diff options
author | Danny van Bruggen <hexagonaal@gmail.com> | 2017-09-20 22:14:59 +0200 |
---|---|---|
committer | Danny van Bruggen <hexagonaal@gmail.com> | 2017-09-20 23:00:00 +0200 |
commit | ad9d33b5b22f4f4d470018e41d5c33c1eaf464c8 (patch) | |
tree | c3fbe5db2e0807063de09696f04d360fbd6c722c /javaparser-core-generators/src/main/java/com/github/javaparser | |
parent | fc96cb40b24ae84b5155360e91b4354365ed530f (diff) | |
download | javaparser-ad9d33b5b22f4f4d470018e41d5c33c1eaf464c8.tar.gz |
Generate typecasting code
Diffstat (limited to 'javaparser-core-generators/src/main/java/com/github/javaparser')
3 files changed, 88 insertions, 4 deletions
diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java index 81437ea34..4cf03e272 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java @@ -6,6 +6,7 @@ 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; @@ -25,18 +26,23 @@ public abstract class NodeGenerator extends Generator { public final void generate() throws Exception { Log.info("Running %s", getClass().getSimpleName()); for (BaseNodeMetaModel nodeMetaModel : JavaParserMetaModel.getNodeMetaModels()) { - CompilationUnit nodeCu = sourceRoot.parse(nodeMetaModel.getPackageName(), nodeMetaModel.getTypeName() + ".java"); - ClassOrInterfaceDeclaration nodeCoid = nodeCu.getClassByName(nodeMetaModel.getTypeName()).orElseThrow(() -> new IOException("Can't find class")); - generateNode(nodeMetaModel, nodeCu, nodeCoid); + Pair<CompilationUnit, ClassOrInterfaceDeclaration> result = parseNode(nodeMetaModel); + generateNode(nodeMetaModel, result.a, result.b); } after(); } + protected Pair<CompilationUnit, ClassOrInterfaceDeclaration> parseNode(BaseNodeMetaModel nodeMetaModel) throws IOException { + CompilationUnit nodeCu = sourceRoot.parse(nodeMetaModel.getPackageName(), nodeMetaModel.getTypeName() + ".java"); + ClassOrInterfaceDeclaration nodeCoid = nodeCu.getClassByName(nodeMetaModel.getTypeName()).orElseThrow(() -> new IOException("Can't find class")); + return new Pair<>(nodeCu, nodeCoid); + } + protected void after() throws Exception { } - protected abstract void generateNode(BaseNodeMetaModel nodeMetaModel, CompilationUnit nodeCu, ClassOrInterfaceDeclaration nodeCoid); + protected abstract void generateNode(BaseNodeMetaModel nodeMetaModel, CompilationUnit nodeCu, ClassOrInterfaceDeclaration nodeCoid) throws Exception; /** * Utility method that looks for a method or constructor with an identical signature as "callable" and replaces it diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java index 2b59bd192..0cdf79d49 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java @@ -27,6 +27,7 @@ public class CoreGenerator { } private void run(SourceRoot sourceRoot) throws Exception { + new TypeCastingGenerator(sourceRoot).generate(); new GenericListVisitorAdapterGenerator(sourceRoot).generate(); new GenericVisitorAdapterGenerator(sourceRoot).generate(); new GenericVisitorWithDefaultsGenerator(sourceRoot).generate(); diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/TypeCastingGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/TypeCastingGenerator.java new file mode 100644 index 000000000..4136705da --- /dev/null +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/TypeCastingGenerator.java @@ -0,0 +1,77 @@ +package com.github.javaparser.generator.core.node; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.BodyDeclaration; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.generator.NodeGenerator; +import com.github.javaparser.metamodel.BaseNodeMetaModel; +import com.github.javaparser.metamodel.JavaParserMetaModel; +import com.github.javaparser.utils.Pair; +import com.github.javaparser.utils.SourceRoot; + +import java.util.Set; +import java.util.function.Consumer; + +import static com.github.javaparser.JavaParser.parseBodyDeclaration; +import static com.github.javaparser.utils.CodeGenerationUtils.f; +import static com.github.javaparser.utils.Utils.set; + +public class TypeCastingGenerator extends NodeGenerator { + private final Set<BaseNodeMetaModel> baseNodes = set( + JavaParserMetaModel.statementMetaModel, + JavaParserMetaModel.expressionMetaModel, + JavaParserMetaModel.typeMetaModel, + JavaParserMetaModel.moduleStmtMetaModel, + JavaParserMetaModel.bodyDeclarationMetaModel, + JavaParserMetaModel.commentMetaModel + ); + + public TypeCastingGenerator(SourceRoot sourceRoot) { + super(sourceRoot); + } + + @Override + protected void generateNode(BaseNodeMetaModel nodeMetaModel, CompilationUnit nodeCu, ClassOrInterfaceDeclaration nodeCoid) throws Exception { + Pair<CompilationUnit, ClassOrInterfaceDeclaration> baseCode = null; + for (BaseNodeMetaModel baseNode : baseNodes) { + if(nodeMetaModel == baseNode) { + // We adjust the base models from the child nodes, + // so we don't do anything when we *are* the base model. + return; + } + if (nodeMetaModel.isInstanceOfMetaModel(baseNode)) { + baseCode = parseNode(baseNode); + } + } + + if (baseCode == null) { + // Node is not a child of one of the base nodes, so we don't want to generate this method for it. + return; + } + + // Generate the isType() method + final String typeName = nodeMetaModel.getTypeName(); + final MethodDeclaration baseIsTypeMethod = (MethodDeclaration) parseBodyDeclaration(f("public boolean is%s() { return false; }", typeName)); + final MethodDeclaration overriddenIsTypeMethod = (MethodDeclaration) parseBodyDeclaration(f("@Override public boolean is%s() { return true; }", typeName)); + + addOrReplaceWhenSameSignature(nodeCoid, overriddenIsTypeMethod); + addOrReplaceWhenSameSignature(baseCode.b, baseIsTypeMethod); + + annotateGenerated(overriddenIsTypeMethod); + annotateGenerated(baseIsTypeMethod); + + // Generate the asType() method + final MethodDeclaration asTypeMethod = (MethodDeclaration) parseBodyDeclaration(f("public %s as%s() { return (%s) this; }", typeName, typeName, typeName)); + addOrReplaceWhenSameSignature(baseCode.b, asTypeMethod); + annotateGenerated(asTypeMethod); + + // Generate the ifType(Consumer) method + final MethodDeclaration ifTypeMethod = (MethodDeclaration) parseBodyDeclaration(f("public void if%s(Consumer<%s> action) { if (is%s()) { action.accept(as%s()); }}", typeName, typeName, typeName, typeName)); + + addOrReplaceWhenSameSignature(baseCode.b, ifTypeMethod); + annotateGenerated(ifTypeMethod); + + baseCode.a.addImport(Consumer.class); + } +} |