diff --git a/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java b/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java index e4df975348d9..6a8c9740df80 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/DefaultMessageHandler.java @@ -48,8 +48,10 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public abstract class DefaultMessageHandler implements BuilderMessageHandler { private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.server.DefaultMessageHandler"); + public static final long CONSTANT_SEARCH_TIME_LIMIT = 60 * 1000L; // one minute private final Project myProject; private final SequentialTaskExecutor myTaskExecutor = new SequentialTaskExecutor(PooledThreadExecutor.INSTANCE); + private volatile long myConstantSearchTime = 0L; protected DefaultMessageHandler(Project project) { myProject = project; @@ -119,14 +121,25 @@ public abstract class DefaultMessageHandler implements BuilderMessageHandler { boolean canceled = false; final Ref isSuccess = Ref.create(Boolean.TRUE); final Set affectedPaths = Collections.synchronizedSet(new HashSet()); // PsiSearchHelper runs multiple threads + final long searchStart = System.currentTimeMillis(); try { - if (isDumbMode()) { + if (myConstantSearchTime > CONSTANT_SEARCH_TIME_LIMIT) { + // skipping constant search and letting the build rebuild dependent modules + isSuccess.set(Boolean.FALSE); + LOG.debug("Total constant search time exceeded time limit for this build session"); + } + else if(isDumbMode()) { // do not wait until dumb mode finishes isSuccess.set(Boolean.FALSE); LOG.debug("Constant search task: cannot search in dumb mode"); } else { final String qualifiedName = ownerClassName.replace('$', '.'); + + handleCompileMessage(sessionId, CmdlineProtoUtil.createCompileProgressMessageResponse( + "Searching for usages of changed/removed constants for class " + qualifiedName + ).getCompileMessage()); + final PsiClass[] classes = ApplicationManager.getApplication().runReadAction(new Computable() { public PsiClass[] compute() { return JavaPsiFacade.getInstance(myProject).findClasses(qualifiedName, GlobalSearchScope.allScope(myProject)); @@ -202,6 +215,7 @@ public abstract class DefaultMessageHandler implements BuilderMessageHandler { throw e; } finally { + myConstantSearchTime += (System.currentTimeMillis() - searchStart); if (!canceled) { notifyConstantSearchFinished(channel, sessionId, ownerClassName, fieldName, isSuccess, affectedPaths); } 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 28aaeca9d98a..228ba507cec3 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineProtoUtil.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineProtoUtil.java @@ -139,6 +139,10 @@ public class CmdlineProtoUtil { .setType(CmdlineRemoteProto.Message.ControllerMessage.Type.CANCEL_BUILD_COMMAND).build(); } + public static BuilderMessage createCompileProgressMessageResponse(String text) { + return createCompileMessage(BuildMessage.Kind.PROGRESS, text, null, -1L, -1L, -1L, -1, -1, -1.0f); + } + public static BuilderMessage createCompileProgressMessageResponse(String text, float done) { return createCompileMessage(BuildMessage.Kind.PROGRESS, text, null, -1L, -1L, -1L, -1, -1, done); }