From 088c44c25afa9a1e618ab988e643985a44b1a450 Mon Sep 17 00:00:00 2001 From: Damjan Cvetko Date: Wed, 25 Dec 2024 19:47:38 +0100 Subject: [PATCH 1/2] Add support for experimental evaluatable expressions --- src/extension.ts | 23 +++++++++++++++++++++++ src/protocol.ts | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/protocol.ts diff --git a/src/extension.ts b/src/extension.ts index 85719f0..3f00cc6 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,4 +1,5 @@ import { LanguageClient, ServerOptions, LanguageClientOptions, StreamInfo } from 'vscode-languageclient' +import { EvaluatableExpressionRequest } from './protocol' import * as vscode from 'vscode' import { join } from 'path' @@ -50,6 +51,28 @@ export function activate(context: vscode.ExtensionContext): void { languageClient = createClient(config) languageClient.start() + + context.subscriptions.push( + vscode.languages.registerEvaluatableExpressionProvider('php', { + async provideEvaluatableExpression( + document: vscode.TextDocument, + position: vscode.Position, + token: vscode.CancellationToken + ): Promise { + if (languageClient.initializeResult?.capabilities.experimental?.xevaluatableExpressionProvider) { + const eer = await languageClient.sendRequest( + EvaluatableExpressionRequest.type, + languageClient.code2ProtocolConverter.asTextDocumentPositionParams(document, position), + token + ) + if (eer && eer.expression) { + return new vscode.EvaluatableExpression(eer.range, eer.expression) + } + } + return undefined + }, + }) + ) } export function deactivate(): Promise | undefined { diff --git a/src/protocol.ts b/src/protocol.ts new file mode 100644 index 0000000..7fa29d0 --- /dev/null +++ b/src/protocol.ts @@ -0,0 +1,33 @@ +import { Range } from 'vscode' +// import { Range } from 'vscode-languageserver-types' +import { ProtocolRequestType } from 'vscode-languageserver-protocol/lib/messages' +import { + TextDocumentPositionParams, + TextDocumentRegistrationOptions, + WorkDoneProgressOptions, + WorkDoneProgressParams, +} from 'vscode-languageclient' + +interface EvaluatableExpression { + expression?: string + range: Range +} + +interface EvaluatableExpressionOptions extends WorkDoneProgressOptions {} + +interface EvaluatableExpressionParams extends TextDocumentPositionParams, WorkDoneProgressParams {} + +interface EvaluatableExpressionRegistrationOptions + extends TextDocumentRegistrationOptions, + EvaluatableExpressionOptions {} + +export namespace EvaluatableExpressionRequest { + export const method: 'textDocument/xevaluatableExpression' = 'textDocument/xevaluatableExpression' + export const type = new ProtocolRequestType< + EvaluatableExpressionParams, + EvaluatableExpression | null, + never, + void, + EvaluatableExpressionRegistrationOptions + >(method) +} From c3a090f6f9fb4b629dd0e248e43fe349a4c3c1b0 Mon Sep 17 00:00:00 2001 From: Damjan Cvetko Date: Wed, 25 Dec 2024 20:22:56 +0100 Subject: [PATCH 2/2] Lint --- src/extension.ts | 1 + src/protocol.ts | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 3f00cc6..86e8a4d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -59,6 +59,7 @@ export function activate(context: vscode.ExtensionContext): void { position: vscode.Position, token: vscode.CancellationToken ): Promise { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (languageClient.initializeResult?.capabilities.experimental?.xevaluatableExpressionProvider) { const eer = await languageClient.sendRequest( EvaluatableExpressionRequest.type, diff --git a/src/protocol.ts b/src/protocol.ts index 7fa29d0..3f1db66 100644 --- a/src/protocol.ts +++ b/src/protocol.ts @@ -1,3 +1,5 @@ +/* eslint @typescript-eslint/no-empty-object-type: 0 */ +/* eslint @typescript-eslint/no-namespace: 0 */ import { Range } from 'vscode' // import { Range } from 'vscode-languageserver-types' import { ProtocolRequestType } from 'vscode-languageserver-protocol/lib/messages' @@ -13,7 +15,7 @@ interface EvaluatableExpression { range: Range } -interface EvaluatableExpressionOptions extends WorkDoneProgressOptions {} +export interface EvaluatableExpressionOptions extends WorkDoneProgressOptions {} interface EvaluatableExpressionParams extends TextDocumentPositionParams, WorkDoneProgressParams {} @@ -22,7 +24,7 @@ interface EvaluatableExpressionRegistrationOptions EvaluatableExpressionOptions {} export namespace EvaluatableExpressionRequest { - export const method: 'textDocument/xevaluatableExpression' = 'textDocument/xevaluatableExpression' + export const method = 'textDocument/xevaluatableExpression' export const type = new ProtocolRequestType< EvaluatableExpressionParams, EvaluatableExpression | null,