Skip to content

Commit 4e057d5

Browse files
c-claeysdbaeumer
andauthored
Add the workspace/foldingRange/refresh method (#1309)
* Add the workspace/foldingRange/refresh method * Add proposed tag * Move refreshSupport to workspace scoped capability --------- Co-authored-by: Dirk Bäumer <[email protected]>
1 parent a57d7f1 commit 4e057d5

File tree

6 files changed

+158
-11
lines changed

6 files changed

+158
-11
lines changed

client/src/common/foldingRange.ts

+19-5
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
* ------------------------------------------------------------------------------------------ */
55

66
import {
7-
languages as Languages, Disposable, TextDocument, ProviderResult, FoldingRange as VFoldingRange, FoldingContext, FoldingRangeProvider
7+
languages as Languages, Disposable, TextDocument, ProviderResult, FoldingRange as VFoldingRange, FoldingContext, FoldingRangeProvider, EventEmitter
88
} from 'vscode';
99

1010
import {
1111
ClientCapabilities, CancellationToken, ServerCapabilities, DocumentSelector, FoldingRangeRequest, FoldingRangeParams,
12-
FoldingRangeRegistrationOptions, FoldingRangeOptions, FoldingRangeKind
12+
FoldingRangeRegistrationOptions, FoldingRangeOptions, FoldingRangeKind, FoldingRangeRefreshRequest
1313
} from 'vscode-languageserver-protocol';
1414

1515
import { TextDocumentLanguageFeature, FeatureClient, ensure } from './features';
@@ -22,7 +22,12 @@ export interface FoldingRangeProviderMiddleware {
2222
provideFoldingRanges?: (this: void, document: TextDocument, context: FoldingContext, token: CancellationToken, next: ProvideFoldingRangeSignature) => ProviderResult<VFoldingRange[]>;
2323
}
2424

25-
export class FoldingRangeFeature extends TextDocumentLanguageFeature<boolean | FoldingRangeOptions, FoldingRangeRegistrationOptions, FoldingRangeProvider, FoldingRangeProviderMiddleware> {
25+
export type FoldingRangeProviderShape = {
26+
provider: FoldingRangeProvider;
27+
onDidChangeFoldingRange: EventEmitter<void>;
28+
};
29+
30+
export class FoldingRangeFeature extends TextDocumentLanguageFeature<boolean | FoldingRangeOptions, FoldingRangeRegistrationOptions, FoldingRangeProviderShape, FoldingRangeProviderMiddleware> {
2631

2732
constructor(client: FeatureClient<FoldingRangeProviderMiddleware>) {
2833
super(client, FoldingRangeRequest.type);
@@ -35,19 +40,28 @@ export class FoldingRangeFeature extends TextDocumentLanguageFeature<boolean | F
3540
capability.lineFoldingOnly = true;
3641
capability.foldingRangeKind = { valueSet: [ FoldingRangeKind.Comment, FoldingRangeKind.Imports, FoldingRangeKind.Region ] };
3742
capability.foldingRange = { collapsedText: false };
43+
ensure(ensure(capabilities, 'workspace')!, 'foldingRange')!.refreshSupport = true;
3844
}
3945

4046
public initialize(capabilities: ServerCapabilities, documentSelector: DocumentSelector): void {
47+
this._client.onRequest(FoldingRangeRefreshRequest.type, async () => {
48+
for (const provider of this.getAllProviders()) {
49+
provider.onDidChangeFoldingRange.fire();
50+
}
51+
});
52+
4153
let [id, options] = this.getRegistration(documentSelector, capabilities.foldingRangeProvider);
4254
if (!id || !options) {
4355
return;
4456
}
4557
this.register({ id: id, registerOptions: options });
4658
}
4759

48-
protected registerLanguageProvider(options: FoldingRangeRegistrationOptions): [Disposable, FoldingRangeProvider] {
60+
protected registerLanguageProvider(options: FoldingRangeRegistrationOptions): [Disposable, FoldingRangeProviderShape] {
4961
const selector = options.documentSelector!;
62+
const eventEmitter: EventEmitter<void> = new EventEmitter<void>();
5063
const provider: FoldingRangeProvider = {
64+
onDidChangeFoldingRanges: eventEmitter.event,
5165
provideFoldingRanges: (document, context, token) => {
5266
const client = this._client;
5367
const provideFoldingRanges: ProvideFoldingRangeSignature = (document, _, token) => {
@@ -69,6 +83,6 @@ export class FoldingRangeFeature extends TextDocumentLanguageFeature<boolean | F
6983
: provideFoldingRanges(document, context, token);
7084
}
7185
};
72-
return [Languages.registerFoldingRangeProvider(this._client.protocol2CodeConverter.asDocumentSelector(selector), provider), provider];
86+
return [Languages.registerFoldingRangeProvider(this._client.protocol2CodeConverter.asDocumentSelector(selector), provider), { provider: provider, onDidChangeFoldingRange: eventEmitter }];
7387
}
7488
}

protocol/metaModel.json

+41
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,17 @@
243243
},
244244
"documentation": "A request to provide folding ranges in a document. The request's\nparameter is of type {@link FoldingRangeParams}, the\nresponse is of type {@link FoldingRangeList} or a Thenable\nthat resolves to such."
245245
},
246+
{
247+
"method": "workspace/foldingRange/refresh",
248+
"result": {
249+
"kind": "base",
250+
"name": "null"
251+
},
252+
"messageDirection": "serverToClient",
253+
"documentation": "@since 3.18.0\n@proposed",
254+
"since": "3.18.0",
255+
"proposed": true
256+
},
246257
{
247258
"method": "textDocument/declaration",
248259
"result": {
@@ -10670,6 +10681,17 @@
1067010681
"optional": true,
1067110682
"documentation": "Capabilities specific to the diagnostic requests scoped to the\nworkspace.\n\n@since 3.17.0.",
1067210683
"since": "3.17.0."
10684+
},
10685+
{
10686+
"name": "foldingRange",
10687+
"type": {
10688+
"kind": "reference",
10689+
"name": "FoldingRangeWorkspaceClientCapabilities"
10690+
},
10691+
"optional": true,
10692+
"documentation": "Capabilities specific to the folding range requests scoped to the workspace.\n\n@since 3.18.0\n@proposed",
10693+
"since": "3.18.0",
10694+
"proposed": true
1067310695
}
1067410696
],
1067510697
"documentation": "Workspace specific client capabilities."
@@ -11489,6 +11511,25 @@
1148911511
"documentation": "Workspace client capabilities specific to diagnostic pull requests.\n\n@since 3.17.0",
1149011512
"since": "3.17.0"
1149111513
},
11514+
{
11515+
"name": "FoldingRangeWorkspaceClientCapabilities",
11516+
"properties": [
11517+
{
11518+
"name": "refreshSupport",
11519+
"type": {
11520+
"kind": "base",
11521+
"name": "boolean"
11522+
},
11523+
"optional": true,
11524+
"documentation": "Whether the client implementation supports a refresh request sent from the\nserver to the client.\n\nNote that this event is global and will force the client to refresh all\nfolding ranges currently shown. It should be used with absolute care and is\nuseful for situation where a server for example detects a project wide\nchange that requires such a calculation.\n\n@since 3.18.0\n@proposed",
11525+
"since": "3.18.0",
11526+
"proposed": true
11527+
}
11528+
],
11529+
"documentation": "Client workspace capabilities specific to folding ranges\n\n@since 3.18.0\n@proposed",
11530+
"since": "3.18.0",
11531+
"proposed": true
11532+
},
1149211533
{
1149311534
"name": "TextDocumentSyncClientCapabilities",
1149411535
"properties": [

protocol/src/common/protocol.foldingRange.ts

+36-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { RequestHandler } from 'vscode-jsonrpc';
6+
import { RequestHandler, RequestHandler0 } from 'vscode-jsonrpc';
77
import { TextDocumentIdentifier, uinteger, FoldingRange, FoldingRangeKind } from 'vscode-languageserver-types';
88

9-
import { MessageDirection, ProtocolRequestType } from './messages';
9+
import { MessageDirection, ProtocolRequestType, ProtocolRequestType0 } from './messages';
1010
import type {
1111
TextDocumentRegistrationOptions, StaticRegistrationOptions, PartialResultParams, WorkDoneProgressParams, WorkDoneProgressOptions
1212
} from './protocol';
@@ -68,6 +68,29 @@ export interface FoldingRangeClientCapabilities {
6868
};
6969
}
7070

71+
/**
72+
* Client workspace capabilities specific to folding ranges
73+
*
74+
* @since 3.18.0
75+
* @proposed
76+
*/
77+
export interface FoldingRangeWorkspaceClientCapabilities {
78+
79+
/**
80+
* Whether the client implementation supports a refresh request sent from the
81+
* server to the client.
82+
*
83+
* Note that this event is global and will force the client to refresh all
84+
* folding ranges currently shown. It should be used with absolute care and is
85+
* useful for situation where a server for example detects a project wide
86+
* change that requires such a calculation.
87+
*
88+
* @since 3.18.0
89+
* @proposed
90+
*/
91+
refreshSupport?: boolean;
92+
}
93+
7194
export interface FoldingRangeOptions extends WorkDoneProgressOptions {
7295
}
7396

@@ -96,3 +119,14 @@ export namespace FoldingRangeRequest {
96119
export const type = new ProtocolRequestType<FoldingRangeParams, FoldingRange[] | null, FoldingRange[], void, FoldingRangeRegistrationOptions>(method);
97120
export type HandlerSignature = RequestHandler<FoldingRangeParams, FoldingRange[] | null, void>;
98121
}
122+
123+
/**
124+
* @since 3.18.0
125+
* @proposed
126+
*/
127+
export namespace FoldingRangeRefreshRequest {
128+
export const method: `workspace/foldingRange/refresh` = `workspace/foldingRange/refresh`;
129+
export const messageDirection: MessageDirection = MessageDirection.serverToClient;
130+
export const type = new ProtocolRequestType0<void, void, void, void>(method);
131+
export type HandlerSignature = RequestHandler0<void, void>;
132+
}

protocol/src/common/protocol.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import {
4343
} from './protocol.colorProvider';
4444

4545
import {
46-
FoldingRangeClientCapabilities, FoldingRangeOptions, FoldingRangeRequest, FoldingRangeParams, FoldingRangeRegistrationOptions
46+
FoldingRangeClientCapabilities, FoldingRangeOptions, FoldingRangeRequest, FoldingRangeParams, FoldingRangeRegistrationOptions, FoldingRangeRefreshRequest, FoldingRangeWorkspaceClientCapabilities
4747
} from './protocol.foldingRange';
4848

4949
import {
@@ -556,6 +556,14 @@ export interface WorkspaceClientCapabilities {
556556
* @since 3.17.0.
557557
*/
558558
diagnostics?: DiagnosticWorkspaceClientCapabilities;
559+
560+
/**
561+
* Capabilities specific to the folding range requests scoped to the workspace.
562+
*
563+
* @since 3.18.0
564+
* @proposed
565+
*/
566+
foldingRange?: FoldingRangeWorkspaceClientCapabilities;
559567
}
560568

561569
/**
@@ -3874,7 +3882,7 @@ export {
38743882
WorkspaceFoldersRequest, DidChangeWorkspaceFoldersNotification, DidChangeWorkspaceFoldersParams, WorkspaceFoldersChangeEvent,
38753883
ConfigurationRequest, ConfigurationParams, ConfigurationItem,
38763884
DocumentColorRequest, ColorPresentationRequest, DocumentColorOptions, DocumentColorParams, ColorPresentationParams, DocumentColorRegistrationOptions,
3877-
FoldingRangeClientCapabilities, FoldingRangeOptions, FoldingRangeRequest, FoldingRangeParams, FoldingRangeRegistrationOptions,
3885+
FoldingRangeClientCapabilities, FoldingRangeOptions, FoldingRangeRequest, FoldingRangeParams, FoldingRangeRegistrationOptions, FoldingRangeRefreshRequest,
38783886
DeclarationClientCapabilities, DeclarationRequest, DeclarationParams, DeclarationRegistrationOptions, DeclarationOptions,
38793887
SelectionRangeClientCapabilities, SelectionRangeOptions, SelectionRangeParams, SelectionRangeRequest, SelectionRangeRegistrationOptions,
38803888
WorkDoneProgressBegin, WorkDoneProgressReport, WorkDoneProgressEnd, WorkDoneProgress, WorkDoneProgressCreateParams,

server/src/common/foldingRange.ts

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/* --------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
* ------------------------------------------------------------------------------------------ */
5+
'use strict';
6+
7+
import { FoldingRange, Disposable, FoldingRangeParams, FoldingRangeRefreshRequest, FoldingRangeRequest } from 'vscode-languageserver-protocol';
8+
9+
import type { Feature, _Languages, ServerRequestHandler } from './server';
10+
11+
/**
12+
* Shape of the folding range feature
13+
*/
14+
export interface FoldingRangeFeatureShape {
15+
foldingRange: {
16+
/**
17+
* Ask the client to refresh all folding ranges
18+
*
19+
* @since 3.18.0.
20+
* @proposed
21+
*/
22+
refresh(): Promise<void>;
23+
24+
/**
25+
* Installs a handler for the folding range request.
26+
*
27+
* @param handler The corresponding handler.
28+
*/
29+
on(handler: ServerRequestHandler<FoldingRangeParams, FoldingRange[] | undefined | null, FoldingRange[], void>): Disposable;
30+
};
31+
}
32+
33+
export const FoldingRangeFeature: Feature<_Languages, FoldingRangeFeatureShape> = (Base) => {
34+
return class extends Base implements FoldingRangeFeatureShape {
35+
public get foldingRange() {
36+
return {
37+
refresh: (): Promise<void> => {
38+
return this.connection.sendRequest(FoldingRangeRefreshRequest.type);
39+
},
40+
on: (handler: ServerRequestHandler<FoldingRangeParams, FoldingRange[] | undefined | null, FoldingRange[], void>): Disposable => {
41+
const type = FoldingRangeRequest.type;
42+
return this.connection.onRequest(type, (params, cancel) => {
43+
return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));
44+
});
45+
}
46+
};
47+
}
48+
};
49+
};

server/src/common/server.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import { FileOperationsFeature, FileOperationsFeatureShape } from './fileOperati
3939
import { LinkedEditingRangeFeature, LinkedEditingRangeFeatureShape } from './linkedEditingRange';
4040
import { TypeHierarchyFeatureShape, TypeHierarchyFeature } from './typeHierarchy';
4141
import { InlineValueFeatureShape, InlineValueFeature } from './inlineValue';
42+
import { FoldingRangeFeatureShape, FoldingRangeFeature } from './foldingRange';
4243
// import { InlineCompletionFeatureShape, InlineCompletionFeature } from './inlineCompletion.proposed';
4344
import { InlayHintFeatureShape, InlayHintFeature } from './inlayHint';
4445
import { DiagnosticFeatureShape, DiagnosticFeature } from './diagnostic';
@@ -828,8 +829,8 @@ export class _LanguagesImpl implements Remote, _Languages {
828829
}
829830
}
830831

831-
export type Languages = _Languages & CallHierarchy & SemanticTokensFeatureShape & LinkedEditingRangeFeatureShape & TypeHierarchyFeatureShape & InlineValueFeatureShape & InlayHintFeatureShape & DiagnosticFeatureShape & MonikerFeatureShape;
832-
const LanguagesImpl: new () => Languages = MonikerFeature(DiagnosticFeature(InlayHintFeature(InlineValueFeature(TypeHierarchyFeature(LinkedEditingRangeFeature(SemanticTokensFeature(CallHierarchyFeature(_LanguagesImpl)))))))) as (new () => Languages);
832+
export type Languages = _Languages & CallHierarchy & SemanticTokensFeatureShape & LinkedEditingRangeFeatureShape & TypeHierarchyFeatureShape & InlineValueFeatureShape & InlayHintFeatureShape & DiagnosticFeatureShape & MonikerFeatureShape & FoldingRangeFeatureShape;
833+
const LanguagesImpl: new () => Languages = FoldingRangeFeature(MonikerFeature(DiagnosticFeature(InlayHintFeature(InlineValueFeature(TypeHierarchyFeature(LinkedEditingRangeFeature(SemanticTokensFeature(CallHierarchyFeature(_LanguagesImpl))))))))) as (new () => Languages);
833834

834835
export interface _Notebooks extends FeatureBase {
835836
connection: Connection;

0 commit comments

Comments
 (0)