Javafx: Regression fixed - allow enum constants in fx:value attribute. Tests added

This commit is contained in:
Pavel Dolgov
2016-04-06 17:32:26 +03:00
parent 222afa0a84
commit fc27b307b4
9 changed files with 53 additions and 11 deletions
@@ -358,6 +358,10 @@ public class JavaFXHighlightingTest extends AbstractJavaFXTestCase {
doTest();
}
public void testEnumConstantValue() throws Exception {
doTest();
}
public void testBoxedConstantValue() throws Exception {
doTest();
}
@@ -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");
}
@@ -438,8 +438,7 @@ public class JavaFxPsiUtil {
}
public static boolean isAbleToInstantiate(@NotNull PsiClass psiClass, @NotNull Consumer<String> 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();
@@ -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);
}
@@ -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<String> enumConstants = new ArrayList<String>();
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() {
@@ -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;
}
@@ -0,0 +1,10 @@
<?import javafx.geometry.Pos?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns:fx="http://javafx.com/fxml">
<TextField>
<alignment>
<Pos fx:value="TO<caret>"/>
</alignment>
</TextField>
</VBox>
@@ -0,0 +1,10 @@
<?import javafx.geometry.Pos?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns:fx="http://javafx.com/fxml">
<TextField>
<alignment>
<Pos fx:value="TOP_LEFT"/>
</alignment>
</TextField>
</VBox>
@@ -0,0 +1,10 @@
<?import javafx.geometry.Pos?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.TextField?>
<GridPane xmlns:fx="http://javafx.com/fxml">
<TextField promptText="User Name">
<alignment>
<Pos fx:value="TOP_LEFT"/>
</alignment>
</TextField>
</GridPane>