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 79ded2d23258..ff87a3e9ac7a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java @@ -51,7 +51,7 @@ public abstract class Builder { //noinspection SynchronizationOnLocalVariableOrMethodParameter synchronized (globalMappings) { - if (!context.isProjectRebuild()) { + if (!context.isProjectRebuild() && context.shouldDifferentiate(chunk, context.isCompilingTests())) { final Set allCompiledFiles = getAllCompiledFilesContainer(context); final Set allAffectedFiles = getAllAffectedFilesContainer(context); 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 d7b4fc88b218..ea4343abc401 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java @@ -1,5 +1,6 @@ package org.jetbrains.jps.incremental; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.UserDataHolderBase; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,6 +32,8 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler private final BuildDataManager myDataManager; private final ModuleRootsIndex myRootsIndex; + private final Set> myNonIncrementalModules = new HashSet>(); + private final ProjectPaths myProjectPaths; private volatile boolean myErrorsFound = false; private final long myCompilationStartStamp; @@ -110,10 +113,30 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler } for (Module module : dirtyModules) { - markDirtyFiles(module, myTsStorage, true, DirtyMarkScope.BOTH, null); + markDirtyFiles(module, myTsStorage, true, isCompilingTests()? DirtyMarkScope.TESTS : DirtyMarkScope.BOTH, null); + if (isMake()) { + if (!isCompilingTests()) { + myNonIncrementalModules.add(new Pair(module, DirtyMarkScope.PRODUCTION)); + } + myNonIncrementalModules.add(new Pair(module, DirtyMarkScope.TESTS)); + } } } + boolean shouldDifferentiate(ModuleChunk chunk, boolean forTests) { + if (!isMake()) { + // the check makes sense only in make mode + return true; + } + final DirtyMarkScope dirtyScope = forTests ? DirtyMarkScope.TESTS : DirtyMarkScope.PRODUCTION; + for (Module module : chunk.getModules()) { + if (myNonIncrementalModules.contains(new Pair(module, dirtyScope))) { + return false; + } + } + return true; + } + public Mappings createDelta() { return myDataManager.getMappings().createDelta(); } @@ -140,7 +163,12 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler try { if (!myErrorsFound && !myCancelStatus.isCanceled()) { final boolean compilingTests = isCompilingTests(); + final DirtyMarkScope dirtyScope = compilingTests ? DirtyMarkScope.TESTS : DirtyMarkScope.PRODUCTION; for (Module module : chunk.getModules()) { + if (isMake()) { + // ensure non-incremental flag cleared + myNonIncrementalModules.remove(new Pair(module, dirtyScope)); + } if (isProjectRebuild()) { myFsState.markInitialScanPerformed(module, compilingTests); }