user4413257
user4413257

Reputation:

How to replace expression by String in JavaParser AST

Suppose I have expression "(a == b || a == c) && (d == e)". How can I replace subexpression by custom String e.g. how can I replace a == b by a.equals(b)?

Upvotes: 1

Views: 1446

Answers (1)

user4413257
user4413257

Reputation:

Solution based on @Andreas suggestion

public static void main(String[] args) {
    String strExpr = "(get(a == b) || b == c ) && ( a == b ? b == c : c == d)";

    Expression expr = StaticJavaParser.parseExpression(strExpr);
    EnclosedExpr parentExpr = addParentExpr(expr);
    processExpr(parentExpr);
    expr = removeParentExpr(parentExpr);

    // OUTPUT: (get(a.equals(b)) || b.equals(c)) && (a.equals(b) ? b.equals(c) : c.equals(d))
    System.out.println(expr);
}

processing

private static void processExpr(Expression expr) {
    expr.stream()
            .filter(node -> node instanceof Expression)
            .map(node -> ( Expression ) node)
            .filter(Expression::isBinaryExpr)
            .map(Expression::asBinaryExpr)
            .filter(binaryExpr -> binaryExpr.getOperator() == Operator.EQUALS)
            .forEach(binaryExpr -> binaryExpr.getParentNode().ifPresent(node ->  {
                node.replace(binaryExpr, equalsExpr(
                        binaryExpr.getLeft(), binaryExpr.getRight()));
            }));
}

helper methods

private static EnclosedExpr addParentExpr(Expression expr) {
    EnclosedExpr enclosedExpr = new EnclosedExpr();
    enclosedExpr.setInner(expr);
    return enclosedExpr;
}

private static Expression removeParentExpr(EnclosedExpr parentExpr) {
    Expression expr = parentExpr.getInner();
    parentExpr.remove(expr);
    return expr;
}

private static MethodCallExpr equalsExpr(Expression leftExpr, Expression rightExpr) {
    return new MethodCallExpr(leftExpr, "equals", new NodeList<>(rightExpr));
}

Since StaticJavaParser is slow, there is also an option to use JavaParser with ParseConfiguration to disable post processing and validation (fast parsing).

JavaParser javaParser = new JavaParser(new ParserConfiguration()
            .setLanguageLevel(LanguageLevel.RAW));

Upvotes: 2

Related Questions