dubugger: consider search scope from run configuration when navigating from exception trace hyperlinks (IDEADEV-41133)

This commit is contained in:
Eugene Zhuravlev
2009-10-30 21:18:46 +03:00
parent 066324e6ef
commit 677f91daff
7 changed files with 57 additions and 35 deletions
@@ -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) {
@@ -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();
@@ -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;
}
@@ -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<ThreadState> 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);
@@ -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;
@@ -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;
}
@@ -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<String> myHistory = new ArrayList<String>();
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);
}
}
}