aboutsummaryrefslogtreecommitdiff
path: root/javaparser-core-generators/src/main/java/com/github/javaparser
diff options
context:
space:
mode:
authorDanny van Bruggen <hexagonaal@gmail.com>2017-09-20 22:14:59 +0200
committerDanny van Bruggen <hexagonaal@gmail.com>2017-09-20 23:00:00 +0200
commitad9d33b5b22f4f4d470018e41d5c33c1eaf464c8 (patch)
treec3fbe5db2e0807063de09696f04d360fbd6c722c /javaparser-core-generators/src/main/java/com/github/javaparser
parentfc96cb40b24ae84b5155360e91b4354365ed530f (diff)
downloadjavaparser-ad9d33b5b22f4f4d470018e41d5c33c1eaf464c8.tar.gz
Generate typecasting code
Diffstat (limited to 'javaparser-core-generators/src/main/java/com/github/javaparser')
-rw-r--r--javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java14
-rw-r--r--javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java1
-rw-r--r--javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/TypeCastingGenerator.java77
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);
+ }
+}