| package com.github.javaparser.generator; |
| |
| import com.github.javaparser.ast.CompilationUnit; |
| import com.github.javaparser.ast.body.CallableDeclaration; |
| import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; |
| import com.github.javaparser.metamodel.BaseNodeMetaModel; |
| import com.github.javaparser.metamodel.JavaParserMetaModel; |
| import com.github.javaparser.utils.Log; |
| import com.github.javaparser.utils.Pair; |
| import com.github.javaparser.utils.SourceRoot; |
| |
| import java.io.IOException; |
| import java.util.List; |
| |
| import static com.github.javaparser.utils.CodeGenerationUtils.f; |
| |
| /** |
| * Makes it easier to generate code in the core AST nodes. The generateNode method will get every node type passed to |
| * it, ready for modification. |
| */ |
| public abstract class NodeGenerator extends Generator { |
| protected NodeGenerator(SourceRoot sourceRoot) { |
| super(sourceRoot); |
| } |
| |
| public final void generate() throws Exception { |
| Log.info("Running %s", getClass().getSimpleName()); |
| for (BaseNodeMetaModel nodeMetaModel : JavaParserMetaModel.getNodeMetaModels()) { |
| Pair<CompilationUnit, ClassOrInterfaceDeclaration> result = parseNode(nodeMetaModel); |
| generateNode(nodeMetaModel, result.a, result.b); |
| } |
| after(); |
| } |
| |
| protected Pair<CompilationUnit, ClassOrInterfaceDeclaration> parseNode(BaseNodeMetaModel nodeMetaModel) { |
| CompilationUnit nodeCu = sourceRoot.parse(nodeMetaModel.getPackageName(), nodeMetaModel.getTypeName() + ".java"); |
| ClassOrInterfaceDeclaration nodeCoid = nodeCu.getClassByName(nodeMetaModel.getTypeName()).orElseThrow(() -> new AssertionError("Can't find class")); |
| return new Pair<>(nodeCu, nodeCoid); |
| } |
| |
| protected void after() throws Exception { |
| |
| } |
| |
| protected abstract void generateNode(BaseNodeMetaModel nodeMetaModel, CompilationUnit nodeCu, ClassOrInterfaceDeclaration nodeCoid) throws Exception; |
| } |