• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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