diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/FxmlConstants.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/FxmlConstants.java index 031bfe3b7c8d..0e9f05bfb3a0 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/FxmlConstants.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/FxmlConstants.java @@ -47,7 +47,14 @@ public class FxmlConstants { public static final Map> FX_ELEMENT_ATTRIBUTES = new HashMap>(); static { - FX_ELEMENT_ATTRIBUTES.put(FX_INCLUDE, Arrays.asList(FX_ELEMENT_SOURCE)); + FX_ELEMENT_ATTRIBUTES.put(FX_INCLUDE, Arrays.asList(FX_ELEMENT_SOURCE, FX_ID)); FX_ELEMENT_ATTRIBUTES.put(FX_REFERENCE, Arrays.asList(FX_ELEMENT_SOURCE)); } + + public static final Map> FX_REQUIRED_ELEMENT_ATTRIBUTES = new HashMap>(); + static { + FX_REQUIRED_ELEMENT_ATTRIBUTES.put(FX_INCLUDE, Arrays.asList(FX_ELEMENT_SOURCE)); + FX_REQUIRED_ELEMENT_ATTRIBUTES.put(FX_REFERENCE, Arrays.asList(FX_ELEMENT_SOURCE)); + } + } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFXNSDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFXNSDescriptor.java index 4b4cd2076202..231a3c96a7a9 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFXNSDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFXNSDescriptor.java @@ -1,9 +1,7 @@ package org.jetbrains.plugins.javaFX.fxml; import com.intellij.codeInsight.daemon.Validator; -import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.util.ArrayUtil; import com.intellij.xml.XmlElementDescriptor; @@ -12,11 +10,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxClassBackedElementDescriptor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - /** * User: anna * Date: 1/9/13 @@ -29,7 +22,7 @@ public class JavaFXNSDescriptor implements XmlNSDescriptor, Validator= 1) { + return getters[0]; + } + return null; + } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java index 9ace652aa295..2249a39ae7fa 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxClassBackedElementDescriptor.java @@ -69,20 +69,14 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, } }); - collectParentStaticProperties(context, children, new Function() { - @Override - public XmlElementDescriptor fun(PsiMethod method) { - final PsiClass aClass = method.getContainingClass(); - return new JavaFxPropertyElementDescriptor(aClass, PropertyUtil.getPropertyName(method.getName()), true); - } - }); + collectStaticElementDescriptors(context, children); final PsiAnnotation annotation = AnnotationUtil.findAnnotationInHierarchy(myPsiClass, Collections.singleton(JavaFxCommonClassNames.JAVAFX_BEANS_DEFAULT_PROPERTY)); if (annotation != null) { final PsiAnnotationMemberValue memberValue = annotation.findAttributeValue(null); if (memberValue != null) { final String propertyName = StringUtil.stripQuotesAroundValue(memberValue.getText()); - final PsiMethod getter = findPropertyGetter(propertyName, myPsiClass); + final PsiMethod getter = JavaFxPsiUtil.findPropertyGetter(propertyName, myPsiClass); if (getter != null) { final PsiType returnType = getter.getReturnType(); JavaFxPropertyElementDescriptor.collectDescriptorsByCollection(returnType, myPsiClass.getResolveScope(), children); @@ -102,6 +96,25 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, return XmlElementDescriptor.EMPTY_ARRAY; } + static void collectStaticAttributesDescriptors(XmlTag context, List simpleAttrs) { + collectParentStaticProperties(context.getParentTag(), simpleAttrs, new Function() { + @Override + public XmlAttributeDescriptor fun(PsiMethod method) { + return new JavaFxSetterAttributeDescriptor(method, method.getContainingClass()); + } + }); + } + + protected static void collectStaticElementDescriptors(XmlTag context, List children) { + collectParentStaticProperties(context, children, new Function() { + @Override + public XmlElementDescriptor fun(PsiMethod method) { + final PsiClass aClass = method.getContainingClass(); + return new JavaFxPropertyElementDescriptor(aClass, PropertyUtil.getPropertyName(method.getName()), true); + } + }); + } + private static void collectParentStaticProperties(XmlTag context, List children, Function factory) { XmlTag tag = context; while (tag != null) { @@ -127,13 +140,13 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, @Override public XmlElementDescriptor getElementDescriptor(XmlTag childTag, XmlTag contextTag) { final String name = childTag.getName(); - if (isClassTag(name)) { + if (JavaFxPsiUtil.isClassTag(name)) { return new JavaFxClassBackedElementDescriptor(name, childTag); } else { final String shortName = StringUtil.getShortName(name); if (!name.equals(shortName)) { //static property - final PsiMethod propertySetter = findPropertySetter(name, childTag); + final PsiMethod propertySetter = JavaFxPsiUtil.findPropertySetter(name, childTag); if (propertySetter != null) { return new JavaFxPropertyElementDescriptor(propertySetter.getContainingClass(), shortName, true); } @@ -146,11 +159,6 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, } } - public static boolean isClassTag(String name) { - final String shortName = StringUtil.getShortName(name); - return StringUtil.isCapitalized(name) && name.equals(shortName); - } - @Override public XmlAttributeDescriptor[] getAttributesDescriptors(@Nullable XmlTag context) { //todo filter @@ -164,12 +172,7 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, return new JavaFxPropertyAttributeDescriptor(field.getName(), myPsiClass); } }); - collectParentStaticProperties(context.getParentTag(), simpleAttrs, new Function() { - @Override - public XmlAttributeDescriptor fun(PsiMethod method) { - return new JavaFxSetterAttributeDescriptor(method, method.getContainingClass()); - } - }); + collectStaticAttributesDescriptors(context, simpleAttrs); for (String defaultProperty : FxmlConstants.FX_DEFAULT_PROPERTIES) { simpleAttrs.add(new JavaFxDefaultAttributeDescriptor(defaultProperty, myPsiClass)); } @@ -203,7 +206,7 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, if (FxmlConstants.FX_DEFAULT_PROPERTIES.contains(attributeName)){ return new JavaFxDefaultAttributeDescriptor(attributeName, myPsiClass); } else { - final PsiMethod propertySetter = findPropertySetter(attributeName, context); + final PsiMethod propertySetter = JavaFxPsiUtil.findPropertySetter(attributeName, context); if (propertySetter != null) { return new JavaFxStaticPropertyAttributeDescriptor(propertySetter, attributeName); } @@ -301,33 +304,4 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, } } } - - public static PsiMethod findPropertySetter(String attributeName, XmlTag context) { - final String packageName = StringUtil.getPackageName(attributeName); - if (context != null && !StringUtil.isEmptyOrSpaces(packageName)) { - final PsiClass classWithStaticProperty = JavaFxPsiUtil.findPsiClass(packageName, context); - if (classWithStaticProperty != null) { - return findPropertySetter(attributeName, classWithStaticProperty); - } - } - return null; - } - - public static PsiMethod findPropertySetter(String attributeName, PsiClass classWithStaticProperty) { - final String setterName = PropertyUtil.suggestSetterName(StringUtil.getShortName(attributeName)); - final PsiMethod[] setters = classWithStaticProperty.findMethodsByName(setterName, true); - if (setters.length == 1) { - return setters[0]; - } - return null; - } - - public static PsiMethod findPropertyGetter(String attributeName, PsiClass classWithStaticProperty) { - final String getterName = PropertyUtil.suggestGetterName(StringUtil.getShortName(attributeName), null); - final PsiMethod[] getters = classWithStaticProperty.findMethodsByName(getterName, true); - if (getters.length >= 1) { - return getters[0]; - } - return null; - } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxDefaultAttributeDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxDefaultAttributeDescriptor.java index 97619128d9b0..80b05a8d6397 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxDefaultAttributeDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxDefaultAttributeDescriptor.java @@ -21,6 +21,8 @@ import com.intellij.psi.PsiField; import com.intellij.psi.PsiModifier; import org.jetbrains.plugins.javaFX.fxml.FxmlConstants; +import java.util.List; + /** * User: anna * Date: 1/10/13 @@ -28,10 +30,16 @@ import org.jetbrains.plugins.javaFX.fxml.FxmlConstants; public class JavaFxDefaultAttributeDescriptor extends JavaFxPropertyAttributeDescriptor { private static final Logger LOG = Logger.getInstance("#" + JavaFxDefaultAttributeDescriptor.class.getName()); + private String myDefaultPropertyName = null; public JavaFxDefaultAttributeDescriptor(String name, PsiClass psiClass) { super(name, psiClass); } + public JavaFxDefaultAttributeDescriptor(String name, String defaultPropertyName) { + super(name, null); + myDefaultPropertyName = defaultPropertyName; + } + @Override public boolean hasIdType() { return getName().equals(FxmlConstants.FX_ID); @@ -42,6 +50,15 @@ public class JavaFxDefaultAttributeDescriptor extends JavaFxPropertyAttributeDes return getName().equals("fx:constant"); } + @Override + public boolean isRequired() { + if (myDefaultPropertyName != null) { + final List requiredAttrs = FxmlConstants.FX_REQUIRED_ELEMENT_ATTRIBUTES.get(myDefaultPropertyName); + if (requiredAttrs != null && requiredAttrs.contains(getName())) return true; + } + return false; + } + @Override protected PsiClass getEnum() { return isEnumerated() ? getPsiClass() : null ; diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxDefaultPropertyElementDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxDefaultPropertyElementDescriptor.java index f83ada66938e..2c682cf56fbf 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxDefaultPropertyElementDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxDefaultPropertyElementDescriptor.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.javaFX.fxml.descriptors; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; @@ -26,6 +27,7 @@ import com.intellij.xml.XmlNSDescriptor; import org.jetbrains.annotations.NonNls; 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; @@ -69,8 +71,9 @@ public class JavaFxDefaultPropertyElementDescriptor implements XmlElementDescrip if (defaultAttributeList != null) { final List descriptors = new ArrayList(); for (String defaultAttrName : defaultAttributeList) { - descriptors.add(new JavaFxDefaultAttributeDescriptor(defaultAttrName, null)); + descriptors.add(new JavaFxDefaultAttributeDescriptor(defaultAttrName, getName())); } + JavaFxClassBackedElementDescriptor.collectStaticAttributesDescriptors(context, descriptors); return descriptors.toArray(new XmlAttributeDescriptor[descriptors.size()]); } return XmlAttributeDescriptor.EMPTY; @@ -80,8 +83,14 @@ public class JavaFxDefaultPropertyElementDescriptor implements XmlElementDescrip @Override public XmlAttributeDescriptor getAttributeDescriptor(@NonNls String attributeName, @Nullable XmlTag context) { final List defaultAttributeList = FxmlConstants.FX_ELEMENT_ATTRIBUTES.get(getName()); - if (defaultAttributeList != null && defaultAttributeList.contains(attributeName)) { - return new JavaFxDefaultAttributeDescriptor(attributeName, null); + if (defaultAttributeList != null) { + if (defaultAttributeList.contains(attributeName)) { + return new JavaFxDefaultAttributeDescriptor(attributeName, getName()); + } + final PsiMethod propertySetter = JavaFxPsiUtil.findPropertySetter(attributeName, context); + if (propertySetter != null) { + return new JavaFxStaticPropertyAttributeDescriptor(propertySetter, attributeName); + } } return null; } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyElementDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyElementDescriptor.java index cd2433a54798..2ded59af3b49 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyElementDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyElementDescriptor.java @@ -20,6 +20,7 @@ import com.intellij.xml.XmlNSDescriptor; import org.jetbrains.annotations.NonNls; 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; @@ -89,7 +90,7 @@ public class JavaFxPropertyElementDescriptor implements XmlElementDescriptor { if (FxmlConstants.FX_DEFAULT_ELEMENTS.contains(name)) { return new JavaFxDefaultPropertyElementDescriptor(name, childTag); } - if (JavaFxClassBackedElementDescriptor.isClassTag(name)) { + if (JavaFxPsiUtil.isClassTag(name)) { return new JavaFxClassBackedElementDescriptor(name, childTag); } else if (myPsiClass != null) { @@ -144,7 +145,7 @@ public class JavaFxPropertyElementDescriptor implements XmlElementDescriptor { if (field != null) { return field; } - return JavaFxClassBackedElementDescriptor.findPropertySetter(myName, myPsiClass); + return JavaFxPsiUtil.findPropertySetter(myName, myPsiClass); } @Override diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFieldIdReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFieldIdReferenceProvider.java index f087c407bb85..fa811efebb69 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFieldIdReferenceProvider.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxFieldIdReferenceProvider.java @@ -32,27 +32,6 @@ class JavaFxFieldIdReferenceProvider extends JavaFxControllerBasedReferenceProvi XmlAttributeValue xmlAttributeValue, ProcessingContext context) { final PsiField field = aClass.findFieldByName(xmlAttributeValue.getValue(), false); - return field == null ? PsiReference.EMPTY_ARRAY : new PsiReference[]{new JavaFxIdReference(xmlAttributeValue, field)}; - } - - private static class JavaFxIdReference extends PsiReferenceBase { - private final PsiField myField; - - public JavaFxIdReference(XmlAttributeValue xmlAttributeValue, PsiField field) { - super(xmlAttributeValue); - myField = field; - } - - @Nullable - @Override - public PsiElement resolve() { - return myField; - } - - @NotNull - @Override - public Object[] getVariants() { - return ArrayUtil.EMPTY_OBJECT_ARRAY; - } + return field == null ? PsiReference.EMPTY_ARRAY : new PsiReference[]{new PsiReferenceBase.Immediate(xmlAttributeValue, field)}; } } diff --git a/plugins/javaFX/testData/highlighting/defineAttributes.fxml b/plugins/javaFX/testData/highlighting/defineAttributes.fxml new file mode 100644 index 000000000000..c582e617fc04 --- /dev/null +++ b/plugins/javaFX/testData/highlighting/defineAttributes.fxml @@ -0,0 +1,5 @@ + + + GridPane.halignment="CENTER" /> + + diff --git a/plugins/javaFX/testData/highlighting/referenceAttributes.fxml b/plugins/javaFX/testData/highlighting/referenceAttributes.fxml new file mode 100644 index 000000000000..6dd49d046575 --- /dev/null +++ b/plugins/javaFX/testData/highlighting/referenceAttributes.fxml @@ -0,0 +1,5 @@ + + + + + diff --git a/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java b/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java index 9cfc99ca4a51..d16f2830a1d5 100644 --- a/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java +++ b/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java @@ -110,6 +110,14 @@ public class JavaFXHighlightingTest extends DaemonAnalyzerTestCase { doTest(); } + public void testReferenceAttributes() throws Exception { + doTest(); + } + + public void testDefineAttributes() throws Exception { + doTest(); + } + @NotNull @Override protected String getTestDataPath() {