From 230de29b807909527d0a45fcc2197c7085fc2686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aslak=20Helles=C3=B8y?= Date: Wed, 27 Apr 2022 13:46:23 +0100 Subject: [PATCH 1/2] Export custom node and wasm entry points --- CHANGELOG.md | 7 ++++++ bin/cucumber-language-server.cjs | 5 ++--- node/package.json | 7 ++++++ package-lock.json | 33 +++++++++++++++++++++++------ package.json | 21 ++++++++++++------ src/CucumberLanguageServer.ts | 10 +++++---- src/index.ts | 1 - src/loadAll.ts | 4 +++- src/node/startNodeServer.ts | 7 ++++++ src/startServer.ts | 4 ++-- src/wasm/startWasmServer.ts | 7 ++++++ test/CucumberLanguageServer.test.ts | 2 +- tsconfig.build-cjs.json | 6 +++--- wasm/package.json | 7 ++++++ 14 files changed, 92 insertions(+), 29 deletions(-) create mode 100644 node/package.json delete mode 100644 src/index.ts create mode 100644 src/node/startNodeServer.ts create mode 100644 src/wasm/startWasmServer.ts create mode 100644 wasm/package.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 54272cf4..e9ec79b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Added +- Support for C# +- Support for PHP + +### Changed +- Remove external dependency on `@cucumber/language-service` - always use tree-sitter wasm + ## [0.6.0] - 2022-04-26 ### Changed - Use tree-sitter Node.js bindings instead of web (WASM) bindings. diff --git a/bin/cucumber-language-server.cjs b/bin/cucumber-language-server.cjs index ccee88f8..ef5db6b3 100755 --- a/bin/cucumber-language-server.cjs +++ b/bin/cucumber-language-server.cjs @@ -1,5 +1,4 @@ #!/usr/bin/env node require('source-map-support').install() -const { startServer } = require('../dist/cjs/src/startServer') -const { NodeParserAdapter } = require('@cucumber/language-service/node') -startServer(new NodeParserAdapter()) +const { startNodeServer } = require('../dist/cjs/src/node/startNodeServer') +startNodeServer() diff --git a/node/package.json b/node/package.json new file mode 100644 index 00000000..6371344c --- /dev/null +++ b/node/package.json @@ -0,0 +1,7 @@ +{ + "name": "wasm", + "description": "Cucumber Language server using tree-sitter node bindings", + "main": "../dist/cjs/src/node/startNodeServer.js", + "module": "../dist/esm/src/node/startNodeServer.js", + "types": "../dist/esm/src/node/startNodeServer.d.ts" +} diff --git a/package-lock.json b/package-lock.json index 68381246..56a20f32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@cucumber/cucumber-expressions": "^15.1.1", "@cucumber/gherkin-utils": "^7.0.0", - "@cucumber/language-service": "^0.14.4", + "@cucumber/language-service": "^0.15.0", "fast-glob": "3.2.11", "source-map-support": "0.5.21", "vscode-languageserver": "7.0.0", @@ -230,9 +230,9 @@ } }, "node_modules/@cucumber/language-service": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@cucumber/language-service/-/language-service-0.14.4.tgz", - "integrity": "sha512-L0cbjfXrGkgxfia0JOqA9hPOFbOihvxgulGt1IJofa/knMAxNZFQO8pSExEQBCjXmQMEnOdlP2c0iGyVwRD3rg==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@cucumber/language-service/-/language-service-0.15.0.tgz", + "integrity": "sha512-LSL4H2IDqfgiKdrAnQRBctJZ/6vKa7x6nkavsnrCH6xab9QFTFZMSnF2GGW/OLPi4M03BGg+ehZaWYNu4YcCtw==", "dependencies": { "@cucumber/cucumber-expressions": "^15.1.1", "@cucumber/gherkin": "^23.0.1", @@ -244,6 +244,7 @@ "tree-sitter": "0.20.0", "tree-sitter-c-sharp": "0.19.1", "tree-sitter-java": "0.19.1", + "tree-sitter-php": "0.19.0", "tree-sitter-typescript": "0.20.1", "vscode-languageserver-types": "3.17.0-next.10" }, @@ -6156,6 +6157,15 @@ "nan": "^2.14.1" } }, + "node_modules/tree-sitter-php": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/tree-sitter-php/-/tree-sitter-php-0.19.0.tgz", + "integrity": "sha512-YchOF4ai+CIP8AMHuNDohEOG4T+9+6YwVqyNwWS9+BIBze41D32V9FCc88/v4W5YRvvCdRqJk8V+hWtnCHrUcw==", + "hasInstallScript": true, + "dependencies": { + "nan": "^2.14.0" + } + }, "node_modules/tree-sitter-typescript": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.20.1.tgz", @@ -6915,9 +6925,9 @@ "requires": {} }, "@cucumber/language-service": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@cucumber/language-service/-/language-service-0.14.4.tgz", - "integrity": "sha512-L0cbjfXrGkgxfia0JOqA9hPOFbOihvxgulGt1IJofa/knMAxNZFQO8pSExEQBCjXmQMEnOdlP2c0iGyVwRD3rg==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@cucumber/language-service/-/language-service-0.15.0.tgz", + "integrity": "sha512-LSL4H2IDqfgiKdrAnQRBctJZ/6vKa7x6nkavsnrCH6xab9QFTFZMSnF2GGW/OLPi4M03BGg+ehZaWYNu4YcCtw==", "requires": { "@cucumber/cucumber-expressions": "^15.1.1", "@cucumber/gherkin": "^23.0.1", @@ -6929,6 +6939,7 @@ "tree-sitter": "0.20.0", "tree-sitter-c-sharp": "0.19.1", "tree-sitter-java": "0.19.1", + "tree-sitter-php": "0.19.0", "tree-sitter-typescript": "0.20.1", "vscode-languageserver-types": "3.17.0-next.10" } @@ -11370,6 +11381,14 @@ "nan": "^2.14.1" } }, + "tree-sitter-php": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/tree-sitter-php/-/tree-sitter-php-0.19.0.tgz", + "integrity": "sha512-YchOF4ai+CIP8AMHuNDohEOG4T+9+6YwVqyNwWS9+BIBze41D32V9FCc88/v4W5YRvvCdRqJk8V+hWtnCHrUcw==", + "requires": { + "nan": "^2.14.0" + } + }, "tree-sitter-typescript": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.20.1.tgz", diff --git a/package.json b/package.json index 736ec180..a6862de2 100644 --- a/package.json +++ b/package.json @@ -3,18 +3,25 @@ "version": "0.6.0", "description": "Cucumber Language Server", "type": "module", - "main": "dist/cjs/src/index.js", - "module": "dist/esm/src/index.js", - "types": "dist/esm/src/index.d.ts", + "main": "dist/cjs/src/node/startNodeServer.js", + "module": "dist/esm/src/node/startNodeServer.js", + "types": "dist/esm/src/node/startNodeServer.d.ts", "exports": { ".": { - "import": "./dist/esm/src/index.js", - "require": "./dist/cjs/src/index.js" + "import": "./dist/esm/src/node/startNodeServer.js", + "require": "./dist/cjs/src/node/startNodeServer.js" + }, + "./wasm": { + "import": "./dist/esm/src/wasm/startWasmServer.js", + "require": "./dist/cjs/src/wasm/startWasmServer.js" } }, "files": [ "dist/cjs/src", - "dist/esm/src" + "dist/cjs/package.json", + "dist/esm/src", + "node", + "wasm" ], "bin": { "cucumber-language-server": "bin/cucumber-language-server.cjs" @@ -77,7 +84,7 @@ "dependencies": { "@cucumber/cucumber-expressions": "^15.1.1", "@cucumber/gherkin-utils": "^7.0.0", - "@cucumber/language-service": "^0.14.4", + "@cucumber/language-service": "^0.15.0", "fast-glob": "3.2.11", "source-map-support": "0.5.21", "vscode-languageserver": "7.0.0", diff --git a/src/CucumberLanguageServer.ts b/src/CucumberLanguageServer.ts index fa148e79..10ea571c 100644 --- a/src/CucumberLanguageServer.ts +++ b/src/CucumberLanguageServer.ts @@ -1,6 +1,7 @@ import { Expression, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' import { buildSuggestions, + ExpressionBuilder, getGherkinCompletionItems, getGherkinDiagnostics, getGherkinFormattingEdits, @@ -11,7 +12,6 @@ import { semanticTokenTypes, Suggestion, } from '@cucumber/language-service' -import { ExpressionBuilder } from '@cucumber/language-service' import { ConfigurationRequest, Connection, @@ -40,18 +40,20 @@ const defaultSettings: Settings = { } export class CucumberLanguageServer { - private readonly expressionBuilder + private readonly expressionBuilder: ExpressionBuilder private searchIndex: Index private expressions: readonly Expression[] = [] private reindexingTimeout: NodeJS.Timeout constructor( - private parserAdapter: ParserAdapter, private readonly connection: Connection, - private readonly documents: TextDocuments + private readonly documents: TextDocuments, + parserAdapter: ParserAdapter ) { this.expressionBuilder = new ExpressionBuilder(parserAdapter) connection.onInitialize(async (params) => { + await parserAdapter.init() + if (params.capabilities.workspace?.configuration) { connection.onDidChangeConfiguration((params) => { this.reindex(params.settings).catch((err) => { diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 42a83a18..00000000 --- a/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './startServer.js' diff --git a/src/loadAll.ts b/src/loadAll.ts index cb4eb1ad..6578a015 100644 --- a/src/loadAll.ts +++ b/src/loadAll.ts @@ -3,11 +3,13 @@ import fg from 'fast-glob' import fs from 'fs/promises' import path from 'path' -type Extension = '.ts' | '.java' +type Extension = '.ts' | '.java' | '.cs' | '.php' export const languageByExt: Record = { '.ts': 'typescript', '.java': 'java', + '.cs': 'c_sharp', + '.php': 'php', } const extensions = Array.from(Object.keys(languageByExt)).concat('.feature') diff --git a/src/node/startNodeServer.ts b/src/node/startNodeServer.ts new file mode 100644 index 00000000..7f23f3c9 --- /dev/null +++ b/src/node/startNodeServer.ts @@ -0,0 +1,7 @@ +import { NodeParserAdapter } from '@cucumber/language-service/node' + +import { startServer } from '../startServer' + +export function startNodeServer() { + startServer(new NodeParserAdapter()) +} diff --git a/src/startServer.ts b/src/startServer.ts index 5d17b4af..8d593dec 100644 --- a/src/startServer.ts +++ b/src/startServer.ts @@ -1,14 +1,14 @@ -import { ParserAdapter } from '@cucumber/language-service' import { TextDocuments } from 'vscode-languageserver' import { createConnection, ProposedFeatures } from 'vscode-languageserver/node' import { TextDocument } from 'vscode-languageserver-textdocument' +import { ParserAdapter } from '../../language-service' import { CucumberLanguageServer } from './CucumberLanguageServer.js' export function startServer(adapter: ParserAdapter) { const connection = createConnection(ProposedFeatures.all) const documents = new TextDocuments(TextDocument) - new CucumberLanguageServer(adapter, connection, documents) + new CucumberLanguageServer(connection, documents, adapter) connection.listen() // Don't die on unhandled Promise rejections diff --git a/src/wasm/startWasmServer.ts b/src/wasm/startWasmServer.ts new file mode 100644 index 00000000..6c3097d5 --- /dev/null +++ b/src/wasm/startWasmServer.ts @@ -0,0 +1,7 @@ +import { WasmParserAdapter } from '@cucumber/language-service/wasm' + +import { startServer } from '../startServer' + +export function startWasmServer(wasmBaseUrl: string) { + startServer(new WasmParserAdapter(wasmBaseUrl)) +} diff --git a/test/CucumberLanguageServer.test.ts b/test/CucumberLanguageServer.test.ts index 56c8ff34..6ceb62fc 100644 --- a/test/CucumberLanguageServer.test.ts +++ b/test/CucumberLanguageServer.test.ts @@ -54,7 +54,7 @@ describe('CucumberLanguageServer', () => { serverConnection = createConnection(inputStream, outputStream) documents = new TextDocuments(TextDocument) - new CucumberLanguageServer(new NodeParserAdapter(), serverConnection, documents) + new CucumberLanguageServer(serverConnection, documents, new NodeParserAdapter()) serverConnection.listen() const initializeParams: InitializeParams = { diff --git a/tsconfig.build-cjs.json b/tsconfig.build-cjs.json index da76f4bb..71f03f2d 100644 --- a/tsconfig.build-cjs.json +++ b/tsconfig.build-cjs.json @@ -1,8 +1,8 @@ { "extends": "./tsconfig.build.json", "compilerOptions": { - "outDir": "dist/cjs", - "target": "ES5", + "target": "ES6", "module": "CommonJS", - }, + "outDir": "dist/cjs" + } } diff --git a/wasm/package.json b/wasm/package.json new file mode 100644 index 00000000..d81c77ce --- /dev/null +++ b/wasm/package.json @@ -0,0 +1,7 @@ +{ + "name": "wasm", + "description": "Cucumber Language server using tree-sitter wasm bindings", + "main": "../dist/cjs/src/wasm/startWasmServer.js", + "module": "../dist/esm/src/wasm/startWasmServer.js", + "types": "../dist/esm/src/wasm/startWasmServer.d.ts" +} From 7ca2a7b57dd2645589a8340aa5cf259343f5b5ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aslak=20Helles=C3=B8y?= Date: Wed, 27 Apr 2022 13:50:15 +0100 Subject: [PATCH 2/2] Fix import path --- src/startServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/startServer.ts b/src/startServer.ts index 8d593dec..9b148960 100644 --- a/src/startServer.ts +++ b/src/startServer.ts @@ -1,8 +1,8 @@ +import { ParserAdapter } from '@cucumber/language-service' import { TextDocuments } from 'vscode-languageserver' import { createConnection, ProposedFeatures } from 'vscode-languageserver/node' import { TextDocument } from 'vscode-languageserver-textdocument' -import { ParserAdapter } from '../../language-service' import { CucumberLanguageServer } from './CucumberLanguageServer.js' export function startServer(adapter: ParserAdapter) {