Skip to content

Commit 34e4aa8

Browse files
authored
RenameVariable fixes for member references (#5406)
* fix * Cleanup * fixes
1 parent 7e00acc commit 34e4aa8

File tree

4 files changed

+24
-54
lines changed

4 files changed

+24
-54
lines changed

rewrite-java-test/src/test/java/org/openrewrite/java/JavaTemplateMatchTest.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.junit.jupiter.api.Test;
1919
import org.junit.jupiter.params.ParameterizedTest;
2020
import org.junit.jupiter.params.provider.ValueSource;
21-
import org.junitpioneer.jupiter.ExpectedToFail;
2221
import org.openrewrite.DocumentExample;
2322
import org.openrewrite.ExecutionContext;
2423
import org.openrewrite.Issue;
@@ -1002,20 +1001,19 @@ void test() {
10021001
}
10031002

10041003
@Test
1005-
@ExpectedToFail("PR #5374 was reverted, due to regressions")
10061004
void matchMemberReferenceContainingParameter() {
10071005
rewriteRun(
10081006
spec -> spec
10091007
.expectedCyclesThatMakeChanges(1).cycles(1)
10101008
.recipe(toRecipe(() -> new JavaIsoVisitor<>() {
1011-
JavaTemplate template = JavaTemplate.builder("java.util.Optional.ofNullable(#{any(java.lang.String)}).orElseGet(#{any(java.lang.Object)}::toString)").build();
1009+
JavaTemplate template = JavaTemplate.builder("java.util.function.Predicate.not(#{any(java.util.Set)}::contains)").build();
10121010

10131011
@Override
10141012
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext executionContext) {
10151013
JavaTemplate.Matcher matcher = template.matcher(getCursor());
10161014
if (matcher.find()) {
10171015
JavaTemplateSemanticallyEqual.TemplateMatchResult result = matcher.getMatchResult();
1018-
assertThat(result.getMatchedParameters()).hasSize(2);
1016+
assertThat(result.getMatchedParameters()).hasSize(1);
10191017
return SearchResult.found(template.apply(getCursor(), method.getCoordinates().replace(), result.getMatchedParameters().toArray()));
10201018
}
10211019
return super.visitMethodInvocation(method, executionContext);
@@ -1024,22 +1022,24 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu
10241022
//language=java
10251023
java(
10261024
"""
1027-
import java.util.Optional;
1025+
import java.util.function.Predicate;
1026+
import java.util.Set;
10281027
10291028
class Foo {
1030-
@SuppressWarnings("all")
1031-
void test() {
1032-
Optional.ofNullable("foo").orElseGet("bar"::toString);
1029+
Predicate<Object> test() {
1030+
Set<String> set = Set.of("1", "2");
1031+
return Predicate.not(set::contains);
10331032
}
10341033
}
10351034
""",
10361035
"""
1037-
import java.util.Optional;
1036+
import java.util.function.Predicate;
1037+
import java.util.Set;
10381038
10391039
class Foo {
1040-
@SuppressWarnings("all")
1041-
void test() {
1042-
/*~~>*/java.util.Optional.ofNullable("foo").orElseGet("bar"::toString);
1040+
Predicate<Object> test() {
1041+
Set<String> set = Set.of("1", "2");
1042+
return /*~~>*/java.util.function.Predicate.not(set::contains);
10431043
}
10441044
}
10451045
"""

rewrite-java-test/src/test/java/org/openrewrite/java/RenameVariableTest.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.openrewrite.java;
1717

1818
import org.junit.jupiter.api.Test;
19-
import org.junitpioneer.jupiter.ExpectedToFail;
2019
import org.openrewrite.DocumentExample;
2120
import org.openrewrite.ExecutionContext;
2221
import org.openrewrite.Issue;
@@ -1037,7 +1036,6 @@ public A setN(int n1) {
10371036
}
10381037

10391038
@Test
1040-
@ExpectedToFail("PR #5372 was reverted, due to regressions")
10411039
void hiddenVariablesHierarchyRenameBase() {
10421040
rewriteRun(
10431041
spec -> spec.recipe(toRecipe(() -> new JavaVisitor<>() {
@@ -1133,7 +1131,6 @@ public Extended test(Base hidden) {
11331131
}
11341132

11351133
@Test
1136-
@ExpectedToFail("PR #5372 was reverted, due to regressions")
11371134
void hiddenVariablesHierarchyRenameExtended() {
11381135
rewriteRun(
11391136
spec -> spec.recipe(toRecipe(() -> new JavaVisitor<>() {
@@ -1229,7 +1226,6 @@ public Extended test(Base hidden) {
12291226
}
12301227

12311228
@Test
1232-
@ExpectedToFail("PR #5372 was reverted, due to regressions")
12331229
void hiddenVariablesHierarchyRenameLocal() {
12341230
rewriteRun(
12351231
spec -> spec.recipe(toRecipe(() -> new JavaVisitor<>() {

rewrite-java/src/main/java/org/openrewrite/java/RenameVariable.java

Lines changed: 11 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,12 @@ public J.Identifier visitIdentifier(J.Identifier ident, P p) {
9090
}
9191
Cursor parent = getCursor().getParentTreeCursor();
9292
if (ident.getSimpleName().equals(renameVariable.getSimpleName())) {
93-
if (parent.getValue() instanceof J.FieldAccess) {
93+
if (ident.getFieldType() != null && ident.getFieldType().getOwner() instanceof JavaType.FullyQualified &&
94+
TypeUtils.isOfType(ident.getFieldType(), renameVariable.getVariableType())) {
95+
parent.putMessage("renamed", true);
96+
return ident.withFieldType(ident.getFieldType().withName(newName)).withSimpleName(newName);
97+
} else if (parent.getValue() instanceof J.FieldAccess &&
98+
!ident.equals(((J.FieldAccess) parent.getValue()).getTarget())) {
9499
if (fieldAccessTargetsVariable(parent.getValue())) {
95100
if (ident.getFieldType() != null) {
96101
ident = ident.withFieldType(ident.getFieldType().withName(newName));
@@ -149,50 +154,18 @@ private boolean isVariableName(Object value, J.Identifier ident) {
149154
}
150155

151156
/**
152-
* FieldAccess targets the variable if its target is an Identifier and either
153-
* its target FieldType equals variable.Name.FieldType
154-
* or its target Type equals variable.Name.FieldType.Owner
155-
* or if FieldAccess targets a TypCast and either
156-
* its type equals variable.Name.FieldType
157-
* or its type equals variable.Name.FieldType.Owner.
158-
* In case the FieldAccess targets another FieldAccess, the target is followed
159-
* until it is either an Identifier or a TypeCast.
157+
* FieldAccess targets the variable if its target type equals variable.Name.FieldType.Owner.
160158
*/
161159
private boolean fieldAccessTargetsVariable(J.FieldAccess fieldAccess) {
162-
if (renameVariable.getName().getFieldType() != null) {
163-
Expression target = getTarget(fieldAccess);
164-
JavaType targetType = resolveType(target.getType());
160+
if (renameVariable.getName().getFieldType() != null &&
161+
fieldAccess.getTarget().getType() != null) {
162+
JavaType targetType = resolveType(fieldAccess.getTarget().getType());
165163
JavaType.Variable variableNameFieldType = renameVariable.getName().getFieldType();
166-
if (TypeUtils.isOfType(variableNameFieldType.getOwner(), targetType)) {
167-
return true;
168-
}
169-
if (target instanceof J.TypeCast) {
170-
return TypeUtils.isOfType(variableNameFieldType, targetType);
171-
} else if (target instanceof J.Identifier) {
172-
return TypeUtils.isOfType(variableNameFieldType, ((J.Identifier) target).getFieldType());
173-
}
164+
return TypeUtils.isOfType(resolveType(variableNameFieldType.getOwner()), targetType);
174165
}
175166
return false;
176167
}
177168

178-
private @Nullable Expression getTarget(J.FieldAccess fieldAccess) {
179-
Expression target = fieldAccess.getTarget();
180-
if (target instanceof J.Identifier) {
181-
return target;
182-
}
183-
if (target instanceof J.FieldAccess) {
184-
return getTarget((J.FieldAccess) target);
185-
}
186-
if (target instanceof J.Parentheses<?>) {
187-
J tree = ((J.Parentheses<?>) target).getTree();
188-
if (tree instanceof J.TypeCast) {
189-
return (J.TypeCast) tree;
190-
}
191-
return null;
192-
}
193-
return null;
194-
}
195-
196169
private @Nullable JavaType resolveType(@Nullable JavaType type) {
197170
return type instanceof JavaType.Parameterized ? ((JavaType.Parameterized) type).getType() : type;
198171
}

rewrite-java/src/main/java/org/openrewrite/java/search/SemanticallyEqual.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,7 @@ public J.MemberReference visitMemberReference(J.MemberReference memberRef, J j)
932932
return memberRef;
933933
}
934934

935+
visit(memberRef.getContaining(), compareTo.getContaining());
935936
visitList(memberRef.getTypeParameters(), compareTo.getTypeParameters());
936937
}
937938
return memberRef;

0 commit comments

Comments
 (0)