diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 78126d24e6db2fa94960339552bc3387d9893629..ee895024bae712bd3fb9b1afcb4dc1603951fd4d 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -12,7 +12,7 @@ import { workspace, languages, ExtensionContext, extensions, Uri, LanguageConfig import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, CancellationToken } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; -import { FoldingRangesRequest, FoldingRangeRequestParam } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; import { hash } from './utils/hash'; @@ -97,6 +97,21 @@ export function activate(context: ExtensionContext) { // Create the language client and start the client. let client = new LanguageClient('json', localize('jsonserver.name', 'JSON Language Server'), serverOptions, clientOptions); client.registerProposedFeatures(); + client.registerFeature({ + fillClientCapabilities(capabilities: FoldingRangeClientCapabilities): void { + let textDocumentCap = capabilities.textDocument; + if (!textDocumentCap) { + textDocumentCap = capabilities.textDocument = {}; + } + textDocumentCap.foldingRange = { + dynamicRegistration: false, + rangeLimit: 5000, + lineFoldingOnly: true + }; + }, + initialize(capabilities, documentSelector): void { + } + }); let disposable = client.start(); toDispose.push(disposable); @@ -144,16 +159,15 @@ export function activate(context: ExtensionContext) { return languages.registerFoldingProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { const param: FoldingRangeRequestParam = { - textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), - maxRanges: context.maxRanges + textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document) }; - return client.sendRequest(FoldingRangesRequest.type, param, token).then(res => { - if (res && Array.isArray(res.ranges)) { - return new FoldingRangeList(res.ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.type))); + return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => { + if (Array.isArray(ranges)) { + return new FoldingRangeList(ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.kind))); } return null; }, error => { - client.logFailedRequest(FoldingRangesRequest.type, error); + client.logFailedRequest(FoldingRangeRequest.type, error); return null; }); } diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 1632b67bccfb8fe7f436a59227420054a6ecfb55..807a17db05022e3baeada2d1ad5a2d9571897ad7 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -20,9 +20,9 @@ "postinstall": "cd server && yarn install", "install-client-next": "yarn add vscode-languageclient@next" }, - "categories": [ - "Programming Languages" - ], + "categories": [ + "Programming Languages" + ], "contributes": { "configuration": { "id": "json", @@ -102,7 +102,7 @@ "dependencies": { "vscode-extension-telemetry": "0.0.15", "vscode-languageclient": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^1.0.1", + "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2" }, "devDependencies": { diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 0fef4531f08119c1f6269eea82e4446080eb7ed3..3f4cc7718cc49f53d5476aaa83dc9e04fc67aed6 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -13,9 +13,9 @@ "dependencies": { "jsonc-parser": "^2.0.0-next.1", "request-light": "^0.2.2", - "vscode-json-languageservice": "^3.1.2-next.1", + "vscode-json-languageservice": "^3.1.2-next.2", "vscode-languageserver": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^1.0.1", + "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2", "vscode-uri": "^1.0.3" }, diff --git a/extensions/json-language-features/server/src/jsonServerMain.ts b/extensions/json-language-features/server/src/jsonServerMain.ts index 0ecb72259cd856277eef120e82fdf173d71eba68..eb1587786b94d55c43454b1ef7dcda74c7f4c85f 100644 --- a/extensions/json-language-features/server/src/jsonServerMain.ts +++ b/extensions/json-language-features/server/src/jsonServerMain.ts @@ -19,7 +19,7 @@ import { formatError, runSafe, runSafeAsync } from './utils/runner'; import { JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration } from 'vscode-json-languageservice'; import { getLanguageModelCache } from './languageModelCache'; -import { FoldingRangesRequest, FoldingProviderServerCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeServerCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; interface ISchemaAssociations { [pattern: string]: string[]; @@ -60,22 +60,28 @@ documents.listen(connection); let clientSnippetSupport = false; let clientDynamicRegisterSupport = false; +let foldingRangeLimit = Number.MAX_VALUE; // After the server has started the client sends an initialize request. The server receives // in the passed params the rootPath of the workspace plus the client capabilities. connection.onInitialize((params: InitializeParams): InitializeResult => { - function hasClientCapability(...keys: string[]) { - let c = params.capabilities as any; + function getClientCapability(name: string, def: T) { + let keys = name.split('.'); + let c: any = params.capabilities; for (let i = 0; c && i < keys.length; i++) { + if (!c.hasOwnProperty(keys[i])) { + return def; + } c = c[keys[i]]; } - return !!c; + return c; } - clientSnippetSupport = hasClientCapability('textDocument', 'completion', 'completionItem', 'snippetSupport'); - clientDynamicRegisterSupport = hasClientCapability('workspace', 'symbol', 'dynamicRegistration'); - let capabilities: ServerCapabilities & FoldingProviderServerCapabilities = { + clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false); + clientDynamicRegisterSupport = getClientCapability('workspace.symbol.dynamicRegistration', false); + foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); + let capabilities: ServerCapabilities & FoldingRangeServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['"', ':'] } : void 0, @@ -83,7 +89,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { documentSymbolProvider: true, documentRangeFormattingProvider: false, colorProvider: true, - foldingProvider: true + foldingRangeProvider: true }; return { capabilities }; @@ -364,11 +370,11 @@ connection.onColorPresentation((params, token) => { }, [], `Error while computing color presentations for ${params.textDocument.uri}`, token); }); -connection.onRequest(FoldingRangesRequest.type, (params, token) => { +connection.onRequest(FoldingRangeRequest.type, (params, token) => { return runSafe(() => { let document = documents.get(params.textDocument.uri); if (document) { - return languageService.getFoldingRanges(document, { maxRanges: params.maxRanges }); + return languageService.getFoldingRanges(document, { rangeLimit: foldingRangeLimit }); } return null; }, null, `Error while computing folding ranges for ${params.textDocument.uri}`, token); diff --git a/extensions/json-language-features/server/yarn.lock b/extensions/json-language-features/server/yarn.lock index 1ae1cc93da0b5aaed4fd45340d60542c067a7d5b..26fe2245dcdaf4abd9703c0aef6b88b2951d7e95 100644 --- a/extensions/json-language-features/server/yarn.lock +++ b/extensions/json-language-features/server/yarn.lock @@ -72,9 +72,9 @@ request-light@^0.2.2: https-proxy-agent "2.1.1" vscode-nls "^2.0.2" -vscode-json-languageservice@^3.1.2-next.1: - version "3.1.2-next.1" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.1.2-next.1.tgz#8acee581c664e2af72ade2f08252aeae9b5918ca" +vscode-json-languageservice@^3.1.2-next.2: + version "3.1.2-next.2" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.1.2-next.2.tgz#da5346e5c22edbce739f29c110eb41732d41dc2d" dependencies: jsonc-parser "^2.0.0" vscode-languageserver-types "^3.6.1" @@ -85,9 +85,9 @@ vscode-jsonrpc@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" -vscode-languageserver-protocol-foldingprovider@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" +vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: + version "2.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" dependencies: vscode-languageserver-protocol "^3.6.0" vscode-languageserver-types "^3.6.0" diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index 2db2da5dbe989171a1980b1c5b7d6e13e9bde70d..2a2706462ef8a1409891ec5c5256ea7641689870 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -44,9 +44,9 @@ vscode-languageclient@^4.0.0: dependencies: vscode-languageserver-protocol "^3.6.0" -vscode-languageserver-protocol-foldingprovider@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" +vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: + version "2.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" dependencies: vscode-languageserver-protocol "^3.6.0" vscode-languageserver-types "^3.6.0"