From 44078600ba88be1d530b7a2ba3b5e32982bac2e4 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 7 Nov 2012 22:28:28 +0100 Subject: [PATCH] external build: isUpToDate() query implementation --- .../intellij/compiler/impl/CompileDriver.java | 142 ++++++++++++------ .../compiler/server/BuildManager.java | 10 +- .../proto/cmdline_remote_proto.proto | 1 + .../src/org/jetbrains/jps/api/BuildType.java | 2 +- .../jetbrains/jps/api/CmdlineProtoUtil.java | 33 ++-- .../jetbrains/jps/api/CmdlineRemoteProto.java | 3 + .../jetbrains/jps/cmdline/BuildRunner.java | 5 +- .../jetbrains/jps/cmdline/BuildSession.java | 20 +-- .../jps/incremental/BuildOperations.java | 4 +- .../jps/incremental/IncProjectBuilder.java | 33 +++- .../messages/DoneSomethingNotification.java | 13 ++ .../messages/UptoDateFilesSavedEvent.java | 13 -- .../jetbrains/jps/builders/BuildResult.java | 4 +- 13 files changed, 193 insertions(+), 90 deletions(-) create mode 100644 jps/jps-builders/src/org/jetbrains/jps/incremental/messages/DoneSomethingNotification.java delete mode 100644 jps/jps-builders/src/org/jetbrains/jps/incremental/messages/UptoDateFilesSavedEvent.java 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 ae0e4293826b..5f5adf341e7a 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -69,7 +69,6 @@ import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.RefreshQueue; -import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; import com.intellij.openapi.wm.StatusBar; import com.intellij.openapi.wm.ToolWindowId; import com.intellij.openapi.wm.ToolWindowManager; @@ -212,48 +211,97 @@ public class CompileDriver { if (LOG.isDebugEnabled()) { LOG.debug("isUpToDate operation started"); } - scope = addAdditionalRoots(scope, ALL_EXCEPT_SOURCE_PROCESSING); + if (!useOutOfProcessBuild()) { + scope = addAdditionalRoots(scope, ALL_EXCEPT_SOURCE_PROCESSING); + } final CompilerTask task = new CompilerTask(myProject, "Classes up-to-date check", true, false); - final CompileContextImpl compileContext = new CompileContextImpl(myProject, task, scope, createDependencyCache(), true, false); + final DependencyCache cache = useOutOfProcessBuild()? null : createDependencyCache(); + final CompileContextImpl compileContext = new CompileContextImpl(myProject, task, scope, cache, true, false); - checkCachesVersion(compileContext, ((PersistentFS)ManagingFS.getInstance()).getCreationTimestamp()); - if (compileContext.isRebuildRequested()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Rebuild requested, up-to-date=false"); + if (!useOutOfProcessBuild()) { + checkCachesVersion(compileContext, ManagingFS.getInstance().getCreationTimestamp()); + if (compileContext.isRebuildRequested()) { + if (LOG.isDebugEnabled()) { + LOG.debug("Rebuild requested, up-to-date=false"); + } + return false; + } + + for (Map.Entry, Pair> entry : myGenerationCompilerModuleToOutputDirMap.entrySet()) { + final Pair outputs = entry.getValue(); + final Pair key = entry.getKey(); + final Module module = key.getSecond(); + compileContext.assignModule(outputs.getFirst(), module, false, key.getFirst()); + compileContext.assignModule(outputs.getSecond(), module, true, key.getFirst()); } - return false; } - for (Map.Entry, Pair> entry : myGenerationCompilerModuleToOutputDirMap.entrySet()) { - final Pair outputs = entry.getValue(); - final Pair key = entry.getKey(); - final Module module = key.getSecond(); - compileContext.assignModule(outputs.getFirst(), module, false, key.getFirst()); - compileContext.assignModule(outputs.getSecond(), module, true, key.getFirst()); + final Ref result = new Ref(); + + final Runnable compileWork; + if (useOutOfProcessBuild()) { + compileWork = new Runnable() { + public void run() { + final ProgressIndicator indicator = compileContext.getProgressIndicator(); + if (indicator.isCanceled() || myProject.isDisposed()) { + return; + } + try { + final Collection paths = CompileScopeUtil.fetchFiles(compileContext); + List scopes = new ArrayList(); + if (paths.isEmpty()) { + if (!compileContext.isRebuild() && !CompileScopeUtil.allProjectModulesAffected(compileContext)) { + CompileScopeUtil.addScopesForModules(Arrays.asList(compileContext.getCompileScope().getAffectedModules()), scopes); + } + else { + scopes.addAll(CmdlineProtoUtil.createAllModulesScopes()); + } + for (BuildTargetScopeProvider provider : BuildTargetScopeProvider.EP_NAME.getExtensions()) { + scopes = CompileScopeUtil.mergeScopes(scopes, provider.getBuildTargetScopes(compileContext.getCompileScope(), myCompilerFilter, myProject)); + } + } + final RequestFuture future = compileInExternalProcess(compileContext, scopes, paths, true); + if (future != null) { + while (!future.waitFor(200L , TimeUnit.MILLISECONDS)) { + if (indicator.isCanceled()) { + future.cancel(false); + } + } + } + } + catch (Throwable e) { + LOG.error(e); + } + finally { + result.set(COMPILE_SERVER_BUILD_STATUS.get(compileContext)); + CompilerCacheManager.getInstance(myProject).flushCaches(); + } + } + }; } - - final Ref status = new Ref(); - - task.start(new Runnable() { - public void run() { - try { - myAllOutputDirectories = getAllOutputDirectories(compileContext); - // need this for updating zip archives experiment, uncomment if the feature is turned on - //myOutputFinder = new OutputPathFinder(myAllOutputDirectories); - status.set(doCompile(compileContext, false, false, true)); + else { + compileWork = new Runnable() { + public void run() { + try { + myAllOutputDirectories = getAllOutputDirectories(compileContext); + // need this for updating zip archives experiment, uncomment if the feature is turned on + //myOutputFinder = new OutputPathFinder(myAllOutputDirectories); + result.set(doCompile(compileContext, false, false, true)); + } + finally { + CompilerCacheManager.getInstance(myProject).flushCaches(); + } } - finally { - CompilerCacheManager.getInstance(myProject).flushCaches(); - } - } - }, null); + }; + } + task.start(compileWork, null); if (LOG.isDebugEnabled()) { LOG.debug("isUpToDate operation finished"); } - return ExitStatus.UP_TO_DATE.equals(status.get()); + return ExitStatus.UP_TO_DATE.equals(result.get()); } private DependencyCache createDependencyCache() { @@ -420,30 +468,37 @@ public class CompileDriver { } @Nullable - private RequestFuture compileInExternalProcess(final @NotNull CompileContextImpl compileContext, @NotNull List scopes, - final @NotNull Collection paths, @Nullable final CompileStatusNotification callback) + private RequestFuture compileInExternalProcess(final @NotNull CompileContextImpl compileContext, + @NotNull List scopes, + final @NotNull Collection paths, + final boolean onlyCheckUpToDate) throws Exception { final CompileScope scope = compileContext.getCompileScope(); // need to pass scope's user data to server - final Map exported = scope.exportUserData(); final Map builderParams; - if (!exported.isEmpty()) { - builderParams = new HashMap(); - for (Map.Entry entry : exported.entrySet()) { - final String _key = entry.getKey().toString(); - final String _value = entry.getValue().toString(); - builderParams.put(_key, _value); - } + if (onlyCheckUpToDate) { + builderParams = Collections.emptyMap(); } else { - builderParams = Collections.emptyMap(); + final Map exported = scope.exportUserData(); + if (!exported.isEmpty()) { + builderParams = new HashMap(); + for (Map.Entry entry : exported.entrySet()) { + final String _key = entry.getKey().toString(); + final String _value = entry.getValue().toString(); + builderParams.put(_key, _value); + } + } + else { + builderParams = Collections.emptyMap(); + } } final MessageBus messageBus = myProject.getMessageBus(); final BuildManager buildManager = BuildManager.getInstance(); buildManager.cancelAutoMakeTasks(myProject); - return buildManager.scheduleBuild(myProject, compileContext.isRebuild(), compileContext.isMake(), scopes, paths, builderParams, new DefaultMessageHandler(myProject) { + return buildManager.scheduleBuild(myProject, compileContext.isRebuild(), compileContext.isMake(), onlyCheckUpToDate, scopes, paths, builderParams, new DefaultMessageHandler(myProject) { @Override public void buildStarted(UUID sessionId) { @@ -616,8 +671,7 @@ public class CompileDriver { scopes = CompileScopeUtil.mergeScopes(scopes, provider.getBuildTargetScopes(scope, myCompilerFilter, myProject)); } } - - final RequestFuture future = compileInExternalProcess(compileContext, scopes, paths, callback); + final RequestFuture future = compileInExternalProcess(compileContext, scopes, paths, false); if (future != null) { while (!future.waitFor(200L , TimeUnit.MILLISECONDS)) { if (indicator.isCanceled()) { diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index 5d96f1d0c1f1..b9cde8c743e5 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -396,7 +396,7 @@ public class BuildManager implements ApplicationComponent{ final List emptyList = Collections.emptyList(); final RequestFuture future = scheduleBuild( - project, false, true, CmdlineProtoUtil.createAllModulesScopes(), emptyList, Collections.emptyMap(), new AutoMakeMessageHandler(project) + project, false, true, false, CmdlineProtoUtil.createAllModulesScopes(), emptyList, Collections.emptyMap(), new AutoMakeMessageHandler(project) ); if (future != null) { futures.add(future); @@ -434,9 +434,8 @@ public class BuildManager implements ApplicationComponent{ @Nullable public RequestFuture scheduleBuild( - final Project project, final boolean isRebuild, - final boolean isMake, - final List scopes, + final Project project, final boolean isRebuild, final boolean isMake, + final boolean onlyCheckUpToDate, final List scopes, final Collection paths, final Map userData, final DefaultMessageHandler handler) { @@ -509,6 +508,9 @@ public class BuildManager implements ApplicationComponent{ if (isRebuild) { params = CmdlineProtoUtil.createRebuildRequest(projectPath, scopes, userData, globals); } + else if (onlyCheckUpToDate) { + params = CmdlineProtoUtil.createUpToDateCheckRequest(projectPath, scopes, userData, globals, currentFSChanges); + } else { params = isMake ? CmdlineProtoUtil.createMakeRequest(projectPath, scopes, userData, globals, currentFSChanges) : diff --git a/jps/jps-builders/proto/cmdline_remote_proto.proto b/jps/jps-builders/proto/cmdline_remote_proto.proto index 4c7eff8ebfc4..4023ca6d823c 100644 --- a/jps/jps-builders/proto/cmdline_remote_proto.proto +++ b/jps/jps-builders/proto/cmdline_remote_proto.proto @@ -58,6 +58,7 @@ message Message { MAKE = 2; CLEAN = 3; FORCED_COMPILATION = 4; + UP_TO_DATE_CHECK = 5; } required Type build_type = 1; diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/BuildType.java b/jps/jps-builders/src/org/jetbrains/jps/api/BuildType.java index ee6ae9307f24..e3f890083129 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/BuildType.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/BuildType.java @@ -5,5 +5,5 @@ package org.jetbrains.jps.api; * Date: 9/10/11 */ public enum BuildType { - PROJECT_REBUILD, FORCED_COMPILATION, MAKE, CLEAN + PROJECT_REBUILD, FORCED_COMPILATION, MAKE, CLEAN, UP_TO_DATE_CHECK } diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineProtoUtil.java b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineProtoUtil.java index 69f1002bb770..e6d423c3c680 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineProtoUtil.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineProtoUtil.java @@ -24,9 +24,19 @@ public class CmdlineProtoUtil { final Map userData, final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings globals, final @Nullable CmdlineRemoteProto.Message.ControllerMessage.FSEvent event) { - return createBuildParametersMessage(CmdlineRemoteProto.Message.ControllerMessage.ParametersMessage.Type.MAKE, project, scopes, - userData, Collections.emptyList(), - globals, event); + return createBuildParametersMessage( + CmdlineRemoteProto.Message.ControllerMessage.ParametersMessage.Type.MAKE, project, scopes, userData, Collections.emptyList(), globals, event + ); + } + + public static CmdlineRemoteProto.Message.ControllerMessage createUpToDateCheckRequest(String project, + List scopes, + final Map userData, + final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings globals, + final @Nullable CmdlineRemoteProto.Message.ControllerMessage.FSEvent event) { + return createBuildParametersMessage( + CmdlineRemoteProto.Message.ControllerMessage.ParametersMessage.Type.UP_TO_DATE_CHECK, project, scopes, userData, Collections.emptyList(), globals, event + ); } public static CmdlineRemoteProto.Message.ControllerMessage createForceCompileRequest(String project, @@ -87,8 +97,7 @@ public class CmdlineProtoUtil { if (!paths.isEmpty()) { builder.addAllFilePath(paths); } - final CmdlineRemoteProto.Message.ControllerMessage.Builder controlMessageBuilder = - CmdlineRemoteProto.Message.ControllerMessage.newBuilder(); + final CmdlineRemoteProto.Message.ControllerMessage.Builder controlMessageBuilder = CmdlineRemoteProto.Message.ControllerMessage.newBuilder(); if (initialEvent != null) { controlMessageBuilder.setFsEvent(initialEvent); } @@ -105,7 +114,13 @@ public class CmdlineProtoUtil { builder.setDescription(description); if (cause != null) { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - cause.printStackTrace(new PrintStream(baos)); + final PrintStream stream = new PrintStream(baos); + try { + cause.printStackTrace(stream); + } + finally { + stream.close(); + } builder.setStacktrace(new String(baos.toByteArray())); } return builder.build(); @@ -187,9 +202,9 @@ public class CmdlineProtoUtil { private static BuilderMessage createBuildEvent(final BuilderMessage.BuildEvent.Type type, @Nullable String description, - final BuilderMessage.BuildEvent.Status status, - Collection> generatedPaths, - final BuilderMessage.BuildEvent.CustomBuilderMessage builderMessage) { + @Nullable final BuilderMessage.BuildEvent.Status status, + @Nullable Collection> generatedPaths, + @Nullable final BuilderMessage.BuildEvent.CustomBuilderMessage builderMessage) { final BuilderMessage.BuildEvent.Builder builder = BuilderMessage.BuildEvent.newBuilder().setEventType(type); if (description != null) { builder.setDescription(description); diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java index 4e6b2c22b3eb..e53e3e5ece06 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java @@ -2490,12 +2490,14 @@ public final class CmdlineRemoteProto { MAKE(1, 2), CLEAN(2, 3), FORCED_COMPILATION(3, 4), + UP_TO_DATE_CHECK(4, 5), ; public static final int REBUILD_VALUE = 1; public static final int MAKE_VALUE = 2; public static final int CLEAN_VALUE = 3; public static final int FORCED_COMPILATION_VALUE = 4; + public static final int UP_TO_DATE_CHECK_VALUE = 5; public final int getNumber() { return value; } @@ -2506,6 +2508,7 @@ public final class CmdlineRemoteProto { case 2: return MAKE; case 3: return CLEAN; case 4: return FORCED_COMPILATION; + case 5: return UP_TO_DATE_CHECK; default: return null; } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java index df7b991c2356..06c14f7cd1c4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java @@ -126,6 +126,9 @@ public class BuildRunner { //todo[nik] // new ProjectBuilder(new GantBinding(), project).clean(); break; + case UP_TO_DATE_CHECK: + builder.checkUpToDate(compileScope); + break; } break; // break attempts loop } @@ -193,7 +196,7 @@ public class BuildRunner { files = Collections.emptyMap(); } - return new CompileScopeImpl(buildType != BuildType.MAKE, targetTypes, targets, files); + return new CompileScopeImpl(!(buildType == BuildType.MAKE || buildType == BuildType.UP_TO_DATE_CHECK), targetTypes, targets, files); } public List getScopes() { diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index 1ee336c0cdcb..ac99f5501928 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -88,7 +88,7 @@ final class BuildSession implements Runnable, CanceledStatus { public void run() { Throwable error = null; final Ref hasErrors = new Ref(false); - final Ref markedFilesUptodate = new Ref(false); + final Ref doneSomething = new Ref(false); try { runBuild(new MessageHandler() { public void processMessage(BuildMessage buildMessage) { @@ -97,12 +97,12 @@ final class BuildSession implements Runnable, CanceledStatus { final Collection> paths = ((FileGeneratedEvent)buildMessage).getPaths(); response = !paths.isEmpty() ? CmdlineProtoUtil.createFileGeneratedEvent(paths) : null; } - else if (buildMessage instanceof UptoDateFilesSavedEvent) { - markedFilesUptodate.set(true); + else if (buildMessage instanceof DoneSomethingNotification) { + doneSomething.set(true); response = null; } else if (buildMessage instanceof CompilerMessage) { - markedFilesUptodate.set(true); + doneSomething.set(true); final CompilerMessage compilerMessage = (CompilerMessage)buildMessage; final String text = compilerMessage.getCompilerName() + ": " + compilerMessage.getMessageText(); final BuildMessage.Kind kind = compilerMessage.getKind(); @@ -117,8 +117,7 @@ final class BuildSession implements Runnable, CanceledStatus { } else if (buildMessage instanceof CustomBuilderMessage) { CustomBuilderMessage builderMessage = (CustomBuilderMessage)buildMessage; - response = CmdlineProtoUtil.createCustomBuilderMessage(builderMessage.getBuilderId(), builderMessage.getMessageType(), - builderMessage.getMessageText()); + response = CmdlineProtoUtil.createCustomBuilderMessage(builderMessage.getBuilderId(), builderMessage.getMessageType(), builderMessage.getMessageText()); } else { float done = -1.0f; @@ -138,7 +137,7 @@ final class BuildSession implements Runnable, CanceledStatus { error = e; } finally { - finishBuild(error, hasErrors.get(), markedFilesUptodate.get()); + finishBuild(error, hasErrors.get(), doneSomething.get()); } } @@ -158,7 +157,7 @@ final class BuildSession implements Runnable, CanceledStatus { if (fsStateStream != null) { // optimization: check whether we can skip the build final boolean hasWorkToDoWithModules = fsStateStream.readBoolean(); - if (myBuildType == BuildType.MAKE && !hasWorkToDoWithModules && scopeContainsModulesOnly(myBuildRunner.getScopes()) && !containsChanges(myInitialFSDelta)) { + if ((myBuildType == BuildType.MAKE || myBuildType == BuildType.UP_TO_DATE_CHECK) && !hasWorkToDoWithModules && scopeContainsModulesOnly(myBuildRunner.getScopes()) && !containsChanges(myInitialFSDelta)) { updateFsStateOnDisk(dataStorageRoot, fsStateStream, myInitialFSDelta.getOrdinal()); return; } @@ -422,7 +421,7 @@ final class BuildSession implements Runnable, CanceledStatus { return event.getChangedPathsCount() != 0 || event.getDeletedPathsCount() != 0; } - private void finishBuild(Throwable error, boolean hadBuildErrors, boolean markedUptodateFiles) { + private void finishBuild(Throwable error, boolean hadBuildErrors, boolean doneSomething) { CmdlineRemoteProto.Message lastMessage = null; try { if (error != null) { @@ -455,7 +454,7 @@ final class BuildSession implements Runnable, CanceledStatus { else if (hadBuildErrors) { status = CmdlineRemoteProto.Message.BuilderMessage.BuildEvent.Status.ERRORS; } - else if (!markedUptodateFiles){ + else if (!doneSomething){ status = CmdlineRemoteProto.Message.BuilderMessage.BuildEvent.Status.UP_TO_DATE; } lastMessage = CmdlineProtoUtil.toMessage(mySessionId, CmdlineProtoUtil.createBuildCompletedEvent("build completed", status)); @@ -489,6 +488,7 @@ final class BuildSession implements Runnable, CanceledStatus { case MAKE: return BuildType.MAKE; case REBUILD: return BuildType.PROJECT_REBUILD; case FORCED_COMPILATION: return BuildType.FORCED_COMPILATION; + case UP_TO_DATE_CHECK: return BuildType.UP_TO_DATE_CHECK; } return BuildType.MAKE; // use make by default } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java index b2a6dae7a16b..23796ae6600b 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java @@ -10,8 +10,8 @@ import org.jetbrains.jps.builders.impl.DirtyFilesHolderBase; import org.jetbrains.jps.builders.storage.SourceToOutputMapping; import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.fs.BuildFSState; +import org.jetbrains.jps.incremental.messages.DoneSomethingNotification; import org.jetbrains.jps.incremental.messages.FileGeneratedEvent; -import org.jetbrains.jps.incremental.messages.UptoDateFilesSavedEvent; import org.jetbrains.jps.incremental.storage.BuildTargetConfiguration; import org.jetbrains.jps.incremental.storage.Timestamps; @@ -119,7 +119,7 @@ public class BuildOperations { } if (marked) { - context.processMessage(UptoDateFilesSavedEvent.INSTANCE); + context.processMessage(DoneSomethingNotification.INSTANCE); } } } 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 ad38c1a25a7d..24cd66a6936a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -32,10 +32,7 @@ import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.fs.BuildFSState; import org.jetbrains.jps.incremental.java.ExternalJavacDescriptor; import org.jetbrains.jps.incremental.java.JavaBuilder; -import org.jetbrains.jps.incremental.messages.BuildMessage; -import org.jetbrains.jps.incremental.messages.CompilerMessage; -import org.jetbrains.jps.incremental.messages.FileDeletedEvent; -import org.jetbrains.jps.incremental.messages.ProgressMessage; +import org.jetbrains.jps.incremental.messages.*; import org.jetbrains.jps.incremental.storage.BuildDataManager; import org.jetbrains.jps.incremental.storage.OneToManyPathsMapping; import org.jetbrains.jps.model.java.JpsJavaExtensionService; @@ -109,6 +106,34 @@ public class IncProjectBuilder { myMessageHandlers.add(handler); } + public void checkUpToDate(CompileScope scope) { + CompileContextImpl context = null; + try { + context = createContext(scope, true, false); + for (BuildTarget target : myProjectDescriptor.getBuildTargetIndex().getAllTargets()) { + if (scope.isAffected(target)) { + BuildOperations.ensureFSStateInitialized(context, target); + if (myProjectDescriptor.fsState.hasWorkToDo(target)) { + // this will serve as a marker that compiler has work to do + myMessageDispatcher.processMessage(DoneSomethingNotification.INSTANCE); + return; + } + } + } + } + catch (Exception e) { + LOG.info(e); + // this will serve as a marker that compiler has work to do + myMessageDispatcher.processMessage(DoneSomethingNotification.INSTANCE); + } + finally { + if (context != null) { + flushContext(context); + } + } + } + + public void build(CompileScope scope, final boolean isMake, final boolean isProjectRebuild, boolean forceCleanCaches) throws RebuildRequestedException { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/DoneSomethingNotification.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/DoneSomethingNotification.java new file mode 100644 index 000000000000..20cff75a6960 --- /dev/null +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/DoneSomethingNotification.java @@ -0,0 +1,13 @@ +package org.jetbrains.jps.incremental.messages; + +/** + * @author Eugene Zhuravlev + * Date: 9/29/11 + */ +public class DoneSomethingNotification extends BuildMessage { + public static DoneSomethingNotification INSTANCE = new DoneSomethingNotification(); + + private DoneSomethingNotification() { + super("", Kind.INFO); + } +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/UptoDateFilesSavedEvent.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/UptoDateFilesSavedEvent.java deleted file mode 100644 index 05b4db1b6a7a..000000000000 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/UptoDateFilesSavedEvent.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.jetbrains.jps.incremental.messages; - -/** - * @author Eugene Zhuravlev - * Date: 9/29/11 - */ -public class UptoDateFilesSavedEvent extends BuildMessage { - public static UptoDateFilesSavedEvent INSTANCE = new UptoDateFilesSavedEvent(); - - private UptoDateFilesSavedEvent() { - super("", Kind.INFO); - } -} diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/BuildResult.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/BuildResult.java index c75681fbfeca..3237eebb59c6 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/BuildResult.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/BuildResult.java @@ -5,7 +5,7 @@ import com.intellij.util.Function; import junit.framework.Assert; import org.jetbrains.jps.incremental.MessageHandler; import org.jetbrains.jps.incremental.messages.BuildMessage; -import org.jetbrains.jps.incremental.messages.UptoDateFilesSavedEvent; +import org.jetbrains.jps.incremental.messages.DoneSomethingNotification; import java.util.ArrayList; import java.util.List; @@ -32,7 +32,7 @@ public class BuildResult implements MessageHandler { else { myInfoMessages.add(msg); } - if (msg instanceof UptoDateFilesSavedEvent) { + if (msg instanceof DoneSomethingNotification) { myUpToDate = false; } }