diff --git a/CHANGELOG.md b/CHANGELOG.md index f9452bb9..6840bb23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Changed +- The Cucumber Language Server is now started in-process ([#105](https://github.com/cucumber/vscode/pull/105)) + ## [1.3.0] - 2022-09-10 ### Added - Add support for `.tsx` ([#87](https://github.com/cucumber/language-service/issues/87) [#90](https://github.com/cucumber/language-service/pull/90)) diff --git a/package-lock.json b/package-lock.json index 9160851c..6cd48a2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "cucumber-official", "version": "1.3.0", "dependencies": { - "@cucumber/language-server": "0.12.14", + "@cucumber/language-server": "0.13.1", "vscode-languageclient": "8.0.2" }, "devDependencies": { @@ -67,9 +67,9 @@ } }, "node_modules/@cucumber/language-server": { - "version": "0.12.14", - "resolved": "https://registry.npmjs.org/@cucumber/language-server/-/language-server-0.12.14.tgz", - "integrity": "sha512-pUROWt3LNzeUFlglVI3gVQOkVQa5+u9sholkXJBDIu3gIobGJz6xKT98DP57HGC3JWFCMMOXnkiUGV2dUgYrtg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@cucumber/language-server/-/language-server-0.13.1.tgz", + "integrity": "sha512-MHAngzL7LRQbanfmTMxlce2z/1nKJSM7p2Jhxc2iQaFDsL+159DOm4nVtXl+D2j8X/XKqcXlmcCupF3nBEvtzg==", "dependencies": { "@cucumber/gherkin-utils": "^8.0.0", "@cucumber/language-service": "^0.33.0", @@ -8419,9 +8419,9 @@ } }, "@cucumber/language-server": { - "version": "0.12.14", - "resolved": "https://registry.npmjs.org/@cucumber/language-server/-/language-server-0.12.14.tgz", - "integrity": "sha512-pUROWt3LNzeUFlglVI3gVQOkVQa5+u9sholkXJBDIu3gIobGJz6xKT98DP57HGC3JWFCMMOXnkiUGV2dUgYrtg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@cucumber/language-server/-/language-server-0.13.1.tgz", + "integrity": "sha512-MHAngzL7LRQbanfmTMxlce2z/1nKJSM7p2Jhxc2iQaFDsL+159DOm4nVtXl+D2j8X/XKqcXlmcCupF3nBEvtzg==", "requires": { "@cucumber/gherkin-utils": "^8.0.0", "@cucumber/language-service": "^0.33.0", diff --git a/package.json b/package.json index 40cb68f0..9b5bdc86 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "upgrade": "npm-check-updates --upgrade" }, "dependencies": { - "@cucumber/language-server": "0.12.14", + "@cucumber/language-server": "0.13.1", "vscode-languageclient": "8.0.2" }, "devDependencies": { diff --git a/src/VscodeFiles.ts b/src/VscodeFiles.ts new file mode 100644 index 00000000..f7eaf194 --- /dev/null +++ b/src/VscodeFiles.ts @@ -0,0 +1,29 @@ +import { Files } from '@cucumber/language-server' +import { FileSystem, Uri, workspace } from 'vscode' + +export class VscodeFiles implements Files { + constructor(private readonly rootUri: string, private readonly fs: FileSystem) {} + + async exists(uri: string): Promise { + try { + await this.fs.stat(Uri.parse(uri)) + return true + } catch { + return false + } + } + + async readFile(uri: string): Promise { + const data = await this.fs.readFile(Uri.parse(uri)) + return new TextDecoder().decode(data) + } + + async findUris(glob: string): Promise { + const uris = await workspace.findFiles(glob) + return uris.map((file) => file.toString()) + } + + relativePath(uri: string): string { + return workspace.asRelativePath(Uri.parse(uri), true) + } +} diff --git a/src/cucumber-language-server.ts b/src/cucumber-language-server.ts index 4025fae6..3c7e4f04 100644 --- a/src/cucumber-language-server.ts +++ b/src/cucumber-language-server.ts @@ -1,3 +1,4 @@ +import { NodeFiles } from '@cucumber/language-server/node' import { startWasmServer } from '@cucumber/language-server/wasm' -startWasmServer(__dirname) +startWasmServer(__dirname, (rootUri) => new NodeFiles(rootUri)) diff --git a/src/extension.ts b/src/extension.ts index 4eea09e9..c8a55933 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,32 +1,20 @@ -import path from 'path' +import { newWasmServer } from '@cucumber/language-server' import vscode from 'vscode' -import { - LanguageClient, - LanguageClientOptions, - ServerOptions, - TransportKind, -} from 'vscode-languageclient/node' +import { LanguageClient, LanguageClientOptions, ServerOptions } from 'vscode-languageclient/node' + +import { VscodeFiles } from './VscodeFiles' let client: LanguageClient -// this method is called when your extension is activated -// your extension is activated the very first time the command is executed +// eslint-disable-next-line @typescript-eslint/no-unused-vars export async function activate(context: vscode.ExtensionContext) { - const serverModule = context.asAbsolutePath(path.join('out', 'cucumber-language-server.js')) - const debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] } - - const serverOptions: ServerOptions = { - run: { module: serverModule, transport: TransportKind.ipc }, - debug: { - module: serverModule, - transport: TransportKind.ipc, - options: debugOptions, - }, - } + const makeFiles = (rootUri: string) => new VscodeFiles(rootUri, vscode.workspace.fs) + const serverOptions: ServerOptions = async () => newWasmServer(__dirname, makeFiles) const clientOptions: LanguageClientOptions = { // We need to list all supported languages here so that // the language server is notified to reindex when a file changes + // https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers documentSelector: [ { scheme: 'file', language: 'csharp' }, { scheme: 'file', language: 'cucumber' }, @@ -34,6 +22,7 @@ export async function activate(context: vscode.ExtensionContext) { { scheme: 'file', language: 'php' }, { scheme: 'file', language: 'ruby' }, { scheme: 'file', language: 'typescript' }, + { scheme: 'file', language: 'typescriptreact' }, { scheme: 'file', language: 'python' }, ], }