diff options
author | Danny van Bruggen <hexagonaal@gmail.com> | 2017-02-10 14:17:16 +0100 |
---|---|---|
committer | Danny van Bruggen <hexagonaal@gmail.com> | 2017-02-10 14:17:16 +0100 |
commit | ab752cf3c23bd70def5f2f7668d5e389a231bceb (patch) | |
tree | 229d81fa742189fef8a866c3f1e1c8dd01ec5590 /javaparser-metamodel-generator/src | |
parent | e6c32c33a5a8214abdce8ea1df539291c78aba49 (diff) | |
download | javaparser-ab752cf3c23bd70def5f2f7668d5e389a231bceb.tar.gz |
* Generate getter for metamodel
* Give metamodel correct inheritance
Diffstat (limited to 'javaparser-metamodel-generator/src')
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; |