JavaParser:如何将方法调用添加到链式调用中



给定一个链式调用(构建器模式(:

return new ThingBuilder().withA(a).withB(b).build();

我如何使用JavaParser添加另一个链式调用,最终得到这样的代码:

return new ThingBuilder().withA(a).withB(b).withC(c).build();

我已经熟悉了ModifierVisitor,但无法找到在正确的位置添加调用的好方法,即添加到相关的MethodCallExpr(表达式为new ThingBuilder().withA(a).withB(b),方法为build()(。

如果可能的话,也可以将其添加到顶级:

return new ThingBuilder().withC(c).withA(a).withB(b).build();

我能够让它发挥作用:

@Override
public Visitable visit(final MethodCallExpr n, final Void arg) {
final Visitable visit = super.visit(n, arg);
if (!n.getName().getIdentifier().equals("build")) {
return visit;
}
n.getScope()
.filter(Expression::isMethodCallExpr)
.map(Expression::asMethodCallExpr)
.filter(method -> method.getName().getIdentifier().equals("withB"))
.ifPresent(method -> {
final Node leftSide = n.getChildNodes().get(0);
final Optional<Expression> scope = n.getScope();
final MethodCallExpr withC = new MethodCallExpr("withC", new NameExpr("c"));
leftSide.replace(withC);
scope.ifPresent(withC::setScope);
});
return visit;
}

如果有更优雅的方法可以做到这一点,我很乐意学习。

最新更新