diff --git a/server/src/common/api.ts b/server/src/common/api.ts index 74bd7f07d..855a1cf08 100644 --- a/server/src/common/api.ts +++ b/server/src/common/api.ts @@ -5,7 +5,7 @@ import { _, Features, _Connection, _LanguagesImpl } from './server'; import { SemanticTokensBuilder } from './semanticTokens'; -import type { WorkDoneProgressReporter, WorkDoneProgressServerReporter, ResultProgressReporter } from './progress'; +import { WorkDoneProgressReporter, type WorkDoneProgressServerReporter, type ResultProgressReporter } from './progress'; export * from 'vscode-languageserver-protocol'; export { WorkDoneProgressReporter, WorkDoneProgressServerReporter, ResultProgressReporter }; @@ -22,4 +22,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..005dce2eb 100644 --- a/server/src/common/progress.ts +++ b/server/src/common/progress.ts @@ -27,6 +27,15 @@ export interface WorkDoneProgressReporter { done(): void; } +export namespace WorkDoneProgressReporter { + /** + * Tests whether the given work done progress reporter discards progress. + */ + export function isNullInstance(reporter: WorkDoneProgressReporter): boolean { + return reporter instanceof NullProgressReporter; + } +} + export interface WorkDoneProgressServerReporter extends WorkDoneProgressReporter { readonly token: CancellationToken; } diff --git a/server/src/node/test/connection.test.ts b/server/src/node/test/connection.test.ts index d99f2f5a8..5d4cd2ce5 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, WorkDoneProgressReporter } 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(!WorkDoneProgressReporter.isNullInstance(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(WorkDoneProgressReporter.isNullInstance(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 +});