From c18ebd7c4657d5f7e3eb048a4c155bdfc5c45124 Mon Sep 17 00:00:00 2001 From: Thomas Droxler Date: Wed, 24 Apr 2024 12:03:43 +0200 Subject: [PATCH] Introduce `ralph-lsp` --- package-lock.json | 73 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 6 ++-- src/extension.ts | 51 ++++++++++++++++++++++----------- 3 files changed, 106 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39d4395..84d0854 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,12 +18,13 @@ "prettier": "^2.8.1", "request": "^2.88.2", "request-progress": "^3.0.0", - "request-promise-native": "^1.0.9" + "request-promise-native": "^1.0.9", + "vscode-languageclient": "^9.0.1" }, "devDependencies": { "@types/chai": "^4.3.4", "@types/crypto-js": "^4.1.1", - "@types/node": "^18.11.18", + "@types/node": "^18.19.31", "@types/prettier": "^2.7.2", "@types/request": "^2.48.8", "@types/request-promise-native": "^1.0.18", @@ -2416,9 +2417,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.14.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", - "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==" + "version": "18.19.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", + "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/prettier": { "version": "2.7.2", @@ -9413,6 +9417,11 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -9648,6 +9657,60 @@ "node": ">=4" } }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", + "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", + "dependencies": { + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.5" + }, + "engines": { + "vscode": "^1.82.0" + } + }, + "node_modules/vscode-languageclient/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, "node_modules/vue-eslint-parser": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", diff --git a/package.json b/package.json index c4a9b41..0530796 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,6 @@ "lint": "eslint src --ext ts,js --fix", "fmt": "prettier --write .", "test": "jest", - "antlr4ts": "antlr4ts -visitor ./src/parser/*.g4", "update-builtin-schema": "curl -o ./src/provider/builtin/ralph-built-in-functions.json https://raw.githubusercontent.com/alephium/alephium/v${npm_package_config_alephium_version}/protocol/src/main/resources/ralph-built-in-functions.json" }, "dependencies": { @@ -141,12 +140,13 @@ "prettier": "^2.8.1", "request": "^2.88.2", "request-progress": "^3.0.0", - "request-promise-native": "^1.0.9" + "request-promise-native": "^1.0.9", + "vscode-languageclient": "^9.0.1" }, "devDependencies": { "@types/chai": "^4.3.4", "@types/crypto-js": "^4.1.1", - "@types/node": "^18.11.18", + "@types/node": "^18.19.31", "@types/prettier": "^2.7.2", "@types/request": "^2.48.8", "@types/request-promise-native": "^1.0.18", diff --git a/src/extension.ts b/src/extension.ts index 1af80d0..3452843 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -21,6 +21,9 @@ import cache from './cache/cache' import { EmitProvider } from './provider/completion/emitProvider' import { parser, registerEvent } from './event' import { ContractBuiltInProvider } from './provider/completion/contractBuiltinProvider' +import {LanguageClient, LanguageClientOptions, ServerOptions, TransportKind} from 'vscode-languageclient/node'; + +let client: LanguageClient; // this method is called when your extension is activated // your extension is activated the very first time the command is executed @@ -41,32 +44,48 @@ export async function activate(context: vscode.ExtensionContext) { }) const selector = { scheme: 'file', language: 'ralph' } - hoverProvider().forEach((value) => context.subscriptions.push(vscode.languages.registerHoverProvider(selector, value))) context.subscriptions.push(vscode.languages.registerDocumentFormattingEditProvider(selector, new FormatterProvider())) context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, new SymbolProvider())) context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(new SymbolProvider())) - // context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, new GlobalProvider())) - context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, new ContractBuiltInProvider(), '.')) - context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, new BuiltInProvider())) - context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, new IdentifierProvider())) - context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, new EmitProvider(), 'emit')) - context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, new AnnotationProvider(), '@', '(', ')')) - // context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, new EnumProvider(), '.')) - context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, new MemberProvider(), '.')) - context.subscriptions.push(vscode.languages.registerDefinitionProvider(selector, new DefinitionProvider())) - context.subscriptions.push(vscode.languages.registerRenameProvider(selector, new RalphRenameProvider())) - context.subscriptions.push(vscode.languages.registerSignatureHelpProvider(selector, new RalphSignatureHelpProvider(), '(', ')', ',')) - context.subscriptions.push(vscode.languages.registerImplementationProvider(selector, new RalphImplementationProvider())) - context.subscriptions.push(vscode.languages.registerTypeDefinitionProvider(selector, new RalphTypeDefinitionProvider())) - context.subscriptions.push(vscode.languages.registerReferenceProvider(selector, new RalphReferenceProvider())) - context.subscriptions.push(vscode.languages.registerTypeHierarchyProvider(selector, new RalphTypeHierarchyProvider())) console.log('register push completed!') + + console.log("Activating Ralph LSP client"); + + const serverOptions: ServerOptions = { + command: "ralph-lsp", + transport: TransportKind.stdio, + options: { + shell: true + } + }; + + const clientOptions: LanguageClientOptions = { + documentSelector: [ + {pattern: '**/*.ral'}, + {language: 'json', pattern: '**/ralph.json'}, + ] + }; + + // Create the client and store it. + client = new LanguageClient( + 'ralph-lsp', + 'Ralph LSP', + serverOptions, + clientOptions + ); + + // Start the client. + client.start(); } // this method is called when your extension is deactivated export function deactivate() { clearInterval(timerId) + if (!client) { + return undefined; + } + return client.stop(); } async function init() {