javafx: completion of simple property tags

This commit is contained in:
Anna Kozlova
2013-01-23 22:35:16 +04:00
parent f04a14bc0d
commit 4545e522f9
5 changed files with 60 additions and 18 deletions
@@ -5,7 +5,6 @@ import com.intellij.codeInsight.daemon.impl.analysis.GenericsHighlightUtil;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Factory;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.xml.XmlAttributeImpl;
@@ -83,11 +82,17 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor,
}
if (myPsiClass != null) {
final List<XmlElementDescriptor> children = new ArrayList<XmlElementDescriptor>();
collectProperties(children, new Function<PsiField, XmlElementDescriptor>() {
@Override
public XmlElementDescriptor fun(PsiField field) {
return new JavaFxPropertyElementDescriptor(myPsiClass, field.getName(), false);
}
});
collectParentStaticProperties(context, children, new Function<PsiMethod, XmlElementDescriptor>() {
@Override
public XmlElementDescriptor fun(PsiMethod method) {
final PsiClass aClass = method.getContainingClass();
return new JavaFxPropertyElementDescriptor(aClass, PropertyUtil.getPropertyName(method.getName()));
return new JavaFxPropertyElementDescriptor(aClass, PropertyUtil.getPropertyName(method.getName()), true);
}
});
@@ -132,11 +137,11 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor,
if (!name.equals(shortName)) { //static property
final PsiMethod propertySetter = findPropertySetter(name, childTag);
if (propertySetter != null) {
return new JavaFxPropertyElementDescriptor(propertySetter.getContainingClass(), shortName);
return new JavaFxPropertyElementDescriptor(propertySetter.getContainingClass(), shortName, true);
}
return null;
}
return myPsiClass != null ? new JavaFxPropertyElementDescriptor(myPsiClass, name) : null;
return myPsiClass != null ? new JavaFxPropertyElementDescriptor(myPsiClass, name, false) : null;
}
}
@@ -152,18 +157,12 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor,
final String name = context.getName();
if (Comparing.equal(name, getName()) && myPsiClass != null) {
final List<XmlAttributeDescriptor> simpleAttrs = new ArrayList<XmlAttributeDescriptor>();
final PsiField[] fields = myPsiClass.getAllFields();
if (fields.length > 0) {
for (PsiField field : fields) {
if (field.hasModifierProperty(PsiModifier.STATIC)) continue;
final PsiType fieldType = field.getType();
if (PropertyUtil.findPropertyGetter(myPsiClass, field.getName(), false, true) != null &&
InheritanceUtil.isInheritor(fieldType, JavaFxCommonClassNames.JAVAFX_BEANS_PROPERTY_PROPERTY) ||
fieldType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
simpleAttrs.add(new JavaFxPropertyAttributeDescriptor(field.getName(), myPsiClass));
}
collectProperties(simpleAttrs, new Function<PsiField, XmlAttributeDescriptor>() {
@Override
public XmlAttributeDescriptor fun(PsiField field) {
return new JavaFxPropertyAttributeDescriptor(field.getName(), myPsiClass);
}
}
});
collectParentStaticProperties(context.getParentTag(), simpleAttrs, new Function<PsiMethod, XmlAttributeDescriptor>() {
@Override
public XmlAttributeDescriptor fun(PsiMethod method) {
@@ -176,6 +175,21 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor,
return XmlAttributeDescriptor.EMPTY;
}
private <T> void collectProperties(List<T> children, Function<PsiField, T> factory) {
final PsiField[] fields = myPsiClass.getAllFields();
if (fields.length > 0) {
for (PsiField field : fields) {
if (field.hasModifierProperty(PsiModifier.STATIC)) continue;
final PsiType fieldType = field.getType();
if (PropertyUtil.findPropertyGetter(myPsiClass, field.getName(), false, true) != null &&
InheritanceUtil.isInheritor(fieldType, JavaFxCommonClassNames.JAVAFX_BEANS_PROPERTY_PROPERTY) ||
fieldType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
children.add(factory.fun(field));
}
}
}
}
@Nullable
@Override
public XmlAttributeDescriptor getAttributeDescriptor(@NonNls String attributeName, @Nullable XmlTag context) {
@@ -21,10 +21,12 @@ import org.jetbrains.annotations.Nullable;
public class JavaFxPropertyElementDescriptor implements XmlElementDescriptor {
private final PsiClass myPsiClass;
private final String myName;
private final boolean myStatic;
public JavaFxPropertyElementDescriptor(PsiClass psiClass, String name) {
public JavaFxPropertyElementDescriptor(PsiClass psiClass, String name, boolean isStatic) {
myPsiClass = psiClass;
myName = name;
myStatic = isStatic;
}
@Override
@@ -52,7 +54,7 @@ public class JavaFxPropertyElementDescriptor implements XmlElementDescriptor {
return new JavaFxClassBackedElementDescriptor(name, childTag);
}
else if (myPsiClass != null) {
return new JavaFxPropertyElementDescriptor(myPsiClass, name);
return new JavaFxPropertyElementDescriptor(myPsiClass, name, name.indexOf('.') > 0);
}
return null;
}
@@ -113,7 +115,7 @@ public class JavaFxPropertyElementDescriptor implements XmlElementDescriptor {
@Override
public String getName() {
if (myPsiClass != null) {
if (myPsiClass != null && myStatic) {
return StringUtil.getQualifiedName(myPsiClass.getName(), myName);
}
return myName;
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.text.*?>
<GridPane xmlns:fx="http://javafx.com/fxml">
<Label>
<<caret>
</Label>
</GridPane>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.text.*?>
<GridPane xmlns:fx="http://javafx.com/fxml">
<Label>
<text
</Label>
</GridPane>
@@ -45,6 +45,10 @@ public class JavaFxCompletionTest extends CompletionTestCase {
doTest("GridPane.columnIndex");
}
public void testSimplePropertyTag() throws Exception {
doTest("text");
}
public void testStaticPropertiesEnumValue() throws Exception {
doTest();
}