extension attributes defined by private fields with accessors supported in plugin.xml

This commit is contained in:
nik
2012-04-04 15:16:52 +04:00
parent 971861c54c
commit 26affc0fc9
4 changed files with 56 additions and 9 deletions
@@ -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<Extensions> {
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<Extensions> {
}
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<Extensions> {
}
}
@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,
@@ -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;
}
}
@@ -0,0 +1,12 @@
<idea-plugin>
<id>com.intellij.myPlugin</id>
<extensionPoints>
<extensionPoint name="acc" beanClass="ExtBeanWithAccessors"/>
</extensionPoints>
<extensions defaultExtensionNs="com.intellij.myPlugin">
<acc param="123"/>
</extensions>
</idea-plugin>
@@ -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");
}