blob: 18ab60d999d3a56d808985116ac994749fec3427 [file] [log] [blame]
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;
}