From 6580c4b8a4a255f14a17885b29c257a03fd16b0f Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 15 Aug 2011 13:25:44 +0400 Subject: [PATCH] highlight usages of deprecated extension attributes in plugin.xml files --- .../xml/DeprecatedClassUsageInspection.java | 9 +++++- .../src/dom/impl/ExtensionDomExtender.java | 5 +-- .../impl/AbstractDomChildDescriptionImpl.java | 31 +++++++++++++++++++ .../util/xml/reflect/DomExtensionImpl.java | 10 ++++++ .../dom/AbstractDomChildrenDescriptor.java | 4 +-- .../impl/dom/DomAttributeXmlDescriptor.java | 8 +++-- .../xml/impl/dom/DomElementXmlDescriptor.java | 23 +++++--------- .../AbstractDomChildrenDescription.java | 5 +++ .../util/xml/reflect/DomExtension.java | 5 ++- 9 files changed, 76 insertions(+), 24 deletions(-) diff --git a/java/java-impl/src/com/intellij/util/xml/DeprecatedClassUsageInspection.java b/java/java-impl/src/com/intellij/util/xml/DeprecatedClassUsageInspection.java index dd0c9018439a..28aa3962c96f 100644 --- a/java/java-impl/src/com/intellij/util/xml/DeprecatedClassUsageInspection.java +++ b/java/java-impl/src/com/intellij/util/xml/DeprecatedClassUsageInspection.java @@ -23,6 +23,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiReference; import com.intellij.psi.XmlElementVisitor; +import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; @@ -42,8 +43,14 @@ public class DeprecatedClassUsageInspection extends XmlSuppressableInspectionToo return new XmlElementVisitor() { @Override public void visitXmlTag(XmlTag tag) { - if (tag.getValue().getTextElements().length > 0) + if (tag.getValue().getTextElements().length > 0) { checkReferences(tag, holder); + } + } + + @Override + public void visitXmlAttribute(XmlAttribute attribute) { + checkReferences(attribute, holder); } @Override diff --git a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java index c1926e7d9076..99f73ea46428 100644 --- a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java +++ b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java @@ -144,7 +144,7 @@ public class ExtensionDomExtender extends DomExtender { final String attrName = getStringAttribute(attrAnno, "value", evalHelper); if (attrName != null) { final DomExtension extension = - registrar.registerGenericAttributeValueChildExtension(new XmlName(attrName), String.class); + registrar.registerGenericAttributeValueChildExtension(new XmlName(attrName), String.class).setDeclaringElement(field); if (fieldName.endsWith("Class")) { extension.setConverter(CLASS_CONVERTER); } @@ -159,7 +159,8 @@ public class ExtensionDomExtender extends DomExtender { propAnno != null && getBooleanAttribute(propAnno, "surroundWithTag", evalHelper)? Constants.OPTION : null; if (tagName != null) { if (absColAnno == null) { - final DomExtension extension = registrar.registerFixedNumberChildExtension(new XmlName(tagName), SimpleTagValue.class); + final DomExtension extension = + registrar.registerFixedNumberChildExtension(new XmlName(tagName), SimpleTagValue.class).setDeclaringElement(field); if (fieldName.endsWith("Class")) { extension.setConverter(CLASS_CONVERTER); } diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/AbstractDomChildDescriptionImpl.java b/xml/dom-impl/src/com/intellij/util/xml/impl/AbstractDomChildDescriptionImpl.java index f6270ed8a52a..20909bd91efd 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/AbstractDomChildDescriptionImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/AbstractDomChildDescriptionImpl.java @@ -16,12 +16,18 @@ package com.intellij.util.xml.impl; import com.intellij.ide.presentation.Presentation; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Factory; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NullableLazyValue; +import com.intellij.pom.references.PomService; +import com.intellij.psi.PsiElement; +import com.intellij.psi.SmartPsiElementPointer; import com.intellij.util.ReflectionUtil; import com.intellij.util.xml.*; import com.intellij.util.xml.reflect.AbstractDomChildrenDescription; +import com.intellij.util.xml.reflect.DomExtension; +import com.intellij.util.xml.reflect.DomExtensionImpl; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -126,4 +132,29 @@ public abstract class AbstractDomChildDescriptionImpl implements AbstractDomChil public ElementPresentationTemplate getPresentationTemplate() { return myPresentationTemplate.getValue(); } + + @Nullable + public PsiElement getDeclaration(final Project project) { + final DomAnchor anchor = getUserData(DomExtension.KEY_DECLARATION); + if (anchor != null) { + final DomElement declaration = anchor.retrieveDomElement(); + if (declaration != null) { + final DomTarget target = DomTarget.getTarget(declaration); + if (target != null) { + return PomService.convertToPsi(target); + } + return declaration.getXmlElement(); + } + return anchor.getContainingFile(); + } + final SmartPsiElementPointer pointer = getUserData(DomExtensionImpl.DECLARING_ELEMENT_KEY); + if (pointer != null) { + final PsiElement element = pointer.getElement(); + if (element != null) { + return element; + } + } + + return PomService.convertToPsi(project, this); + } } diff --git a/xml/dom-impl/src/com/intellij/util/xml/reflect/DomExtensionImpl.java b/xml/dom-impl/src/com/intellij/util/xml/reflect/DomExtensionImpl.java index ad6b245bc406..307539e7566d 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/reflect/DomExtensionImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/reflect/DomExtensionImpl.java @@ -16,6 +16,9 @@ package com.intellij.util.xml.reflect; import com.intellij.openapi.util.Key; +import com.intellij.psi.PsiElement; +import com.intellij.psi.SmartPointerManager; +import com.intellij.psi.SmartPsiElementPointer; import com.intellij.util.SmartList; import com.intellij.util.xml.Converter; import com.intellij.util.xml.DomElement; @@ -36,6 +39,7 @@ import java.util.Map; */ public class DomExtensionImpl implements DomExtension { public static final Key> DOM_EXTENDER_KEY = Key.create("Dom.Extender"); + public static Key> DECLARING_ELEMENT_KEY = Key.create("Dom.Extension.PsiDeclaration"); private final XmlName myXmlName; private final Type myType; private Converter myConverter; @@ -73,6 +77,12 @@ public class DomExtensionImpl implements DomExtension { return this; } + @Override + public DomExtension setDeclaringElement(@NotNull PsiElement declaringElement) { + putUserData(DECLARING_ELEMENT_KEY, SmartPointerManager.getInstance(declaringElement.getProject()).createSmartPsiElementPointer(declaringElement)); + return this; + } + public DomExtension setConverter(@NotNull Converter converter) { return setConverter(converter, false); } diff --git a/xml/dom-impl/src/com/intellij/xml/impl/dom/AbstractDomChildrenDescriptor.java b/xml/dom-impl/src/com/intellij/xml/impl/dom/AbstractDomChildrenDescriptor.java index b8baa40361a2..116e8ce73829 100644 --- a/xml/dom-impl/src/com/intellij/xml/impl/dom/AbstractDomChildrenDescriptor.java +++ b/xml/dom-impl/src/com/intellij/xml/impl/dom/AbstractDomChildrenDescriptor.java @@ -138,7 +138,7 @@ public abstract class AbstractDomChildrenDescriptor implements XmlElementDescrip List descriptors = new ArrayList(); for (DomAttributeChildDescription description : descriptions) { - descriptors.add(new DomAttributeXmlDescriptor(description)); + descriptors.add(new DomAttributeXmlDescriptor(description, myManager.getProject())); } return descriptors.toArray(new XmlAttributeDescriptor[descriptors.size()]); @@ -151,7 +151,7 @@ public abstract class AbstractDomChildrenDescriptor implements XmlElementDescrip for (DomAttributeChildDescription description : domElement.getGenericInfo().getAttributeChildrenDescriptions()) { if (attributeName.equals(DomAttributeXmlDescriptor.getQualifiedAttributeName(context, description.getXmlName()))) { - return new DomAttributeXmlDescriptor(description); + return new DomAttributeXmlDescriptor(description, myManager.getProject()); } } return null; diff --git a/xml/dom-impl/src/com/intellij/xml/impl/dom/DomAttributeXmlDescriptor.java b/xml/dom-impl/src/com/intellij/xml/impl/dom/DomAttributeXmlDescriptor.java index c66368af52a3..eb79b6e56acc 100644 --- a/xml/dom-impl/src/com/intellij/xml/impl/dom/DomAttributeXmlDescriptor.java +++ b/xml/dom-impl/src/com/intellij/xml/impl/dom/DomAttributeXmlDescriptor.java @@ -15,6 +15,7 @@ */ package com.intellij.xml.impl.dom; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.xml.XmlElement; @@ -33,9 +34,11 @@ import org.jetbrains.annotations.Nullable; */ public class DomAttributeXmlDescriptor implements XmlAttributeDescriptor { private final DomAttributeChildDescription myDescription; + private final Project myProject; - public DomAttributeXmlDescriptor(final DomAttributeChildDescription description) { + public DomAttributeXmlDescriptor(final DomAttributeChildDescription description, Project project) { myDescription = description; + myProject = project; } public boolean isRequired() { @@ -73,8 +76,9 @@ public class DomAttributeXmlDescriptor implements XmlAttributeDescriptor { return null; } + @Nullable public PsiElement getDeclaration() { - return null; + return myDescription.getDeclaration(myProject); } @NonNls diff --git a/xml/dom-impl/src/com/intellij/xml/impl/dom/DomElementXmlDescriptor.java b/xml/dom-impl/src/com/intellij/xml/impl/dom/DomElementXmlDescriptor.java index c37e6d2c7b47..28315641cfdf 100644 --- a/xml/dom-impl/src/com/intellij/xml/impl/dom/DomElementXmlDescriptor.java +++ b/xml/dom-impl/src/com/intellij/xml/impl/dom/DomElementXmlDescriptor.java @@ -15,16 +15,15 @@ */ package com.intellij.xml.impl.dom; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.pom.references.PomService; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.xml.*; import com.intellij.util.xml.reflect.DomChildrenDescription; -import com.intellij.util.xml.reflect.DomExtension; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,20 +54,7 @@ public class DomElementXmlDescriptor extends AbstractDomChildrenDescriptor { @Nullable public PsiElement getDeclaration() { - final DomAnchor anchor = myChildrenDescription.getUserData(DomExtension.KEY_DECLARATION); - if (anchor != null) { - final DomElement declaration = anchor.retrieveDomElement(); - if (declaration != null) { - final DomTarget target = DomTarget.getTarget(declaration); - if (target != null) { - return PomService.convertToPsi(target); - } - return declaration.getXmlElement(); - } - return anchor.getContainingFile(); - } - - return PomService.convertToPsi(myManager.getProject(), myChildrenDescription); + return myChildrenDescription.getDeclaration(myManager.getProject()); } @NonNls @@ -174,6 +160,11 @@ public class DomElementXmlDescriptor extends AbstractDomChildrenDescriptor { public T getAnnotation(final Class annotationClass) { throw new UnsupportedOperationException("Method getAnnotation not implemented in " + getClass()); } + + @Nullable + public PsiElement getDeclaration(final Project project) { + return null; + } } } diff --git a/xml/dom-openapi/src/com/intellij/util/xml/reflect/AbstractDomChildrenDescription.java b/xml/dom-openapi/src/com/intellij/util/xml/reflect/AbstractDomChildrenDescription.java index 2759a1168e48..8a80f60dcec2 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/reflect/AbstractDomChildrenDescription.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/reflect/AbstractDomChildrenDescription.java @@ -16,8 +16,10 @@ package com.intellij.util.xml.reflect; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.pom.PomTarget; +import com.intellij.psi.PsiElement; import com.intellij.util.xml.AnnotatedElement; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomNameStrategy; @@ -48,4 +50,7 @@ public interface AbstractDomChildrenDescription extends AnnotatedElement, PomTar @Nullable ElementPresentationTemplate getPresentationTemplate(); + + @Nullable + PsiElement getDeclaration(Project project); } diff --git a/xml/dom-openapi/src/com/intellij/util/xml/reflect/DomExtension.java b/xml/dom-openapi/src/com/intellij/util/xml/reflect/DomExtension.java index 8fe8d060b916..56290e67715a 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/reflect/DomExtension.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/reflect/DomExtension.java @@ -17,6 +17,7 @@ package com.intellij.util.xml.reflect; import com.intellij.openapi.util.Key; +import com.intellij.psi.PsiElement; import com.intellij.util.xml.Converter; import com.intellij.util.xml.DomAnchor; import com.intellij.util.xml.DomElement; @@ -35,7 +36,9 @@ public interface DomExtension { Type getType(); DomExtension setDeclaringElement(@NotNull DomElement declaringElement); - + + DomExtension setDeclaringElement(@NotNull PsiElement declaringElement); + DomExtension setConverter(@NotNull Converter converter); DomExtension setConverter(@NotNull Converter converter, boolean soft);