From 677f91daff4a7caf1104499e597310d9a5952f72 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 30 Oct 2009 21:18:18 +0300 Subject: [PATCH] dubugger: consider search scope from run configuration when navigating from exception trace hyperlinks (IDEADEV-41133) --- .../intellij/compiler/impl/CompileDriver.java | 3 +- .../debugger/engine/DebugProcessImpl.java | 9 +++ .../debugger/impl/DebuggerSession.java | 4 +- .../debugger/ui/DebuggerSessionTab.java | 6 +- .../execution/filters/ExceptionFilter.java | 9 ++- .../configurations/CommandLineState.java | 2 +- .../execution/impl/ConsoleViewImpl.java | 59 ++++++++++--------- 7 files changed, 57 insertions(+), 35 deletions(-) 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 cce777214891..f63641d9a7f6 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -478,7 +478,8 @@ public class CompileDriver { // in case another project was opened in the frame while the compiler was working (See SCR# 28591) statusBar.setInfo(statusMessage); if (duration > ONE_MINUTE_MS) { - ToolWindowManager.getInstance(myProject).notifyByBalloon(ToolWindowId.MESSAGES_WINDOW, MessageType.INFO, statusMessage); + final MessageType messageType = errorCount > 0 ? MessageType.ERROR : warningCount > 0 ? MessageType.WARNING : MessageType.INFO; + ToolWindowManager.getInstance(myProject).notifyByBalloon(ToolWindowId.MESSAGES_WINDOW, messageType, statusMessage); } } if (_status != ExitStatus.UP_TO_DATE && compileContext.getMessageCount(null) > 0) { diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index 478dc3bd8065..5a61e615206f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -46,8 +46,11 @@ import com.intellij.execution.CantRunException; import com.intellij.execution.ExecutionException; import com.intellij.execution.ExecutionResult; import com.intellij.execution.Executor; +import com.intellij.execution.configurations.CommandLineState; import com.intellij.execution.configurations.RemoteConnection; import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.filters.ExceptionFilter; +import com.intellij.execution.filters.TextConsoleBuilder; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessListener; @@ -1621,6 +1624,12 @@ public abstract class DebugProcessImpl implements DebugProcess { try { synchronized (myProcessListeners) { + if (state instanceof CommandLineState) { + final TextConsoleBuilder consoleBuilder = ((CommandLineState)state).getConsoleBuilder(); + if (consoleBuilder != null) { + consoleBuilder.addFilter(new ExceptionFilter(session.getSearchScope())); + } + } myExecutionResult = state.execute(executor, runner); if (myExecutionResult == null) { fail(); diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java index c40f7e2f8915..a2e37db95d34 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java @@ -341,11 +341,10 @@ public class DebuggerSession implements AbstractDebuggerSession { @Nullable protected ExecutionResult attach(@NotNull final Executor executor, @NotNull final ProgramRunner runner, final ModuleRunProfile profile, final RunProfileState state, final RemoteConnection remoteConnection, final boolean pollConnection) throws ExecutionException { - final ExecutionResult executionResult = myDebugProcess.attachVirtualMachine(executor, runner, this, state, remoteConnection, pollConnection); final String addressDisplayName = DebuggerBundle.getAddressDisplayName(remoteConnection); final String transportName = DebuggerBundle.getTransportName(remoteConnection); final Module[] modules = profile.getModules(); - if (modules == null || modules.length == 0) { + if (modules.length == 0) { mySearchScope = GlobalSearchScope.allScope(getProject()); } else { @@ -356,6 +355,7 @@ public class DebuggerSession implements AbstractDebuggerSession { } mySearchScope = scope; } + final ExecutionResult executionResult = myDebugProcess.attachVirtualMachine(executor, runner, this, state, remoteConnection, pollConnection); getContextManager().setState(SESSION_EMPTY_CONTEXT, STATE_WAITING_ATTACH, EVENT_START_WAIT_ATTACH, DebuggerBundle.message("status.waiting.attach", addressDisplayName, transportName)); return executionResult; } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index 04809be06b06..23fed950326e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -33,6 +33,8 @@ import com.intellij.debugger.ui.impl.watch.*; import com.intellij.execution.*; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.executors.DefaultDebugExecutor; +import com.intellij.execution.filters.ExceptionFilter; +import com.intellij.execution.filters.TextConsoleBuilder; import com.intellij.execution.filters.TextConsoleBuilderFactory; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.ProgramRunner; @@ -511,7 +513,9 @@ public class DebuggerSessionTab extends DebuggerLogConsoleManagerBase implements public void addThreadDump(List threads) { final Project project = getProject(); - final ConsoleView consoleView = TextConsoleBuilderFactory.getInstance().createBuilder(project).getConsole(); + final TextConsoleBuilder consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(project); + consoleBuilder.addFilter(new ExceptionFilter(myDebuggerSession.getSearchScope())); + final ConsoleView consoleView = consoleBuilder.getConsole(); final DefaultActionGroup toolbarActions = new DefaultActionGroup(); final ThreadDumpPanel panel = new ThreadDumpPanel(project, consoleView, toolbarActions, threads); diff --git a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java index 6d4cd562f3ff..18b846685bd9 100644 --- a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java +++ b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java @@ -39,9 +39,16 @@ public class ExceptionFilter implements Filter, DumbAware { private static final String AT_PREFIX = AT + " "; private static final String STANDALONE_AT = " " + AT + " "; private static final TextAttributes HYPERLINK_ATTRIBUTES = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES); + private final GlobalSearchScope mySearchScope; public ExceptionFilter(@NotNull final Project project) { myProject = project; + mySearchScope = GlobalSearchScope.allScope(myProject); + } + + public ExceptionFilter(@NotNull final GlobalSearchScope scope) { + myProject = scope.getProject(); + mySearchScope = scope; } public Result applyFilter(final String line, final int textEndOffset) { @@ -81,7 +88,7 @@ public class ExceptionFilter implements Filter, DumbAware { try{ final int lineNumber = Integer.parseInt(lineString); final PsiManager manager = PsiManager.getInstance(myProject); - PsiClass aClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(className, GlobalSearchScope.allScope(myProject)); + PsiClass aClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(className, mySearchScope); if (aClass == null) return null; final PsiFile file = (PsiFile) aClass.getContainingFile().getNavigationElement(); if (file == null) return null; diff --git a/platform/lang-api/src/com/intellij/execution/configurations/CommandLineState.java b/platform/lang-api/src/com/intellij/execution/configurations/CommandLineState.java index 8f37a41fb1ff..15ac3bf74bf0 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/CommandLineState.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/CommandLineState.java @@ -73,7 +73,7 @@ public abstract class CommandLineState implements RunnableState { return new AnAction[]{new PauseOutputAction(console, processHandler)}; } - protected TextConsoleBuilder getConsoleBuilder() { + public TextConsoleBuilder getConsoleBuilder() { return myConsoleBuilder; } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 8b315495d664..be38bcbad49c 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -181,7 +181,8 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ } }; - private final CompositeFilter myMessageFilter; + private final CompositeFilter myPredefinedMessageFilter; + private final CompositeFilter myCustomFilter; private ArrayList myHistory = new ArrayList(); private int myHistorySize = 20; @@ -239,12 +240,11 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ myProject = project; myFileType = fileType; - myMessageFilter = new CompositeFilter(project); - final ConsoleFilterProvider[] filterProviders = Extensions.getExtensions(ConsoleFilterProvider.FILTER_PROVIDERS); - for (ConsoleFilterProvider filterProvider : filterProviders) { - final Filter[] defaultFilters = filterProvider.getDefaultFilters(project); - for (Filter filter : defaultFilters) { - addMessageFilter(filter); + myCustomFilter = new CompositeFilter(project); + myPredefinedMessageFilter = new CompositeFilter(project); + for (ConsoleFilterProvider filterProvider : Extensions.getExtensions(ConsoleFilterProvider.FILTER_PROVIDERS)) { + for (Filter filter : filterProvider.getDefaultFilters(project)) { + myPredefinedMessageFilter.addFilter(filter); } } @@ -533,7 +533,7 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ } public void addMessageFilter(final Filter filter) { - myMessageFilter.addFilter(filter); + myCustomFilter.addFilter(filter); } public void printHyperlink(final String hyperlinkText, final HyperlinkInfo info) { @@ -782,28 +782,29 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ } private void highlightHyperlinks(final int line1, final int line2){ - if (myMessageFilter != null){ - ApplicationManager.getApplication().assertIsDispatchThread(); - PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - final Document document = myEditor.getDocument(); - final CharSequence chars = document.getCharsSequence(); - final TextAttributes hyperlinkAttributes = getHyperlinkAttributes(); + ApplicationManager.getApplication().assertIsDispatchThread(); + PsiDocumentManager.getInstance(myProject).commitAllDocuments(); + final Document document = myEditor.getDocument(); + final CharSequence chars = document.getCharsSequence(); + final TextAttributes hyperlinkAttributes = getHyperlinkAttributes(); - for(int line = line1; line <= line2; line++) { - if (line < 0) continue; - final int startOffset = document.getLineStartOffset(line); - int endOffset = document.getLineEndOffset(line); - if (endOffset < document.getTextLength()){ - endOffset++; // add '\n' - } - final String text = chars.subSequence(startOffset, endOffset).toString(); - final Filter.Result result = myMessageFilter.applyFilter(text, endOffset); - if (result != null){ - final int highlightStartOffset = result.highlightStartOffset; - final int highlightEndOffset = result.highlightEndOffset; - final HyperlinkInfo hyperlinkInfo = result.hyperlinkInfo; - addHyperlink(highlightStartOffset, highlightEndOffset, result.highlightAttributes, hyperlinkInfo, hyperlinkAttributes); - } + for(int line = line1; line <= line2; line++) { + if (line < 0) continue; + final int startOffset = document.getLineStartOffset(line); + int endOffset = document.getLineEndOffset(line); + if (endOffset < document.getTextLength()){ + endOffset++; // add '\n' + } + final String text = chars.subSequence(startOffset, endOffset).toString(); + Filter.Result result = myCustomFilter.applyFilter(text, endOffset); + if (result == null) { + result = myPredefinedMessageFilter.applyFilter(text, endOffset); + } + if (result != null){ + final int highlightStartOffset = result.highlightStartOffset; + final int highlightEndOffset = result.highlightEndOffset; + final HyperlinkInfo hyperlinkInfo = result.hyperlinkInfo; + addHyperlink(highlightStartOffset, highlightEndOffset, result.highlightAttributes, hyperlinkInfo, hyperlinkAttributes); } } }