From 9e96bd062d3490c5a25c622e1f5529a36c84c679 Mon Sep 17 00:00:00 2001 From: Luan Nutels - VolkSec Date: Tue, 28 Jul 2026 08:23:27 -0300 Subject: [PATCH] Expose null progress reporter detection --- server/src/common/api.ts | 5 +++-- server/src/common/progress.ts | 7 +++++++ server/src/node/test/connection.test.ts | 7 ++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/server/src/common/api.ts b/server/src/common/api.ts index 74bd7f07d..591494110 100644 --- a/server/src/common/api.ts +++ b/server/src/common/api.ts @@ -5,10 +5,11 @@ import { _, Features, _Connection, _LanguagesImpl } from './server'; import { SemanticTokensBuilder } from './semanticTokens'; -import type { WorkDoneProgressReporter, WorkDoneProgressServerReporter, ResultProgressReporter } from './progress'; +import { isNullProgressReporter, type WorkDoneProgressReporter, type WorkDoneProgressServerReporter, type ResultProgressReporter } from './progress'; export * from 'vscode-languageserver-protocol'; export { WorkDoneProgressReporter, WorkDoneProgressServerReporter, ResultProgressReporter }; +export { isNullProgressReporter }; export { SemanticTokensBuilder }; import { TextDocuments, TextDocumentsConfiguration, TextDocumentChangeEvent, TextDocumentWillSaveEvent } from './textDocuments'; export { TextDocuments, TextDocumentsConfiguration, TextDocumentChangeEvent, TextDocumentWillSaveEvent }; @@ -22,4 +23,4 @@ export namespace ProposedFeatures { }; export type Connection = _Connection<_, _, _, _, _, _, _, _>; -} \ No newline at end of file +} diff --git a/server/src/common/progress.ts b/server/src/common/progress.ts index 5a4f764e3..976fd1eb0 100644 --- a/server/src/common/progress.ts +++ b/server/src/common/progress.ts @@ -143,6 +143,13 @@ class NullProgressServerReporter extends NullProgressReporter implements WorkDon } } +/** + * Tests whether the given work done progress reporter discards progress. + */ +export function isNullProgressReporter(reporter: WorkDoneProgressReporter): boolean { + return reporter instanceof NullProgressReporter; +} + export function attachWorkDone(connection: ProgressContext, params: WorkDoneProgressParams | undefined): WorkDoneProgressReporter { if (params === undefined || params.workDoneToken === undefined) { return new NullProgressReporter(); diff --git a/server/src/node/test/connection.test.ts b/server/src/node/test/connection.test.ts index d99f2f5a8..34da9feaf 100644 --- a/server/src/node/test/connection.test.ts +++ b/server/src/node/test/connection.test.ts @@ -10,7 +10,7 @@ import { Duplex } from 'stream'; import { InitializeParams, InitializeRequest, InitializeResult, createConnection, DidChangeConfigurationNotification, DidChangeConfigurationParams, Connection, DeclarationRequest, DeclarationParams, ProgressToken, WorkDoneProgress, - LocationLink + LocationLink, isNullProgressReporter } from '../main'; class TestStream extends Duplex { @@ -73,6 +73,7 @@ suite('Connection Tests', () => { test('Ensure work done converted', (done) => { serverConnection.onDeclaration((_params, _cancel, workDone, result) => { assert.ok(workDone !== undefined, 'Work Done token converted.'); + assert.ok(!isNullProgressReporter(workDone), 'Work Done token uses a progress reporter.'); assert.ok(result === undefined, 'Result token undefined.'); done(); return []; @@ -89,7 +90,7 @@ suite('Connection Tests', () => { test('Ensure result converted', (done) => { serverConnection.onDeclaration((_params, _cancel, workDone, result) => { - assert.ok(workDone === undefined || workDone.constructor.name === 'NullProgressReporter', 'Work Done token undefined or null progress.'); + assert.ok(isNullProgressReporter(workDone), 'Work Done token uses a null progress reporter.'); assert.ok(result !== undefined, 'Result token converted.'); done(); return []; @@ -177,4 +178,4 @@ suite('Connection Tests', () => { done(); }); }); -}); \ No newline at end of file +});