look at @Attribute(name="") when resolving <with attribute="">

This commit is contained in:
Dmitry Jemerov
2013-02-12 22:22:32 +01:00
parent 2ff7dea74d
commit aa54cd2a26
2 changed files with 35 additions and 8 deletions
@@ -152,7 +152,7 @@ public class ExtensionDomExtender extends DomExtender<Extensions> {
}
@Nullable
private static With findWithElement(List<With> elements, PsiField field) {
public static With findWithElement(List<With> 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<Extensions> {
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<Extensions> {
}
});
}
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<Extensions> {
}
@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);
@@ -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<PsiField> {
@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