aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java_tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/java_tools')
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java3
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/ZipOutputFileManager.java15
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java39
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");
+ }
}