aboutsummaryrefslogtreecommitdiff
path: root/javaparser-metamodel-generator/src
diff options
context:
space:
mode:
authorDanny van Bruggen <hexagonaal@gmail.com>2017-02-10 14:17:16 +0100
committerDanny van Bruggen <hexagonaal@gmail.com>2017-02-10 14:17:16 +0100
commitab752cf3c23bd70def5f2f7668d5e389a231bceb (patch)
tree229d81fa742189fef8a866c3f1e1c8dd01ec5590 /javaparser-metamodel-generator/src
parente6c32c33a5a8214abdce8ea1df539291c78aba49 (diff)
downloadjavaparser-ab752cf3c23bd70def5f2f7668d5e389a231bceb.tar.gz
* Generate getter for metamodel
* Give metamodel correct inheritance
Diffstat (limited to 'javaparser-metamodel-generator/src')
-rw-r--r--javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java2
-rw-r--r--javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/NodeMetaModelGenerator.java54
2 files changed, 35 insertions, 21 deletions
diff --git a/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java
index ea123f8c9..c653f69d9 100644
--- a/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java
+++ b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java
@@ -23,7 +23,7 @@ import java.util.List;
import static com.github.javaparser.utils.Utils.decapitalize;
public class MetaModelGenerator {
- static final String NODE_META_MODEL = "BaseNodeMetaModel";
+ static final String BASE_NODE_META_MODEL = "BaseNodeMetaModel";
private static List<Class<? extends Node>> ALL_NODE_CLASSES = new ArrayList<Class<? extends Node>>() {{
/* Base classes go first, so we don't have to do any sorting to make sure
generated classes can refer to their base generated classes without
diff --git a/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/NodeMetaModelGenerator.java b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/NodeMetaModelGenerator.java
index 66927dbf9..4bd24d0e0 100644
--- a/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/NodeMetaModelGenerator.java
+++ b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/NodeMetaModelGenerator.java
@@ -5,7 +5,6 @@ import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.*;
import com.github.javaparser.ast.stmt.Statement;
-import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.utils.SourceRoot;
import java.lang.reflect.Field;
@@ -16,10 +15,9 @@ import java.util.List;
import static com.github.javaparser.JavaParser.*;
import static com.github.javaparser.ast.Modifier.*;
-import static com.github.javaparser.ast.Modifier.FINAL;
-import static com.github.javaparser.ast.Modifier.PUBLIC;
import static com.github.javaparser.generator.metamodel.MetaModelGenerator.*;
-import static com.github.javaparser.utils.CodeGenerationUtils.*;
+import static com.github.javaparser.utils.CodeGenerationUtils.f;
+import static com.github.javaparser.utils.CodeGenerationUtils.optionalOf;
import static com.github.javaparser.utils.Utils.decapitalize;
public class NodeMetaModelGenerator {
@@ -27,41 +25,57 @@ public class NodeMetaModelGenerator {
private final InitializeConstructorParametersStatementsGenerator initializeConstructorParametersStatementsGenerator = new InitializeConstructorParametersStatementsGenerator();
public void generate(Class<? extends Node> nodeClass, ClassOrInterfaceDeclaration metaModelCoid, NodeList<Statement> initializeNodeMetaModelsStatements, NodeList<Statement> initializePropertyMetaModelsStatements, NodeList<Statement> initializeConstructorParametersStatements, SourceRoot sourceRoot) throws NoSuchMethodException {
- String className = nodeMetaModelName(nodeClass);
- String nodeMetaModelFieldName = decapitalize(className);
+ final String className = nodeMetaModelName(nodeClass);
+ final String nodeMetaModelFieldName = decapitalize(className);
metaModelCoid.getFieldByName(nodeMetaModelFieldName).ifPresent(Node::remove);
- FieldDeclaration nodeField = metaModelCoid.addField(className, nodeMetaModelFieldName, PUBLIC, STATIC, FINAL);
+ final FieldDeclaration nodeField = metaModelCoid.addField(className, nodeMetaModelFieldName, PUBLIC, STATIC, FINAL);
- Class<?> superclass = nodeClass.getSuperclass();
- final String superClassMetaModel = optionalOf(decapitalize(nodeMetaModelName(superclass)), isNode(superclass));
+ final Class<?> superclass = nodeClass.getSuperclass();
+ final String superNodeMetaModel = nodeMetaModelName(superclass);
- nodeField.getVariable(0).setInitializer(parseExpression(f("new %s(%s)", className, superClassMetaModel)));
+ boolean isRootNode = !isNode(superclass);
+ nodeField.getVariable(0).setInitializer(parseExpression(f("new %s(%s)",
+ className,
+ optionalOf(decapitalize(superNodeMetaModel), !isRootNode))));
initializeNodeMetaModelsStatements.add(parseStatement(f("nodeMetaModels.add(%s);", nodeMetaModelFieldName)));
- CompilationUnit classMetaModelJavaFile = new CompilationUnit(METAMODEL_PACKAGE);
+ final CompilationUnit classMetaModelJavaFile = new CompilationUnit(METAMODEL_PACKAGE);
classMetaModelJavaFile.addImport("java.util.Optional");
sourceRoot.add(METAMODEL_PACKAGE, className + ".java", classMetaModelJavaFile);
- ClassOrInterfaceDeclaration nodeMetaModelClass = classMetaModelJavaFile.addClass(className, PUBLIC);
- nodeMetaModelClass.addExtendedType(new ClassOrInterfaceType(NODE_META_MODEL));
+ final ClassOrInterfaceDeclaration nodeMetaModelClass = classMetaModelJavaFile.addClass(className, PUBLIC);
+ if (isRootNode) {
+ nodeMetaModelClass.addExtendedType(BASE_NODE_META_MODEL);
+ } else {
+ nodeMetaModelClass.addExtendedType(superNodeMetaModel);
+ }
- AstTypeAnalysis typeAnalysis = new AstTypeAnalysis(nodeClass);
+ final AstTypeAnalysis typeAnalysis = new AstTypeAnalysis(nodeClass);
- ConstructorDeclaration classMMConstructor = nodeMetaModelClass
+ final ConstructorDeclaration classMMConstructor = nodeMetaModelClass
.addConstructor()
- .addParameter("Optional<" + NODE_META_MODEL + ">", "super" + NODE_META_MODEL);
+ .addParameter("Optional<" + BASE_NODE_META_MODEL + ">", "super" + BASE_NODE_META_MODEL);
classMMConstructor
.getBody()
.addStatement(parseExplicitConstructorInvocationStmt(f("super(super%s, %s.class, \"%s\", \"%s\", %s, %s);",
- NODE_META_MODEL,
+ BASE_NODE_META_MODEL,
nodeClass.getName(),
nodeClass.getSimpleName(),
nodeClass.getPackage().getName(),
typeAnalysis.isAbstract,
typeAnalysis.isSelfType)));
- List<Field> fields = new ArrayList<>(Arrays.asList(nodeClass.getDeclaredFields()));
+ if (typeAnalysis.isAbstract) {
+ classMetaModelJavaFile.addImport(Node.class);
+ nodeMetaModelClass.addMember(parseClassBodyDeclaration(f(
+ "protected %s(Optional<BaseNodeMetaModel> superNodeMetaModel, Class<? extends Node> type, String name, String packageName, boolean isAbstract, boolean hasWildcard) {" +
+ "super(superNodeMetaModel, type, name, packageName, isAbstract, hasWildcard);" +
+ " }",
+ className)));
+ }
+
+ final List<Field> fields = new ArrayList<>(Arrays.asList(nodeClass.getDeclaredFields()));
fields.sort(Comparator.comparing(Field::getName));
for (Field field : fields) {
if (fieldShouldBeIgnored(field)) {
@@ -78,8 +92,8 @@ public class NodeMetaModelGenerator {
}
private void moveStaticInitializeToTheEndOfTheClassBecauseWeNeedTheFieldsToInitializeFirst(ClassOrInterfaceDeclaration metaModelCoid) {
- for (BodyDeclaration<?> m : metaModelCoid.getMembers()){
- if(m instanceof InitializerDeclaration){
+ for (BodyDeclaration<?> m : metaModelCoid.getMembers()) {
+ if (m instanceof InitializerDeclaration) {
m.remove();
metaModelCoid.addMember(m);
return;