mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
separate "tag" and "attribute" attributes on <with> tag; correctly create extension registration when class name is specified in a subtag (IDEA-60730 done)
This commit is contained in:
@@ -43,7 +43,7 @@
|
||||
|
||||
<extensionPoint name="intentionAction"
|
||||
beanClass="com.intellij.codeInsight.intention.IntentionActionBean">
|
||||
<with attribute="className" implements="com.intellij.codeInsight.intention.IntentionAction"/>
|
||||
<with tag="className" implements="com.intellij.codeInsight.intention.IntentionAction"/>
|
||||
</extensionPoint>
|
||||
|
||||
<extensionPoint name="codeInsight.unresolvedReferenceQuickFixProvider"
|
||||
|
||||
@@ -34,6 +34,10 @@ public interface With extends DomElement {
|
||||
@Convert(PluginFieldNameConverter.class)
|
||||
GenericAttributeValue<PsiField> getAttribute();
|
||||
|
||||
@NotNull
|
||||
@Attribute("tag")
|
||||
@Convert(PluginFieldNameConverter.class)
|
||||
GenericAttributeValue<PsiField> getTag();
|
||||
|
||||
@NotNull
|
||||
@Attribute("implements")
|
||||
|
||||
@@ -77,10 +77,14 @@ public class PluginFieldNameConverter extends ResolvingConverter<PsiField> {
|
||||
}
|
||||
|
||||
public static String getAttributeAnnotationValue(PsiField psiField) {
|
||||
return getAnnotationValue(psiField, Attribute.class);
|
||||
}
|
||||
|
||||
public static String getAnnotationValue(PsiField psiField, Class annotationClass) {
|
||||
final PsiConstantEvaluationHelper evalHelper = JavaPsiFacade.getInstance(psiField.getProject()).getConstantEvaluationHelper();
|
||||
final PsiMethod getter = PropertyUtils.findGetterForField(psiField);
|
||||
final PsiMethod setter = PropertyUtils.findSetterForField(psiField);
|
||||
final PsiAnnotation attrAnno = ExtensionDomExtender.findAnnotation(Attribute.class, psiField, getter, setter);
|
||||
final PsiAnnotation attrAnno = ExtensionDomExtender.findAnnotation(annotationClass, psiField, getter, setter);
|
||||
if (attrAnno != null) {
|
||||
return ExtensionDomExtender.getStringAttribute(attrAnno, "value", evalHelper);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.intellij.psi.search.PsiShortNamesCache;
|
||||
import com.intellij.util.PsiNavigateUtil;
|
||||
import com.intellij.util.xml.DomElement;
|
||||
import com.intellij.util.xml.DomUtil;
|
||||
import com.intellij.util.xmlb.annotations.Tag;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.idea.devkit.dom.ExtensionPoint;
|
||||
import org.jetbrains.idea.devkit.dom.With;
|
||||
@@ -61,15 +62,21 @@ public class AddWithTagFix implements LocalQuickFix {
|
||||
List<PsiField> fields = ExtensionPointBeanClassInspection.collectMissingWithTags(extensionPoint);
|
||||
PsiElement navTarget = null;
|
||||
for (PsiField field : fields) {
|
||||
String attributeName = PluginFieldNameConverter.getAttributeAnnotationValue(field);
|
||||
if (attributeName == null) {
|
||||
attributeName = field.getName();
|
||||
}
|
||||
if (attributeName.equals("forClass")) {
|
||||
continue;
|
||||
}
|
||||
With with = extensionPoint.addWith();
|
||||
with.getAttribute().setStringValue(attributeName);
|
||||
String tagName = PluginFieldNameConverter.getAnnotationValue(field, Tag.class);
|
||||
if (tagName != null) {
|
||||
with.getTag().setStringValue(tagName);
|
||||
}
|
||||
else {
|
||||
String attributeName = PluginFieldNameConverter.getAttributeAnnotationValue(field);
|
||||
if (attributeName == null) {
|
||||
attributeName = field.getName();
|
||||
}
|
||||
if (attributeName.equals("forClass")) {
|
||||
continue;
|
||||
}
|
||||
with.getAttribute().setStringValue(attributeName);
|
||||
}
|
||||
String epName = extensionPoint.getName().getStringValue();
|
||||
String className = "";
|
||||
if (epName != null) {
|
||||
|
||||
@@ -21,17 +21,20 @@ package org.jetbrains.idea.devkit.inspections.quickfix;
|
||||
class ExtensionPointCandidate {
|
||||
public final String epName;
|
||||
public final String attributeName;
|
||||
public final String tagName;
|
||||
public final String beanClassName;
|
||||
|
||||
ExtensionPointCandidate(String epName, String attributeName, String beanClassName) {
|
||||
ExtensionPointCandidate(String epName, String attributeName, String tagName, String beanClassName) {
|
||||
this.epName = epName;
|
||||
this.attributeName = attributeName;
|
||||
this.tagName = tagName;
|
||||
this.beanClassName = beanClassName;
|
||||
}
|
||||
|
||||
ExtensionPointCandidate(String epName) {
|
||||
this.epName = epName;
|
||||
this.attributeName = "implementation";
|
||||
this.tagName = null;
|
||||
this.beanClassName = null;
|
||||
}
|
||||
|
||||
|
||||
@@ -114,7 +114,13 @@ public class RegisterExtensionFix implements IntentionAction {
|
||||
XmlAttribute attr = tag.setAttribute(keyAttrName, "");
|
||||
navTarget = attr.getValueElement();
|
||||
}
|
||||
tag.setAttribute(candidate.attributeName, myExtensionClass.getQualifiedName());
|
||||
if (candidate.attributeName != null) {
|
||||
tag.setAttribute(candidate.attributeName, myExtensionClass.getQualifiedName());
|
||||
}
|
||||
else {
|
||||
XmlTag subTag = tag.createChildTag(candidate.tagName, null, myExtensionClass.getQualifiedName(), false);
|
||||
tag.addSubTag(subTag, false);
|
||||
}
|
||||
result.setResult(navTarget != null ? navTarget : extension.getXmlTag());
|
||||
}
|
||||
}.execute().throwException().getResultObject();
|
||||
|
||||
@@ -101,10 +101,11 @@ public class RegisterExtensionFixProvider implements UnusedDeclarationFixProvide
|
||||
XmlTag extensionPointTag = tag.getParentTag();
|
||||
if (!"extensionPoint".equals(extensionPointTag.getName())) return;
|
||||
String attrName = tag.getAttributeValue("attribute");
|
||||
String tagName = tag.getAttributeValue("tag");
|
||||
String epName = getEPName(extensionPointTag);
|
||||
String beanClassName = extensionPointTag.getAttributeValue("beanClass");
|
||||
if (attrName == null || epName == null) return;
|
||||
list.add(new ExtensionPointCandidate(epName, attrName, beanClassName));
|
||||
if ((attrName == null && tagName == null) || epName == null) return;
|
||||
list.add(new ExtensionPointCandidate(epName, attrName, tagName, beanClassName));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user