1 package com.github.javaparser.generator; 2 3 import com.github.javaparser.ast.CompilationUnit; 4 import com.github.javaparser.ast.body.CallableDeclaration; 5 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 6 import com.github.javaparser.metamodel.BaseNodeMetaModel; 7 import com.github.javaparser.metamodel.JavaParserMetaModel; 8 import com.github.javaparser.utils.Log; 9 import com.github.javaparser.utils.Pair; 10 import com.github.javaparser.utils.SourceRoot; 11 12 import java.io.IOException; 13 import java.util.List; 14 15 import static com.github.javaparser.utils.CodeGenerationUtils.f; 16 17 /** 18 * Makes it easier to generate code in the core AST nodes. The generateNode method will get every node type passed to 19 * it, ready for modification. 20 */ 21 public abstract class NodeGenerator extends Generator { 22 protected NodeGenerator(SourceRoot sourceRoot) { 23 super(sourceRoot); 24 } 25 26 public final void generate() throws Exception { 27 Log.info("Running %s", getClass().getSimpleName()); 28 for (BaseNodeMetaModel nodeMetaModel : JavaParserMetaModel.getNodeMetaModels()) { 29 Pair<CompilationUnit, ClassOrInterfaceDeclaration> result = parseNode(nodeMetaModel); 30 generateNode(nodeMetaModel, result.a, result.b); 31 } 32 after(); 33 } 34 35 protected Pair<CompilationUnit, ClassOrInterfaceDeclaration> parseNode(BaseNodeMetaModel nodeMetaModel) { 36 CompilationUnit nodeCu = sourceRoot.parse(nodeMetaModel.getPackageName(), nodeMetaModel.getTypeName() + ".java"); 37 ClassOrInterfaceDeclaration nodeCoid = nodeCu.getClassByName(nodeMetaModel.getTypeName()).orElseThrow(() -> new AssertionError("Can't find class")); 38 return new Pair<>(nodeCu, nodeCoid); 39 } 40 41 protected void after() throws Exception { 42 43 } 44 45 protected abstract void generateNode(BaseNodeMetaModel nodeMetaModel, CompilationUnit nodeCu, ClassOrInterfaceDeclaration nodeCoid) throws Exception; 46 } 47