diff --git a/src/main/java/com/squareup/javapoet/CodeWriter.java b/src/main/java/com/squareup/javapoet/CodeWriter.java index da6d3c8e5..48964a5cc 100644 --- a/src/main/java/com/squareup/javapoet/CodeWriter.java +++ b/src/main/java/com/squareup/javapoet/CodeWriter.java @@ -401,8 +401,16 @@ String lookupName(ClassName className) { // If the class is in the same package, we're done. if (Objects.equals(packageName, className.packageName())) { - referencedNames.add(topLevelSimpleName); - return join(".", className.simpleNames()); + String conflictClassName = packageName+"."+className.simpleName;//From same package (Nest) + //For nested conflict situation, the simpleName should be in QualifyList + //But its full name dont contains its super name + if(alwaysQualify.contains(className.simpleName) + &&Objects.equals(conflictClassName,className.canonicalName)){ + + }else{//If not, do regular trim + referencedNames.add(topLevelSimpleName); + return join(".", className.simpleNames()); + } } // We'll have to use the fully-qualified name. Mark the type as importable for a future pass. diff --git a/src/test/java/com/squareup/javapoet/FooInterface.java b/src/test/java/com/squareup/javapoet/FooInterface.java new file mode 100644 index 000000000..2e48735d7 --- /dev/null +++ b/src/test/java/com/squareup/javapoet/FooInterface.java @@ -0,0 +1,5 @@ +package com.squareup.javapoet; + +public interface FooInterface { + public class Nest{}; +} diff --git a/src/test/java/com/squareup/javapoet/JavaFileTest.java b/src/test/java/com/squareup/javapoet/JavaFileTest.java index e75a01961..1ed588b7d 100644 --- a/src/test/java/com/squareup/javapoet/JavaFileTest.java +++ b/src/test/java/com/squareup/javapoet/JavaFileTest.java @@ -757,6 +757,50 @@ private TypeSpec importStaticTypeSpec(String name) { + "}\n"); } + @Test public void avoidClashesWithNestedClasses_SamePackageTest() { + String source = JavaFile.builder("com.squareup.javapoet", + TypeSpec.classBuilder("Taco") + // The external Name should be full + .addField(ClassName.get(com.squareup.javapoet.Nest.class), "external_Nest") + // The internal Name would be better with super name + .addField(ClassName.get(com.squareup.javapoet.FooInterface.Nest.class), "interface_Nest") + .addSuperinterface(com.squareup.javapoet.FooInterface.class) + .build()) + .build() + .toString(); + assertThat(source).isEqualTo("package com.squareup.javapoet;\n" + + "\n" + + "class Taco implements FooInterface {\n" + + " com.squareup.javapoet.Nest external_Nest;\n" + + "\n" + + " FooInterface.Nest interface_Nest;\n" + + "}"+"\n"); + } + + @Test public void avoidClashesWithNestedClasses_InterExterPackageTest() { + String source = JavaFile.builder("com.squareup.javapoet", + TypeSpec.classBuilder("Taco") + // The external Name should be full + .addField(ClassName.get(com.squareup.javapoet.Nest.class), "external_Nest") + // The internal Name would be better with super name + .addField(ClassName.get(com.squareup.javapoet.FooInterface.Nest.class), "interface_Nest") + // The external Name from external package + .addField(ClassName.get("other","Nest"), "interface_Nest") + .addSuperinterface(com.squareup.javapoet.FooInterface.class) + .build()) + .build() + .toString(); + assertThat(source).isEqualTo("package com.squareup.javapoet;\n" + + "\n" + + "class Taco implements FooInterface {\n" + + " com.squareup.javapoet.Nest external_Nest;\n" + + "\n" + + " FooInterface.Nest interface_Nest;\n" + + "\n" + + " other.Nest interface_Nest;\n" + + "}"+"\n"); + } + @Test public void avoidClashesWithNestedClasses_viaClass() { String source = JavaFile.builder("com.squareup.tacos", TypeSpec.classBuilder("Taco") @@ -876,6 +920,10 @@ class NestedTypeB { } } + static class NestedTypeA{ + + } + private TypeSpec.Builder childTypeBuilder() { return TypeSpec.classBuilder("Child") .addMethod(MethodSpec.methodBuilder("optionalString") diff --git a/src/test/java/com/squareup/javapoet/Nest.java b/src/test/java/com/squareup/javapoet/Nest.java new file mode 100644 index 000000000..b911908b1 --- /dev/null +++ b/src/test/java/com/squareup/javapoet/Nest.java @@ -0,0 +1,4 @@ +package com.squareup.javapoet; + +public class Nest { +}