From aa54cd2a2631db4d8c66cd160f510c10a9daccfa Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 12 Feb 2013 19:34:39 +0100 Subject: [PATCH] look at @Attribute(name="") when resolving --- .../src/dom/impl/ExtensionDomExtender.java | 18 +++++++------ .../dom/impl/PluginFieldNameConverter.java | 25 ++++++++++++++++++- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java index 9fd4d519ea19..d228b28994bf 100644 --- a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java +++ b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java @@ -152,7 +152,7 @@ public class ExtensionDomExtender extends DomExtender { } @Nullable - private static With findWithElement(List elements, PsiField field) { + public static With findWithElement(List elements, PsiField field) { for (With element : elements) { if (field.getName().equals(element.getAttribute().getStringValue())) { return element; @@ -174,7 +174,7 @@ public class ExtensionDomExtender extends DomExtender { if (attrAnno != null) { final String attrName = getStringAttribute(attrAnno, "value", evalHelper); if (attrName != null) { - boolean isClass = withElement != null || fieldName.endsWith("Class"); + boolean isClass = withElement != null || isClassField(fieldName); final DomExtension extension = registrar.registerGenericAttributeValueChildExtension(new XmlName(attrName), isClass ? PsiClass.class : String.class).setDeclaringElement(field); markAsClass(extension, fieldName, withElement); @@ -217,13 +217,17 @@ public class ExtensionDomExtender extends DomExtender { } }); } - if (fieldName.endsWith("Class") || withElement != null) { + if (isClassField(fieldName) || withElement != null) { extension.setConverter(CLASS_CONVERTER); } } + public static boolean isClassField(String fieldName) { + return fieldName.endsWith("Class") || fieldName.equals("implementation"); + } + @Nullable - private static PsiAnnotation findAnnotation(final Class annotationClass, PsiMember... members) { + static PsiAnnotation findAnnotation(final Class annotationClass, PsiMember... members) { for (PsiMember member : members) { if (member != null) { final PsiModifierList modifierList = member.getModifierList(); @@ -274,9 +278,9 @@ public class ExtensionDomExtender extends DomExtender { } @Nullable - private static String getStringAttribute(final PsiAnnotation annotation, - final String name, - final PsiConstantEvaluationHelper evalHelper) { + static String getStringAttribute(final PsiAnnotation annotation, + final String name, + final PsiConstantEvaluationHelper evalHelper) { String value = getAttributeValue(annotation, name); if (value != null) return value; final Object o = evalHelper.computeConstantExpression(annotation.findAttributeValue(name), false); diff --git a/plugins/devkit/src/dom/impl/PluginFieldNameConverter.java b/plugins/devkit/src/dom/impl/PluginFieldNameConverter.java index aebdd1e1d88e..5515db6d1bd4 100644 --- a/plugins/devkit/src/dom/impl/PluginFieldNameConverter.java +++ b/plugins/devkit/src/dom/impl/PluginFieldNameConverter.java @@ -16,8 +16,10 @@ package org.jetbrains.idea.devkit.dom.impl; import com.intellij.psi.*; +import com.intellij.refactoring.psi.PropertyUtils; import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.ResolvingConverter; +import com.intellij.util.xmlb.annotations.Attribute; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,9 +57,30 @@ public class PluginFieldNameConverter extends ResolvingConverter { @Nullable @Override public PsiField fromString(@Nullable @NonNls String s, ConvertContext context) { + if (s == null) return null; PsiClass value = getEPBeanClass(context); if (value == null) return null; - return value.findFieldByName(s, true); + PsiField field = value.findFieldByName(s, true); + if (field != null) { + return field; + } + return findFieldByAttributeValue(value, s); + } + + private static PsiField findFieldByAttributeValue(PsiClass psiClass, @NotNull String attrNameToFind) { + final PsiConstantEvaluationHelper evalHelper = JavaPsiFacade.getInstance(psiClass.getProject()).getConstantEvaluationHelper(); + for (PsiField psiField : psiClass.getAllFields()) { + final PsiMethod getter = PropertyUtils.findGetterForField(psiField); + final PsiMethod setter = PropertyUtils.findSetterForField(psiField); + final PsiAnnotation attrAnno = ExtensionDomExtender.findAnnotation(Attribute.class, psiField, getter, setter); + if (attrAnno != null) { + final String attrName = ExtensionDomExtender.getStringAttribute(attrAnno, "value", evalHelper); + if (attrNameToFind.equals(attrName)) { + return psiField; + } + } + } + return null; } @Nullable