diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
index 7f7f0d7dd7ae..f286872f6f26 100644
--- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
+++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
@@ -43,7 +43,7 @@
-
+
getAttribute();
+ @NotNull
+ @Attribute("tag")
+ @Convert(PluginFieldNameConverter.class)
+ GenericAttributeValue getTag();
@NotNull
@Attribute("implements")
diff --git a/plugins/devkit/src/dom/impl/PluginFieldNameConverter.java b/plugins/devkit/src/dom/impl/PluginFieldNameConverter.java
index 37ce15267102..115e9f995ada 100644
--- a/plugins/devkit/src/dom/impl/PluginFieldNameConverter.java
+++ b/plugins/devkit/src/dom/impl/PluginFieldNameConverter.java
@@ -77,10 +77,14 @@ public class PluginFieldNameConverter extends ResolvingConverter {
}
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);
}
diff --git a/plugins/devkit/src/inspections/quickfix/AddWithTagFix.java b/plugins/devkit/src/inspections/quickfix/AddWithTagFix.java
index df5a7eeaf5da..dbe1f1bc1535 100644
--- a/plugins/devkit/src/inspections/quickfix/AddWithTagFix.java
+++ b/plugins/devkit/src/inspections/quickfix/AddWithTagFix.java
@@ -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 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) {
diff --git a/plugins/devkit/src/inspections/quickfix/ExtensionPointCandidate.java b/plugins/devkit/src/inspections/quickfix/ExtensionPointCandidate.java
index 384d115ba914..5bedaf3281da 100644
--- a/plugins/devkit/src/inspections/quickfix/ExtensionPointCandidate.java
+++ b/plugins/devkit/src/inspections/quickfix/ExtensionPointCandidate.java
@@ -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;
}
diff --git a/plugins/devkit/src/inspections/quickfix/RegisterExtensionFix.java b/plugins/devkit/src/inspections/quickfix/RegisterExtensionFix.java
index 5cb864ccfa5a..65392a815e93 100644
--- a/plugins/devkit/src/inspections/quickfix/RegisterExtensionFix.java
+++ b/plugins/devkit/src/inspections/quickfix/RegisterExtensionFix.java
@@ -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();
diff --git a/plugins/devkit/src/inspections/quickfix/RegisterExtensionFixProvider.java b/plugins/devkit/src/inspections/quickfix/RegisterExtensionFixProvider.java
index dab63ac2f7e5..8749be442316 100644
--- a/plugins/devkit/src/inspections/quickfix/RegisterExtensionFixProvider.java
+++ b/plugins/devkit/src/inspections/quickfix/RegisterExtensionFixProvider.java
@@ -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));
}
}