aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhil Glass <phil@phil.glass>2017-05-23 22:43:13 +0100
committerJesse Wilson <jesse@swank.ca>2017-05-23 17:43:13 -0400
commit08c7148ab302a364517f993c0fda33b1dca7bfe6 (patch)
tree7a84f0b617e593b5180e3f956eff51894c9f2a7a /src
parent5f3b345be9bd8364268d6460424ae8cf59d087f0 (diff)
downloadjavapoet-08c7148ab302a364517f993c0fda33b1dca7bfe6.tar.gz
Fix ClassName regression for class names starting with a $ (#562)
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/squareup/javapoet/ClassName.java17
-rw-r--r--src/test/java/com/squareup/javapoet/ClassNameTest.java18
2 files changed, 23 insertions, 12 deletions
diff --git a/src/main/java/com/squareup/javapoet/ClassName.java b/src/main/java/com/squareup/javapoet/ClassName.java
index 6d1abd8..3617c51 100644
--- a/src/main/java/com/squareup/javapoet/ClassName.java
+++ b/src/main/java/com/squareup/javapoet/ClassName.java
@@ -51,7 +51,7 @@ public final class ClassName extends TypeName implements Comparable<ClassName> {
this.names = Util.immutableList(names);
this.canonicalName = (names.get(0).isEmpty()
? Util.join(".", names.subList(1, names.size()))
- : Util.join(".", names)).replace(".$", "$");
+ : Util.join(".", names));
}
@Override public ClassName annotated(List<AnnotationSpec> annotations) {
@@ -141,16 +141,13 @@ public final class ClassName extends TypeName implements Comparable<ClassName> {
checkArgument(!clazz.isArray(), "array types cannot be represented as a ClassName");
List<String> names = new ArrayList<>();
while (true) {
- if (clazz.isAnonymousClass()) {
- int lastDot = clazz.getName().lastIndexOf('.');
- if (lastDot != -1) {
- String anonClassName = clazz.getName().substring(lastDot + 1);
- int lastDollar = anonClassName.lastIndexOf('$');
- names.add(anonClassName.substring(lastDollar));
- }
- } else {
- names.add(clazz.getSimpleName());
+ String anonymousSuffix = "";
+ while (clazz.isAnonymousClass()) {
+ int lastDollar = clazz.getName().lastIndexOf('$');
+ anonymousSuffix = clazz.getName().substring(lastDollar) + anonymousSuffix;
+ clazz = clazz.getEnclosingClass();
}
+ names.add(clazz.getSimpleName() + anonymousSuffix);
Class<?> enclosing = clazz.getEnclosingClass();
if (enclosing == null) break;
clazz = enclosing;
diff --git a/src/test/java/com/squareup/javapoet/ClassNameTest.java b/src/test/java/com/squareup/javapoet/ClassNameTest.java
index 1544814..0488213 100644
--- a/src/test/java/com/squareup/javapoet/ClassNameTest.java
+++ b/src/test/java/com/squareup/javapoet/ClassNameTest.java
@@ -96,10 +96,18 @@ public final class ClassNameTest {
assertThat(baz).isEqualTo(ClassName.get("com.example", "Foo", "Bar", "Baz"));
}
+ static class $Outer {
+ static class $Inner {}
+ }
+
@Test public void classNameFromTypeElement() {
Elements elements = compilationRule.getElements();
- TypeElement element = elements.getTypeElement(Object.class.getCanonicalName());
- assertThat(ClassName.get(element).toString()).isEqualTo("java.lang.Object");
+ TypeElement object = elements.getTypeElement(Object.class.getCanonicalName());
+ assertThat(ClassName.get(object).toString()).isEqualTo("java.lang.Object");
+ TypeElement outer = elements.getTypeElement($Outer.class.getCanonicalName());
+ assertThat(ClassName.get(outer).toString()).isEqualTo("com.squareup.javapoet.ClassNameTest.$Outer");
+ TypeElement inner = elements.getTypeElement($Outer.$Inner.class.getCanonicalName());
+ assertThat(ClassName.get(inner).toString()).isEqualTo("com.squareup.javapoet.ClassNameTest.$Outer.$Inner");
}
@Test public void classNameFromClass() {
@@ -109,6 +117,12 @@ public final class ClassNameTest {
.isEqualTo("com.squareup.javapoet.ClassNameTest.OuterClass.InnerClass");
assertThat((ClassName.get(new Object() {}.getClass())).toString())
.isEqualTo("com.squareup.javapoet.ClassNameTest$1");
+ assertThat((ClassName.get(new Object() { Object inner = new Object() {}; }.inner.getClass())).toString())
+ .isEqualTo("com.squareup.javapoet.ClassNameTest$2$1");
+ assertThat((ClassName.get($Outer.class)).toString())
+ .isEqualTo("com.squareup.javapoet.ClassNameTest.$Outer");
+ assertThat((ClassName.get($Outer.$Inner.class)).toString())
+ .isEqualTo("com.squareup.javapoet.ClassNameTest.$Outer.$Inner");
}
@Test public void peerClass() {