Skip to content

Commit 61e9980

Browse files
cushonJavac Team
authored andcommitted
Fix handling of unnamed packages in getPackageElement
PiperOrigin-RevId: 836134198
1 parent d79f9a1 commit 61e9980

File tree

5 files changed

+53
-2
lines changed

5 files changed

+53
-2
lines changed

java/com/google/turbine/binder/Binder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ private static BindPackagesResult bindPackages(
257257
}
258258
CompoundScope topLevel = CompoundScope.base(tli.scope()).append(javaLang);
259259
for (PreprocessedCompUnit unit : units) {
260+
// omitEmptyStrings() to return an empty Iterable for the default package
260261
ImmutableList<String> packagename =
261262
ImmutableList.copyOf(Splitter.on('/').omitEmptyStrings().split(unit.packageName()));
262263
Scope packageScope = tli.lookupPackage(packagename);

java/com/google/turbine/binder/lookup/SimpleTopLevelIndex.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ public Scope scope() {
170170
public @Nullable PackageScope lookupPackage(Iterable<String> packagename) {
171171
Node curr = root;
172172
for (String bit : packagename) {
173+
if (bit.isEmpty()) {
174+
throw new IllegalArgumentException("Empty package name");
175+
}
173176
curr = curr.lookup(bit);
174177
if (curr == null || curr.sym != null) {
175178
return null;

java/com/google/turbine/processing/TurbineElement.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1059,7 +1059,9 @@ public Element getEnclosingElement() {
10591059
@Override
10601060
public List<TurbineTypeElement> getEnclosedElements() {
10611061
ImmutableSet.Builder<TurbineTypeElement> result = ImmutableSet.builder();
1062-
PackageScope scope = factory.tli().lookupPackage(Splitter.on('/').split(sym.binaryName()));
1062+
// omitEmptyStrings() to return an empty Iterable for the default package
1063+
PackageScope scope =
1064+
factory.tli().lookupPackage(Splitter.on('/').omitEmptyStrings().split(sym.binaryName()));
10631065
requireNonNull(scope); // the current package exists
10641066
for (ClassSymbol key : scope.classes()) {
10651067
if (key.binaryName().contains("$") && factory.getSymbol(key).owner() != null) {

java/com/google/turbine/processing/TurbineElements.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ private static Symbol asSymbol(Element element) {
7676

7777
@Override
7878
public PackageElement getPackageElement(CharSequence name) {
79-
ImmutableList<String> packageName = ImmutableList.copyOf(Splitter.on('.').split(name));
79+
ImmutableList<String> packageName =
80+
name.isEmpty() ? ImmutableList.of() : ImmutableList.copyOf(Splitter.on('.').split(name));
8081
if (factory.tli().lookupPackage(packageName) == null) {
8182
return null;
8283
}

javatests/com/google/turbine/processing/ProcessingIntegrationTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import javax.lang.model.element.AnnotationMirror;
7070
import javax.lang.model.element.Element;
7171
import javax.lang.model.element.ExecutableElement;
72+
import javax.lang.model.element.PackageElement;
7273
import javax.lang.model.element.RecordComponentElement;
7374
import javax.lang.model.element.TypeElement;
7475
import javax.lang.model.element.VariableElement;
@@ -1163,6 +1164,49 @@ class T {
11631164
"field h with annotations [], type '@A int[]' with annotations []");
11641165
}
11651166

1167+
@SupportedAnnotationTypes("*")
1168+
public static class UnnamedPackageProcessor extends AbstractProcessor {
1169+
@Override
1170+
public SourceVersion getSupportedSourceVersion() {
1171+
return SourceVersion.latestSupported();
1172+
}
1173+
1174+
private boolean first = true;
1175+
1176+
@Override
1177+
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
1178+
if (!first) {
1179+
return false;
1180+
}
1181+
first = false;
1182+
PackageElement p = processingEnv.getElementUtils().getPackageElement("");
1183+
for (Element e : p.getEnclosedElements()) {
1184+
processingEnv
1185+
.getMessager()
1186+
.printMessage(
1187+
Diagnostic.Kind.ERROR, String.format("package '%s' contains %s", p, e), e);
1188+
}
1189+
return false;
1190+
}
1191+
}
1192+
1193+
@Test
1194+
public void unnamedPackage() {
1195+
ImmutableList<Tree.CompUnit> units =
1196+
parseUnit(
1197+
"""
1198+
=== T.java ===
1199+
class A {}
1200+
class B {}
1201+
""");
1202+
TurbineError e = runProcessors(units, new UnnamedPackageProcessor());
1203+
assertThat(
1204+
e.diagnostics().stream()
1205+
.filter(d -> d.severity().equals(Diagnostic.Kind.ERROR))
1206+
.map(d -> d.message()))
1207+
.containsExactly("package '' contains A", "package '' contains B");
1208+
}
1209+
11661210
private TurbineError runProcessors(ImmutableList<Tree.CompUnit> units, Processor... processors) {
11671211
return assertThrows(
11681212
TurbineError.class,

0 commit comments

Comments
 (0)