highlight usages of deprecated extension attributes in plugin.xml files

This commit is contained in:
nik
2011-08-15 13:26:14 +04:00
parent 66e7f4803f
commit 6580c4b8a4
9 changed files with 76 additions and 24 deletions
@@ -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
@@ -144,7 +144,7 @@ public class ExtensionDomExtender extends DomExtender<Extensions> {
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<Extensions> {
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);
}
@@ -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);
}
}
@@ -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<List<DomExtender>> DOM_EXTENDER_KEY = Key.create("Dom.Extender");
public static Key<SmartPsiElementPointer<?>> 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);
}
@@ -138,7 +138,7 @@ public abstract class AbstractDomChildrenDescriptor implements XmlElementDescrip
List<XmlAttributeDescriptor> descriptors = new ArrayList<XmlAttributeDescriptor>();
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;
@@ -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
@@ -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 extends Annotation> T getAnnotation(final Class<T> annotationClass) {
throw new UnsupportedOperationException("Method getAnnotation not implemented in " + getClass());
}
@Nullable
public PsiElement getDeclaration(final Project project) {
return null;
}
}
}
@@ -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);
}
@@ -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);