1 package com.github.javaparser.generator.core.node; 2 3 import com.github.javaparser.TokenRange; 4 import com.github.javaparser.ast.CompilationUnit; 5 import com.github.javaparser.ast.Node; 6 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 7 import com.github.javaparser.ast.body.ConstructorDeclaration; 8 import com.github.javaparser.ast.stmt.BlockStmt; 9 import com.github.javaparser.generator.NodeGenerator; 10 import com.github.javaparser.metamodel.BaseNodeMetaModel; 11 import com.github.javaparser.metamodel.PropertyMetaModel; 12 import com.github.javaparser.utils.SeparatedItemStringBuilder; 13 import com.github.javaparser.utils.SourceRoot; 14 15 import static com.github.javaparser.JavaParser.parseExplicitConstructorInvocationStmt; 16 import static com.github.javaparser.utils.CodeGenerationUtils.f; 17 18 public class MainConstructorGenerator extends NodeGenerator { MainConstructorGenerator(SourceRoot sourceRoot)19 public MainConstructorGenerator(SourceRoot sourceRoot) { 20 super(sourceRoot); 21 } 22 23 @Override generateNode(BaseNodeMetaModel nodeMetaModel, CompilationUnit nodeCu, ClassOrInterfaceDeclaration nodeCoid)24 protected void generateNode(BaseNodeMetaModel nodeMetaModel, CompilationUnit nodeCu, ClassOrInterfaceDeclaration nodeCoid) { 25 if (nodeMetaModel.is(Node.class)) { 26 return; 27 } 28 ConstructorDeclaration constructor = new ConstructorDeclaration() 29 .setPublic(true) 30 .setName(nodeCoid.getNameAsString()) 31 .addParameter(TokenRange.class, "tokenRange") 32 .setJavadocComment("\n * This constructor is used by the parser and is considered private.\n "); 33 34 BlockStmt body = constructor.getBody(); 35 36 SeparatedItemStringBuilder superCall = new SeparatedItemStringBuilder("super(", ", ", ");"); 37 superCall.append("tokenRange"); 38 for (PropertyMetaModel parameter : nodeMetaModel.getConstructorParameters()) { 39 constructor.addParameter(parameter.getTypeNameForSetter(), parameter.getName()); 40 if (nodeMetaModel.getDeclaredPropertyMetaModels().contains(parameter)) { 41 body.addStatement(f("%s(%s);", parameter.getSetterMethodName(), parameter.getName())); 42 } else { 43 superCall.append(parameter.getName()); 44 } 45 } 46 47 body.getStatements().addFirst(parseExplicitConstructorInvocationStmt(superCall.toString())); 48 49 body.addStatement("customInitialization();"); 50 51 addOrReplaceWhenSameSignature(nodeCoid, constructor); 52 nodeCu.addImport(TokenRange.class); 53 } 54 } 55