aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlmog Gavra <almog@confluent.io>2019-04-26 16:15:29 -0700
committerJake Wharton <jakew@google.com>2019-05-01 15:32:05 -0400
commit3829f2ca6f03a4b941fea41a1e2f4eead8f37bc1 (patch)
tree33122f54ede853eb55ac631bbbd22f39da00860b
parent0f93da9a3d9a1da8d29fc993409fcf83d40452bc (diff)
downloadjavapoet-3829f2ca6f03a4b941fea41a1e2f4eead8f37bc1.tar.gz
Fix an issue where ClassName could not handle classes in the default (empty) package
-rw-r--r--src/main/java/com/squareup/javapoet/ClassName.java10
-rw-r--r--src/test/java/ClassNameNoPackageTest.java33
2 files changed, 40 insertions, 3 deletions
diff --git a/src/main/java/com/squareup/javapoet/ClassName.java b/src/main/java/com/squareup/javapoet/ClassName.java
index b8dbd31..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;
@@ -53,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
@@ -172,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);
}
@@ -194,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;
diff --git a/src/test/java/ClassNameNoPackageTest.java b/src/test/java/ClassNameNoPackageTest.java
new file mode 100644
index 0000000..8b8545d
--- /dev/null
+++ b/src/test/java/ClassNameNoPackageTest.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 Square, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.squareup.javapoet.ClassName;
+import org.junit.Test;
+
+/**
+ * Since it is impossible to import classes from the default package into other
+ * modules, this test must live in this package.
+ */
+public final class ClassNameNoPackageTest {
+ @Test public void shouldSupportClassInDefaultPackage() {
+ ClassName className = ClassName.get(ClassNameNoPackageTest.class);
+ assertThat(className.packageName()).isEqualTo("");
+ assertThat(className.simpleName()).isEqualTo("ClassNameNoPackageTest");
+ assertThat(className.toString()).isEqualTo("ClassNameNoPackageTest");
+ }
+}