[css] adopt folding apis

This commit is contained in:
Martin Aeschlimann
2018-04-17 18:18:03 +02:00
parent a509b1797b
commit e09c8a7086
6 changed files with 50 additions and 31 deletions

View File

@@ -10,7 +10,7 @@ const localize = nls.loadMessageBundle();
import { languages, window, commands, ExtensionContext, Range, Position, TextDocument, CompletionItem, CompletionItemKind, TextEdit, SnippetString, FoldingRangeList, FoldingRange, FoldingContext, CancellationToken } from 'vscode'; import { languages, window, commands, ExtensionContext, Range, Position, TextDocument, CompletionItem, CompletionItemKind, TextEdit, SnippetString, FoldingRangeList, FoldingRange, FoldingContext, CancellationToken } from 'vscode';
import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, Disposable } from 'vscode-languageclient'; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, Disposable } from 'vscode-languageclient';
import { FoldingRangesRequest, FoldingRangeRequestParam } from 'vscode-languageserver-protocol-foldingprovider'; import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider';
// this method is called when vs code is activated // this method is called when vs code is activated
export function activate(context: ExtensionContext) { export function activate(context: ExtensionContext) {
@@ -42,6 +42,21 @@ export function activate(context: ExtensionContext) {
// Create the language client and start the client. // Create the language client and start the client.
let client = new LanguageClient('css', localize('cssserver.name', 'CSS Language Server'), serverOptions, clientOptions); let client = new LanguageClient('css', localize('cssserver.name', 'CSS Language Server'), serverOptions, clientOptions);
client.registerProposedFeatures(); 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(); let disposable = client.start();
// Push the disposable to the context's subscriptions so that the // Push the disposable to the context's subscriptions so that the
@@ -105,16 +120,15 @@ export function activate(context: ExtensionContext) {
return languages.registerFoldingProvider(documentSelector, { return languages.registerFoldingProvider(documentSelector, {
provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) {
const param: FoldingRangeRequestParam = { const param: FoldingRangeRequestParam = {
textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document)
maxRanges: context.maxRanges
}; };
return client.sendRequest(FoldingRangesRequest.type, param, token).then(res => { return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => {
if (res && Array.isArray(res.ranges)) { if (Array.isArray(ranges)) {
return new FoldingRangeList(res.ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.type))); return new FoldingRangeList(ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.kind)));
} }
return null; return null;
}, error => { }, error => {
client.logFailedRequest(FoldingRangesRequest.type, error); client.logFailedRequest(FoldingRangeRequest.type, error);
return null; return null;
}); });
} }

View File

@@ -696,7 +696,7 @@
}, },
"dependencies": { "dependencies": {
"vscode-languageclient": "^4.0.0", "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.1" "vscode-nls": "^3.2.1"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -8,9 +8,9 @@
"node": "*" "node": "*"
}, },
"dependencies": { "dependencies": {
"vscode-css-languageservice": "^3.0.9-next.5", "vscode-css-languageservice": "^3.0.9-next.7",
"vscode-languageserver": "^4.0.0", "vscode-languageserver": "^4.0.0",
"vscode-languageserver-protocol-foldingprovider": "^1.0.1" "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2"
}, },
"devDependencies": { "devDependencies": {
"@types/mocha": "2.2.33", "@types/mocha": "2.2.33",

View File

@@ -15,7 +15,7 @@ import { getLanguageModelCache } from './languageModelCache';
import { formatError, runSafe } from './utils/runner'; import { formatError, runSafe } from './utils/runner';
import URI from 'vscode-uri'; import URI from 'vscode-uri';
import { getPathCompletionParticipant } from './pathCompletion'; import { getPathCompletionParticipant } from './pathCompletion';
import { FoldingProviderServerCapabilities, FoldingRangesRequest } from 'vscode-languageserver-protocol-foldingprovider'; import { FoldingRangeServerCapabilities, FoldingRangeRequest } from 'vscode-languageserver-protocol-foldingprovider';
export interface Settings { export interface Settings {
css: LanguageSettings; css: LanguageSettings;
@@ -49,6 +49,7 @@ connection.onShutdown(() => {
}); });
let scopedSettingsSupport = false; let scopedSettingsSupport = false;
let foldingRangeLimit = Number.MAX_VALUE;
let workspaceFolders: WorkspaceFolder[]; let workspaceFolders: WorkspaceFolder[];
// After the server has started the client sends an initialize request. The server receives // After the server has started the client sends an initialize request. The server receives
@@ -62,18 +63,22 @@ connection.onInitialize((params: InitializeParams): InitializeResult => {
} }
} }
function hasClientCapability(name: string) { function getClientCapability<T>(name: string, def: T) {
let keys = name.split('.'); let keys = name.split('.');
let c: any = params.capabilities; let c: any = params.capabilities;
for (let i = 0; c && i < keys.length; i++) { for (let i = 0; c && i < keys.length; i++) {
if (!c.hasOwnProperty(keys[i])) {
return def;
}
c = c[keys[i]]; c = c[keys[i]];
} }
return !!c; return c;
} }
let snippetSupport = hasClientCapability('textDocument.completion.completionItem.snippetSupport'); let snippetSupport = !!getClientCapability('textDocument.completion.completionItem.snippetSupport', false);
scopedSettingsSupport = hasClientCapability('workspace.configuration'); scopedSettingsSupport = !!getClientCapability('workspace.configuration', false);
foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE);
let capabilities: ServerCapabilities & FoldingProviderServerCapabilities = { let capabilities: ServerCapabilities & FoldingRangeServerCapabilities = {
// Tell the client that the server works in FULL text document sync mode // Tell the client that the server works in FULL text document sync mode
textDocumentSync: documents.syncKind, textDocumentSync: documents.syncKind,
completionProvider: snippetSupport ? { resolveProvider: false, triggerCharacters: ['/'] } : undefined, completionProvider: snippetSupport ? { resolveProvider: false, triggerCharacters: ['/'] } : undefined,
@@ -85,7 +90,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => {
codeActionProvider: true, codeActionProvider: true,
renameProvider: true, renameProvider: true,
colorProvider: true, colorProvider: true,
foldingProvider: true foldingRangeProvider: true
}; };
return { capabilities }; return { capabilities };
}); });
@@ -276,10 +281,10 @@ connection.onRenameRequest((renameParameters, token) => {
}, null, `Error while computing renames for ${renameParameters.textDocument.uri}`, token); }, null, `Error while computing renames for ${renameParameters.textDocument.uri}`, token);
}); });
connection.onRequest(FoldingRangesRequest.type, (params, token) => { connection.onRequest(FoldingRangeRequest.type, (params, token) => {
return runSafe(() => { return runSafe(() => {
let document = documents.get(params.textDocument.uri); let document = documents.get(params.textDocument.uri);
return getLanguageService(document).getFoldingRanges(document, { maxRanges: params.maxRanges }); return getLanguageService(document).getFoldingRanges(document, { rangeLimit: foldingRangeLimit });
}, null, `Error while computing folding ranges for ${params.textDocument.uri}`, token); }, null, `Error while computing folding ranges for ${params.textDocument.uri}`, token);
}); });

View File

@@ -10,9 +10,9 @@
version "7.0.43" version "7.0.43"
resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c"
vscode-css-languageservice@^3.0.9-next.5: vscode-css-languageservice@^3.0.9-next.7:
version "3.0.9-next.5" version "3.0.9-next.7"
resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.5.tgz#854048eafc91406af4b276d9f812e24c677e262e" resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.7.tgz#1eb8deadaa6bfaf55187656ea6fb6b7e8d71cd7f"
dependencies: dependencies:
vscode-languageserver-types "^3.6.1" vscode-languageserver-types "^3.6.1"
vscode-nls "^3.2.1" vscode-nls "^3.2.1"
@@ -21,9 +21,9 @@ vscode-jsonrpc@^3.6.0:
version "3.6.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4"
vscode-languageserver-protocol-foldingprovider@^1.0.1: vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2:
version "1.0.1" version "2.0.0-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0"
dependencies: dependencies:
vscode-languageserver-protocol "^3.6.0" vscode-languageserver-protocol "^3.6.0"
vscode-languageserver-types "^3.6.0" vscode-languageserver-types "^3.6.0"

View File

@@ -16,9 +16,9 @@ vscode-languageclient@^4.0.0:
dependencies: dependencies:
vscode-languageserver-protocol "^3.6.0" vscode-languageserver-protocol "^3.6.0"
vscode-languageserver-protocol-foldingprovider@^1.0.1: vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2:
version "1.0.1" version "2.0.0-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0"
dependencies: dependencies:
vscode-languageserver-protocol "^3.6.0" vscode-languageserver-protocol "^3.6.0"
vscode-languageserver-types "^3.6.0" vscode-languageserver-types "^3.6.0"