Skip to content

Commit 39a42d4

Browse files
committed
Refactor language client handling
1 parent 40cbeb5 commit 39a42d4

File tree

7 files changed

+312
-441
lines changed

7 files changed

+312
-441
lines changed

editors/code/package-lock.json

+39-39
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

editors/code/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@
3737
"dependencies": {
3838
"d3": "^7.6.1",
3939
"d3-graphviz": "^4.1.1",
40-
"vscode-languageclient": "^8.0.0-next.14"
40+
"vscode-languageclient": "^8.0.2"
4141
},
4242
"devDependencies": {
4343
"@types/node": "~16.11.7",
44-
"@types/vscode": "~1.66.0",
44+
"@types/vscode": "~1.72.0",
4545
"@typescript-eslint/eslint-plugin": "^5.30.5",
4646
"@typescript-eslint/parser": "^5.30.5",
4747
"@vscode/test-electron": "^2.1.5",

editors/code/src/ast_inspector.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ export class AstInspector implements vscode.HoverProvider, vscode.DefinitionProv
3535
});
3636

3737
constructor(ctx: Ctx) {
38-
ctx.pushCleanup(vscode.languages.registerHoverProvider({ scheme: "rust-analyzer" }, this));
39-
ctx.pushCleanup(vscode.languages.registerDefinitionProvider({ language: "rust" }, this));
38+
ctx.pushExtCleanup(
39+
vscode.languages.registerHoverProvider({ scheme: "rust-analyzer" }, this)
40+
);
41+
ctx.pushExtCleanup(vscode.languages.registerDefinitionProvider({ language: "rust" }, this));
4042
vscode.workspace.onDidCloseTextDocument(
4143
this.onDidCloseTextDocument,
4244
this,
@@ -53,7 +55,7 @@ export class AstInspector implements vscode.HoverProvider, vscode.DefinitionProv
5355
ctx.subscriptions
5456
);
5557

56-
ctx.pushCleanup(this);
58+
ctx.pushExtCleanup(this);
5759
}
5860
dispose() {
5961
this.setRustEditor(undefined);

editors/code/src/client.ts

+10-33
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import * as ra from "../src/lsp_ext";
44
import * as Is from "vscode-languageclient/lib/common/utils/is";
55
import { assert } from "./util";
66
import { WorkspaceEdit } from "vscode";
7-
import { Workspace } from "./ctx";
8-
import { substituteVariablesInEnv, substituteVSCodeVariables } from "./config";
9-
import { outputChannel, traceOutputChannel } from "./main";
7+
import { substituteVSCodeVariables } from "./config";
108
import { randomUUID } from "crypto";
119

1210
export interface Env {
@@ -65,41 +63,17 @@ function renderHoverActions(actions: ra.CommandLinkGroup[]): vscode.MarkdownStri
6563
}
6664

6765
export async function createClient(
68-
serverPath: string,
69-
workspace: Workspace,
70-
extraEnv: Env
66+
traceOutputChannel: vscode.OutputChannel,
67+
outputChannel: vscode.OutputChannel,
68+
initializationOptions: vscode.WorkspaceConfiguration,
69+
serverOptions: lc.ServerOptions
7170
): Promise<lc.LanguageClient> {
72-
// '.' Is the fallback if no folder is open
73-
// TODO?: Workspace folders support Uri's (eg: file://test.txt).
74-
// It might be a good idea to test if the uri points to a file.
75-
76-
const newEnv = substituteVariablesInEnv(Object.assign({}, process.env, extraEnv));
77-
const run: lc.Executable = {
78-
command: serverPath,
79-
options: { env: newEnv },
80-
};
81-
const serverOptions: lc.ServerOptions = {
82-
run,
83-
debug: run,
84-
};
85-
86-
let rawInitializationOptions = vscode.workspace.getConfiguration("rust-analyzer");
87-
88-
if (workspace.kind === "Detached Files") {
89-
rawInitializationOptions = {
90-
detachedFiles: workspace.files.map((file) => file.uri.fsPath),
91-
...rawInitializationOptions,
92-
};
93-
}
94-
95-
const initializationOptions = substituteVSCodeVariables(rawInitializationOptions);
96-
9771
const clientOptions: lc.LanguageClientOptions = {
9872
documentSelector: [{ scheme: "file", language: "rust" }],
9973
initializationOptions,
10074
diagnosticCollectionName: "rustc",
101-
traceOutputChannel: traceOutputChannel(),
102-
outputChannel: outputChannel(),
75+
traceOutputChannel,
76+
outputChannel,
10377
middleware: {
10478
workspace: {
10579
async configuration(
@@ -273,6 +247,9 @@ export async function createClient(
273247
}
274248

275249
class ExperimentalFeatures implements lc.StaticFeature {
250+
getState(): lc.FeatureState {
251+
return { kind: "static" };
252+
}
276253
fillClientCapabilities(capabilities: lc.ClientCapabilities): void {
277254
const caps: any = capabilities.experimental ?? {};
278255
caps.snippetTextEdit = true;

0 commit comments

Comments
 (0)