private Set<String> getEditorFieldCleanupExpressions() {
    Set<String> result = new LinkedHashSet<>();

    for (JClassType typeCandidate : model.getEditorType().getFlattenedSupertypeHierarchy()) {
      JClassType classType = typeCandidate.isClass();

      if (classType != null) {
        for (JField field : classType.getFields()) {
          JClassType fieldClassOrInterfaceType = field.getType().isClassOrInterface();

          if (fieldClassOrInterfaceType != null
              // field type assignable to HasCleanup ..
              && fieldClassOrInterfaceType.isAssignableTo(hasCleanupType)
              // .. but not assignable to Model
              && !fieldClassOrInterfaceType.isAssignableTo(baseModelType)) {
            result.add(
                String.format(
                    "getEditor().%s", //$NON-NLS-1$
                    field.getName()));
          }
        }
      }
    }

    return result;
  }