aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/squareup/javapoet/ClassName.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/squareup/javapoet/ClassName.java')
-rw-r--r--src/main/java/com/squareup/javapoet/ClassName.java35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/main/java/com/squareup/javapoet/ClassName.java b/src/main/java/com/squareup/javapoet/ClassName.java
index 99c4ed2..4bef49d 100644
--- a/src/main/java/com/squareup/javapoet/ClassName.java
+++ b/src/main/java/com/squareup/javapoet/ClassName.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import javax.lang.model.element.Element;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
@@ -32,6 +33,9 @@ import static com.squareup.javapoet.Util.checkNotNull;
public final class ClassName extends TypeName implements Comparable<ClassName> {
public static final ClassName OBJECT = ClassName.get(Object.class);
+ /** The name representing the default Java package. */
+ private static final String NO_PACKAGE = "";
+
/** The package name of this class, or "" if this is in the default package. */
final String packageName;
@@ -41,6 +45,8 @@ public final class ClassName extends TypeName implements Comparable<ClassName> {
/** This class name, like "Entry" for java.util.Map.Entry. */
final String simpleName;
+ private List<String> simpleNames;
+
/** The full class name like "java.util.Map.Entry". */
final String canonicalName;
@@ -51,7 +57,7 @@ public final class ClassName extends TypeName implements Comparable<ClassName> {
private ClassName(String packageName, ClassName enclosingClassName, String simpleName,
List<AnnotationSpec> annotations) {
super(annotations);
- this.packageName = packageName;
+ this.packageName = Objects.requireNonNull(packageName, "packageName == null");
this.enclosingClassName = enclosingClassName;
this.simpleName = simpleName;
this.canonicalName = enclosingClassName != null
@@ -108,11 +114,18 @@ public final class ClassName extends TypeName implements Comparable<ClassName> {
}
public List<String> simpleNames() {
- List<String> simpleNames = new ArrayList<>();
- if (enclosingClassName != null) {
- simpleNames.addAll(enclosingClassName().simpleNames());
+ if (simpleNames != null) {
+ return simpleNames;
+ }
+
+ if (enclosingClassName == null) {
+ simpleNames = Collections.singletonList(simpleName);
+ } else {
+ List<String> mutableNames = new ArrayList<>();
+ mutableNames.addAll(enclosingClassName().simpleNames());
+ mutableNames.add(simpleName);
+ simpleNames = Collections.unmodifiableList(mutableNames);
}
- simpleNames.add(simpleName);
return simpleNames;
}
@@ -138,6 +151,14 @@ public final class ClassName extends TypeName implements Comparable<ClassName> {
return simpleName;
}
+ /**
+ * Returns the full class name of this class.
+ * Like {@code "java.util.Map.Entry"} for {@link Map.Entry}.
+ * */
+ public String canonicalName() {
+ return canonicalName;
+ }
+
public static ClassName get(Class<?> clazz) {
checkNotNull(clazz, "clazz == null");
checkArgument(!clazz.isPrimitive(), "primitive types cannot be represented as a ClassName");
@@ -155,7 +176,7 @@ public final class ClassName extends TypeName implements Comparable<ClassName> {
if (clazz.getEnclosingClass() == null) {
// Avoid unreliable Class.getPackage(). https://github.com/square/javapoet/issues/295
int lastDot = clazz.getName().lastIndexOf('.');
- String packageName = (lastDot != -1) ? clazz.getName().substring(0, lastDot) : null;
+ String packageName = (lastDot != -1) ? clazz.getName().substring(0, lastDot) : NO_PACKAGE;
return new ClassName(packageName, null, name);
}
@@ -177,7 +198,7 @@ public final class ClassName extends TypeName implements Comparable<ClassName> {
p = classNameString.indexOf('.', p) + 1;
checkArgument(p != 0, "couldn't make a guess for %s", classNameString);
}
- String packageName = p == 0 ? "" : classNameString.substring(0, p - 1);
+ String packageName = p == 0 ? NO_PACKAGE : classNameString.substring(0, p - 1);
// Add class names like "Map" and "Entry".
ClassName className = null;