diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java
index 58448dcb7615..026b0fa1c762 100644
--- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java
+++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java
@@ -358,6 +358,14 @@ public class JavaFXHighlightingTest extends AbstractJavaFXTestCase {
doTest();
}
+ public void testBoxedConstantValue() throws Exception {
+ doTest();
+ }
+
+ public void testFactoryMethod() throws Exception {
+ doTest();
+ }
+
public void testPropertyTagCompatibleClass() throws Exception {
doTest();
}
diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java
index 3411fc538314..c85f0cab762d 100644
--- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java
+++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java
@@ -35,12 +35,11 @@ import com.intellij.util.containers.HashSet;
import com.intellij.xml.XmlAttributeDescriptor;
import com.intellij.xml.XmlElementDescriptor;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.plugins.javaFX.fxml.FxmlConstants;
import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory;
import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil;
-import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxBuiltInAttributeDescriptor;
import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxClassTagDescriptorBase;
import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxPropertyTagDescriptor;
+import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxRootTagDescriptor;
import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxStaticSetterAttributeDescriptor;
import java.util.*;
@@ -145,7 +144,7 @@ public class JavaFxImportsOptimizer implements ImportOptimizer {
appendClassName(((PsiMember)declaration).getContainingClass());
}
}
- else if (descriptor instanceof JavaFxBuiltInAttributeDescriptor && FxmlConstants.TYPE.equals(descriptor.getName())) {
+ else if (descriptor instanceof JavaFxRootTagDescriptor.RootTagTypeAttributeDescriptor) {
appendClassName(JavaFxPsiUtil.findPsiClass(attribute.getValue(), attribute));
}
}
diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxBuiltInAttributeDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxBuiltInAttributeDescriptor.java
index ec3376cff4e6..4c0938298db7 100644
--- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxBuiltInAttributeDescriptor.java
+++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxBuiltInAttributeDescriptor.java
@@ -115,11 +115,16 @@ public class JavaFxBuiltInAttributeDescriptor extends JavaFxPropertyAttributeDes
return "Unable to coerce '" + value + "' to " + tagClass.getQualifiedName() + ".";
}
}
- } else if (FxmlConstants.TYPE.equals(attributeName)) {
- final PsiReference[] references = context.getReferences();
- if (references.length == 0 || references[references.length - 1].resolve() == null) {
- return "Cannot resolve class " + value;
+ }
+ else if (FxmlConstants.FX_CONSTANT.equals(attributeName)) {
+ final PsiClass tagClass = JavaFxPsiUtil.getTagClass((XmlAttributeValue)context);
+ if (tagClass != null) {
+ final PsiField constField = tagClass.findFieldByName(value, true);
+ if (constField == null) {
+ return "Constant '" + value + "' is not found";
+ }
}
+ return null;
}
}
}
diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassTagDescriptorBase.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassTagDescriptorBase.java
index dfda34534683..2fbe497fe9ad 100644
--- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassTagDescriptorBase.java
+++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassTagDescriptorBase.java
@@ -320,20 +320,23 @@ public abstract class JavaFxClassTagDescriptorBase implements XmlElementDescript
}
PsiClass aClass = getPsiClass();
final XmlAttribute constAttr = context.getAttribute(FxmlConstants.FX_CONSTANT);
+ final XmlAttribute factoryAttr = context.getAttribute(FxmlConstants.FX_FACTORY);
if (constAttr != null && aClass != null) {
final PsiField constField = aClass.findFieldByName(constAttr.getValue(), true);
if (constField != null) {
- aClass = PsiUtil.resolveClassInType(constField.getType());
+ final PsiType constType = constField.getType();
+ aClass = PsiUtil.resolveClassInClassTypeOnly(
+ constType instanceof PsiPrimitiveType ? ((PsiPrimitiveType)constType).getBoxedType(context) : constType);
}
} else {
- final XmlAttribute factoryAttr = context.getAttribute(FxmlConstants.FX_FACTORY);
if (factoryAttr != null) {
aClass = JavaFxPsiUtil.getFactoryProducedClass(aClass, factoryAttr.getValue());
}
}
JavaFxPsiUtil.isClassAcceptable(parentTag, aClass, (errorMessage, errorType) ->
host.addMessage(context.getNavigationElement(), errorMessage, errorType));
- if (aClass != null && aClass.isValid()) {
+ boolean needInstantiate = constAttr == null && factoryAttr == null;
+ if (needInstantiate && aClass != null && aClass.isValid()) {
JavaFxPsiUtil.isAbleToInstantiate(aClass, errorMessage ->
host.addMessage(context, errorMessage, ValidationHost.ErrorType.ERROR));
}
diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxRootTagDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxRootTagDescriptor.java
index a84df70a8455..485dccc9531c 100644
--- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxRootTagDescriptor.java
+++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxRootTagDescriptor.java
@@ -75,7 +75,7 @@ public class JavaFxRootTagDescriptor extends JavaFxClassTagDescriptorBase {
return psiClass != null ? psiClass : myXmlTag;
}
- private static class RootTagTypeAttributeDescriptor extends JavaFxPropertyAttributeDescriptor {
+ public static class RootTagTypeAttributeDescriptor extends JavaFxPropertyAttributeDescriptor {
public RootTagTypeAttributeDescriptor() {
super(FxmlConstants.TYPE, null);
}
diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFactoryReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFactoryReferenceProvider.java
index f2da17c1454e..8c2ce3419670 100644
--- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFactoryReferenceProvider.java
+++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFactoryReferenceProvider.java
@@ -59,7 +59,9 @@ class JavaFxFactoryReferenceProvider extends PsiReferenceProvider {
}
private static boolean isFactoryMethod(PsiMethod method) {
- return method.hasModifierProperty(PsiModifier.STATIC) && method.getParameterList().getParametersCount() == 0;
+ return method.hasModifierProperty(PsiModifier.STATIC) &&
+ method.getParameterList().getParametersCount() == 0 &&
+ !PsiType.VOID.equals(method.getReturnType());
}
@NotNull
diff --git a/plugins/javaFX/testData/highlighting/boxedConstantValue.fxml b/plugins/javaFX/testData/highlighting/boxedConstantValue.fxml
new file mode 100644
index 000000000000..49d710bd3079
--- /dev/null
+++ b/plugins/javaFX/testData/highlighting/boxedConstantValue.fxml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+ <Double fx:constant="TYPE"/>
+
+
+ <Double fx:constant="SIZE"/>
+
+
\ No newline at end of file
diff --git a/plugins/javaFX/testData/highlighting/factoryMethod.fxml b/plugins/javaFX/testData/highlighting/factoryMethod.fxml
new file mode 100644
index 000000000000..9be5d722c359
--- /dev/null
+++ b/plugins/javaFX/testData/highlighting/factoryMethod.fxml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+ unmodifiableList"/>
+
+
+ gc"/>
+
+
\ No newline at end of file