aboutsummaryrefslogtreecommitdiff
path: root/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/InitializeConstructorParametersStatementsGenerator.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/InitializeConstructorParametersStatementsGenerator.java')
-rw-r--r--javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/InitializeConstructorParametersStatementsGenerator.java58
1 files changed, 58 insertions, 0 deletions
diff --git a/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/InitializeConstructorParametersStatementsGenerator.java b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/InitializeConstructorParametersStatementsGenerator.java
new file mode 100644
index 000000000..d50c0ed2d
--- /dev/null
+++ b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/InitializeConstructorParametersStatementsGenerator.java
@@ -0,0 +1,58 @@
+package com.github.javaparser.generator.metamodel;
+
+import com.github.javaparser.ast.AllFieldsConstructor;
+import com.github.javaparser.ast.Node;
+import com.github.javaparser.ast.NodeList;
+import com.github.javaparser.ast.stmt.Statement;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+
+import static com.github.javaparser.JavaParser.parseStatement;
+import static com.github.javaparser.generator.metamodel.MetaModelGenerator.nodeMetaModelFieldName;
+import static com.github.javaparser.generator.metamodel.MetaModelGenerator.propertyMetaModelFieldName;
+import static com.github.javaparser.utils.CodeGenerationUtils.f;
+
+class InitializeConstructorParametersStatementsGenerator {
+ void generate(Class<? extends Node> nodeClass, NodeList<Statement> initializeConstructorParametersStatements) {
+ if (nodeClass == Node.class) {
+ return;
+ }
+ Constructor<?> constructor = findAllFieldsConstructor(nodeClass);
+ for (java.lang.reflect.Parameter parameter : constructor.getParameters()) {
+ Field field = findFieldInClass(nodeClass, parameter.getName());
+
+ String addFieldStatement = f("%s.getConstructorParameters().add(%s.%s);",
+ nodeMetaModelFieldName(nodeClass),
+ nodeMetaModelFieldName(field.getDeclaringClass()),
+ propertyMetaModelFieldName(field));
+
+ initializeConstructorParametersStatements.add(parseStatement(addFieldStatement));
+ }
+ }
+
+ private Field findFieldInClass(Class<?> nodeClass, String name) {
+ Class<?> searchClass = nodeClass;
+ do {
+ for (Field field : searchClass.getDeclaredFields()) {
+ if (field.getName().equals(name)) {
+ return field;
+ }
+ }
+ searchClass = searchClass.getSuperclass();
+ } while (searchClass != null);
+ throw new AssertionError(f("Couldn't find constructor parameter %s as a field, class %s", name, nodeClass.getSimpleName()));
+ }
+
+ private Constructor<?> findAllFieldsConstructor(Class<? extends Node> nodeClass) {
+ for (Constructor<?> constructor : nodeClass.getDeclaredConstructors()) {
+ for (Annotation annotation : constructor.getAnnotations()) {
+ if (annotation.annotationType() == AllFieldsConstructor.class) {
+ return constructor;
+ }
+ }
+ }
+ throw new AssertionError(f("Node class %s has no constructor annotated with @AllFieldsConstructor", nodeClass.getSimpleName()));
+ }
+}