Skip to content

Commit

Permalink
Create the removeXxxx() methods too
Browse files Browse the repository at this point in the history
  • Loading branch information
Danny van Bruggen committed Feb 7, 2017
1 parent b7fdeab commit 00e9518
Show file tree
Hide file tree
Showing 29 changed files with 262 additions and 130 deletions.
Expand Up @@ -3,7 +3,7 @@
import com.github.javaparser.JavaParser; import com.github.javaparser.JavaParser;
import com.github.javaparser.generator.core.node.GetNodeListsGenerator; import com.github.javaparser.generator.core.node.GetNodeListsGenerator;
import com.github.javaparser.generator.core.node.PropertyGenerator; import com.github.javaparser.generator.core.node.PropertyGenerator;
import com.github.javaparser.generator.core.node.RemoveNodeMethodGenerator; import com.github.javaparser.generator.core.node.RemoveMethodGenerator;
import com.github.javaparser.generator.core.visitor.*; import com.github.javaparser.generator.core.visitor.*;
import com.github.javaparser.generator.utils.GeneratorUtils; import com.github.javaparser.generator.utils.GeneratorUtils;
import com.github.javaparser.generator.utils.SourceRoot; import com.github.javaparser.generator.utils.SourceRoot;
Expand Down Expand Up @@ -33,7 +33,7 @@ public static void main(String[] args) throws Exception {


new GetNodeListsGenerator(javaParser, sourceRoot).generate(); new GetNodeListsGenerator(javaParser, sourceRoot).generate();
new PropertyGenerator(javaParser, sourceRoot).generate(); new PropertyGenerator(javaParser, sourceRoot).generate();
new RemoveNodeMethodGenerator(javaParser, sourceRoot).generate(); new RemoveMethodGenerator(javaParser, sourceRoot).generate();


sourceRoot.saveAll(); sourceRoot.saveAll();
} }
Expand Down
@@ -0,0 +1,113 @@
package com.github.javaparser.generator.core.node;

import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.nodeTypes.NodeWithOptionalBlockStmt;
import com.github.javaparser.ast.stmt.BlockStmt;
import com.github.javaparser.generator.NodeGenerator;
import com.github.javaparser.generator.utils.SourceRoot;
import com.github.javaparser.metamodel.BaseNodeMetaModel;
import com.github.javaparser.metamodel.PropertyMetaModel;

import java.util.List;
import java.util.function.Supplier;

import static com.github.javaparser.JavaParser.*;
import static com.github.javaparser.generator.utils.GeneratorUtils.capitalize;
import static com.github.javaparser.generator.utils.GeneratorUtils.f;


public class RemoveMethodGenerator extends NodeGenerator {
public RemoveMethodGenerator(JavaParser javaParser, SourceRoot sourceRoot) {
super(javaParser, sourceRoot);
}

@Override
protected void generateNode(BaseNodeMetaModel nodeMetaModel, CompilationUnit nodeCu, ClassOrInterfaceDeclaration nodeCoid) {
final MethodDeclaration removeMethod = getOrCreateMethod(nodeCoid, () -> {
nodeCu.addImport(Node.class);
return (MethodDeclaration) parseClassBodyDeclaration("@Override public boolean remove(Node node) {}");
},
"remove", "Node");

final BlockStmt body = emptyBodyFor(removeMethod);

body.addStatement("if (node == null) return false;");

for (PropertyMetaModel property : nodeMetaModel.getDeclaredPropertyMetaModels()) {
if (!property.isNode()) {
continue;
}
String check;
if (property.isNodeList()) {
check = nodeListCheck(property);
} else {
if (property.isRequired()) {
continue;
}
String removeAttributeMethodName = generateRemoveMethodForAttribute(nodeCoid, nodeMetaModel, property);
check = attributeCheck(property, removeAttributeMethodName);
}
if (property.isOptional()) {
check = f("if (%s != null) { %s }", property.getName(), check);
}
body.addStatement(check);
}
if (nodeMetaModel.getSuperNodeMetaModel().isPresent()) {
body.addStatement("return super.remove(node);");
} else {
body.addStatement("return false;");
}
}

private BlockStmt emptyBodyFor(NodeWithOptionalBlockStmt<?> removeMethod) {
final BlockStmt body = removeMethod.getBody().get();
body.getStatements().clear();
return body;
}

private MethodDeclaration getOrCreateMethod(ClassOrInterfaceDeclaration nodeCoid,
Supplier<MethodDeclaration> newMethodSupplier,
String methodName, String... methodParameterTypes) {
final List<MethodDeclaration> removeMethods = nodeCoid.getMethodsBySignature(methodName, methodParameterTypes);
final MethodDeclaration removeMethod;
if (removeMethods.isEmpty()) {
removeMethod = newMethodSupplier.get();
nodeCoid.addMember(removeMethod);
} else if (removeMethods.size() == 1) {
removeMethod = removeMethods.get(0);
} else {
throw new AssertionError(f("Found more than one method while expecting only one."));
}
return removeMethod;
}

private String attributeCheck(PropertyMetaModel property, String removeAttributeMethodName) {
return f("if (node == %s) {" +
" %s();" +
" return true;\n" +
"}", property.getName(), removeAttributeMethodName);
}

private String nodeListCheck(PropertyMetaModel property) {
return f("for (int i = 0; i < %s.size(); i++) {" +
" if (%s.get(i) == node) {" +
" %s.remove(i);" +
" return true;" +
" }" +
"}", property.getName(), property.getName(), property.getName());
}

private String generateRemoveMethodForAttribute(ClassOrInterfaceDeclaration nodeCoid, BaseNodeMetaModel nodeMetaModel, PropertyMetaModel property) {
String methodName = "remove" + capitalize(property.getName());
MethodDeclaration removeMethod = getOrCreateMethod(nodeCoid,
() -> (MethodDeclaration) parseClassBodyDeclaration(f("public %s %s() {}", nodeMetaModel.getTypeName(), methodName)),
methodName);
BlockStmt block = emptyBodyFor(removeMethod);
block.addStatement(f("return %s((%s) null);", property.getSetterMethodName(), property.getTypeNameForSetter()));
return methodName;
}
}

This file was deleted.

Expand Up @@ -118,8 +118,8 @@ public List<NodeList<?>> getNodeLists() {
return Arrays.asList(getAnnotations()); return Arrays.asList(getAnnotations());
} }


public void removeDimension() { public ArrayCreationLevel removeDimension() {
setDimension(null); return setDimension((Expression) null);
} }


@Override @Override
Expand All @@ -134,7 +134,7 @@ public boolean remove(Node node) {
} }
if (dimension != null) { if (dimension != null) {
if (node == dimension) { if (node == dimension) {
setDimension((Expression) null); removeDimension();
return true; return true;
} }
} }
Expand Down
Expand Up @@ -435,7 +435,7 @@ public boolean remove(Node node) {
} }
if (packageDeclaration != null) { if (packageDeclaration != null) {
if (node == packageDeclaration) { if (node == packageDeclaration) {
setPackageDeclaration((PackageDeclaration) null); removePackageDeclaration();
return true; return true;
} }
} }
Expand All @@ -447,5 +447,9 @@ public boolean remove(Node node) {
} }
return super.remove(node); return super.remove(node);
} }

public CompilationUnit removePackageDeclaration() {
return setPackageDeclaration((PackageDeclaration) null);
}
} }


Expand Up @@ -524,11 +524,15 @@ public boolean remove(Node node) {
return false; return false;
if (comment != null) { if (comment != null) {
if (node == comment) { if (node == comment) {
setComment((Comment) null); removeComment();
return true; return true;
} }
} }
return false; return false;
} }

public Node removeComment() {
return setComment((Comment) null);
}
} }


Expand Up @@ -114,12 +114,8 @@ public Type getType() {
return type; return type;
} }


public Expression removeDefaultValue() { public AnnotationMemberDeclaration removeDefaultValue() {
Expression res = defaultValue; return setDefaultValue((Expression) null);
if (res != null) {
setDefaultValue(null);
}
return res;
} }


/** /**
Expand Down Expand Up @@ -178,7 +174,7 @@ public boolean remove(Node node) {
return false; return false;
if (defaultValue != null) { if (defaultValue != null) {
if (node == defaultValue) { if (node == defaultValue) {
setDefaultValue((Expression) null); removeDefaultValue();
return true; return true;
} }
} }
Expand Down
Expand Up @@ -323,7 +323,7 @@ public boolean remove(Node node) {
return false; return false;
if (body != null) { if (body != null) {
if (node == body) { if (node == body) {
setBody((BlockStmt) null); removeBody();
return true; return true;
} }
} }
Expand All @@ -347,5 +347,9 @@ public boolean remove(Node node) {
} }
return super.remove(node); return super.remove(node);
} }

public MethodDeclaration removeBody() {
return setBody((BlockStmt) null);
}
} }


Expand Up @@ -161,11 +161,15 @@ public boolean remove(Node node) {
return false; return false;
if (initializer != null) { if (initializer != null) {
if (node == initializer) { if (node == initializer) {
setInitializer((Expression) null); removeInitializer();
return true; return true;
} }
} }
return super.remove(node); return super.remove(node);
} }

public VariableDeclarator removeInitializer() {
return setInitializer((Expression) null);
}
} }


Expand Up @@ -172,7 +172,7 @@ public boolean remove(Node node) {
return false; return false;
if (initializer != null) { if (initializer != null) {
if (node == initializer) { if (node == initializer) {
setInitializer((ArrayInitializerExpr) null); removeInitializer();
return true; return true;
} }
} }
Expand All @@ -184,5 +184,9 @@ public boolean remove(Node node) {
} }
return super.remove(node); return super.remove(node);
} }

public ArrayCreationExpr removeInitializer() {
return setInitializer((ArrayInitializerExpr) null);
}
} }


Expand Up @@ -87,11 +87,15 @@ public boolean remove(Node node) {
return false; return false;
if (inner != null) { if (inner != null) {
if (node == inner) { if (node == inner) {
setInner((Expression) null); removeInner();
return true; return true;
} }
} }
return super.remove(node); return super.remove(node);
} }

public EnclosedExpr removeInner() {
return setInner((Expression) null);
}
} }


Expand Up @@ -174,7 +174,7 @@ public boolean remove(Node node) {
return false; return false;
if (scope != null) { if (scope != null) {
if (node == scope) { if (node == scope) {
setScope((Expression) null); removeScope();
return true; return true;
} }
} }
Expand All @@ -188,5 +188,9 @@ public boolean remove(Node node) {
} }
return super.remove(node); return super.remove(node);
} }

public FieldAccessExpr removeScope() {
return setScope((Expression) null);
}
} }


0 comments on commit 00e9518

Please sign in to comment.