Fixing IDEA-115649 Compiler cannot resolve references to classes generated by annotation processors

1. save generated files synchronously
2. do not use cache when listing files from output directories
This commit is contained in:
Eugene Zhuravlev
2013-10-29 23:27:19 +01:00
parent 9b9dd9f0d3
commit 4ff44ecd6d
5 changed files with 63 additions and 45 deletions

View File

@@ -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() {

View File

@@ -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);
}

View File

@@ -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<JavaFileObject> results = new ListBuffer<JavaFileObject>();
final Set<File> outputRoots;
if (location.isOutputLocation() || location != StandardLocation.CLASS_PATH) {
outputRoots = Collections.emptySet();
}
else {
final Iterable<? extends File> outputs = getLocation(StandardLocation.CLASS_OUTPUT);
if (outputs == null) {
outputRoots = Collections.emptySet();
}
else {
outputRoots = new HashSet<File>(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);
}
}
}

View File

@@ -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<JavaFileObject> results = new ListBuffer<JavaFileObject>();
final Set<File> outputRoots;
if (location.isOutputLocation() || location != StandardLocation.CLASS_PATH) {
outputRoots = Collections.emptySet();
}
else {
final Iterable<? extends File> outputs = getLocation(StandardLocation.CLASS_OUTPUT);
if (outputs == null) {
outputRoots = Collections.emptySet();
}
else {
outputRoots = new HashSet<File>(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);
}
}

Binary file not shown.