From 233449c7a0e3a7500bd9b146f9aad3f686b15c45 Mon Sep 17 00:00:00 2001 From: Alec Theriault Date: Mon, 28 Apr 2025 13:11:30 -0400 Subject: [PATCH 1/2] fix: `TextDocument.lineAt` properties Fixes incorrect mocks of - `firstNonWhitespaceCharacterIndex` - `isEmptyOrWhitespace` Fixes #564 --- src/vscode/TextDocument.test.ts | 22 ++++++++++++++++++++++ src/vscode/TextDocument.ts | 5 +++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/vscode/TextDocument.test.ts b/src/vscode/TextDocument.test.ts index c97fdc18..e0439d8a 100644 --- a/src/vscode/TextDocument.test.ts +++ b/src/vscode/TextDocument.test.ts @@ -71,6 +71,28 @@ describe('Validate TextDocument', () => { MockTextDocument.setContents(doc, content()); expect(() => doc.save()).toThrow('Method not implemented.'); }); + + test('lineAt', async () => { + const doc = createDoc(); + + const line1 = doc.lineAt(1) + expect(line1.lineNumber).toEqual(1) + expect(line1.text).toEqual('Line 1') + expect(line1.firstNonWhitespaceCharacterIndex).toEqual(0) + expect(line1.isEmptyOrWhitespace).toEqual(false) + + const line3 = doc.lineAt(3) + expect(line3.lineNumber).toEqual(3) + expect(line3.text).toEqual('') + expect(line3.firstNonWhitespaceCharacterIndex).toEqual(0) + expect(line3.isEmptyOrWhitespace).toEqual(true) + + const line4 = doc.lineAt(4) + expect(line4.lineNumber).toEqual(4) + expect(line4.text).toEqual(' Line 4') + expect(line4.firstNonWhitespaceCharacterIndex).toEqual(2) + expect(line4.isEmptyOrWhitespace).toEqual(false) + }); }); function r(lineA: number, rowA: number, lineB: number, rowB: number): vscode.Range { diff --git a/src/vscode/TextDocument.ts b/src/vscode/TextDocument.ts index 37fa42de..87b5d7c4 100644 --- a/src/vscode/TextDocument.ts +++ b/src/vscode/TextDocument.ts @@ -46,13 +46,14 @@ export class MockTextDocument implements vscode.TextDocument { const lineNumber = typeof line === 'number' ? line : line.line; const fullLineText = this._lines[lineNumber]; const text = fullLineText.replace(/\r?\n/, ''); + const firstNonWhitespaceCharacterIndex = /^(\s*)/.exec(text)![1].length return { lineNumber, text, range: new mocked.Range(lineNumber, 0, lineNumber, text.length), - firstNonWhitespaceCharacterIndex: 0, + firstNonWhitespaceCharacterIndex, rangeIncludingLineBreak: new mocked.Range(lineNumber, 0, lineNumber, fullLineText.length), - isEmptyOrWhitespace: !!text.replace(/\s+/, ''), + isEmptyOrWhitespace: firstNonWhitespaceCharacterIndex === text.length, }; } From 3733aef46f45b87e4453e2e28de480343fb36004 Mon Sep 17 00:00:00 2001 From: Jason Dent Date: Fri, 2 May 2025 09:10:46 +0200 Subject: [PATCH 2/2] suppress linter warning. --- src/vscode/TextDocument.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vscode/TextDocument.ts b/src/vscode/TextDocument.ts index 87b5d7c4..5b7d1e10 100644 --- a/src/vscode/TextDocument.ts +++ b/src/vscode/TextDocument.ts @@ -46,6 +46,10 @@ export class MockTextDocument implements vscode.TextDocument { const lineNumber = typeof line === 'number' ? line : line.line; const fullLineText = this._lines[lineNumber]; const text = fullLineText.replace(/\r?\n/, ''); + /** + * See: https://github.com/microsoft/vscode/blob/56222f3441914d033791e7e7a09b99423864751b/src/vs/workbench/api/common/extHostDocumentData.ts#L284-L291 + */ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const firstNonWhitespaceCharacterIndex = /^(\s*)/.exec(text)![1].length return { lineNumber,