Home | History | Annotate | Download | only in visitor
      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