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:
Dmitry Jemerov
2013-02-12 22:22:33 +01:00
parent 4bdc769a7a
commit a79ba4e5b0
7 changed files with 39 additions and 14 deletions
@@ -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"
+4
View File
@@ -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));
}
}