Skip to content

Commit

Permalink
Have visitors working with the meta model
Browse files Browse the repository at this point in the history
  • Loading branch information
matozoid committed Jan 21, 2017
1 parent 2810201 commit bd289e2
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 13 deletions.
Expand Up @@ -36,10 +36,10 @@
*/
public interface VoidVisitor<A> {

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);
Expand Down
Expand Up @@ -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();

Expand Down Expand Up @@ -64,4 +74,5 @@ protected void generateVisitorFor(BaseNodeMetaModel node, MethodDeclaration visi
body.addStatement(returnStatement);
}
}

}
Expand Up @@ -4,15 +4,14 @@
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;

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;
Expand All @@ -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<ClassOrInterfaceDeclaration> visitorClassOptional = voidVisitorCu.getClassByName(visitorClassName);
Optional<ClassOrInterfaceDeclaration> visitorClassOptional = compilationUnit.getClassByName(visitorClassName);
if (!visitorClassOptional.isPresent()) {
visitorClassOptional = voidVisitorCu.getInterfaceByName(visitorClassName);
visitorClassOptional = compilationUnit.getInterfaceByName(visitorClassName);
}
ClassOrInterfaceDeclaration visitorClass = visitorClassOptional.get();

Expand All @@ -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);
}
Expand Up @@ -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);
}
}

0 comments on commit bd289e2

Please sign in to comment.