Skip to content

Commit a639856

Browse files
mihnitajukzi
authored andcommitted
Fix #91: Stack trace detection not working in colored console
1 parent b08e5b1 commit a639856

File tree

4 files changed

+54
-7
lines changed

4 files changed

+54
-7
lines changed

org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/JavaDebugStackTraceConsoleTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,31 @@ public void testMixedCases() throws Exception {
213213
new String[] { "somewhere1.somewhere2.Some1Class105", "line: 5" }, matchTexts);
214214
}
215215

216+
public void testStackTraceDetectionWithColors() throws Exception {
217+
String exception = ""
218+
+ "Caused by\033[m: java.lang.NullPointerException: \033[1;31mCannot invoke \"org.eclipse.equinox.internal.provisional.p2.core.eventbus.IProvisioningEventBus.addListener(org.eclipse.equinox.internal.provisional.p2.core.eventbus.ProvisioningListener)\" because \"this.eventBus\" is null\033[m\n"
219+
+ " \033[1mat\033[m org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.<init> (\033[1mAbstractRepositoryManager.java:107\033[m)\n"
220+
+ " \033[1mat\033[m org.eclipse.equinox.internal.p2.artifact.repository.ArtifactRepositoryManager.<init> (\033[1mArtifactRepositoryManager.java:41\033[m)\n"
221+
// ...
222+
+ " \033[1mat\033[m java.lang.reflect.Method.invoke (\033[1mMethod.java:568\033[m)\n"
223+
+ " \033[1mat\033[m org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (\033[1mLauncher.java:282\033[m)\n"
224+
+ " \033[1mat\033[m org.codehaus.plexus.classworlds.launcher.Launcher.launch (\033[1mLauncher.java:225\033[m)\n"
225+
+ " \033[1mat\033[m org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (\033[1mLauncher.java:406\033[m)\n"
226+
+ " \033[1mat\033[m org.codehaus.plexus.classworlds.launcher.Launcher.main (\033[1mLauncher.java:347\033[m)\n";
227+
consoleDocumentWithText(exception);
228+
229+
Position[] positions = allLinkPositions();
230+
int[] offsets = new int[positions.length];
231+
for (int i = 0; i < offsets.length; i++) {
232+
offsets[i] = positions[i].getOffset();
233+
}
234+
235+
String[] matchTexts = linkTextsAtPositions(offsets);
236+
String[] expected = { "java.lang.NullPointerException", "AbstractRepositoryManager.java:107", "ArtifactRepositoryManager.java:41",
237+
"Method.java:568", "Launcher.java:282", "Launcher.java:225", "Launcher.java:406", "Launcher.java:347" };
238+
assertArrayEquals("Wrong hyperlinks, listing all links: " + allLinks(), expected, matchTexts);
239+
}
240+
216241
private static String getSelectedText(IEditorPart editor) {
217242
ITextEditor textEditor = (ITextEditor) editor;
218243
ISelectionProvider selectionProvider = textEditor.getSelectionProvider();

org.eclipse.jdt.debug.ui/plugin.xml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3503,7 +3503,7 @@ M4 = Platform-specific fourth key
35033503
point="org.eclipse.ui.console.consolePatternMatchListeners">
35043504
<consolePatternMatchListener
35053505
class="org.eclipse.jdt.internal.debug.ui.console.JavaConsoleTracker"
3506-
regex="\([\w\.\\/@]*${java_extensions_regex}\S*\)"
3506+
regex="\(${ansi_escape_regex}[\w\.\\/@]*${java_extensions_regex}\S*${ansi_escape_regex}\)"
35073507
qualifier="${java_extensions_regex}"
35083508
flags="UNICODE_CHARACTER_CLASS"
35093509
id="org.eclipse.jdt.debug.ui.JavaConsoleTracker">
@@ -3517,7 +3517,7 @@ M4 = Platform-specific fourth key
35173517
</consolePatternMatchListener>
35183518
<consolePatternMatchListener
35193519
class="org.eclipse.jdt.internal.debug.ui.console.JavaNativeConsoleTracker"
3520-
regex="\(Native Method\)"
3520+
regex="\(${ansi_escape_regex}Native Method${ansi_escape_regex}\)"
35213521
qualifier="Native Method"
35223522
id="org.eclipse.jdt.debug.ui.JavaNativeConsoleTracker">
35233523
<enablement>
@@ -3890,4 +3890,15 @@ M4 = Platform-specific fourth key
38903890
</enabledWhen>
38913891
</handler>
38923892
</extension>
3893+
3894+
<extension
3895+
point="org.eclipse.core.variables.valueVariables">
3896+
<!-- For convenience, to use when we detect stack-trace links -->
3897+
<variable
3898+
initialValue="(\033\[[\d;]*[A-HJKSTfimnsu])*"
3899+
name="ansi_escape_regex"
3900+
readOnly="true">
3901+
</variable>
3902+
</extension>
3903+
38933904
</plugin>

org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaConsoleTracker.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,22 @@ protected TextConsole getConsole() {
5454
* @see org.eclipse.ui.console.IPatternMatchListenerDelegate#matchFound(org.eclipse.ui.console.PatternMatchEvent)
5555
*/
5656
@Override
57-
public void matchFound(PatternMatchEvent event) {
57+
public void matchFound(PatternMatchEvent event) {
5858
try {
59-
int offset = event.getOffset();
60-
int length = event.getLength();
59+
int offset = event.getOffset() + 1; // skip the leading (
60+
int length = event.getLength() - 2; // don't count the leading ( and trailing )
61+
62+
String text = fConsole.getDocument().get(offset, length);
63+
// Remove the ANSI escape sequences
64+
String textNew = text.replaceAll(JavaStackTraceHyperlink.ANSI_ESCAPE_REGEX, ""); //$NON-NLS-1$
65+
int delta = text.indexOf(textNew);
66+
if (delta != -1) {
67+
offset += delta;
68+
length = textNew.length();
69+
}
70+
6171
IHyperlink link = new JavaStackTraceHyperlink(fConsole);
62-
fConsole.addHyperlink(link, offset+1, length-2);
72+
fConsole.addHyperlink(link, offset, length);
6373
} catch (BadLocationException e) {
6474
}
6575
}

org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
* A hyper-link from a stack trace line of the form "*(*.java:*)"
6161
*/
6262
public class JavaStackTraceHyperlink implements IHyperlink {
63-
63+
final static String ANSI_ESCAPE_REGEX = "\033\\[[\\d;]*[A-HJKSTfimnsu]"; //$NON-NLS-1$
6464
private final TextConsole fConsole;
6565
private final AtomicReference<String> generatedLink;
6666
private static final String REGEX_FOR_NORMAL = "([a-zA-Z0-9\\$]+)\\.([a-zA-Z0-9]+)\\(([^)]*)\\)"; //$NON-NLS-1$
@@ -103,6 +103,7 @@ public void linkActivated() {
103103
int lineNumber;
104104
try {
105105
String linkText = getLinkText();
106+
linkText = linkText.replaceAll(ANSI_ESCAPE_REGEX, ""); //$NON-NLS-1$
106107
generatedLink.set(linkText);
107108
typeName = getTypeName(linkText);
108109
lineNumber = getLineNumber(linkText);

0 commit comments

Comments
 (0)