javafx: instantiate with valueOf fixed

This commit is contained in:
Anna Kozlova
2013-02-04 15:12:05 +04:00
parent e2d209a841
commit 2798d260f4
2 changed files with 21 additions and 14 deletions
@@ -287,23 +287,28 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor,
if (myPsiClass != null && myPsiClass.isValid()) {
if(myPsiClass.getConstructors().length > 0) {
final Project project = myPsiClass.getProject();
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
final PsiMethod noArgConstructor = myPsiClass
.findMethodBySignature(JavaPsiFacade.getElementFactory(project).createConstructor(myPsiClass.getName()), false);
.findMethodBySignature(factory.createConstructor(myPsiClass.getName()), false);
if (noArgConstructor == null) {
final PsiClass builderClass = JavaPsiFacade.getInstance(project).findClass(JavaFxCommonClassNames.JAVAFX_FXML_BUILDER,
GlobalSearchScope.allScope(project));
if (builderClass != null) {
//todo cache this info
final PsiTypeParameter typeParameter = builderClass.getTypeParameters()[0];
if (ClassInheritorsSearch.search(builderClass).forEach(new Processor<PsiClass>() {
@Override
public boolean process(PsiClass aClass) {
final PsiType initType =
TypeConversionUtil.getSuperClassSubstitutor(builderClass, aClass, PsiSubstitutor.EMPTY).substitute(typeParameter);
return !Comparing.equal(myPsiClass, PsiUtil.resolveClassInClassTypeOnly(initType));
final PsiMethod valueOfPattern = factory.createMethodFromText("void valueOf(java.lang.String s){}", myPsiClass);
final PsiMethod valueOf = myPsiClass.findMethodBySignature(valueOfPattern, false);
if (valueOf == null || !valueOf.hasModifierProperty(PsiModifier.STATIC) || !myPsiClass.equals(PsiUtil.resolveClassInType(valueOf.getReturnType()))) {
final PsiClass builderClass = JavaPsiFacade.getInstance(project).findClass(JavaFxCommonClassNames.JAVAFX_FXML_BUILDER,
GlobalSearchScope.allScope(project));
if (builderClass != null) {
//todo cache this info
final PsiTypeParameter typeParameter = builderClass.getTypeParameters()[0];
if (ClassInheritorsSearch.search(builderClass).forEach(new Processor<PsiClass>() {
@Override
public boolean process(PsiClass aClass) {
final PsiType initType =
TypeConversionUtil.getSuperClassSubstitutor(builderClass, aClass, PsiSubstitutor.EMPTY).substitute(typeParameter);
return !Comparing.equal(myPsiClass, PsiUtil.resolveClassInClassTypeOnly(initType));
}
})) {
host.addMessage(context, "Unable to instantiate", ValidationHost.ErrorType.ERROR);
}
})) {
host.addMessage(context, "Unable to instantiate", ValidationHost.ErrorType.ERROR);
}
}
}
@@ -2,6 +2,7 @@
<?import java.lang.String?>
<?import javafx.collections.FXCollections?>
<?import java.util.ArrayList?>
<?import java.lang.Double?>
<GridPane xmlns:fx="http://javafx.com/fxml">
<fx:define>
<FXCollections fx:factory="observableArrayList">
@@ -10,6 +11,7 @@
<FXCollections fx:factory="observableArrayList">
<String fx:value="A"/>
<Double value="5"/>
</FXCollections>
</fx:define>