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