Skip to content

Commit 69acde7

Browse files
committed
testing: track test error message decorations correctly
Fixes #234293
1 parent bbe24d7 commit 69acde7

File tree

1 file changed

+36
-17
lines changed

1 file changed

+36
-17
lines changed

src/vs/workbench/contrib/testing/browser/testingDecorations.ts

+36-17
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { ResourceMap } from '../../../../base/common/map.js';
2020
import { clamp } from '../../../../base/common/numbers.js';
2121
import { autorun } from '../../../../base/common/observable.js';
2222
import { isMacintosh } from '../../../../base/common/platform.js';
23-
import { truncateMiddle } from '../../../../base/common/strings.js';
23+
import { count, truncateMiddle } from '../../../../base/common/strings.js';
2424
import { ThemeIcon } from '../../../../base/common/themables.js';
2525
import { Constants } from '../../../../base/common/uint.js';
2626
import { URI } from '../../../../base/common/uri.js';
@@ -360,7 +360,7 @@ export class TestingDecorations extends Disposable implements IEditorContributio
360360
/**
361361
* Results invalidated by editor changes.
362362
*/
363-
private static invalidatedTests = new WeakSet<TestResultItem | ITestMessage>();
363+
public static invalidatedTests = new WeakSet<TestResultItem | ITestMessage>();
364364

365365
/**
366366
* Gets the decorations associated with the given code editor.
@@ -455,20 +455,18 @@ export class TestingDecorations extends Disposable implements IEditorContributio
455455
}
456456

457457
let changed = false;
458-
for (const decos of [this.errorContentWidgets, this.loggedMessageDecorations]) {
459-
for (const [message, deco] of decos) {
460-
// invalidate decorations if either the line they're on was changed,
461-
// or if the range of the test was changed. The range of the test is
462-
// not always present, so check bo.
463-
const invalidate = evts.some(e => e.changes.some(c =>
464-
c.range.startLineNumber <= deco.line && c.range.endLineNumber >= deco.line
465-
|| (deco.resultItem?.item.range && deco.resultItem.item.range.startLineNumber <= c.range.startLineNumber && deco.resultItem.item.range.endLineNumber >= c.range.endLineNumber)
466-
));
467-
468-
if (invalidate) {
469-
changed = true;
470-
TestingDecorations.invalidatedTests.add(deco.resultItem || message);
471-
}
458+
for (const [message, deco] of this.loggedMessageDecorations) {
459+
// invalidate decorations if either the line they're on was changed,
460+
// or if the range of the test was changed. The range of the test is
461+
// not always present, so check bo.
462+
const invalidate = evts.some(e => e.changes.some(c =>
463+
c.range.startLineNumber <= deco.line && c.range.endLineNumber >= deco.line
464+
|| (deco.resultItem?.item.range && deco.resultItem.item.range.startLineNumber <= c.range.startLineNumber && deco.resultItem.item.range.endLineNumber >= c.range.endLineNumber)
465+
));
466+
467+
if (invalidate) {
468+
changed = true;
469+
TestingDecorations.invalidatedTests.add(deco.resultItem || message);
472470
}
473471
}
474472

@@ -1354,7 +1352,7 @@ class TestErrorContentWidget extends Disposable implements IContentWidget {
13541352

13551353
constructor(
13561354
private readonly editor: ICodeEditor,
1357-
private readonly position: Position,
1355+
private position: Position,
13581356
public readonly message: ITestErrorMessage,
13591357
public readonly resultItem: TestResultItem,
13601358
uri: URI,
@@ -1411,6 +1409,27 @@ class TestErrorContentWidget extends Disposable implements IContentWidget {
14111409

14121410
this.node.arrow.appendChild(svg);
14131411

1412+
this._register(editor.onDidChangeModelContent(e => {
1413+
for (const c of e.changes) {
1414+
if (c.range.startLineNumber > this.line) {
1415+
continue;
1416+
}
1417+
if (
1418+
c.range.startLineNumber <= this.line && c.range.endLineNumber >= this.line
1419+
|| (resultItem.item.range && resultItem.item.range.startLineNumber <= c.range.startLineNumber && resultItem.item.range.endLineNumber >= c.range.endLineNumber)
1420+
) {
1421+
TestingDecorations.invalidatedTests.add(this.resultItem);
1422+
this.dispose(); // todo
1423+
}
1424+
1425+
const adjust = count(c.text, '\n') - (c.range.endLineNumber - c.range.startLineNumber);
1426+
if (adjust !== 0) {
1427+
this.position = this.position.delta(adjust);
1428+
this.editor.layoutContentWidget(this);
1429+
}
1430+
}
1431+
}));
1432+
14141433
editor.addContentWidget(this);
14151434
this._register(toDisposable(() => editor.removeContentWidget(this)));
14161435
}

0 commit comments

Comments
 (0)