Improve name handling

This commit is contained in:
Timo Westkämper 2015-09-25 21:54:17 +03:00
parent 5a3bbb78ae
commit d285ba836f
5 changed files with 61 additions and 27 deletions

View File

@ -230,7 +230,9 @@ public class SimpleType implements Type {
public String getRawName(Set<String> packages, Set<String> classes) {
if (classes.contains(fullName)) {
return simpleName;
} else if (packages.contains(packageName) || classes.contains(outerClassName)) {
} else if (classes.contains(outerClassName)) {
return fullName.substring(outerClassName.lastIndexOf('.') + 1);
} else if (packages.contains(packageName)) {
return localName;
} else {
return fullName;

View File

@ -55,21 +55,19 @@ public final class ClassUtils {
public static String getName(Class<?> cl, Set<String> packages, Set<String> classes) {
if (cl.isArray()) {
return getName(cl.getComponentType(), packages, classes) + "[]";
}
if (cl.getName().indexOf('$') > 0) {
return getName(cl.getDeclaringClass(), packages, classes) + "." + cl.getSimpleName();
}
final String canonicalName = cl.getName();
final int i = canonicalName.lastIndexOf('.');
if (i == -1) {
return canonicalName;
} else {
final String packageName = canonicalName.substring(0, i);
if (packages.contains(packageName) || classes.contains(canonicalName)) {
return cl.getSimpleName();
} else {
return canonicalName;
}
final String canonicalName = cl.getName().replace('$', '.');
final int i = cl.getName().lastIndexOf('.');
if (classes.contains(canonicalName)) {
return cl.getSimpleName();
} else if (cl.getEnclosingClass() != null) {
return getName(cl.getEnclosingClass(), packages, classes) + "." + cl.getSimpleName();
} else if (i == -1) {
return canonicalName;
} else if (packages.contains(canonicalName.substring(0, i))) {
return canonicalName.substring(i + 1);
} else {
return canonicalName;
}
}

View File

@ -12,10 +12,15 @@ import java.util.Map;
import org.junit.Test;
import com.google.common.collect.ImmutableSet;
public class ClassTypeTest {
public class Inner {
public class Inner2 {
public class Inner3 {
}
}
}
private final ClassType stringType = new ClassType(TypeCategory.STRING, String.class);
@ -110,8 +115,22 @@ public class ClassTypeTest {
// }
@Test
public void getEnclosingType() {
assertEquals(new ClassType(ClassTypeTest.class), new ClassType(Inner.class).getEnclosingType());
assertNull(new ClassType(ClassTypeTest.class).getEnclosingType());
public void GetEnclosingType() {
Type outer = new ClassType(ClassTypeTest.class);
Type inner = new ClassType(ClassTypeTest.Inner.class);
Type inner2 = new ClassType(ClassTypeTest.Inner.Inner2.class);
Type inner3 = new ClassType(ClassTypeTest.Inner.Inner2.Inner3.class);
assertEquals(inner2, inner3.getEnclosingType());
assertEquals(inner, inner2.getEnclosingType());
assertEquals(outer, inner.getEnclosingType());
assertNull(outer.getEnclosingType());
assertEquals("ClassTypeTest.Inner.Inner2.Inner3",
inner3.getRawName(ImmutableSet.of(outer.getPackageName()), ImmutableSet.<String>of()));
assertEquals("Inner2.Inner3",
inner3.getRawName(ImmutableSet.<String>of(), ImmutableSet.of(inner2.getFullName())));
assertEquals("Inner3",
inner3.getRawName(ImmutableSet.<String>of(), ImmutableSet.of(inner3.getFullName())));
}
}

View File

@ -6,10 +6,15 @@ import java.util.Collections;
import org.junit.Test;
import com.google.common.collect.ImmutableSet;
public class SimpleTypeTest {
public static class Inner {
public class Inner2 {
public class Inner3 {
}
}
}
@Test
@ -68,11 +73,23 @@ public class SimpleTypeTest {
@Test
public void GetEnclosingType() {
assertEquals(new SimpleType(new ClassType(SimpleTypeTest.class)),
new SimpleType(new ClassType(Inner.class)).getEnclosingType());
assertNull(new SimpleType(new ClassType(SimpleTypeTest.class)).getEnclosingType());
}
Type outer = new SimpleType(new ClassType(SimpleTypeTest.class));
Type inner = new SimpleType(new ClassType(SimpleTypeTest.Inner.class));
Type inner2 = new SimpleType(new ClassType(SimpleTypeTest.Inner.Inner2.class));
Type inner3 = new SimpleType(new ClassType(SimpleTypeTest.Inner.Inner2.Inner3.class));
assertEquals(inner2, inner3.getEnclosingType());
assertEquals(inner, inner2.getEnclosingType());
assertEquals(outer, inner.getEnclosingType());
assertNull(outer.getEnclosingType());
assertEquals("SimpleTypeTest.Inner.Inner2.Inner3",
inner3.getRawName(ImmutableSet.of(outer.getPackageName()), ImmutableSet.<String>of()));
assertEquals("Inner2.Inner3",
inner3.getRawName(ImmutableSet.<String>of(), ImmutableSet.of(inner2.getFullName())));
assertEquals("Inner3",
inner3.getRawName(ImmutableSet.<String>of(), ImmutableSet.of(inner3.getFullName())));
}
@Test
public void IsMember() {
assertTrue(new SimpleType(new ClassType(SimpleTypeTest.Inner.class)).isMember());

View File

@ -19,9 +19,7 @@ public class ClassUtilsTest {
@Test
public void GetName() {
assertEquals("int", ClassUtils.getName(int.class));
assertEquals(
"int",
ClassUtils.getName(int.class, Collections.<String> emptySet(),
assertEquals("int", ClassUtils.getName(int.class, Collections.<String> emptySet(),
Collections.<String> emptySet()));
assertEquals("Object", ClassUtils.getName(Object.class));
assertEquals("Object[]", ClassUtils.getName(Object[].class));