From 90de4069c9cc148f127b418a5c05c2daa645a2af Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 19 May 2014 13:16:30 +0400 Subject: [PATCH] support content loading for resource files from output roots (needed by some annotation processors) --- .../jetbrains/jps/javac/JavacFileManager.java | 36 ++++++++++++++++++- .../jps/javac/JavacServerClient.java | 16 ++++++++- .../jps/javac/JavacServerResponseHandler.java | 11 ++++-- .../jetbrains/jps/javac/OutputFileObject.java | 33 +++++++++++++---- 4 files changed, 84 insertions(+), 12 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacFileManager.java b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacFileManager.java index d2f934c40f77..9a7afe1cfa8d 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacFileManager.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacFileManager.java @@ -39,6 +39,8 @@ class JavacFileManager extends ForwardingJavaFileManager mySourceTransformers; private Map> myOutputsMap = Collections.emptyMap(); + @Nullable + private String myEncodingName; interface Context { boolean isCanceled(); @@ -64,6 +66,38 @@ class JavacFileManager extends ForwardingJavaFileManager remaining) { + if ("-encoding".equalsIgnoreCase(current) && remaining.hasNext()) { + final String encoding = remaining.next(); + myEncodingName = encoding; + return super.handleOption(current, new Iterator() { + private boolean encodingConsumed = false; + @Override + public boolean hasNext() { + return !encodingConsumed || remaining.hasNext(); + } + + @Override + public String next() { + if (!encodingConsumed) { + encodingConsumed = true; + return encoding; + } + return remaining.next(); + } + + @Override + public void remove() { + if (encodingConsumed) { + remaining.remove(); + } + } + }); + } + return super.handleOption(current, remaining); + } + @Override public String inferBinaryName(Location location, JavaFileObject file) { return super.inferBinaryName(location, unwrapFileObject(file)); @@ -194,7 +228,7 @@ class JavacFileManager extends ForwardingJavaFileManager sendCompileRequest(List options, Collection files, Collection classpath, Collection platformCp, Collection sourcePath, Map> outs, DiagnosticOutputConsumer diagnosticSink, OutputFileConsumer outputSink) { - final JavacServerResponseHandler rh = new JavacServerResponseHandler(diagnosticSink, outputSink); + final JavacServerResponseHandler rh = new JavacServerResponseHandler(diagnosticSink, outputSink, getEncodingName(options)); final JavacRemoteProto.Message.Request request = JavacProtoUtil.createCompilationRequest(options, files, classpath, platformCp, sourcePath, outs); return sendRequest(request, rh, new RequestFuture.CancelAction() { @Override @@ -61,4 +62,17 @@ public class JavacServerClient extends SimpleProtobufClient options) { + boolean found = false; + for (String option : options) { + if (found) { + return option; + } + if ("-encoding".equalsIgnoreCase(option)) { + found = true; + } + } + return null; + } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerResponseHandler.java b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerResponseHandler.java index 6f06bcae29b6..688bf0596ac4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerResponseHandler.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerResponseHandler.java @@ -17,10 +17,12 @@ package org.jetbrains.jps.javac; import com.google.protobuf.ByteString; import com.google.protobuf.MessageLite; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.client.ProtobufResponseHandler; import org.jetbrains.jps.incremental.BinaryContent; -import javax.tools.*; +import javax.tools.Diagnostic; +import javax.tools.JavaFileObject; import java.io.File; import java.net.URI; import java.util.Collection; @@ -33,11 +35,14 @@ import java.util.Locale; public class JavacServerResponseHandler implements ProtobufResponseHandler{ private final DiagnosticOutputConsumer myDiagnosticSink; private final OutputFileConsumer myOutputSink; + @Nullable + private final String myEncodingName; private volatile boolean myTerminatedSuccessfully; - public JavacServerResponseHandler(DiagnosticOutputConsumer diagnosticSink, OutputFileConsumer outputSink) { + public JavacServerResponseHandler(DiagnosticOutputConsumer diagnosticSink, OutputFileConsumer outputSink, @Nullable final String encodingName) { myDiagnosticSink = diagnosticSink; myOutputSink = outputSink; + myEncodingName = encodingName; } public boolean handleMessage(MessageLite message) throws Exception { @@ -93,7 +98,7 @@ public class JavacServerResponseHandler implements ProtobufResponseHandler{ convertKind(kind), outputObject.hasClassName()? outputObject.getClassName() : null, srcUri, - fileObjectContent + myEncodingName, fileObjectContent ); myOutputSink.save(fileObject); diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/OutputFileObject.java b/jps/jps-builders/src/org/jetbrains/jps/javac/OutputFileObject.java index ae4c6f97677d..14b7d219de10 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/OutputFileObject.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/OutputFileObject.java @@ -15,12 +15,14 @@ */ package org.jetbrains.jps.javac; +import com.intellij.openapi.util.io.FileUtilRt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.incremental.BinaryContent; import org.jetbrains.jps.incremental.Utils; -import javax.tools.*; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; import java.io.*; import java.net.URI; @@ -40,12 +42,28 @@ public final class OutputFileObject extends SimpleJavaFileObject { @Nullable private final URI mySourceUri; private volatile BinaryContent myContent; private final File mySourceFile; + private final String myEncodingName; - public OutputFileObject(@NotNull JavacFileManager.Context context, @Nullable File outputRoot, String relativePath, @NotNull File file, @NotNull Kind kind, @Nullable String className, @Nullable final URI sourceUri) { - this(context, outputRoot, relativePath, file, kind, className, sourceUri, null); + public OutputFileObject(@NotNull JavacFileManager.Context context, + @Nullable File outputRoot, + String relativePath, + @NotNull File file, + @NotNull Kind kind, + @Nullable String className, + @Nullable final URI sourceUri, + @Nullable final String encodingName) { + this(context, outputRoot, relativePath, file, kind, className, sourceUri, encodingName, null); } - public OutputFileObject(@Nullable JavacFileManager.Context context, @Nullable File outputRoot, String relativePath, @NotNull File file, @NotNull Kind kind, @Nullable String className, @Nullable final URI srcUri, @Nullable BinaryContent content) { + public OutputFileObject(@Nullable JavacFileManager.Context context, + @Nullable File outputRoot, + String relativePath, + @NotNull File file, + @NotNull Kind kind, + @Nullable String className, + @Nullable final URI srcUri, + @Nullable final String encodingName, + @Nullable BinaryContent content) { super(Utils.toURI(file.getPath()), kind); myContext = context; mySourceUri = srcUri; @@ -55,6 +73,7 @@ public final class OutputFileObject extends SimpleJavaFileObject { myFile = file; myClassName = className != null? className.replace('/', '.') : null; mySourceFile = srcUri != null? Utils.convertToFile(srcUri) : null; + myEncodingName = encodingName; } @Nullable @@ -116,10 +135,10 @@ public final class OutputFileObject extends SimpleJavaFileObject { @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { final BinaryContent content = myContent; - if (content == null) { - throw new FileNotFoundException(toUri().getPath()); + if (content != null) { + return new String(content.getBuffer(), content.getOffset(), content.getLength()); } - return new String(content.getBuffer(), content.getOffset(), content.getLength()); + return FileUtilRt.loadFile(myFile, myEncodingName, false); } @Nullable