mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
highlight usages of deprecated extension attributes in plugin.xml files
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user