diff options
Diffstat (limited to 'javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/NodeMetaModelGenerator.java')
-rw-r--r-- | javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/NodeMetaModelGenerator.java | 54 |
1 files changed, 34 insertions, 20 deletions
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; |