diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java index e6d82790bac3..d52217717e6a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java @@ -71,10 +71,8 @@ public abstract class Builder { if (incremental) { final Set newlyAffectedFiles = new HashSet(allAffectedFiles); newlyAffectedFiles.removeAll(affectedBeforeDif); - // todo: temp code - for (String removedPath : removedPaths) { - newlyAffectedFiles.remove(new File(removedPath)); - } + newlyAffectedFiles.removeAll(allCompiledFiles); // the diff operation may have affected the class already compiled in thic compilation round + if (!newlyAffectedFiles.isEmpty()) { for (File file : newlyAffectedFiles) { context.markDirty(file); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java index 4de33f00731f..57a9972ed5e2 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java @@ -126,6 +126,10 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler myCompilingTests = compilingTests; } + public void onChunkBuildStart(ModuleChunk chunk) { + myFsState.setContextChunk(chunk); + } + void beforeNextCompileRound(@NotNull ModuleChunk chunk) { myFsState.beforeNextRoundStart(); } @@ -150,7 +154,7 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler } } finally { - myFsState.clearRoundDeltas(); + myFsState.clearContextRoundData(); } } @@ -204,7 +208,7 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler // can check if the file exists final File file = new File(path); if (!currentFiles.contains(file)) { - myFsState.registerDeleted(module, path, isCompilingTests(), myTsStorage); + myFsState.registerDeleted(module, file, isCompilingTests(), myTsStorage); } } } @@ -224,10 +228,6 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler return myRootsIndex.getModuleRoots(module); } - public int getTotalModuleCount() { - return myRootsIndex.getTotalModuleCount(); - } - public void setDone(float done) { myDone = done; processMessage(new ProgressMessage("", done)); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSState.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSState.java index 50ad6fe45b6e..950265a6950c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSState.java @@ -5,6 +5,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.CompilerExcludes; import org.jetbrains.jps.Module; +import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.incremental.storage.TimestampStorage; import java.io.File; @@ -18,6 +19,8 @@ public class FSState { private final Map myDeltas = Collections.synchronizedMap(new HashMap()); private final Set myInitialTestsScanPerformed = Collections.synchronizedSet(new HashSet()); private final Set myInitialProductionScanPerformed = Collections.synchronizedSet(new HashSet()); + + private final Set myContextModules = new HashSet(); private volatile FilesDelta myCurrentRoundDelta; private volatile FilesDelta myLastRoundDelta; @@ -25,7 +28,7 @@ public class FSState { } public void onRebuild() { - clearRoundDeltas(); + clearContextRoundData(); myInitialProductionScanPerformed.clear(); myInitialTestsScanPerformed.clear(); myDeltas.clear(); @@ -36,14 +39,19 @@ public class FSState { return map.add(module); } + public void setContextChunk(ModuleChunk chunk) { + myContextModules.addAll(chunk.getModules()); + } + public void beforeNextRoundStart() { myLastRoundDelta = myCurrentRoundDelta; myCurrentRoundDelta = new FilesDelta(); } - public void clearRoundDeltas() { + public void clearContextRoundData() { myCurrentRoundDelta = null; myLastRoundDelta = null; + myContextModules.clear(); } public void clearRecompile(RootDescriptor rd) { @@ -53,7 +61,9 @@ public class FSState { public void markDirty(final File file, final RootDescriptor rd, final @Nullable TimestampStorage tsStorage) throws Exception { final FilesDelta roundDelta = myCurrentRoundDelta; if (roundDelta != null) { - roundDelta.markRecompile(rd.root, rd.isTestRoot, file); + if (myContextModules.contains(rd.module)) { + roundDelta.markRecompile(rd.root, rd.isTestRoot, file); + } } final FilesDelta mainDelta = getDelta(rd.module); final boolean marked = mainDelta.markRecompile(rd.root, rd.isTestRoot, file); @@ -108,10 +118,10 @@ public class FSState { return true; } - public void registerDeleted(final Module module, final String path, final boolean isTest, @Nullable TimestampStorage tsStorage) throws Exception { - getDelta(module).addDeleted(path, isTest); + public void registerDeleted(final Module module, final File file, final boolean isTest, @Nullable TimestampStorage tsStorage) throws Exception { + getDelta(module).addDeleted(file, isTest); if (tsStorage != null) { - tsStorage.remove(new File(path)); + tsStorage.remove(file); } } @@ -161,9 +171,16 @@ public class FSState { return files.add(file); } - public void addDeleted(String path, boolean isTest) { - final Set map = isTest? myDeletedTests : myDeletedProduction; - map.add(path); + public void addDeleted(File file, boolean isTest) { + // ensure the file is no more marked to recompilation + final Map> toRecompile = isTest ? myTestsToRecompile : mySourcesToRecompile; + synchronized (toRecompile) { + for (Set files : toRecompile.values()) { + files.remove(file); + } + } + final Set deletedMap = isTest? myDeletedTests : myDeletedProduction; + deletedMap.add(FileUtil.toCanonicalPath(file.getPath())); } public void clearDeletedPaths(boolean isTest) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 05eadf134526..c7ac05d9ebc9 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -273,6 +273,8 @@ public class IncProjectBuilder { } } + context.onChunkBuildStart(chunk); + for (BuilderCategory category : BuilderCategory.values()) { runBuilders(context, chunk, category); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java b/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java index 460bcaaf6b31..bfce4ceabeba 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java @@ -1,7 +1,6 @@ package org.jetbrains.jps.server; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.io.FileUtil; import org.codehaus.groovy.runtime.MethodClosure; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.JavaSdk; @@ -66,7 +65,7 @@ class ServerState { try { final RootDescriptor moduleAndRoot = pd.rootsIndex.getModuleAndRoot(file); if (moduleAndRoot != null) { - pd.fsState.registerDeleted(moduleAndRoot.module, FileUtil.toCanonicalPath(file.getPath()), moduleAndRoot.isTestRoot, pd.timestamps.getStorage()); + pd.fsState.registerDeleted(moduleAndRoot.module, file, moduleAndRoot.isTestRoot, pd.timestamps.getStorage()); } } catch (Exception e) {