Как заменить выражение на строку в JavaParser AST - PullRequest
0 голосов
/ 23 марта 2019

Предположим, у меня есть выражение "(a == b || a == c) && (d == e)".Как заменить подвыражение пользовательской строкой, например, как я могу заменить a == b на a.equals(b)?

1 Ответ

0 голосов
/ 23 марта 2019

Решение на основе предложения @Andreas

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);
}

обработка

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()));
            }));
}

вспомогательные методы

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));
}

Поскольку StaticJavaParser медленный, есть также возможность использовать JavaParser с ParseConfiguration для отключения постобработки и проверки (быстрый анализ).

JavaParser javaParser = new JavaParser(new ParserConfiguration()
            .setLanguageLevel(LanguageLevel.RAW));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...