Javafx: In completion for fx:constant attribute offer constants from superclass (IDEA-153813)

This commit is contained in:
Pavel Dolgov
2016-04-01 11:28:17 +03:00
parent bd3e1328b9
commit 8c21082956
5 changed files with 45 additions and 1 deletions
@@ -252,6 +252,11 @@ public class JavaFxCompletionTest extends LightFixtureCompletionTestCase {
assertSameElements(myFixture.getLookupElementStrings(),"pane", "node", "box", "model", "text", "target");
}
public void testInheritedConstant() throws Exception {
configureAndComplete("InheritedConstantData.java", "InheritedConstantSuperData.java");
assertSameElements(myFixture.getLookupElementStrings(), "MY_TEXT", "SUPER_TEXT");
}
private void configureAndComplete(final String... extraFiles) {
final String fxmlFileName = getTestName(true) + ".fxml";
if (extraFiles.length != 0) {
@@ -20,10 +20,12 @@ import com.intellij.psi.*;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlElement;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.javaFX.fxml.FxmlConstants;
import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil;
import java.util.ArrayList;
import java.util.List;
/**
@@ -52,7 +54,30 @@ public class JavaFxBuiltInAttributeDescriptor extends JavaFxPropertyAttributeDes
@Override
public boolean isEnumerated() {
return getName().equals(FxmlConstants.FX_CONSTANT);
return getPsiClass() != null && getName().equals(FxmlConstants.FX_CONSTANT);
}
@Nullable
@Override
public String[] getEnumeratedValues() {
final PsiClass psiClass = getPsiClass();
if (psiClass != null) {
if (getName().equals(FxmlConstants.FX_CONSTANT)) {
final List<String> constants = new ArrayList<String>();
for (PsiClass aClass = psiClass; aClass != null; aClass = aClass.getSuperClass()) {
final String qualifiedName = aClass.getQualifiedName();
if (CommonClassNames.JAVA_LANG_OBJECT.equals(qualifiedName)) break;
final PsiField[] fields = aClass.getFields();
for (PsiField field : fields) {
if (isConstant(field)) {
constants.add(field.getName());
}
}
}
return ArrayUtil.toStringArray(constants);
}
}
return null;
}
@Override
@@ -0,0 +1,3 @@
public class InheritedConstantData extends InheritedConstantSuperData {
public static final String MY_TEXT = "MyButton";
}
@@ -0,0 +1,3 @@
public class InheritedConstantSuperData {
public static final String SUPER_TEXT = "SuperButton";
}
@@ -0,0 +1,8 @@
<?import InheritedConstantData?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns:fx="http://javafx.com/fxml">
<Button>
<InheritedConstantData fx:constant="<caret>"/>
</Button>
</VBox>