• 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.JavaParser.parseStatement;
13 import static com.github.javaparser.ast.Modifier.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) throws NoSuchMethodException {
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, %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.isEnumSet,
36                 fieldTypeAnalysis.isSelfType);
37         final String fieldSetting = f("%s.%s=%s;", nodeMetaModelFieldName, propertyMetaModelFieldName, propertyInitializer);
38         final String fieldAddition = f("%s.getDeclaredPropertyMetaModels().add(%s.%s);", nodeMetaModelFieldName, nodeMetaModelFieldName, propertyMetaModelFieldName);
39 
40         initializePropertyMetaModelsStatements.add(parseStatement(fieldSetting));
41         initializePropertyMetaModelsStatements.add(parseStatement(fieldAddition));
42     }
43 
generateDerivedProperty(Method method, ClassOrInterfaceDeclaration nodeMetaModelClass, String nodeMetaModelFieldName, NodeList<Statement> initializePropertyMetaModelsStatements)44     void generateDerivedProperty(Method method, ClassOrInterfaceDeclaration nodeMetaModelClass, String nodeMetaModelFieldName, NodeList<Statement> initializePropertyMetaModelsStatements) {
45         final AstTypeAnalysis returnTypeAnalysis = new AstTypeAnalysis(method.getGenericReturnType());
46 
47         final Class<?> innermostReturnType = returnTypeAnalysis.innerType;
48         final String typeName = innermostReturnType.getTypeName().replace('$', '.');
49         final String propertyMetaModelFieldName = getterToPropertyName(method.getName()) + "PropertyMetaModel";
50         nodeMetaModelClass.addField("PropertyMetaModel", propertyMetaModelFieldName, PUBLIC);
51         final String propertyInitializer = f("new PropertyMetaModel(%s, \"%s\", %s.class, %s, %s, %s, %s, %s, %s)",
52                 nodeMetaModelFieldName,
53                 getterToPropertyName(method.getName()),
54                 typeName,
55                 optionalOf(decapitalize(nodeMetaModelName(innermostReturnType)), isNode(innermostReturnType)),
56                 returnTypeAnalysis.isOptional,
57                 isNonEmpty(method),
58                 returnTypeAnalysis.isNodeList,
59                 returnTypeAnalysis.isEnumSet,
60                 returnTypeAnalysis.isSelfType);
61         final String fieldSetting = f("%s.%s=%s;", nodeMetaModelFieldName, propertyMetaModelFieldName, propertyInitializer);
62         final String fieldAddition = f("%s.getDerivedPropertyMetaModels().add(%s.%s);", nodeMetaModelFieldName, nodeMetaModelFieldName, propertyMetaModelFieldName);
63 
64         initializePropertyMetaModelsStatements.add(parseStatement(fieldSetting));
65         initializePropertyMetaModelsStatements.add(parseStatement(fieldAddition));
66     }
67 
isNonEmpty(Field field)68     private boolean isNonEmpty(Field field) {
69         return field.isAnnotationPresent(NonEmptyProperty.class);
70     }
71 
isNonEmpty(Method method)72     private boolean isNonEmpty(Method method) {
73         return method.isAnnotationPresent(NonEmptyProperty.class);
74     }
75 
isOptional(Field field)76     private boolean isOptional(Field field) {
77         return field.isAnnotationPresent(OptionalProperty.class);
78     }
79 }
80