From fc27b307b483aaf3668fa84344ea7f4784d6d7bc Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Wed, 6 Apr 2016 17:31:30 +0300 Subject: [PATCH] Javafx: Regression fixed - allow enum constants in fx:value attribute. Tests added --- .../plugins/javaFX/fxml/JavaFXHighlightingTest.java | 4 ++++ .../plugins/javaFX/fxml/JavaFxCompletionTest.java | 4 ++++ .../jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java | 4 ++-- .../JavaFxBuiltInAttributeDescriptor.java | 8 ++++++-- .../JavaFxPropertyAttributeDescriptor.java | 12 ++++++------ .../fxml/descriptors/JavaFxRootTagDescriptor.java | 2 +- .../testData/completion/enumConstantValue.fxml | 10 ++++++++++ .../testData/completion/enumConstantValue_after.fxml | 10 ++++++++++ .../testData/highlighting/enumConstantValue.fxml | 10 ++++++++++ 9 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 plugins/javaFX/testData/completion/enumConstantValue.fxml create mode 100644 plugins/javaFX/testData/completion/enumConstantValue_after.fxml create mode 100644 plugins/javaFX/testData/highlighting/enumConstantValue.fxml 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 fea80b3d4432..0f259b1ac7ac 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,10 @@ public class JavaFXHighlightingTest extends AbstractJavaFXTestCase { doTest(); } + public void testEnumConstantValue() throws Exception { + doTest(); + } + public void testBoxedConstantValue() throws Exception { doTest(); } diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java index cfc93d3d305f..692fe0c91879 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java @@ -80,6 +80,10 @@ public class JavaFxCompletionTest extends LightFixtureCompletionTestCase { doTest(); } + public void testEnumConstantValue() throws Exception { + doTest("TOP_LEFT"); + } + public void testConstants() throws Exception { doTest("NEGATIVE_INFINITY"); } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java index 11e5cd2119c5..a1b89e8766c6 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java @@ -438,8 +438,7 @@ public class JavaFxPsiUtil { } public static boolean isAbleToInstantiate(@NotNull PsiClass psiClass, @NotNull Consumer messageConsumer) { - if (psiClass.getConstructors().length == 0) return true; - if (hasNamedArgOrNoArgConstructor(psiClass)) return true; + if (psiClass.isEnum() || hasNamedArgOrNoArgConstructor(psiClass)) return true; final PsiMethod valueOf = findValueOfMethod(psiClass); if (valueOf == null) { if (!hasBuilder(psiClass)) { @@ -451,6 +450,7 @@ public class JavaFxPsiUtil { } private static boolean hasNamedArgOrNoArgConstructor(@NotNull PsiClass psiClass) { + if (psiClass.getConstructors().length == 0) return true; return CachedValuesManager.getCachedValue(psiClass, () -> { for (PsiMethod constructor : psiClass.getConstructors()) { final PsiParameter[] parameters = constructor.getParameterList().getParameters(); 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 34dc7fa226fa..317f1bb07d33 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 @@ -52,7 +52,10 @@ public class JavaFxBuiltInAttributeDescriptor extends JavaFxPropertyAttributeDes @Override public boolean isEnumerated() { - return getPsiClass() != null && getName().equals(FxmlConstants.FX_CONSTANT); + final PsiClass psiClass = getPsiClass(); + if (psiClass == null) return false; + final String name = getName(); + return FxmlConstants.FX_CONSTANT.equals(name) || psiClass.isEnum() && FxmlConstants.FX_VALUE.equals(name); } @Override @@ -67,7 +70,8 @@ public class JavaFxBuiltInAttributeDescriptor extends JavaFxPropertyAttributeDes return isEnumerated() ? getPsiClass() : null ; } - protected boolean isConstant(PsiField field) { + protected boolean isConstant(PsiField field, boolean inEnum) { + if (inEnum) return field instanceof PsiEnumConstant; return field.hasModifierProperty(PsiModifier.STATIC) && field.hasModifierProperty(PsiModifier.FINAL) && field.hasModifierProperty(PsiModifier.PUBLIC); } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java index 682896f1e541..857193a76572 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java @@ -72,12 +72,12 @@ public class JavaFxPropertyAttributeDescriptor extends BasicXmlAttributeDescript @Nullable @Override public String[] getEnumeratedValues() { - final PsiClass enumClass = getEnum(); - if (enumClass != null) { - final PsiField[] fields = enumClass.getAllFields(); + final PsiClass aClass = getEnum(); + if (aClass != null) { + final PsiField[] fields = aClass.getAllFields(); final List enumConstants = new ArrayList(); for (PsiField enumField : fields) { - if (isConstant(enumField)) { + if (isConstant(enumField, aClass.isEnum())) { enumConstants.add(enumField.getName()); } } @@ -94,8 +94,8 @@ public class JavaFxPropertyAttributeDescriptor extends BasicXmlAttributeDescript return null; } - protected boolean isConstant(PsiField enumField) { - return enumField instanceof PsiEnumConstant; + protected boolean isConstant(PsiField field, boolean inEnum) { + return inEnum && field instanceof PsiEnumConstant; } protected PsiClass getEnum() { 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 485dccc9531c..e3c672153532 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 @@ -100,7 +100,7 @@ public class JavaFxRootTagDescriptor extends JavaFxClassTagDescriptorBase { return null; } - protected boolean isConstant(PsiField field) { + protected boolean isConstant(PsiField field, boolean inEnum) { return false; } diff --git a/plugins/javaFX/testData/completion/enumConstantValue.fxml b/plugins/javaFX/testData/completion/enumConstantValue.fxml new file mode 100644 index 000000000000..3db82c9c28b6 --- /dev/null +++ b/plugins/javaFX/testData/completion/enumConstantValue.fxml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/completion/enumConstantValue_after.fxml b/plugins/javaFX/testData/completion/enumConstantValue_after.fxml new file mode 100644 index 000000000000..b91cf442f3cf --- /dev/null +++ b/plugins/javaFX/testData/completion/enumConstantValue_after.fxml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/highlighting/enumConstantValue.fxml b/plugins/javaFX/testData/highlighting/enumConstantValue.fxml new file mode 100644 index 000000000000..e6bdfbd02e17 --- /dev/null +++ b/plugins/javaFX/testData/highlighting/enumConstantValue.fxml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file