aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java_tools
diff options
context:
space:
mode:
authorGravatar Liam Miller-Cushon <cushon@google.com>2016-03-31 23:12:46 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-04-01 08:30:32 +0000
commit9a2ba602382decae4838e2f8f65105023615d5bd (patch)
tree5531ba9339ddefcb15cb43d426a85ea6acfec4a9 /src/java_tools
parente321ce265d949fa8b7a77086f0b832e51e25de51 (diff)
Track which output files are written
instead of initializing all file objects to empty. Some annotation processors speculatively open files and handle FileNotFoundException, and we were always providing empty files. -- MOS_MIGRATED_REVID=118730162
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");
+ }
}