diff options
Diffstat (limited to 'src/java_tools')
3 files changed, 55 insertions, 2 deletions
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java index a3f8d7265b..df446cd300 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java @@ -248,6 +248,9 @@ public class JavacTurbine implements AutoCloseable { } String name = entry.getKey(); byte[] bytes = entry.getValue().asBytes(); + if (bytes == null) { + continue; + } if (name.endsWith(".class")) { bytes = processBytecode(bytes); } diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java index cb197a487b..42d698e7d8 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java @@ -20,6 +20,7 @@ import com.sun.tools.javac.util.Context; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -32,6 +33,7 @@ import java.nio.charset.CodingErrorAction; import java.nio.charset.StandardCharsets; import java.util.Map; +import javax.annotation.Nullable; import javax.tools.FileObject; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; @@ -116,7 +118,7 @@ public class ZipOutputFileManager extends JavacFileManager { public final Location location; - private final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + @Nullable private ByteArrayOutputStream buffer; public OutputFileObject(String name, Kind kind, Location location) { super(URI.create("outputbuffer:/" + name), kind); @@ -125,16 +127,25 @@ public class ZipOutputFileManager extends JavacFileManager { @Override public OutputStream openOutputStream() { + if (buffer == null) { + buffer = new ByteArrayOutputStream(); + } return buffer; } @Override public InputStream openInputStream() throws IOException { + if (buffer == null) { + throw new FileNotFoundException(getName()); + } return new ByteArrayInputStream(asBytes()); } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { + if (buffer == null) { + throw new FileNotFoundException(getName()); + } CodingErrorAction errorAction = ignoreEncodingErrors ? CodingErrorAction.IGNORE : CodingErrorAction.REPORT; CharsetDecoder decoder = @@ -146,7 +157,7 @@ public class ZipOutputFileManager extends JavacFileManager { } public byte[] asBytes() { - return buffer.toByteArray(); + return buffer != null ? buffer.toByteArray() : null; } } diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java index 015a12212b..7588d647ec 100644 --- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java +++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java @@ -1042,4 +1042,43 @@ public class JavacTurbineTest { } assertThat(errOutput.toString()).contains("invalid flag: -NOT_AN_OPTION"); } + + /** An annotation processor that reads a file that doesn't exist. */ + @SupportedAnnotationTypes("*") + public static class NoSuchFileProcessor extends AbstractProcessor { + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } + + @Override + public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { + try { + processingEnv + .getFiler() + .getResource(StandardLocation.CLASS_OUTPUT, "", "NO_SUCH_FILE") + .openInputStream(); + } catch (IOException e) { + throw new IOError(e); + } + return false; + } + } + + @Test + public void processorReadsNonexistantFile() throws Exception { + addSourceLines("Hello.java", "@Deprecated class Hello {}"); + optionsBuilder.setProcessors(ImmutableList.of(NoSuchFileProcessor.class.getName())); + optionsBuilder.addProcessorPathEntries( + ImmutableList.copyOf(Splitter.on(':').split(System.getProperty("java.class.path")))); + optionsBuilder.addSources(ImmutableList.copyOf(Iterables.transform(sources, TO_STRING))); + + StringWriter errOutput = new StringWriter(); + try (JavacTurbine turbine = + new JavacTurbine(new PrintWriter(errOutput, true), optionsBuilder.build())) { + assertThat(turbine.compile()).isEqualTo(Result.ERROR); + } + assertThat(errOutput.toString()).contains("FileNotFoundException: /NO_SUCH_FILE"); + } } |