• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.github.javaparser.generator.metamodel;
2 
3 import com.github.javaparser.ast.NodeList;
4 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
5 import com.github.javaparser.ast.stmt.Statement;
6 import com.github.javaparser.metamodel.NonEmptyProperty;
7 import com.github.javaparser.metamodel.OptionalProperty;
8 
9 import java.lang.reflect.Field;
10 import java.lang.reflect.Method;
11 
12 import static com.github.javaparser.StaticJavaParser.parseStatement;
13 import static com.github.javaparser.ast.Modifier.Keyword.PUBLIC;
14 import static com.github.javaparser.generator.metamodel.MetaModelGenerator.isNode;
15 import static com.github.javaparser.generator.metamodel.MetaModelGenerator.nodeMetaModelName;
16 import static com.github.javaparser.utils.CodeGenerationUtils.*;
17 import static com.github.javaparser.utils.Utils.decapitalize;
18 
19 class InitializePropertyMetaModelsStatementsGenerator {
generate(Field field, ClassOrInterfaceDeclaration nodeMetaModelClass, String nodeMetaModelFieldName, NodeList<Statement> initializePropertyMetaModelsStatements)20     void generate(Field field, ClassOrInterfaceDeclaration nodeMetaModelClass, String nodeMetaModelFieldName, NodeList<Statement> initializePropertyMetaModelsStatements) {
21         final AstTypeAnalysis fieldTypeAnalysis = new AstTypeAnalysis(field.getGenericType());
22 
23         final Class<?> fieldType = fieldTypeAnalysis.innerType;
24         final String typeName = fieldType.getTypeName().replace('$', '.');
25         final String propertyMetaModelFieldName = field.getName() + "PropertyMetaModel";
26         nodeMetaModelClass.addField("PropertyMetaModel", propertyMetaModelFieldName, PUBLIC);
27         final String propertyInitializer = f("new PropertyMetaModel(%s, \"%s\", %s.class, %s, %s, %s, %s, %s)",
28                 nodeMetaModelFieldName,
29                 field.getName(),
30                 typeName,
31                 optionalOf(decapitalize(nodeMetaModelName(fieldType)), isNode(fieldType)),
32                 isOptional(field),
33                 isNonEmpty(field),
34                 fieldTypeAnalysis.isNodeList,
35                 fieldTypeAnalysis.isSelfType);
36         final String fieldSetting = f("%s.%s=%s;", nodeMetaModelFieldName, propertyMetaModelFieldName, propertyInitializer);
37         final String fieldAddition = f("%s.getDeclaredPropertyMetaModels().add(%s.%s);", nodeMetaModelFieldName, nodeMetaModelFieldName, propertyMetaModelFieldName);
38 
39         initializePropertyMetaModelsStatements.add(parseStatement(fieldSetting));
40         initializePropertyMetaModelsStatements.add(parseStatement(fieldAddition));
41     }
42 
generateDerivedProperty(Method method, ClassOrInterfaceDeclaration nodeMetaModelClass, String nodeMetaModelFieldName, NodeList<Statement> initializePropertyMetaModelsStatements)43     void generateDerivedProperty(Method method, ClassOrInterfaceDeclaration nodeMetaModelClass, String nodeMetaModelFieldName, NodeList<Statement> initializePropertyMetaModelsStatements) {
44         final AstTypeAnalysis returnTypeAnalysis = new AstTypeAnalysis(method.getGenericReturnType());
45 
46         final Class<?> innermostReturnType = returnTypeAnalysis.innerType;
47         final String typeName = innermostReturnType.getTypeName().replace('$', '.');
48         final String propertyMetaModelFieldName = getterToPropertyName(method.getName()) + "PropertyMetaModel";
49         nodeMetaModelClass.addField("PropertyMetaModel", propertyMetaModelFieldName, PUBLIC);
50         final String propertyInitializer = f("new PropertyMetaModel(%s, \"%s\", %s.class, %s, %s, %s, %s, %s)",
51                 nodeMetaModelFieldName,
52                 getterToPropertyName(method.getName()),
53                 typeName,
54                 optionalOf(decapitalize(nodeMetaModelName(innermostReturnType)), isNode(innermostReturnType)),
55                 returnTypeAnalysis.isOptional,
56                 isNonEmpty(method),
57                 returnTypeAnalysis.isNodeList,
58                 returnTypeAnalysis.isSelfType);
59         final String fieldSetting = f("%s.%s=%s;", nodeMetaModelFieldName, propertyMetaModelFieldName, propertyInitializer);
60         final String fieldAddition = f("%s.getDerivedPropertyMetaModels().add(%s.%s);", nodeMetaModelFieldName, nodeMetaModelFieldName, propertyMetaModelFieldName);
61 
62         initializePropertyMetaModelsStatements.add(parseStatement(fieldSetting));
63         initializePropertyMetaModelsStatements.add(parseStatement(fieldAddition));
64     }
65 
isNonEmpty(Field field)66     private boolean isNonEmpty(Field field) {
67         return field.isAnnotationPresent(NonEmptyProperty.class);
68     }
69 
isNonEmpty(Method method)70     private boolean isNonEmpty(Method method) {
71         return method.isAnnotationPresent(NonEmptyProperty.class);
72     }
73 
isOptional(Field field)74     private boolean isOptional(Field field) {
75         return field.isAnnotationPresent(OptionalProperty.class);
76     }
77 }
78