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