Skip to content

Commit 8cb6825

Browse files
authored
feat: support for experimental evaluatable expressions (#167)
* Add support for experimental evaluatable expressions * Lint
1 parent d83bb01 commit 8cb6825

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

src/extension.ts

+24
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,29 @@ 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+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
63+
if (languageClient.initializeResult?.capabilities.experimental?.xevaluatableExpressionProvider) {
64+
const eer = await languageClient.sendRequest(
65+
EvaluatableExpressionRequest.type,
66+
languageClient.code2ProtocolConverter.asTextDocumentPositionParams(document, position),
67+
token
68+
)
69+
if (eer && eer.expression) {
70+
return new vscode.EvaluatableExpression(eer.range, eer.expression)
71+
}
72+
}
73+
return undefined
74+
},
75+
})
76+
)
5377
}
5478

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

src/protocol.ts

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

0 commit comments

Comments
 (0)