From 478c282e65460718c5ab32078da0e66f03bc5a02 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 15 Jul 2013 13:09:29 +0200 Subject: [PATCH] javafx: retrieve factory method return type to check for coercing --- .../plugins/javaFX/fxml/JavaFxCoercingTest.java | 4 ++++ .../JavaFxClassBackedElementDescriptor.java | 15 +++++++++++++++ .../javaFX/testData/coercing/factoryCoercing.fxml | 14 ++++++++++++++ .../testData/coercing/rootTagSubtagsCoercing.fxml | 4 ++-- 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 plugins/javaFX/testData/coercing/factoryCoercing.fxml diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCoercingTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCoercingTest.java index 48ffb35544dd..b86409810cfd 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCoercingTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCoercingTest.java @@ -44,6 +44,10 @@ public class JavaFxCoercingTest extends AbstractJavaFXTestCase { doTest(); } + public void testFactoryCoercing() throws Exception { + doTest(); + } + private void doTest() throws Exception { myFixture.testHighlighting(false, false, false, getTestName(true) + ".fxml"); } 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 3c8b1e887a2a..723cae673715 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 @@ -11,6 +11,7 @@ import com.intellij.psi.impl.source.xml.XmlAttributeImpl; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.*; import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; @@ -377,6 +378,20 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, if (constField != null) { aClass = PsiUtil.resolveClassInType(constField.getType()); } + } else { + final XmlAttribute factoryAttr = context.getAttribute(FxmlConstants.FX_FACTORY); + if (factoryAttr != null) { + final XmlAttributeValue valueElement = factoryAttr.getValueElement(); + if (valueElement != null) { + final PsiReference reference = valueElement.getReference(); + final PsiElement staticFactoryMethod = reference != null ? reference.resolve() : null; + if (staticFactoryMethod instanceof PsiMethod && + ((PsiMethod)staticFactoryMethod).getParameterList().getParametersCount() == 0 && + ((PsiMethod)staticFactoryMethod).hasModifierProperty(PsiModifier.STATIC)) { + aClass = PsiUtil.resolveClassInType(((PsiMethod)staticFactoryMethod).getReturnType()); + } + } + } } final String canCoerceError = JavaFxPsiUtil.isClassAcceptable(parentTag, aClass); if (canCoerceError != null) { diff --git a/plugins/javaFX/testData/coercing/factoryCoercing.fxml b/plugins/javaFX/testData/coercing/factoryCoercing.fxml new file mode 100644 index 000000000000..1173b0a6480f --- /dev/null +++ b/plugins/javaFX/testData/coercing/factoryCoercing.fxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/coercing/rootTagSubtagsCoercing.fxml b/plugins/javaFX/testData/coercing/rootTagSubtagsCoercing.fxml index d44cb8ddd612..44a5ed8270a4 100644 --- a/plugins/javaFX/testData/coercing/rootTagSubtagsCoercing.fxml +++ b/plugins/javaFX/testData/coercing/rootTagSubtagsCoercing.fxml @@ -10,9 +10,9 @@ - <FXCollections fx:factory="observableArrayList"> + <FXCollections fx:factory="observableArrayList"> - FXCollections> + FXCollections> \ No newline at end of file