From 0b81c72f403c65c8370c67c0297fc6ab8fbd2a61 Mon Sep 17 00:00:00 2001 From: David Renz Date: Tue, 29 Mar 2016 16:18:01 +0200 Subject: [PATCH] Changed root node from (AST)UserClass to (AST)Compilation --- .../pmd/lang/apex/ast/ASTCompilation.java | 8 +++++- .../pmd/lang/apex/ast/ApexParser.java | 27 ++++++++++++++----- .../pmd/lang/apex/ast/ApexTreeBuilder.java | 2 ++ .../pmd/lang/apex/ast/ApexParserTest.java | 14 +++++----- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTCompilation.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTCompilation.java index ca19f4bf6f..45bcb67151 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTCompilation.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTCompilation.java @@ -10,10 +10,16 @@ import apex.jorje.semantic.ast.compilation.Compilation; import net.sourceforge.pmd.lang.ast.RootNode; public class ASTCompilation extends AbstractApexNode implements RootNode { - public ASTCompilation(Compilation classOrInterface) { + + public ASTCompilation(Compilation classOrInterface) { super(classOrInterface); } + /** + * Accept the visitor. Note: This needs to be in each concrete node class, + * as otherwise the visitor won't work - as java resolves the type "this" at + * compile time. + */ public Object jjtAccept(ApexParserVisitor visitor, Object data) { return visitor.visit(this, data); } diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParser.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParser.java index 27cef9a72e..0447a5d40a 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParser.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParser.java @@ -13,7 +13,10 @@ import net.sourceforge.pmd.lang.ast.ParseException; import org.apache.commons.io.IOUtils; +import apex.jorje.semantic.ast.compilation.Compilation; import apex.jorje.semantic.ast.compilation.UserClass; +import apex.jorje.semantic.ast.compilation.UserEnum; +import apex.jorje.semantic.ast.compilation.UserInterface; import apex.jorje.semantic.ast.visitor.AdditionalPassScope; import apex.jorje.semantic.ast.visitor.AstVisitor; @@ -31,19 +34,19 @@ public class ApexParser { } } - public UserClass parseApex(final String sourceCode) throws ParseException { + public Compilation parseApex(final String sourceCode) throws ParseException { TopLevelVisitor visitor = new TopLevelVisitor(); CompilerService.INSTANCE.visitAstFromString(sourceCode, visitor); - UserClass astRoot = visitor.getTopLevel(); + Compilation astRoot = visitor.getTopLevel(); return astRoot; } - public ApexNode parse(final Reader reader) { + public ApexNode parse(final Reader reader) { try { final String sourceCode = IOUtils.toString(reader); - final UserClass astRoot = parseApex(sourceCode); + final Compilation astRoot = parseApex(sourceCode); final ApexTreeBuilder treeBuilder = new ApexTreeBuilder(); suppressMap = new HashMap<>(); @@ -51,7 +54,7 @@ public class ApexParser { throw new ParseException("Couldn't parse the source - there is not root node - Syntax Error??"); } - ApexNode tree = treeBuilder.build(astRoot); + ApexNode tree = treeBuilder.build(astRoot); return tree; } catch (IOException e) { throw new ParseException(e); @@ -63,9 +66,9 @@ public class ApexParser { } private class TopLevelVisitor extends AstVisitor { - UserClass topLevel; + Compilation topLevel; - public UserClass getTopLevel() { + public Compilation getTopLevel() { return topLevel; } @@ -73,5 +76,15 @@ public class ApexParser { public void visitEnd(UserClass node, AdditionalPassScope scope) { topLevel = node; } + + @Override + public void visitEnd(UserEnum node, AdditionalPassScope scope) { + topLevel = node; + } + + @Override + public void visitEnd(UserInterface node, AdditionalPassScope scope) { + topLevel = node; + } } } diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexTreeBuilder.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexTreeBuilder.java index 53de6560f9..4410b0c13c 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexTreeBuilder.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexTreeBuilder.java @@ -11,6 +11,7 @@ import java.util.Stack; import apex.jorje.semantic.ast.AstNode; import apex.jorje.semantic.ast.compilation.AnonymousClass; +import apex.jorje.semantic.ast.compilation.Compilation; import apex.jorje.semantic.ast.compilation.UserClass; import apex.jorje.semantic.ast.compilation.UserClassMethods; import apex.jorje.semantic.ast.compilation.UserEnum; @@ -112,6 +113,7 @@ public final class ApexTreeBuilder extends AstVisitor { register(BridgeMethodCreator.class, ASTBridgeMethodCreator.class); register(CatchBlockStatement.class, ASTCatchBlockStatement.class); register(ClassRefExpression.class, ASTClassRefExpression.class); + register(Compilation.class, ASTCompilation.class); register(ContinueStatement.class, ASTContinueStatement.class); register(DmlDeleteStatement.class, ASTDmlDeleteStatement.class); register(DmlInsertStatement.class, ASTDmlInsertStatement.class); diff --git a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexParserTest.java b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexParserTest.java index 361e766031..fea9e1df5b 100644 --- a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexParserTest.java +++ b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexParserTest.java @@ -17,6 +17,7 @@ import org.apache.commons.io.FileUtils; import org.junit.Assert; import org.junit.Test; +import apex.jorje.semantic.ast.compilation.Compilation; import net.sourceforge.pmd.lang.apex.ApexParserOptions; import net.sourceforge.pmd.lang.ast.Node; @@ -31,8 +32,8 @@ public class ApexParserTest { + " \n" + " }\n" + "}"; // Exercise - ASTUserClass rootNode = parse(code); - // dumpNode(rootNode); + ApexNode rootNode = parse(code); + dumpNode(rootNode); // Verify List methods = rootNode.findDescendantsOfType(ASTMethod.class); @@ -46,9 +47,10 @@ public class ApexParserTest { File[] fList = directory.listFiles(); for (File file : fList) { - if (file.isFile()) { + if (file.isFile() && file.getName().endsWith(".cls")) { String sourceCode = FileUtils.readFileToString(file); - ASTUserClass rootNode = parse(sourceCode); + ApexNode rootNode = parse(sourceCode); + dumpNode(rootNode); } } } catch (IOException e) { @@ -59,10 +61,10 @@ public class ApexParserTest { // TEST HELPER - private ASTUserClass parse(String code) { + private ApexNode parse(String code) { ApexParser parser = new ApexParser(new ApexParserOptions()); Reader reader = new StringReader(code); - return (ASTUserClass) parser.parse(reader); + return parser.parse(reader); } private void dumpNode(Node node) {