From a79ba4e5b09a7511b1763f52a6e526e6c3565357 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 12 Feb 2013 22:17:02 +0100 Subject: [PATCH] separate "tag" and "attribute" attributes on tag; correctly create extension registration when class name is specified in a subtag (IDEA-60730 done) --- .../src/META-INF/LangExtensionPoints.xml | 2 +- plugins/devkit/src/dom/With.java | 4 ++++ .../dom/impl/PluginFieldNameConverter.java | 6 ++++- .../inspections/quickfix/AddWithTagFix.java | 23 ++++++++++++------- .../quickfix/ExtensionPointCandidate.java | 5 +++- .../quickfix/RegisterExtensionFix.java | 8 ++++++- .../RegisterExtensionFixProvider.java | 5 ++-- 7 files changed, 39 insertions(+), 14 deletions(-) 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)); } }