Skip to content

Commit 2d47826

Browse files
committed
Adopt LS service/client that has common & node
1 parent d1a3e6e commit 2d47826

9 files changed

Lines changed: 67 additions & 43 deletions

File tree

extensions/css-language-features/client/src/cssClient.ts

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { commands, CompletionItem, CompletionItemKind, ExtensionContext, languages, Position, Range, SnippetString, TextEdit, window, TextDocument, CompletionContext, CancellationToken, ProviderResult, CompletionList, extensions } from 'vscode';
7-
import { Disposable, LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, ProvideCompletionItemsSignature, NotificationType } from 'vscode-languageclient';
6+
import { commands, CompletionItem, CompletionItemKind, ExtensionContext, languages, Position, Range, SnippetString, TextEdit, window, TextDocument, CompletionContext, CancellationToken, ProviderResult, CompletionList } from 'vscode';
7+
import { Disposable, LanguageClientOptions, ProvideCompletionItemsSignature, NotificationType, CommonLanguageClient } from 'vscode-languageclient';
88
import * as nls from 'vscode-nls';
99
import { getCustomDataSource } from './customData';
1010
import { RequestService, serveFileSystemRequests } from './requests';
@@ -15,28 +15,12 @@ namespace CustomDataChangedNotification {
1515

1616
const localize = nls.loadMessageBundle();
1717

18-
export function startClient(context: ExtensionContext, runtime: { fs?: RequestService }) {
18+
export type LanguageClientConstructor = (name: string, description: string, clientOptions: LanguageClientOptions) => CommonLanguageClient;
1919

20-
const clientMain = extensions.getExtension('vscode.css-language-features')?.packageJSON?.main;
21-
const serverMain = clientMain?.replace('client', 'server').replace('cssClientMain', 'cssServerMain');
22-
if (!serverMain) {
23-
throw new Error('Unable to compute CSS server module path. Client: ' + clientMain);
24-
}
25-
26-
const serverModule = context.asAbsolutePath(serverMain);
20+
export function startClient(context: ExtensionContext, newLanguageClient: LanguageClientConstructor, runtime: { fs?: RequestService }) {
2721

2822
const customDataSource = getCustomDataSource(context.subscriptions);
2923

30-
// The debug options for the server
31-
let debugOptions = { execArgv: ['--nolazy', '--inspect=6044'] };
32-
33-
// If the extension is launch in debug mode the debug server options are use
34-
// Otherwise the run options are used
35-
let serverOptions: ServerOptions = {
36-
run: { module: serverModule, transport: TransportKind.ipc },
37-
debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions }
38-
};
39-
4024
let documentSelector = ['css', 'scss', 'less'];
4125

4226
// Options to control the language client
@@ -86,7 +70,7 @@ export function startClient(context: ExtensionContext, runtime: { fs?: RequestSe
8670
};
8771

8872
// Create the language client and start the client.
89-
let client = new LanguageClient('css', localize('cssserver.name', 'CSS Language Server'), serverOptions, clientOptions);
73+
let client = newLanguageClient('css', localize('cssserver.name', 'CSS Language Server'), clientOptions);
9074
client.registerProposedFeatures();
9175
client.onReady().then(() => {
9276

@@ -131,7 +115,7 @@ export function startClient(context: ExtensionContext, runtime: { fs?: RequestSe
131115
const regionCompletionRegExpr = /^(\s*)(\/(\*\s*(#\w*)?)?)?$/;
132116

133117
return languages.registerCompletionItemProvider(documentSelector, {
134-
provideCompletionItems(doc, pos) {
118+
provideCompletionItems(doc: TextDocument, pos: Position) {
135119
let lineUntilPos = doc.getText(new Range(new Position(pos.line, 0), pos));
136120
let match = lineUntilPos.match(regionCompletionRegExpr);
137121
if (match) {

extensions/css-language-features/client/src/customData.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { workspace, extensions, Uri, EventEmitter, Disposable } from 'vscode';
7-
import { resolvePath } from './requests';
7+
import { resolvePath, joinPath } from './requests';
88

99
export function getCustomDataSource(toDispose: Disposable[]) {
1010
let pathsInWorkspace = getCustomDataPathsInAllWorkspaces();
@@ -83,7 +83,7 @@ function getCustomDataPathsFromAllExtensions(): string[] {
8383
if (contributes && contributes.css && contributes.css.customData && Array.isArray(contributes.css.customData)) {
8484
const relativePaths: string[] = contributes.css.customData;
8585
relativePaths.forEach(rp => {
86-
dataPaths.push(Uri.joinPath(extension.extensionUri, rp).toString());
86+
dataPaths.push(joinPath(extension.extensionUri, rp).toString());
8787
});
8888
}
8989
}

extensions/css-language-features/client/src/node/cssClientMain.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,35 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { getNodeFSRequestService } from './nodeFs';
7-
import { ExtensionContext } from 'vscode';
8-
import { startClient } from '../cssClient';
7+
import { ExtensionContext, extensions } from 'vscode';
8+
import { startClient, LanguageClientConstructor } from '../cssClient';
9+
10+
import { ServerOptions, TransportKind, LanguageClientOptions, LanguageClient } from 'vscode-languageclient/node';
911

1012
// this method is called when vs code is activated
1113
export function activate(context: ExtensionContext) {
12-
startClient(context, { fs: getNodeFSRequestService() });
14+
15+
const clientMain = extensions.getExtension('vscode.css-language-features')?.packageJSON?.main;
16+
const serverMain = clientMain?.replace('client', 'server').replace('cssClientMain', 'cssServerMain');
17+
if (!serverMain) {
18+
throw new Error('Unable to compute CSS server module path. Client: ' + clientMain);
19+
}
20+
21+
const serverModule = context.asAbsolutePath(serverMain);
22+
23+
// The debug options for the server
24+
const debugOptions = { execArgv: ['--nolazy', '--inspect=6044'] };
25+
26+
// If the extension is launch in debug mode the debug server options are use
27+
// Otherwise the run options are used
28+
const serverOptions: ServerOptions = {
29+
run: { module: serverModule, transport: TransportKind.ipc },
30+
debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions }
31+
};
32+
33+
const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => {
34+
return new LanguageClient(id, name, serverOptions, clientOptions);
35+
};
36+
37+
startClient(context, newLanguageClient, { fs: getNodeFSRequestService() });
1338
}

extensions/css-language-features/client/src/requests.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Uri, workspace } from 'vscode';
7-
import { RequestType, LanguageClient } from 'vscode-languageclient';
7+
import { RequestType, CommonLanguageClient } from 'vscode-languageclient';
88
import { TextDecoder } from 'util';
99

1010
export namespace FsContentRequest {
@@ -18,7 +18,7 @@ export namespace FsReadDirRequest {
1818
export const type: RequestType<string, [string, FileType][], any, any> = new RequestType('fs/readDir');
1919
}
2020

21-
export function serveFileSystemRequests(client: LanguageClient, runtime: { fs?: RequestService; }) {
21+
export function serveFileSystemRequests(client: CommonLanguageClient, runtime: { fs?: RequestService; }) {
2222
client.onRequest(FsContentRequest.type, (param: { uri: string; encoding?: string; }) => {
2323
const uri = Uri.parse(param.uri);
2424
if (uri.scheme === 'file' && runtime.fs) {
@@ -113,6 +113,16 @@ export function resolvePath(uri: Uri, path: string): Uri {
113113
if (isAbsolutePath(path)) {
114114
return uri.with({ path: path });
115115
}
116-
return Uri.joinPath(uri, path);
116+
return joinPath(uri, path);
117117
}
118118

119+
export function joinPath(uri: Uri, ...paths: string[]): Uri {
120+
let uriPath = uri.path;
121+
for (let path of paths) {
122+
if (path.charCodeAt(path.length - 1) !== Slash && path.charCodeAt(0) !== Slash) {
123+
uriPath += '/';
124+
}
125+
uriPath += path;
126+
}
127+
return uri.with({ path: uriPath });
128+
}

extensions/css-language-features/server/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"main": "./out/node/cssServerMain",
1111
"dependencies": {
12-
"vscode-css-languageservice": "4.3.0-next.0",
12+
"vscode-css-languageservice": "4.3.0-next.1",
1313
"vscode-languageserver": "^6.1.1",
1414
"vscode-uri": "^2.1.1"
1515
},

extensions/css-language-features/server/src/cssServer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import {
7-
IConnection, TextDocuments, InitializeParams, InitializeResult, ServerCapabilities, ConfigurationRequest, WorkspaceFolder, TextDocumentSyncKind, NotificationType
7+
Connection, TextDocuments, InitializeParams, InitializeResult, ServerCapabilities, ConfigurationRequest, WorkspaceFolder, TextDocumentSyncKind, NotificationType
88
} from 'vscode-languageserver';
99
import { URI } from 'vscode-uri';
1010
import { getCSSLanguageService, getSCSSLanguageService, getLESSLanguageService, LanguageSettings, LanguageService, Stylesheet, TextDocument, Position } from 'vscode-css-languageservice';
@@ -29,7 +29,7 @@ export interface RuntimeEnvironment {
2929
http?: RequestService
3030
}
3131

32-
export function startServer(connection: IConnection, runtime: RuntimeEnvironment) {
32+
export function startServer(connection: Connection, runtime: RuntimeEnvironment) {
3333

3434
// Create a text document manager.
3535
const documents = new TextDocuments(TextDocument);

extensions/css-language-features/server/src/node/cssServerMain.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IConnection, createConnection } from 'vscode-languageserver';
6+
import { createConnection, Connection } from 'vscode-languageserver/node';
77
import { formatError } from '../utils/runner';
88
import { startServer } from '../cssServer';
99
import { getNodeFSRequestService } from './nodeFs';
1010

1111
// Create a connection for the server.
12-
const connection: IConnection = createConnection();
12+
const connection: Connection = createConnection();
1313

1414
console.log = connection.console.log.bind(connection.console);
1515
console.error = connection.console.error.bind(connection.console);

extensions/css-language-features/server/src/requests.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { URI } from 'vscode-uri';
77
import { endsWith, startsWith } from './utils/strings';
8-
import { RequestType, IConnection } from 'vscode-languageserver';
8+
import { RequestType, Connection } from 'vscode-languageserver';
99
import { RuntimeEnvironment } from './cssServer';
1010

1111
export namespace FsContentRequest {
@@ -65,7 +65,7 @@ export interface RequestService {
6565
}
6666

6767

68-
export function getRequestService(handledSchemas: string[], connection: IConnection, runtime: RuntimeEnvironment): RequestService {
68+
export function getRequestService(handledSchemas: string[], connection: Connection, runtime: RuntimeEnvironment): RequestService {
6969
const builtInHandlers: { [protocol: string]: RequestService | undefined } = {};
7070
for (let protocol of handledSchemas) {
7171
if (protocol === 'file') {

extensions/css-language-features/server/yarn.lock

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -701,13 +701,13 @@ to-regex-range@^5.0.1:
701701
dependencies:
702702
is-number "^7.0.0"
703703

704-
vscode-css-languageservice@4.3.0-next.0:
705-
version "4.3.0-next.0"
706-
resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.3.0-next.0.tgz#70ca6e192e1d7fb904867e696851b14401da9573"
707-
integrity sha512-OwYavU+gqocK3YQi484CrGkGMMRRmzJdeNMfgAr/SssKJVJuvkLec7NbAopM42KTE6OPaqU3AFgI5AMERmIJ4A==
704+
vscode-css-languageservice@4.3.0-next.1:
705+
version "4.3.0-next.1"
706+
resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.3.0-next.1.tgz#6e1ddf5c469468585bdb91b554ffdf961915cd10"
707+
integrity sha512-Ks/MbHDyUFMMF5DQ3hqh6xjT+EoEjWsdeOwgWTCg+caConhweO2Y8VpZO3qDpbBO5dTnGlcxVG07sxOZyxF77Q==
708708
dependencies:
709709
vscode-languageserver-textdocument "^1.0.1"
710-
vscode-languageserver-types "^3.15.1"
710+
vscode-languageserver-types "3.16.0-next.1"
711711
vscode-nls "^4.1.2"
712712
vscode-uri "^2.1.1"
713713

@@ -729,11 +729,16 @@ vscode-languageserver-textdocument@^1.0.1:
729729
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f"
730730
integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==
731731

732-
vscode-languageserver-types@3.15.1, vscode-languageserver-types@^3.15.1:
732+
vscode-languageserver-types@3.15.1:
733733
version "3.15.1"
734734
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de"
735735
integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==
736736

737+
vscode-languageserver-types@3.16.0-next.1:
738+
version "3.16.0-next.1"
739+
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.1.tgz#97e9803c4a999e81e3ff000a91b630173eaaf28c"
740+
integrity sha512-tZFUSbyjUcrh+qQf13ALX4QDdOfDX0cVaBFgy7ktJ0VwS7AW/yRKgGPSxVqqP9OCMNPdqP57O5q47w2pEwfaUg==
741+
737742
vscode-languageserver@^6.1.1:
738743
version "6.1.1"
739744
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz#d76afc68172c27d4327ee74332b468fbc740d762"

0 commit comments

Comments
 (0)