From bd289e2af0435bcbbbcb94c1c1325d152a447473 Mon Sep 17 00:00:00 2001 From: Danny van Bruggen Date: Sat, 21 Jan 2017 21:07:25 +0100 Subject: [PATCH] Have visitors working with the meta model --- .../javaparser/ast/visitor/VoidVisitor.java | 4 +-- .../visitor/HashCodeVisitorGenerator.java | 13 ++++++++- .../generator/visitor/VisitorGenerator.java | 27 ++++++++++++------- .../visitor/VoidVisitorGenerator.java | 12 ++++++++- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java index d5fe58957e..6d73139106 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java @@ -36,10 +36,10 @@ */ public interface VoidVisitor { - void visit(AnnotationDeclaration n, A arg); - void visit(NodeList n, A arg); + void visit(AnnotationDeclaration n, A arg); + void visit(AnnotationMemberDeclaration n, A arg); void visit(ArrayAccessExpr n, A arg); diff --git a/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/HashCodeVisitorGenerator.java b/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/HashCodeVisitorGenerator.java index 14cde4186b..f8255aa0db 100644 --- a/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/HashCodeVisitorGenerator.java +++ b/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/HashCodeVisitorGenerator.java @@ -22,7 +22,17 @@ public HashCodeVisitorGenerator(JavaParser javaParser, SourceRoot sourceRoot, Ja } @Override - protected void generateVisitorFor(BaseNodeMetaModel node, MethodDeclaration visitMethod, CompilationUnit voidVisitorCu) { + protected String getReturnType() { + return "Integer"; + } + + @Override + protected String getArgumentType() { + return "Void"; + } + + @Override + protected void generateVisitMethodBody(BaseNodeMetaModel node, MethodDeclaration visitMethod, CompilationUnit compilationUnit) { BlockStmt body = visitMethod.getBody().get(); body.getStatements().clear(); @@ -64,4 +74,5 @@ protected void generateVisitorFor(BaseNodeMetaModel node, MethodDeclaration visi body.addStatement(returnStatement); } } + } diff --git a/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/VisitorGenerator.java b/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/VisitorGenerator.java index fb1a1e5e8f..df1f30de87 100644 --- a/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/VisitorGenerator.java +++ b/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/VisitorGenerator.java @@ -4,6 +4,7 @@ import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.type.Type; import com.github.javaparser.generator.utils.SourceRoot; import com.github.javaparser.metamodel.BaseNodeMetaModel; import com.github.javaparser.metamodel.JavaParserMetaModel; @@ -11,8 +12,6 @@ import java.io.IOException; import java.util.Optional; -import static com.github.javaparser.generator.utils.GeneratorUtils.f; - public abstract class VisitorGenerator { protected final JavaParser javaParser; protected final SourceRoot sourceRoot; @@ -29,11 +28,11 @@ public VisitorGenerator(JavaParser javaParser, SourceRoot sourceRoot, String pkg } public void generate() throws IOException { - CompilationUnit voidVisitorCu = sourceRoot.parse(pkg, visitorClassName + ".java", javaParser).get(); + CompilationUnit compilationUnit = sourceRoot.parse(pkg, visitorClassName + ".java", javaParser).get(); - Optional visitorClassOptional = voidVisitorCu.getClassByName(visitorClassName); + Optional visitorClassOptional = compilationUnit.getClassByName(visitorClassName); if (!visitorClassOptional.isPresent()) { - visitorClassOptional = voidVisitorCu.getInterfaceByName(visitorClassName); + visitorClassOptional = compilationUnit.getInterfaceByName(visitorClassName); } ClassOrInterfaceDeclaration visitorClass = visitorClassOptional.get(); @@ -43,13 +42,23 @@ public void generate() throws IOException { .filter(m -> m.getNameAsString().equals("visit")) .filter(m -> m.getParameter(0).getType().toString().equals(node.getTypeName())) .findFirst(); - visitMethod.ifPresent(m -> generateVisitorFor(node, m, voidVisitorCu)); - if (!visitMethod.isPresent()) { - System.out.println(f("No visit method found for type %s", node)); + + if (visitMethod.isPresent()) { + generateVisitMethodBody(node, visitMethod.get(), compilationUnit); + } else { + MethodDeclaration methodDeclaration = visitorClass.addMethod("visit") + .addParameter(node.getTypeNameGenericsed(), "n") + .addParameter(getArgumentType(), "arg") + .setType(getReturnType()); + generateVisitMethodBody(node, methodDeclaration, compilationUnit); } } } } - protected abstract void generateVisitorFor(BaseNodeMetaModel node, MethodDeclaration visitMethod, CompilationUnit voidVisitorCu); + protected abstract String getReturnType(); + + protected abstract String getArgumentType(); + + protected abstract void generateVisitMethodBody(BaseNodeMetaModel node, MethodDeclaration visitMethod, CompilationUnit compilationUnit); } diff --git a/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/VoidVisitorGenerator.java b/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/VoidVisitorGenerator.java index 7a0a7dacfa..65d26800f9 100644 --- a/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/VoidVisitorGenerator.java +++ b/javaparser-visitor-generator/src/main/java/com/github/javaparser/generator/visitor/VoidVisitorGenerator.java @@ -13,7 +13,17 @@ public VoidVisitorGenerator(JavaParser javaParser, SourceRoot sourceRoot, JavaPa } @Override - protected void generateVisitorFor(BaseNodeMetaModel node, MethodDeclaration visitMethod, CompilationUnit voidVisitorCu) { + protected String getReturnType() { + return "void"; + } + + @Override + protected String getArgumentType() { + return "A"; + } + + @Override + protected void generateVisitMethodBody(BaseNodeMetaModel node, MethodDeclaration visitMethod, CompilationUnit compilationUnit) { visitMethod.setBody(null); } }