From 8fb9d2e74dbcf38d433728229baa8f8c5658630c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Tue, 17 Mar 2020 19:49:06 +0100 Subject: [PATCH] Implement for java --- .../designerbindings/DesignerBindings.java | 13 +-- .../pmd/lang/java/AbstractJavaHandler.java | 6 ++ .../java/internal/JavaDesignerBindings.java | 96 +++++++++++++++++++ 3 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaDesignerBindings.java diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/designerbindings/DesignerBindings.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/designerbindings/DesignerBindings.java index 4731c2d118..4e316ae204 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/designerbindings/DesignerBindings.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/designerbindings/DesignerBindings.java @@ -12,8 +12,6 @@ import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.ast.xpath.Attribute; import net.sourceforge.pmd.lang.symboltable.ScopedNode; -import com.sun.istack.internal.Nullable; - /** * Gathers some services to customise how language implementations bind * to the designer. @@ -41,7 +39,6 @@ public interface DesignerBindings { *

Order of the collection is unimportant, it's sorted using * {@link AdditionalInfo#getAlphaSortKey()}. */ - @Nullable Collection getAdditionalInfo(Node node); @@ -59,6 +56,10 @@ public interface DesignerBindings { this.display = display; } + public AdditionalInfo(String display) { + this(display, display); + } + /** * Returns the string used to sort the additional info. * For example, returning {@code "A"} ensures this is displayed @@ -96,7 +97,7 @@ public interface DesignerBindings { * *

This method is meant to break the designer's dependency on {@link Node#getImage()}. */ - @Nullable + // @Nullable Attribute getMainAttribute(Node node); @@ -112,7 +113,7 @@ public interface DesignerBindings { * in the treeview and other relevant places. Returns null if no icon * is applicable. */ - @Nullable + // @Nullable TreeIconId getIcon(Node node); @@ -125,7 +126,7 @@ public interface DesignerBindings { METHOD, CONSTRUCTOR, FIELD, - LOCAL_VAR + VARIABLE } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/AbstractJavaHandler.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/AbstractJavaHandler.java index 58485f357a..afee0df9c6 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/AbstractJavaHandler.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/AbstractJavaHandler.java @@ -21,6 +21,7 @@ import net.sourceforge.pmd.lang.java.ast.JavaNode; import net.sourceforge.pmd.lang.java.ast.MethodLikeNode; import net.sourceforge.pmd.lang.java.dfa.DataFlowFacade; import net.sourceforge.pmd.lang.java.dfa.JavaDFAGraphRule; +import net.sourceforge.pmd.lang.java.internal.JavaDesignerBindings; import net.sourceforge.pmd.lang.java.multifile.MultifileVisitorFacade; import net.sourceforge.pmd.lang.java.qname.QualifiedNameResolver; import net.sourceforge.pmd.lang.java.rule.JavaRuleViolationFactory; @@ -34,6 +35,7 @@ import net.sourceforge.pmd.lang.java.xpath.TypeIsFunction; import net.sourceforge.pmd.lang.java.xpath.TypeOfFunction; import net.sourceforge.pmd.lang.metrics.LanguageMetricsProvider; import net.sourceforge.pmd.lang.rule.RuleViolationFactory; +import net.sourceforge.pmd.util.designerbindings.DesignerBindings; import net.sf.saxon.sxpath.IndependentContext; @@ -151,6 +153,10 @@ public abstract class AbstractJavaHandler extends AbstractLanguageVersionHandler }; } + @Override + public DesignerBindings getDesignerBindings() { + return JavaDesignerBindings.INSTANCE; + } @Override public DFAGraphRule getDFAGraphRule() { diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaDesignerBindings.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaDesignerBindings.java new file mode 100644 index 0000000000..86e8c47b0f --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaDesignerBindings.java @@ -0,0 +1,96 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.java.internal; + +import java.util.Collection; +import java.util.Collections; + +import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.ast.xpath.Attribute; +import net.sourceforge.pmd.lang.java.ast.ASTAnyTypeDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTRecordConstructorDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId; +import net.sourceforge.pmd.lang.java.ast.JavaNode; +import net.sourceforge.pmd.lang.java.ast.JavaParserVisitor; +import net.sourceforge.pmd.lang.java.ast.JavaParserVisitorReducedAdapter; +import net.sourceforge.pmd.lang.java.ast.TypeNode; +import net.sourceforge.pmd.util.designerbindings.DesignerBindings.DefaultDesignerBindings; + +public final class JavaDesignerBindings extends DefaultDesignerBindings { + + public static final JavaDesignerBindings INSTANCE = new JavaDesignerBindings(); + + private JavaDesignerBindings() { + + } + + @Override + public Attribute getMainAttribute(Node node) { + if (node instanceof JavaNode) { + Attribute attr = (Attribute) ((JavaNode) node).jjtAccept(MainAttrVisitor.INSTANCE, null); + if (attr != null) { + return attr; + } + } + + + return super.getMainAttribute(node); + } + + @Override + public TreeIconId getIcon(Node node) { + if (node instanceof ASTFieldDeclaration) { + return TreeIconId.FIELD; + } else if (node instanceof ASTAnyTypeDeclaration) { + return TreeIconId.CLASS; + } else if (node instanceof ASTMethodDeclaration) { + return TreeIconId.METHOD; + } else if (node instanceof ASTConstructorDeclaration + || node instanceof ASTRecordConstructorDeclaration) { + return TreeIconId.CONSTRUCTOR; + } else if (node instanceof ASTVariableDeclaratorId) { + return TreeIconId.VARIABLE; + } + return super.getIcon(node); + } + + @Override + public Collection getAdditionalInfo(Node node) { + if (node instanceof TypeNode) { + Class type = ((TypeNode) node).getType(); + if (type != null) { + return Collections.singletonList(new AdditionalInfo("Type: " + type)); + } + } + return super.getAdditionalInfo(node); + } + + private static final class MainAttrVisitor extends JavaParserVisitorReducedAdapter { + + private static final JavaParserVisitor INSTANCE = new MainAttrVisitor(); + + private MainAttrVisitor() { + + } + + @Override + public Object visit(JavaNode node, Object data) { + return null; // don't recurse + } + + @Override + public Object visit(ASTAnyTypeDeclaration node, Object data) { + return new Attribute(node, "SimpleName", node.getSimpleName()); + } + + @Override + public Object visit(ASTMethodDeclaration node, Object data) { + return new Attribute(node, "Name", node.getName()); + } + } +}