diff options
Diffstat (limited to 'javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/visitor/ModifierVisitorGenerator.java')
-rw-r--r-- | javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/visitor/ModifierVisitorGenerator.java | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/visitor/ModifierVisitorGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/visitor/ModifierVisitorGenerator.java new file mode 100644 index 000000000..4c2f71146 --- /dev/null +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/visitor/ModifierVisitorGenerator.java @@ -0,0 +1,78 @@ +package com.github.javaparser.generator.core.visitor; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.expr.BinaryExpr; +import com.github.javaparser.ast.stmt.BlockStmt; +import com.github.javaparser.generator.VisitorGenerator; +import com.github.javaparser.metamodel.BaseNodeMetaModel; +import com.github.javaparser.metamodel.PropertyMetaModel; +import com.github.javaparser.utils.SeparatedItemStringBuilder; +import com.github.javaparser.utils.SourceRoot; + +import static com.github.javaparser.utils.CodeGenerationUtils.f; + +public class ModifierVisitorGenerator extends VisitorGenerator { + public ModifierVisitorGenerator(SourceRoot sourceRoot) { + super(sourceRoot, "com.github.javaparser.ast.visitor", "ModifierVisitor", "Visitable", "A", true); + } + + @Override + protected void generateVisitMethodBody(BaseNodeMetaModel node, MethodDeclaration visitMethod, CompilationUnit compilationUnit) { + visitMethod.getParameters().forEach(p -> p.setFinal(true)); + + BlockStmt body = visitMethod.getBody().get(); + body.getStatements().clear(); + + for (PropertyMetaModel property : node.getAllPropertyMetaModels()) { + if (property.isNode()) { + if (property.isNodeList()) { + body.addStatement(f("NodeList<%s> %s = modifyList(n.%s(), arg);", + property.getTypeNameGenerified(), + property.getName(), + property.getGetterMethodName())); + } else if (property.isOptional()) { + body.addStatement(f("%s %s = n.%s().map(s -> (%s) s.accept(this, arg)).orElse(null);", + property.getTypeNameGenerified(), + property.getName(), + property.getGetterMethodName(), + property.getTypeNameGenerified())); + } else { + body.addStatement(f("%s %s = (%s) n.%s().accept(this, arg);", + property.getTypeNameGenerified(), + property.getName(), + property.getTypeNameGenerified(), + property.getGetterMethodName())); + } + } + } + + if(node.is(BinaryExpr.class)){ + body.addStatement("if (left == null) return right;"); + body.addStatement("if (right == null) return left;"); + }else { + final SeparatedItemStringBuilder collapseCheck = new SeparatedItemStringBuilder("if(", "||", ") return null;"); + for (PropertyMetaModel property : node.getAllPropertyMetaModels()) { + if (property.isRequired() && property.isNode()) { + if (property.isNodeList()) { + if(property.isNonEmpty()){ + collapseCheck.append(f("%s.isEmpty()", property.getName())); + } + } else { + collapseCheck.append(f("%s==null", property.getName())); + } + } + } + if (collapseCheck.hasItems()) { + body.addStatement(collapseCheck.toString()); + } + } + + for (PropertyMetaModel property : node.getAllPropertyMetaModels()) { + if (property.isNode()) { + body.addStatement(f("n.%s(%s);", property.getSetterMethodName(), property.getName())); + } + } + body.addStatement("return n;"); + } +} |