diff --git a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java index 0bd5e19bff15..922861de9c70 100644 --- a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java +++ b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java @@ -25,6 +25,7 @@ import com.intellij.psi.util.PsiTypesUtil; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; +import com.intellij.refactoring.psi.PropertyUtils; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.*; import com.intellij.util.xml.reflect.DomExtender; @@ -127,18 +128,20 @@ public class ExtensionDomExtender extends DomExtender { if (beanClass == null) return; for (PsiField field : beanClass.getAllFields()) { - if (field.hasModifierProperty(PsiModifier.PUBLIC)) { - registerField(registrar, field); - } + registerField(registrar, field); } } private static void registerField(final DomExtensionsRegistrar registrar, @NotNull final PsiField field) { - final PsiModifierList modifierList = field.getModifierList(); - if (modifierList == null) return; + final PsiMethod getter = PropertyUtils.findGetterForField(field); + final PsiMethod setter = PropertyUtils.findSetterForField(field); + if (!field.hasModifierProperty(PsiModifier.PUBLIC) && (getter == null || setter == null)) { + return; + } + final String fieldName = field.getName(); final PsiConstantEvaluationHelper evalHelper = JavaPsiFacade.getInstance(field.getProject()).getConstantEvaluationHelper(); - final PsiAnnotation attrAnno = modifierList.findAnnotation(Attribute.class.getName()); + final PsiAnnotation attrAnno = findAnnotation(Attribute.class, field, getter, setter); if (attrAnno != null) { final String attrName = getStringAttribute(attrAnno, "value", evalHelper); if (attrName != null) { @@ -150,9 +153,9 @@ public class ExtensionDomExtender extends DomExtender { } return; } - final PsiAnnotation tagAnno = modifierList.findAnnotation(Tag.class.getName()); - final PsiAnnotation propAnno = modifierList.findAnnotation(Property.class.getName()); - final PsiAnnotation absColAnno = modifierList.findAnnotation(AbstractCollection.class.getName()); + final PsiAnnotation tagAnno = findAnnotation(Tag.class, field, getter, setter); + final PsiAnnotation propAnno = findAnnotation(Property.class, field, getter, setter); + final PsiAnnotation absColAnno = findAnnotation(AbstractCollection.class, field, getter, setter); //final PsiAnnotation colAnno = modifierList.findAnnotation(Collection.class.getName()); // todo final String tagName = tagAnno != null? getStringAttribute(tagAnno, "value", evalHelper) : propAnno != null && getBooleanAttribute(propAnno, "surroundWithTag", evalHelper)? Constants.OPTION : null; @@ -178,6 +181,20 @@ public class ExtensionDomExtender extends DomExtender { } } + @Nullable + private static PsiAnnotation findAnnotation(final Class annotationClass, PsiMember... members) { + for (PsiMember member : members) { + final PsiModifierList modifierList = member.getModifierList(); + if (modifierList != null) { + final PsiAnnotation annotation = modifierList.findAnnotation(annotationClass.getName()); + if (annotation != null) { + return annotation; + } + } + } + return null; + } + private static void registerCollectionBinding(PsiType type, DomExtensionsRegistrar registrar, PsiAnnotation anno, diff --git a/plugins/devkit/testData/codeInsight/ExtBeanWithAccessors.java b/plugins/devkit/testData/codeInsight/ExtBeanWithAccessors.java new file mode 100644 index 000000000000..bf06af52d87c --- /dev/null +++ b/plugins/devkit/testData/codeInsight/ExtBeanWithAccessors.java @@ -0,0 +1,14 @@ +import java.lang.String; + +public class ExtBeanWithAccessors { + private String field; + + @com.intellij.util.xmlb.annotations.Attribute("param") + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } +} \ No newline at end of file diff --git a/plugins/devkit/testData/codeInsight/extensionAttributeWithAccessors.xml b/plugins/devkit/testData/codeInsight/extensionAttributeWithAccessors.xml new file mode 100644 index 000000000000..843d95a23878 --- /dev/null +++ b/plugins/devkit/testData/codeInsight/extensionAttributeWithAccessors.xml @@ -0,0 +1,12 @@ + + com.intellij.myPlugin + + + + + + + + + + \ No newline at end of file diff --git a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java index 24d8e0790446..dc9e0767b163 100644 --- a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java +++ b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java @@ -141,6 +141,10 @@ public class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase { myFixture.testHighlighting("deprecatedExtensionAttribute.xml", "MyExtBean.java"); } + public void testExtensionAttributeDeclaredUsingAccessors() { + myFixture.testHighlighting("extensionAttributeWithAccessors.xml", "ExtBeanWithAccessors.java"); + } + public void testPluginModule() throws Throwable { myFixture.testHighlighting("pluginWithModules.xml"); }