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