static @Nullable ObservableType createObservableType(@NotNull PsiField field, @NotNull Project project) {
      final PsiType type = field.getType();
      if (type instanceof PsiPrimitiveType) {
        final String text = JavaFxCommonNames.ourObservablePrimitiveWrappers.get(type);
        return text != null ? new ObservablePrimitive(text, (PsiPrimitiveType)type) : null;
      }
      final PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
      if (unboxedType != null) {
        final String text = JavaFxCommonNames.ourObservablePrimitiveWrappers.get(unboxedType);
        return text != null ? new ObservablePrimitive(text, unboxedType) : null;
      }
      if (type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
        return new ObservableString();
      }
      if (type instanceof PsiClassType) {
        if (InheritanceUtil.isInheritor(type, JavaFxCommonNames.JAVAFX_BEANS_OBSERVABLE)) {
          return null; // already observable
        }
        if (InheritanceUtil.isInheritor(type, CommonClassNames.JAVA_UTIL_LIST)) {
          return ObservableList.createObservableList(type, project);
        }
        else if (InheritanceUtil.isInheritor(type, CommonClassNames.JAVA_UTIL_COLLECTION) ||
                 InheritanceUtil.isInheritor(type, CommonClassNames.JAVA_UTIL_MAP)) {
          return null; // TODO: support SimpleSetProperty, SimpleMapProperty
        }
        else {
          return new ObservableObject(type);
        }
      }
      return null;
    }
static @Nullable ObservableType createObservableType(@NotNull PsiField field, @NotNull Project project)