diff --git a/extensions/notebook-renderers/src/stackTraceHelper.ts b/extensions/notebook-renderers/src/stackTraceHelper.ts index 3ac30abaf6b..943877ad59d 100644 --- a/extensions/notebook-renderers/src/stackTraceHelper.ts +++ b/extensions/notebook-renderers/src/stackTraceHelper.ts @@ -31,7 +31,7 @@ export function formatStackTrace(stack: string) { const formatSequence = /\u001b\[.+?m/g; const fileRegex = /File\s+(?:\u001b\[.+?m)?(.+):(\d+)/; -const lineNumberRegex = /^((?:\u001b\[.+?m)?[ ->]*?)(\d+)(.*)/; +const lineNumberRegex = /^((?:\u001b\[.+?m)?[ \->]+?)(\d+)(?:\u001b\[0m)?( .*)/; const cellRegex = /(?Cell\s+(?:\u001b\[.+?m)?In\s*\[(?\d+)\],\s*)(?line (?\d+)).*/; // older versions of IPython ~8.3.0 const inputRegex = /(?Input\s+?(?:\u001b\[.+?m)(?In\s*\[(?\d+)\]))(?.*)/; diff --git a/extensions/notebook-renderers/src/test/stackTraceHelper.test.ts b/extensions/notebook-renderers/src/test/stackTraceHelper.test.ts index da7f9d0e2e4..c4e99179086 100644 --- a/extensions/notebook-renderers/src/test/stackTraceHelper.test.ts +++ b/extensions/notebook-renderers/src/test/stackTraceHelper.test.ts @@ -43,8 +43,6 @@ suite('StackTraceHelper', () => { assert.ok(formatted.indexOf('2') > 0, 'Missing frame link in ' + formatted); }); - - test('IPython stack line numbers are linkified for IPython 8.3', () => { // stack frames within functions do not list the line number, i.e. // 'Input In [1], in myfunc()' vs @@ -93,7 +91,11 @@ suite('StackTraceHelper', () => { '\u001b[1;36m Cell \u001b[1;32mIn[6], line 1\u001b[1;36m\u001b[0m\n' + '\u001b[1;33m print(\u001b[0m\n' + '\u001b[1;37m ^\u001b[0m\n' + - '\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m incomplete input\n'; + '\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m incomplete input\n' + + // contrived examples to check for more false positives + '1 print(\n' + + 'a 1 print(\n' + + ' 1a print(\n'; const formattedLines = formatStackTrace(stack).split('\n'); assert.ok(/