mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
look at @Attribute(name="") when resolving <with attribute="">
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user