From 2798d260f44bdac1575337403e4754fbad4f2f54 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 4 Feb 2013 14:47:24 +0400 Subject: [PATCH] javafx: instantiate with valueOf fixed --- .../JavaFxClassBackedElementDescriptor.java | 33 +++++++++++-------- .../highlighting/valueOfAcceptance.fxml | 2 ++ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java index 2cf007f383b6..c333188825ca 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java @@ -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() { - @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() { + @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); } } } diff --git a/plugins/javaFX/testData/highlighting/valueOfAcceptance.fxml b/plugins/javaFX/testData/highlighting/valueOfAcceptance.fxml index a4b16c30662e..645e1b733f27 100644 --- a/plugins/javaFX/testData/highlighting/valueOfAcceptance.fxml +++ b/plugins/javaFX/testData/highlighting/valueOfAcceptance.fxml @@ -2,6 +2,7 @@ + @@ -10,6 +11,7 @@ +