Skip to content

Commit 1b68dc6

Browse files
Groovy: fix parsing of negated new expression (#7508)
1 parent 08aec2e commit 1b68dc6

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

rewrite-groovy/src/main/java/org/openrewrite/groovy/GroovyParserVisitor.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1821,7 +1821,21 @@ public void visitNotExpression(NotExpression expression) {
18211821
queue.add(insideParentheses(expression, fmt -> {
18221822
skip("!");
18231823
JLeftPadded<J.Unary.Type> op = padLeft(EMPTY, J.Unary.Type.Not);
1824-
Expression expr = doVisit(expression.getExpression());
1824+
// Groovy 3+ does not set _INSIDE_PARENTHESES_LEVEL on PropertyExpression / MethodCallExpression,
1825+
// so when `!` directly wraps such an expression in parentheses, detect the parentheses from the source.
1826+
org.codehaus.groovy.ast.expr.Expression operand = expression.getExpression();
1827+
int savedCursor = cursor;
1828+
Space beforeParen = whitespace();
1829+
Expression expr;
1830+
if (cursor < source.length() && source.charAt(cursor) == '(' && getInsideParenthesesLevel(operand) == null) {
1831+
skip("(");
1832+
Expression inner = doVisit(operand);
1833+
expr = new J.Parentheses<>(randomId(), beforeParen, Markers.EMPTY,
1834+
JRightPadded.build((J) inner).withAfter(sourceBefore(")")));
1835+
} else {
1836+
cursor = savedCursor;
1837+
expr = doVisit(operand);
1838+
}
18251839
return new J.Unary(randomId(), fmt, Markers.EMPTY, op, expr, typeMapping.type(expression.getType()));
18261840
}));
18271841
}

rewrite-groovy/src/test/java/org/openrewrite/groovy/tree/UnaryTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,27 @@ void negation() {
7070
)
7171
);
7272
}
73+
74+
@Test
75+
void negationOfParenthesizedPropertyAccess() {
76+
rewriteRun(
77+
groovy(
78+
"""
79+
!(new String("a").bytes)
80+
"""
81+
)
82+
);
83+
}
84+
85+
@Test
86+
void negationOfParenthesizedPropertyAccessOnLocal() {
87+
rewriteRun(
88+
groovy(
89+
"""
90+
def x = "a"
91+
def b = !(x.bytes)
92+
"""
93+
)
94+
);
95+
}
7396
}

0 commit comments

Comments
 (0)