diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
index 6c32c762ce30..aa4e2bc60ec8 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
@@ -647,7 +647,7 @@ public class CompileDriver {
final String contentName =
forceCompile ? CompilerBundle.message("compiler.content.name.compile") : CompilerBundle.message("compiler.content.name.make");
- final boolean compileInBackground = useServer? true : CompilerWorkspaceConfiguration.getInstance(myProject).COMPILE_IN_BACKGROUND;
+ final boolean compileInBackground = true;
final CompilerTask compileTask =
new CompilerTask(myProject, compileInBackground, contentName, ApplicationManager.getApplication().isUnitTestMode());
@@ -1301,6 +1301,8 @@ public class CompileDriver {
final Function>, Pair>> dependencyFilter = new DependentClassesCumulativeFilter();
do {
+ generatedTypes.clear();
+ snapshot = null;
for (int currentCompiler = 0, translatorsLength = translators.length; currentCompiler < translatorsLength; currentCompiler++) {
sink.setCurrentCompilerIndex(currentCompiler);
final TranslatingCompiler compiler = translators[currentCompiler];
@@ -1310,18 +1312,16 @@ public class CompileDriver {
dumbService.waitForSmartMode();
- if (round == 0) {
- if (snapshot == null || ContainerUtil.intersects(generatedTypes, compilerManager.getRegisteredInputTypes(compiler))) {
- // rescan snapshot if previously generated files may influence the input of this compiler
- snapshot = ApplicationManager.getApplication().runReadAction(new Computable() {
- public VirtualFile[] compute() {
- return context.getCompileScope().getFiles(null, true);
- }
- });
- recalculateChunkToFilesMap(context, sortedChunks, snapshot, chunkMap);
- chunkFiles = chunkMap.get(currentChunk);
- total = snapshot.length * translatorsLength;
- }
+ if (snapshot == null || ContainerUtil.intersects(generatedTypes, compilerManager.getRegisteredInputTypes(compiler))) {
+ // rescan snapshot if previously generated files may influence the input of this compiler
+ snapshot = ApplicationManager.getApplication().runReadAction(new Computable() {
+ public VirtualFile[] compute() {
+ return context.getCompileScope().getFiles(null, true);
+ }
+ });
+ recalculateChunkToFilesMap(context, sortedChunks, snapshot, chunkMap);
+ chunkFiles = chunkMap.get(currentChunk);
+ total = snapshot.length * translatorsLength;
}
final CompileContextEx _context;
@@ -2250,7 +2250,7 @@ public class CompileDriver {
public void executeCompileTask(final CompileTask task, final CompileScope scope, final String contentName, final Runnable onTaskFinished) {
final CompilerTask progressManagerTask =
- new CompilerTask(myProject, CompilerWorkspaceConfiguration.getInstance(myProject).COMPILE_IN_BACKGROUND, contentName, false);
+ new CompilerTask(myProject, true, contentName, false);
final CompileContextImpl compileContext = new CompileContextImpl(myProject, progressManagerTask, scope, null, false, false);
FileDocumentManager.getInstance().saveAllDocuments();
diff --git a/java/compiler/impl/src/com/intellij/compiler/options/CompilerOptionsPanel.form b/java/compiler/impl/src/com/intellij/compiler/options/CompilerOptionsPanel.form
index fceb7255b549..64a4db5bc0ac 100644
--- a/java/compiler/impl/src/com/intellij/compiler/options/CompilerOptionsPanel.form
+++ b/java/compiler/impl/src/com/intellij/compiler/options/CompilerOptionsPanel.form
@@ -1,6 +1,6 @@
+ *
* Also, if .git/index changes, then a full refresh is initiated. The reason is not only untracked files tracking, but also handling
* committing outside IDEA, etc.
*
+ *
+ * Synchronization policy used in this class:
+ * myDefinitelyUntrackedFiles is accessed under the myDefinitelyUntrackedFiles lock.
+ * myPossiblyUntrackedFiles and myReady is accessed under the LOCK lock.
+ * This is done so, because the latter two variables are accessed from the AWT in after() and we don't want to lock the AWT long,
+ * while myDefinitelyUntrackedFiles is modified along with native request to Git.
+ *
*
* @author Kirill Likhodedov
*/
@@ -84,9 +92,8 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener {
private final GitRepositoryFiles myRepositoryFiles;
private final Git myGit;
- private Set myDefinitelyUntrackedFiles = new HashSet();
- private Set myPossiblyUntrackedFiles = new HashSet();
- private Set myPossiblyTrackedFiles = new HashSet();
+ private final Set myDefinitelyUntrackedFiles = new HashSet();
+ private final Set myPossiblyUntrackedFiles = new HashSet();
private boolean myReady; // if false, total refresh is needed
private final Object LOCK = new Object();
private final GitRepositoryManager myRepositoryManager;
@@ -112,10 +119,11 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener {
@Override
public void dispose() {
- synchronized (LOCK) {
+ synchronized (myDefinitelyUntrackedFiles) {
myDefinitelyUntrackedFiles.clear();
+ }
+ synchronized (LOCK) {
myPossiblyUntrackedFiles.clear();
- myPossiblyTrackedFiles.clear();
}
}
@@ -123,32 +131,8 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener {
* Adds the file to the list of untracked.
*/
public void add(@NotNull VirtualFile file) {
- synchronized (LOCK) {
- if (myReady) {
- myDefinitelyUntrackedFiles.add(file);
- }
- }
- }
-
- /**
- * Adds several files to the list of untracked.
- */
- public void add(@NotNull Collection files) {
- synchronized (LOCK) {
- if (myReady) {
- myDefinitelyUntrackedFiles.addAll(files);
- }
- }
- }
-
- /**
- * Removes the file from untracked.
- */
- public void remove(@NotNull VirtualFile file) {
- synchronized (LOCK) {
- if (myReady) {
- myDefinitelyUntrackedFiles.remove(file);
- }
+ synchronized (myDefinitelyUntrackedFiles) {
+ myDefinitelyUntrackedFiles.add(file);
}
}
@@ -156,10 +140,8 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener {
* Removes several files from untracked.
*/
public void remove(@NotNull Collection files) {
- synchronized (LOCK) {
- if (myReady) {
- myDefinitelyUntrackedFiles.removeAll(files);
- }
+ synchronized (myDefinitelyUntrackedFiles) {
+ myDefinitelyUntrackedFiles.removeAll(files);
}
}
@@ -176,7 +158,7 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener {
} else {
rescanAll();
}
- synchronized (LOCK) {
+ synchronized (myDefinitelyUntrackedFiles) {
return myDefinitelyUntrackedFiles;
}
}
@@ -192,10 +174,12 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener {
*/
public void rescanAll() throws VcsException {
Set untrackedFiles = myGit.untrackedFiles(myProject, myRoot, null);
+ synchronized (myDefinitelyUntrackedFiles) {
+ myDefinitelyUntrackedFiles.clear();
+ myDefinitelyUntrackedFiles.addAll(untrackedFiles);
+ }
synchronized (LOCK) {
- myDefinitelyUntrackedFiles = untrackedFiles;
myPossiblyUntrackedFiles.clear();
- myPossiblyTrackedFiles.clear();
myReady = true;
}
}
@@ -216,17 +200,15 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener {
Set suspiciousFiles = new HashSet();
synchronized (LOCK) {
suspiciousFiles.addAll(myPossiblyUntrackedFiles);
- suspiciousFiles.addAll(myPossiblyTrackedFiles);
+ myPossiblyUntrackedFiles.clear();
}
- Set untrackedFiles = myGit.untrackedFiles(myProject, myRoot, suspiciousFiles);
- suspiciousFiles.removeAll(untrackedFiles);
- // files that were suspicious (and thus passed to 'git ls-files'), but are not untracked, are definitely tracked.
- Set trackedFiles = suspiciousFiles;
+ synchronized (myDefinitelyUntrackedFiles) {
+ Set untrackedFiles = myGit.untrackedFiles(myProject, myRoot, suspiciousFiles);
+ suspiciousFiles.removeAll(untrackedFiles);
+ // files that were suspicious (and thus passed to 'git ls-files'), but are not untracked, are definitely tracked.
+ Set trackedFiles = suspiciousFiles;
- synchronized (LOCK) {
- myPossiblyUntrackedFiles.clear();
- myPossiblyTrackedFiles.clear();
myDefinitelyUntrackedFiles.addAll(untrackedFiles);
myDefinitelyUntrackedFiles.removeAll(trackedFiles);
}
diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy
index c1a99b1033aa..9dfb4d16ec60 100644
--- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy
+++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy
@@ -615,6 +615,20 @@ public class Main {
shouldFail { compileModule(myModule) }
}
+ public void "test stubs generated while processing groovy class file dependencies"() {
+ def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo { }')
+ def bar = myFixture.addFileToProject('Bar.groovy', 'class Bar extends Foo { }')
+ def client = myFixture.addFileToProject('Client.groovy', 'class Client { Bar bar = new Bar() }')
+ def java = myFixture.addFileToProject('Java.java', 'class Java extends Client { String getName(Bar bar) { return bar.toString(); } }')
+
+ assertEmpty(make())
+
+ setFileText(bar, 'class Bar { }')
+
+ assertEmpty(make())
+ assert findClassFile("Client")
+ }
+
public static class IdeaModeTest extends GroovyCompilerTest {
@Override protected boolean useJps() { false }
}
diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java
index 84cb5ac129bd..c150655db22c 100644
--- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java
+++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java
@@ -15,7 +15,6 @@
*/
package org.jetbrains.idea.maven;
-import com.intellij.compiler.CompilerWorkspaceConfiguration;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
@@ -67,7 +66,6 @@ public abstract class MavenTestCase extends UsefulTestCase {
protected VirtualFile myProjectPom;
protected List myAllPoms = new ArrayList();
- private boolean myCompileInBackground;
static {
IdeaTestCase.initPlatformPrefix();
@@ -112,8 +110,6 @@ public abstract class MavenTestCase extends UsefulTestCase {
}
});
- myCompileInBackground = CompilerWorkspaceConfiguration.getInstance(myProject).COMPILE_IN_BACKGROUND;
- CompilerWorkspaceConfiguration.getInstance(myProject).COMPILE_IN_BACKGROUND = false;
}
private static void ensureTempDirCreated() {
@@ -137,8 +133,6 @@ public abstract class MavenTestCase extends UsefulTestCase {
@Override
protected void tearDown() throws Exception {
- CompilerWorkspaceConfiguration.getInstance(myProject).COMPILE_IN_BACKGROUND = myCompileInBackground;
-
myProject = null;
UIUtil.invokeAndWaitIfNeeded(new Runnable() {
@Override
diff --git a/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java b/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java
index 78b8859f0af9..7ddb4d84ba25 100644
--- a/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java
+++ b/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java
@@ -300,7 +300,12 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
private final Alarm myUpdateEditorAlarm = new Alarm();
private void selectionChanged() {
myBackSlashPressed.clear();
- updateEditorsFromProperties();
+ UIUtil.invokeLaterIfNeeded(new Runnable() {
+ @Override
+ public void run() {
+ updateEditorsFromProperties();
+ }
+ });
}
private void updateEditorsFromProperties() {
diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java b/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java
index b19d46b823ac..e829de30dae4 100644
--- a/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java
+++ b/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java
@@ -210,10 +210,9 @@ public final class GuiEditor extends JPanel implements DataProvider {
* @param file file to be edited
* @throws java.lang.IllegalArgumentException
* if the file
- * is null or file is not falid PsiFile
+ * is null or file is not valid PsiFile
*/
public GuiEditor(@NotNull final Module module, @NotNull final VirtualFile file) {
- ApplicationManager.getApplication().assertIsDispatchThread();
LOG.assertTrue(file.isValid());
myModule = module;
@@ -474,7 +473,9 @@ public final class GuiEditor extends JPanel implements DataProvider {
}
// Standard Swing cut/copy/paste actions should work if user is editing something inside property inspector
- final UIDesignerToolWindowManager manager = UIDesignerToolWindowManager.getInstance(getProject());
+ Project project = getProject();
+ if (project.isDisposed()) return null;
+ final UIDesignerToolWindowManager manager = UIDesignerToolWindowManager.getInstance(project);
final PropertyInspector inspector = manager.getPropertyInspector();
if (inspector != null && inspector.isEditing()) {
return null;