Skip to content

Commit 088c44c

Browse files
committed
Add support for experimental evaluatable expressions
1 parent 6ec5ee3 commit 088c44c

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/extension.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { LanguageClient, ServerOptions, LanguageClientOptions, StreamInfo } from 'vscode-languageclient'
2+
import { EvaluatableExpressionRequest } from './protocol'
23

34
import * as vscode from 'vscode'
45
import { join } from 'path'
@@ -50,6 +51,28 @@ export function activate(context: vscode.ExtensionContext): void {
5051

5152
languageClient = createClient(config)
5253
languageClient.start()
54+
55+
context.subscriptions.push(
56+
vscode.languages.registerEvaluatableExpressionProvider('php', {
57+
async provideEvaluatableExpression(
58+
document: vscode.TextDocument,
59+
position: vscode.Position,
60+
token: vscode.CancellationToken
61+
): Promise<vscode.EvaluatableExpression | undefined> {
62+
if (languageClient.initializeResult?.capabilities.experimental?.xevaluatableExpressionProvider) {
63+
const eer = await languageClient.sendRequest(
64+
EvaluatableExpressionRequest.type,
65+
languageClient.code2ProtocolConverter.asTextDocumentPositionParams(document, position),
66+
token
67+
)
68+
if (eer && eer.expression) {
69+
return new vscode.EvaluatableExpression(eer.range, eer.expression)
70+
}
71+
}
72+
return undefined
73+
},
74+
})
75+
)
5376
}
5477

5578
export function deactivate(): Promise<void> | undefined {

src/protocol.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Range } from 'vscode'
2+
// import { Range } from 'vscode-languageserver-types'
3+
import { ProtocolRequestType } from 'vscode-languageserver-protocol/lib/messages'
4+
import {
5+
TextDocumentPositionParams,
6+
TextDocumentRegistrationOptions,
7+
WorkDoneProgressOptions,
8+
WorkDoneProgressParams,
9+
} from 'vscode-languageclient'
10+
11+
interface EvaluatableExpression {
12+
expression?: string
13+
range: Range
14+
}
15+
16+
interface EvaluatableExpressionOptions extends WorkDoneProgressOptions {}
17+
18+
interface EvaluatableExpressionParams extends TextDocumentPositionParams, WorkDoneProgressParams {}
19+
20+
interface EvaluatableExpressionRegistrationOptions
21+
extends TextDocumentRegistrationOptions,
22+
EvaluatableExpressionOptions {}
23+
24+
export namespace EvaluatableExpressionRequest {
25+
export const method: 'textDocument/xevaluatableExpression' = 'textDocument/xevaluatableExpression'
26+
export const type = new ProtocolRequestType<
27+
EvaluatableExpressionParams,
28+
EvaluatableExpression | null,
29+
never,
30+
void,
31+
EvaluatableExpressionRegistrationOptions
32+
>(method)
33+
}

0 commit comments

Comments
 (0)