Skip to content

Commit c46b1b6

Browse files
netdpbCompile-Testing Team
authored andcommitted
Fix bug where testing a package-info.java file with parsesAs() threw an NPE.
Fixes #85. RELNOTES=Fixed bug where testing `package-info.java` with `parsesAs()` threw an NPE. PiperOrigin-RevId: 375541051
1 parent b6b54cd commit c46b1b6

4 files changed

Lines changed: 47 additions & 16 deletions

File tree

src/main/java/com/google/testing/compile/TypeEnumerator.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,13 @@
2121
import com.google.common.collect.FluentIterable;
2222
import com.google.common.collect.ImmutableSet;
2323
import com.google.common.collect.Sets;
24-
2524
import com.sun.source.tree.ClassTree;
2625
import com.sun.source.tree.CompilationUnitTree;
2726
import com.sun.source.tree.ExpressionStatementTree;
2827
import com.sun.source.tree.IdentifierTree;
2928
import com.sun.source.tree.MemberSelectTree;
3029
import com.sun.source.tree.Tree;
3130
import com.sun.source.util.TreeScanner;
32-
3331
import java.util.Set;
3432

3533
/**
@@ -100,7 +98,7 @@ public Set<String> visitCompilationUnit(CompilationUnitTree reference, Void v) {
10098
"package identifier. Found " + packageSet);
10199
}
102100
final String packageName = packageSet.isEmpty() ? "" : packageSet.iterator().next();
103-
Set<String> typeDeclSet = scan(reference.getTypeDecls(), v);
101+
Set<String> typeDeclSet = firstNonNull(scan(reference.getTypeDecls(), v), ImmutableSet.of());
104102
return FluentIterable.from(typeDeclSet)
105103
.transform(new Function<String, String>() {
106104
@Override public String apply(String typeName) {

src/test/java/com/google/testing/compile/CompilationSubjectTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,16 @@ public void generatedSourceFile() {
808808
GeneratingProcessor.GENERATED_CLASS_NAME, GeneratingProcessor.GENERATED_SOURCE));
809809
}
810810

811+
@Test
812+
public void generatedSourceFile_packageInfo() {
813+
GeneratingProcessor generatingProcessor = new GeneratingProcessor("test");
814+
assertThat(javac().withProcessors(generatingProcessor).compile(HELLO_WORLD_RESOURCE))
815+
.generatedSourceFile("test.package-info")
816+
.hasSourceEquivalentTo(
817+
JavaFileObjects.forSourceString(
818+
"test.package-info", generatingProcessor.generatedPackageInfoSource()));
819+
}
820+
811821
@Test
812822
public void generatedSourceFile_fail() {
813823
expectFailure

src/test/java/com/google/testing/compile/GeneratingProcessor.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.common.collect.ImmutableSet;
2222
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2323
import java.io.IOException;
24+
import java.io.UncheckedIOException;
2425
import java.io.Writer;
2526
import java.util.Set;
2627
import javax.annotation.processing.AbstractProcessor;
@@ -29,6 +30,7 @@
2930
import javax.annotation.processing.RoundEnvironment;
3031
import javax.lang.model.SourceVersion;
3132
import javax.lang.model.element.TypeElement;
33+
import javax.tools.FileObject;
3234

3335
final class GeneratingProcessor extends AbstractProcessor {
3436
static final String GENERATED_CLASS_NAME = "Blah";
@@ -50,31 +52,33 @@ final class GeneratingProcessor extends AbstractProcessor {
5052
@Override
5153
public synchronized void init(ProcessingEnvironment processingEnv) {
5254
Filer filer = processingEnv.getFiler();
53-
try (Writer writer = filer.createSourceFile(generatedClassName()).openWriter()) {
54-
writer.write(GENERATED_SOURCE);
55-
} catch (IOException e) {
56-
throw new RuntimeException(e);
57-
}
55+
try {
56+
write(filer.createSourceFile(generatedClassName()), GENERATED_SOURCE);
57+
write(
58+
filer.createResource(
59+
CLASS_OUTPUT, getClass().getPackage().getName(), GENERATED_RESOURCE_NAME),
60+
GENERATED_RESOURCE);
5861

59-
try (Writer writer =
60-
filer
61-
.createResource(
62-
CLASS_OUTPUT, getClass().getPackage().getName(), GENERATED_RESOURCE_NAME)
63-
.openWriter()) {
64-
writer.write(GENERATED_RESOURCE);
62+
if (!packageName.isEmpty()) {
63+
write(filer.createSourceFile(packageName + ".package-info"), generatedPackageInfoSource());
64+
}
6565
} catch (IOException e) {
66-
throw new RuntimeException(e);
66+
throw new UncheckedIOException(e);
6767
}
6868
}
6969

7070
String packageName() {
7171
return packageName;
7272
}
73-
73+
7474
String generatedClassName() {
7575
return packageName.isEmpty() ? GENERATED_CLASS_NAME : packageName + "." + GENERATED_CLASS_NAME;
7676
}
7777

78+
String generatedPackageInfoSource() {
79+
return "package " + packageName + ";\n";
80+
}
81+
7882
@CanIgnoreReturnValue
7983
@Override
8084
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
@@ -90,4 +94,10 @@ public Set<String> getSupportedAnnotationTypes() {
9094
public SourceVersion getSupportedSourceVersion() {
9195
return SourceVersion.latestSupported();
9296
}
97+
98+
private static void write(FileObject file, String contents) throws IOException {
99+
try (Writer writer = file.openWriter()) {
100+
writer.write(contents);
101+
}
102+
}
93103
}

src/test/java/com/google/testing/compile/JavaSourcesSubjectFactoryTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,19 @@ public void generatesSources() {
741741
GeneratingProcessor.GENERATED_CLASS_NAME, GeneratingProcessor.GENERATED_SOURCE));
742742
}
743743

744+
@Test
745+
public void generatesSources_packageInfo() {
746+
GeneratingProcessor generatingProcessor = new GeneratingProcessor("test.generated");
747+
assertAbout(javaSource())
748+
.that(HELLO_WORLD_RESOURCE)
749+
.processedWith(generatingProcessor)
750+
.compilesWithoutError()
751+
.and()
752+
.generatesSources(
753+
JavaFileObjects.forSourceString(
754+
"test.generated.package-info", generatingProcessor.generatedPackageInfoSource()));
755+
}
756+
744757
@Test
745758
public void generatesSources_failOnUnexpected() {
746759
String failingExpectationSource = "abstract class Blah {}";

0 commit comments

Comments
 (0)