diff options
Diffstat (limited to 'javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java')
-rw-r--r-- | javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java | 207 |
1 files changed, 207 insertions, 0 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 new file mode 100644 index 000000000..43d9112fd --- /dev/null +++ b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java @@ -0,0 +1,207 @@ +package com.github.javaparser.generator.metamodel; + +import com.github.javaparser.ast.*; +import com.github.javaparser.ast.body.*; +import com.github.javaparser.ast.comments.BlockComment; +import com.github.javaparser.ast.comments.Comment; +import com.github.javaparser.ast.comments.JavadocComment; +import com.github.javaparser.ast.comments.LineComment; +import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.modules.*; +import com.github.javaparser.ast.stmt.*; +import com.github.javaparser.ast.type.*; +import com.github.javaparser.printer.PrettyPrinter; +import com.github.javaparser.printer.PrettyPrinterConfiguration; +import com.github.javaparser.utils.SourceRoot; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import static com.github.javaparser.utils.Utils.decapitalize; + +public class MetaModelGenerator { + 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 + being afraid those are not initialized yet. */ + add(Node.class); + + add(BodyDeclaration.class); + add(CallableDeclaration.class); + add(Statement.class); + add(Expression.class); + add(Type.class); + + add(AnnotationExpr.class); + add(TypeDeclaration.class); + add(ReferenceType.class); + + add(LiteralExpr.class); + add(LiteralStringValueExpr.class); + add(StringLiteralExpr.class); + + add(ModuleDeclaration.class); + add(ModuleStmt.class); + + // + add(ArrayCreationLevel.class); + add(CompilationUnit.class); + add(PackageDeclaration.class); + + add(AnnotationDeclaration.class); + add(AnnotationMemberDeclaration.class); + add(ClassOrInterfaceDeclaration.class); + add(ConstructorDeclaration.class); + add(EnumConstantDeclaration.class); + add(EnumDeclaration.class); + add(FieldDeclaration.class); + add(InitializerDeclaration.class); + add(MethodDeclaration.class); + add(Parameter.class); + add(ReceiverParameter.class); + add(VariableDeclarator.class); + + add(Comment.class); + add(BlockComment.class); + add(JavadocComment.class); + add(LineComment.class); + + add(ArrayAccessExpr.class); + add(ArrayCreationExpr.class); + add(ArrayInitializerExpr.class); + add(AssignExpr.class); + add(BinaryExpr.class); + add(BooleanLiteralExpr.class); + add(CastExpr.class); + add(CharLiteralExpr.class); + add(ClassExpr.class); + add(ConditionalExpr.class); + add(DoubleLiteralExpr.class); + add(EnclosedExpr.class); + add(FieldAccessExpr.class); + add(InstanceOfExpr.class); + add(IntegerLiteralExpr.class); + add(LambdaExpr.class); + add(LongLiteralExpr.class); + add(MarkerAnnotationExpr.class); + add(MemberValuePair.class); + add(MethodCallExpr.class); + add(MethodReferenceExpr.class); + add(NameExpr.class); + add(Name.class); + add(NormalAnnotationExpr.class); + add(NullLiteralExpr.class); + add(ObjectCreationExpr.class); + add(SimpleName.class); + add(SingleMemberAnnotationExpr.class); + add(SuperExpr.class); + add(ThisExpr.class); + add(TypeExpr.class); + add(UnaryExpr.class); + add(VariableDeclarationExpr.class); + + add(ImportDeclaration.class); + + add(AssertStmt.class); + add(BlockStmt.class); + add(BreakStmt.class); + add(CatchClause.class); + add(ContinueStmt.class); + add(DoStmt.class); + add(EmptyStmt.class); + add(ExplicitConstructorInvocationStmt.class); + add(ExpressionStmt.class); + add(ForeachStmt.class); + add(ForStmt.class); + add(IfStmt.class); + add(LabeledStmt.class); + add(ReturnStmt.class); + add(SwitchEntryStmt.class); + add(SwitchStmt.class); + add(SynchronizedStmt.class); + add(ThrowStmt.class); + add(TryStmt.class); + add(LocalClassDeclarationStmt.class); + add(WhileStmt.class); + add(UnparsableStmt.class); + + add(ArrayType.class); + add(ClassOrInterfaceType.class); + add(IntersectionType.class); + add(PrimitiveType.class); + add(TypeParameter.class); + add(UnionType.class); + add(UnknownType.class); + add(VoidType.class); + add(WildcardType.class); + add(VarType.class); + + add(ModuleRequiresStmt.class); + add(ModuleExportsStmt.class); + add(ModuleProvidesStmt.class); + add(ModuleUsesStmt.class); + add(ModuleOpensStmt.class); + }}; + + static String METAMODEL_PACKAGE = "com.github.javaparser.metamodel"; + + public static void main(String[] args) throws IOException, NoSuchMethodException { + if (args.length != 1) { + throw new RuntimeException("Need 1 parameter: the JavaParser source checkout root directory."); + } + final Path root = Paths.get(args[0], "..", "javaparser-core", "src", "main", "java"); + final SourceRoot sourceRoot = new SourceRoot(root); + sourceRoot.setPrinter(new PrettyPrinter(new PrettyPrinterConfiguration().setEndOfLineCharacter("\n"))::print); + + new MetaModelGenerator().run(sourceRoot); + + sourceRoot.saveAll(); + } + + private void run(SourceRoot sourceRoot) throws IOException, NoSuchMethodException { + final CompilationUnit javaParserMetaModel = sourceRoot.parse(METAMODEL_PACKAGE, "JavaParserMetaModel.java"); + + generateNodeMetaModels(javaParserMetaModel, sourceRoot); + } + + private void generateNodeMetaModels(CompilationUnit javaParserMetaModelCu, SourceRoot sourceRoot) throws NoSuchMethodException { + final ClassOrInterfaceDeclaration metaModelCoid = javaParserMetaModelCu.getClassByName("JavaParserMetaModel").get(); + final NodeList<Statement> initializeNodeMetaModelsStatements = metaModelCoid.getMethodsByName("initializeNodeMetaModels").get(0).getBody().get().getStatements(); + final NodeList<Statement> initializePropertyMetaModelsStatements = metaModelCoid.getMethodsByName("initializePropertyMetaModels").get(0).getBody().get().getStatements(); + final NodeList<Statement> initializeConstructorParametersStatements = metaModelCoid.getMethodsByName("initializeConstructorParameters").get(0).getBody().get().getStatements(); + initializeNodeMetaModelsStatements.clear(); + initializePropertyMetaModelsStatements.clear(); + initializeConstructorParametersStatements.clear(); + + metaModelCoid.getFields().stream().filter(f -> f.getVariable(0).getNameAsString().endsWith("MetaModel")).forEach(Node::remove); + final NodeMetaModelGenerator nodeMetaModelGenerator = new NodeMetaModelGenerator(); + for (Class<? extends Node> nodeClass : ALL_NODE_CLASSES) { + nodeMetaModelGenerator.generate(nodeClass, metaModelCoid, initializeNodeMetaModelsStatements, initializePropertyMetaModelsStatements, initializeConstructorParametersStatements, sourceRoot); + } + + initializeNodeMetaModelsStatements.sort(Comparator.comparing(Node::toString)); + } + + static boolean isNode(Class<?> c) { + return Node.class.isAssignableFrom(c); + } + + static String nodeMetaModelName(Class<?> c) { + return c.getSimpleName() + "MetaModel"; + } + + static String propertyMetaModelFieldName(Field field) { + return field.getName() + "PropertyMetaModel"; + } + + static String nodeMetaModelFieldName(Class<?> nodeClass) { + return decapitalize(nodeMetaModelName(nodeClass)); + } + +} |