Skip to content

Commit c99b44d

Browse files
UseForEachLoop - not to change in case of array assignment (#661)
* Test case * insideInvalidAccess logic
1 parent 1f7ade0 commit c99b44d

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

src/main/java/org/openrewrite/staticanalysis/UseForEachLoop.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ private class ValidationVisitor extends JavaVisitor<Object> {
258258
private final J collection;
259259
private boolean valid = true;
260260
private boolean insideValidAccess;
261+
private boolean insideInvalidAccess;
261262

262263
public ValidationVisitor(String indexVarName, J collection) {
263264
this.indexVarName = indexVarName;
@@ -308,6 +309,9 @@ public J visitArrayAccess(J.ArrayAccess arrayAccess, Object o) {
308309
} else {
309310
valid = false;
310311
}
312+
if (insideInvalidAccess) {
313+
valid = false;
314+
}
311315

312316
J result = super.visitArrayAccess(arrayAccess, o);
313317
insideValidAccess = wasInsideValidAccess;
@@ -316,6 +320,13 @@ public J visitArrayAccess(J.ArrayAccess arrayAccess, Object o) {
316320
return super.visitArrayAccess(arrayAccess, o);
317321
}
318322

323+
@Override
324+
public J visitAssignment(J.Assignment assignment, Object o) {
325+
this.insideInvalidAccess = true;
326+
this.visit(assignment.getVariable(), o);
327+
this.insideInvalidAccess = false;
328+
return super.visitAssignment(assignment, o);
329+
}
319330
}
320331

321332
private class BodyTransformer extends JavaVisitor<Object> {

src/test/java/org/openrewrite/staticanalysis/UseForEachLoopTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,4 +331,22 @@ void test(CustomContainer container) {
331331
)
332332
);
333333
}
334+
335+
@Test
336+
void noChangeWhenArrayAccessOnLeftSideOfAssignment() {
337+
rewriteRun(
338+
//language=java
339+
java(
340+
"""
341+
class Test {
342+
void test(String[] names) {
343+
for (int i = 0; i < names.length; i++) {
344+
names[i] = "modified";
345+
}
346+
}
347+
}
348+
"""
349+
)
350+
);
351+
}
334352
}

0 commit comments

Comments
 (0)