Skip to content

Commit 19ca58c

Browse files
authored
Enhance AddImport to shorten fully qualified names (#5452)
1 parent 5ed9fb2 commit 19ca58c

File tree

2 files changed

+98
-4
lines changed

2 files changed

+98
-4
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,7 @@ class A {
10311031
Map<String, String> map = new HashMap<>();
10321032
Set<String> set = new HashSet<>();
10331033
List<String> test = Collections.singletonList("test");
1034-
List<String> test2 = new java.util.ArrayList<>();
1034+
List<String> test2 = new ArrayList<>();
10351035
}
10361036
"""
10371037
)
@@ -1546,7 +1546,7 @@ void method() {
15461546
import static com.example.CustomColor.RED;
15471547
15481548
class Ambiguous {
1549-
Color color = java.awt.Color.RED;
1549+
Color color = Color.RED;
15501550
void method() {
15511551
// RED is from com.example.CustomColor
15521552
System.out.println(RED);

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

Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.openrewrite.java;
1717

18+
import lombok.AllArgsConstructor;
1819
import lombok.EqualsAndHashCode;
1920
import org.jspecify.annotations.Nullable;
2021
import org.openrewrite.Cursor;
@@ -172,6 +173,12 @@ public AddImport(@Nullable String packageName, String typeName, @Nullable String
172173

173174
List<JRightPadded<J.Import>> newImports = layoutStyle.addImport(cu.getPadding().getImports(), importToAdd, cu.getPackageDeclaration(), classpath);
174175

176+
if (member != null && typeReference.isPresent()) {
177+
cu = (JavaSourceFile) new ShortenFullyQualifiedMemberReferences(typeReference.get()).visit(cu, p);
178+
} else if (member == null && typeReference.isPresent()) {
179+
cu = (JavaSourceFile) new ShortenFullyQualifiedTypeReferences((JavaType.FullyQualified) typeReference.get()).visit(cu, p);
180+
}
181+
175182
// ImportLayoutStyle::addImport adds always `\n` as newlines. Checking if we need to fix them
176183
newImports = checkCRLF(cu, newImports);
177184

@@ -202,7 +209,7 @@ private ImportStatus checkImportsForType(List<J.Import> imports) {
202209
return ImportStatus.IMPLICITLY_IMPORTED;
203210
}
204211
}
205-
if (ending.equals(member)) {
212+
if (!"*".equals(ending) && ending.equals(member)) {
206213
return ImportStatus.IMPORT_AMBIGUITY;
207214
}
208215
} else {
@@ -213,7 +220,7 @@ private ImportStatus checkImportsForType(List<J.Import> imports) {
213220
return ImportStatus.IMPLICITLY_IMPORTED;
214221
}
215222
}
216-
if (ending.equals(typeName)) {
223+
if (!"*".equals(ending) && ending.equals(typeName)) {
217224
return ImportStatus.IMPORT_AMBIGUITY;
218225
}
219226
}
@@ -319,4 +326,91 @@ public J.Identifier visitIdentifier(J.Identifier identifier, AtomicReference<Jav
319326
return identifier;
320327
}
321328
}
329+
330+
@AllArgsConstructor
331+
private class ShortenFullyQualifiedTypeReferences extends ShortenFullyQualifiedReference {
332+
private final JavaType.FullyQualified typeToShorten;
333+
334+
@Override
335+
public J visitFieldAccess(J.FieldAccess fieldAccess, P p) {
336+
if (fieldAccess.isFullyQualifiedClassReference(typeToShorten.getFullyQualifiedName())) {
337+
return fieldAccess.getName().withPrefix(fieldAccess.getPrefix());
338+
}
339+
return super.visitFieldAccess(fieldAccess, p);
340+
}
341+
342+
@Override
343+
public J visitIdentifier(J.Identifier identifier, P p) {
344+
if (isFullyQualifiedClassReference(identifier, typeToShorten.getFullyQualifiedName())) {
345+
return identifier.withSimpleName(typeToShorten.getClassName());
346+
}
347+
return super.visitIdentifier(identifier, p);
348+
}
349+
}
350+
351+
@AllArgsConstructor
352+
private class ShortenFullyQualifiedMemberReferences extends ShortenFullyQualifiedReference {
353+
private final JavaType memberToShorten;
354+
355+
@Override
356+
public J visitMethodInvocation(J.MethodInvocation methodInvocation, P p) {
357+
J.MethodInvocation mi = (J.MethodInvocation) super.visitMethodInvocation(methodInvocation, p);
358+
if (!(memberToShorten instanceof JavaType.Method)) {
359+
return mi;
360+
}
361+
JavaType.Method m = (JavaType.Method) memberToShorten;
362+
JavaType.FullyQualified targetType = m.getDeclaringType();
363+
364+
if (isFullyQualifiedClassReference(mi.getSelect(), targetType.getFullyQualifiedName()) && mi.getSimpleName().equals(m.getName())) {
365+
return methodInvocation.withSelect(null);
366+
}
367+
return mi;
368+
}
369+
370+
@Override
371+
public J visitFieldAccess(J.FieldAccess fieldAccess, P p) {
372+
if (!(memberToShorten instanceof JavaType.Variable)) {
373+
return super.visitFieldAccess(fieldAccess, p);
374+
}
375+
JavaType.Variable var = (JavaType.Variable) memberToShorten;
376+
JavaType.FullyQualified targetType = (JavaType.FullyQualified) var.getOwner();
377+
if (targetType != null) {
378+
if (fieldAccess.getTarget() instanceof J.FieldAccess) {
379+
J.FieldAccess target = (J.FieldAccess) fieldAccess.getTarget();
380+
if (target.isFullyQualifiedClassReference(targetType.getFullyQualifiedName())) {
381+
return fieldAccess.getName().withPrefix(fieldAccess.getPrefix());
382+
}
383+
}
384+
}
385+
return super.visitFieldAccess(fieldAccess, p);
386+
}
387+
}
388+
389+
private abstract class ShortenFullyQualifiedReference extends JavaVisitor<P> {
390+
@Override
391+
public J visitImport(J.Import _import, P p) {
392+
return _import;
393+
}
394+
395+
@Override
396+
protected JavadocVisitor<P> getJavadocVisitor() {
397+
return new JavadocVisitor<P>(new JavaVisitor<>()) {
398+
@Override
399+
public Javadoc visitReference(Javadoc.Reference reference, P p) {
400+
return reference;
401+
}
402+
};
403+
}
404+
405+
protected boolean isFullyQualifiedClassReference(@Nullable Expression expr, String className) {
406+
if (expr instanceof J.FieldAccess) {
407+
return ((J.FieldAccess) expr).isFullyQualifiedClassReference(className);
408+
}
409+
if (expr instanceof J.Identifier) {
410+
J.Identifier id = (J.Identifier) expr;
411+
return id.getFieldType() == null && id.getSimpleName().equals(className);
412+
}
413+
return false;
414+
}
415+
}
322416
}

0 commit comments

Comments
 (0)