1 package com.github.javaparser.generator.core.visitor; 2 3 import com.github.javaparser.ast.CompilationUnit; 4 import com.github.javaparser.ast.body.MethodDeclaration; 5 import com.github.javaparser.ast.stmt.BlockStmt; 6 import com.github.javaparser.generator.VisitorGenerator; 7 import com.github.javaparser.utils.SourceRoot; 8 import com.github.javaparser.metamodel.BaseNodeMetaModel; 9 import com.github.javaparser.metamodel.PropertyMetaModel; 10 11 import static com.github.javaparser.utils.CodeGenerationUtils.f; 12 13 /** 14 * Generates JavaParser's VoidVisitorAdapter. 15 */ 16 public class GenericVisitorAdapterGenerator extends VisitorGenerator { 17 public GenericVisitorAdapterGenerator(SourceRoot sourceRoot) { 18 super(sourceRoot, "com.github.javaparser.ast.visitor", "GenericVisitorAdapter", "R", "A", true); 19 } 20 21 @Override 22 protected void generateVisitMethodBody(BaseNodeMetaModel node, MethodDeclaration visitMethod, CompilationUnit compilationUnit) { 23 visitMethod.getParameters().forEach(p -> p.setFinal(true)); 24 25 BlockStmt body = visitMethod.getBody().get(); 26 body.getStatements().clear(); 27 28 body.addStatement("R result;"); 29 30 final String resultCheck = "if (result != null) return result;"; 31 32 for (PropertyMetaModel field : node.getAllPropertyMetaModels()) { 33 final String getter = field.getGetterMethodName() + "()"; 34 if (field.getNodeReference().isPresent()) { 35 if (field.isOptional()) { 36 body.addStatement(f("if (n.%s.isPresent()) {" + 37 " result = n.%s.get().accept(this, arg);" + 38 " %s" + 39 "}", getter, getter, resultCheck)); 40 } else { 41 body.addStatement(f("{ result = n.%s.accept(this, arg); %s }", getter, resultCheck)); 42 } 43 } 44 } 45 body.addStatement("return null;"); 46 } 47 } 48