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