diff options
author | Almog Gavra <almog@confluent.io> | 2019-04-26 16:15:29 -0700 |
---|---|---|
committer | Jake Wharton <jakew@google.com> | 2019-05-01 15:32:05 -0400 |
commit | 3829f2ca6f03a4b941fea41a1e2f4eead8f37bc1 (patch) | |
tree | 33122f54ede853eb55ac631bbbd22f39da00860b | |
parent | 0f93da9a3d9a1da8d29fc993409fcf83d40452bc (diff) | |
download | javapoet-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.java | 10 | ||||
-rw-r--r-- | src/test/java/ClassNameNoPackageTest.java | 33 |
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"); + } +} |