diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index 776c3a800834..3cb21174c862 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -59,7 +59,8 @@ import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleType; import org.jetbrains.jps.service.JpsServiceManager; -import javax.tools.*; +import javax.tools.Diagnostic; +import javax.tools.JavaFileObject; import java.io.*; import java.net.ServerSocket; import java.util.*; @@ -904,19 +905,21 @@ public class JavaBuilder extends ModuleLevelBuilder { } public void save(@NotNull final OutputFileObject fileObject) { - if (JavaFileObject.Kind.CLASS != fileObject.getKind()) { - // generated sources or resources must be saved synchronously, because some compilers (e.g. eclipse) - // may want to read generated text for further compilation - try { - final BinaryContent content = fileObject.getContent(); - if (content != null) { - content.saveToFile(fileObject.getFile()); - } + // generated files must be saved synchronously, because some compilers (e.g. eclipse) + // may want to read them for further compilation + try { + final BinaryContent content = fileObject.getContent(); + final File file = fileObject.getFile(); + if (content != null) { + content.saveToFile(file); } - catch (IOException e) { - myContext.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, e.getMessage())); + else { + myContext.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.WARNING, "Missing content for file " + file.getPath())); } } + catch (IOException e) { + myContext.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, e.getMessage())); + } submitAsyncTask(myContext, new Runnable() { public void run() { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/OutputFilesSink.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/OutputFilesSink.java index 519762b92954..187d7d199a33 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/OutputFilesSink.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/OutputFilesSink.java @@ -29,7 +29,7 @@ import org.jetbrains.jps.incremental.messages.ProgressMessage; import org.jetbrains.jps.javac.OutputFileConsumer; import org.jetbrains.jps.javac.OutputFileObject; -import javax.tools.*; +import javax.tools.JavaFileObject; import java.io.File; import java.io.IOException; import java.util.Collections; @@ -102,12 +102,9 @@ class OutputFilesSink implements OutputFileConsumer { } if (outKind == JavaFileObject.Kind.CLASS) { - // generated sources and resources are handled separately - try { - writeToDisk(fileObject, isTemp); - } - catch (IOException e) { - myContext.processMessage(new CompilerMessage(JavaBuilder.BUILDER_NAME, BuildMessage.Kind.ERROR, e.getMessage())); + myContext.processMessage(new ProgressMessage("Writing classes... " + myChunkName)); + if (!isTemp && srcFile != null) { + mySuccessfullyCompiled.add(srcFile); } } } @@ -116,27 +113,6 @@ class OutputFilesSink implements OutputFileConsumer { return Collections.unmodifiableSet(mySuccessfullyCompiled); } - private void writeToDisk(@NotNull OutputFileObject fileObject, boolean isTemp) throws IOException { - myContext.processMessage(new ProgressMessage("Writing classes... " + myChunkName)); - - final File file = fileObject.getFile(); - final BinaryContent content = fileObject.getContent(); - if (content == null) { - throw new IOException("Missing content for file " + file); - } - - content.saveToFile(file); - - final File source = fileObject.getSourceFile(); - if (!isTemp && source != null) { - mySuccessfullyCompiled.add(source); - //final String className = fileObject.getClassName(); - //if (className != null) { - // myContext.processMessage(new ProgressMessage("Compiled " + className)); - //} - } - } - public void markError(@NotNull final File sourceFile) { mySuccessfullyCompiled.remove(sourceFile); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java index 0004f5736c3a..8b57038ffa78 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java @@ -22,7 +22,9 @@ import com.sun.tools.javac.util.List; import org.jetbrains.jps.incremental.Utils; import javax.lang.model.SourceVersion; -import javax.tools.*; +import javax.tools.FileObject; +import javax.tools.JavaFileObject; +import javax.tools.StandardLocation; import java.io.*; import java.lang.ref.SoftReference; import java.lang.reflect.Field; @@ -100,6 +102,23 @@ class OptimizedFileManager extends DefaultFileManager { final String relativePath = packageName.replace('.', File.separatorChar); ListBuffer results = new ListBuffer(); + final Set outputRoots; + if (location.isOutputLocation() || location != StandardLocation.CLASS_PATH) { + outputRoots = Collections.emptySet(); + } + else { + final Iterable outputs = getLocation(StandardLocation.CLASS_OUTPUT); + if (outputs == null) { + outputRoots = Collections.emptySet(); + } + else { + outputRoots = new HashSet(1, 0.98f); + for (File file : outputs) { + outputRoots.add(file); + } + } + } + for (File root : locationRoots) { final Archive archive = myArchives.get(root); final boolean isFile; @@ -114,11 +133,12 @@ class OptimizedFileManager extends DefaultFileManager { } else { final File directory = relativePath.length() != 0 ? new File(root, relativePath) : root; + final boolean canUseCache = !location.isOutputLocation() && !outputRoots.contains(root); if (recurse) { - collectFromDirectoryRecursively(directory, kinds, results, true, !location.isOutputLocation()); + collectFromDirectoryRecursively(directory, kinds, results, true, canUseCache); } else { - collectFromDirectory(directory, kinds, results, !location.isOutputLocation()); + collectFromDirectory(directory, kinds, results, canUseCache); } } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java index a9f47ec2f6f6..ebc1e93b5faa 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java @@ -24,7 +24,8 @@ import com.sun.tools.javac.util.ListBuffer; import org.jetbrains.jps.incremental.Utils; import javax.lang.model.SourceVersion; -import javax.tools.*; +import javax.tools.JavaFileObject; +import javax.tools.StandardLocation; import java.io.*; import java.lang.ref.Reference; import java.lang.ref.SoftReference; @@ -86,6 +87,23 @@ class OptimizedFileManager17 extends com.sun.tools.javac.file.JavacFileManager { ListBuffer results = new ListBuffer(); + final Set outputRoots; + if (location.isOutputLocation() || location != StandardLocation.CLASS_PATH) { + outputRoots = Collections.emptySet(); + } + else { + final Iterable outputs = getLocation(StandardLocation.CLASS_OUTPUT); + if (outputs == null) { + outputRoots = Collections.emptySet(); + } + else { + outputRoots = new HashSet(1, 0.98f); + for (File file : outputs) { + outputRoots.add(file); + } + } + } + for (File root : locationRoots) { Archive archive = myArchives.get(root); @@ -111,11 +129,12 @@ class OptimizedFileManager17 extends com.sun.tools.javac.file.JavacFileManager { } else { final File dir = subdirectory.getFile(root); + final boolean canUseCache = !location.isOutputLocation() && !outputRoots.contains(root); if (recurse) { - listDirectoryRecursively(dir, kinds, results, true, !location.isOutputLocation()); + listDirectoryRecursively(dir, kinds, results, true, canUseCache); } else { - listDirectory(dir, kinds, results, !location.isOutputLocation()); + listDirectory(dir, kinds, results, canUseCache); } } diff --git a/jps/lib/optimizedFileManager.jar b/jps/lib/optimizedFileManager.jar index 8a12d502b63b..b45f61e363d0 100644 Binary files a/jps/lib/optimizedFileManager.jar and b/jps/lib/optimizedFileManager.jar differ