aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src')
-rw-r--r--editors/code/src/client.ts10
-rw-r--r--editors/code/src/ctx.ts2
-rw-r--r--editors/code/src/debug.ts12
-rw-r--r--editors/code/src/lsp_ext.ts5
-rw-r--r--editors/code/src/toolchain.ts4
-rw-r--r--editors/code/src/util.ts7
6 files changed, 22 insertions, 18 deletions
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts
index 18948cb3c..f5db55b8c 100644
--- a/editors/code/src/client.ts
+++ b/editors/code/src/client.ts
@@ -4,7 +4,7 @@ import * as ra from '../src/lsp_ext';
4import * as Is from 'vscode-languageclient/lib/utils/is'; 4import * as Is from 'vscode-languageclient/lib/utils/is';
5 5
6import { CallHierarchyFeature } from 'vscode-languageclient/lib/callHierarchy.proposed'; 6import { CallHierarchyFeature } from 'vscode-languageclient/lib/callHierarchy.proposed';
7import { SemanticTokensFeature, DocumentSemanticsTokensSignature } from 'vscode-languageclient/lib/semanticTokens.proposed'; 7import { SemanticTokensFeature } from 'vscode-languageclient/lib/semanticTokens.proposed';
8import { assert } from './util'; 8import { assert } from './util';
9 9
10function renderCommand(cmd: ra.CommandLink) { 10function renderCommand(cmd: ra.CommandLink) {
@@ -44,12 +44,6 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
44 diagnosticCollectionName: "rustc", 44 diagnosticCollectionName: "rustc",
45 traceOutputChannel, 45 traceOutputChannel,
46 middleware: { 46 middleware: {
47 // Workaround for https://github.com/microsoft/vscode-languageserver-node/issues/576
48 async provideDocumentSemanticTokens(document: vscode.TextDocument, token: vscode.CancellationToken, next: DocumentSemanticsTokensSignature) {
49 const res = await next(document, token);
50 if (res === undefined) throw new Error('busy');
51 return res;
52 },
53 async provideHover(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, _next: lc.ProvideHoverSignature) { 47 async provideHover(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, _next: lc.ProvideHoverSignature) {
54 return client.sendRequest(lc.HoverRequest.type, client.code2ProtocolConverter.asTextDocumentPositionParams(document, position), token).then( 48 return client.sendRequest(lc.HoverRequest.type, client.code2ProtocolConverter.asTextDocumentPositionParams(document, position), token).then(
55 (result) => { 49 (result) => {
@@ -135,7 +129,7 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
135 ); 129 );
136 } 130 }
137 131
138 } as any 132 }
139 }; 133 };
140 134
141 const client = new lc.LanguageClient( 135 const client = new lc.LanguageClient(
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index 6e767babf..543f7e02e 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -36,7 +36,7 @@ export class Ctx {
36 36
37 res.pushCleanup(client.start()); 37 res.pushCleanup(client.start());
38 await client.onReady(); 38 await client.onReady();
39 client.onNotification(ra.status, (status) => res.setStatus(status)); 39 client.onNotification(ra.status, (params) => res.setStatus(params.status));
40 return res; 40 return res;
41 } 41 }
42 42
diff --git a/editors/code/src/debug.ts b/editors/code/src/debug.ts
index bd92c5b6d..925126a16 100644
--- a/editors/code/src/debug.ts
+++ b/editors/code/src/debug.ts
@@ -87,9 +87,17 @@ async function getDebugConfiguration(ctx: Ctx, runnable: ra.Runnable): Promise<v
87 debugOutput.show(true); 87 debugOutput.show(true);
88 } 88 }
89 89
90 const wsFolder = path.normalize(vscode.workspace.workspaceFolders![0].uri.fsPath); // folder exists or RA is not active. 90 const isMultiFolderWorkspace = vscode.workspace.workspaceFolders!.length > 1;
91 const firstWorkspace = vscode.workspace.workspaceFolders![0]; // folder exists or RA is not active.
92 const workspace = !isMultiFolderWorkspace || !runnable.args.workspaceRoot ?
93 firstWorkspace :
94 vscode.workspace.workspaceFolders!.find(w => runnable.args.workspaceRoot?.includes(w.uri.fsPath)) || firstWorkspace;
95
96 const wsFolder = path.normalize(workspace.uri.fsPath);
97 const workspaceQualifier = isMultiFolderWorkspace ? `:${workspace.name}` : '';
91 function simplifyPath(p: string): string { 98 function simplifyPath(p: string): string {
92 return path.normalize(p).replace(wsFolder, '${workspaceRoot}'); 99 // see https://github.com/rust-analyzer/rust-analyzer/pull/5513#issuecomment-663458818 for why this is needed
100 return path.normalize(p).replace(wsFolder, '${workspaceFolder' + workspaceQualifier + '}');
93 } 101 }
94 102
95 const executable = await getDebugExecutable(runnable); 103 const executable = await getDebugExecutable(runnable);
diff --git a/editors/code/src/lsp_ext.ts b/editors/code/src/lsp_ext.ts
index 494d51c83..8663737a6 100644
--- a/editors/code/src/lsp_ext.ts
+++ b/editors/code/src/lsp_ext.ts
@@ -8,7 +8,10 @@ export const analyzerStatus = new lc.RequestType<null, string, void>("rust-analy
8export const memoryUsage = new lc.RequestType<null, string, void>("rust-analyzer/memoryUsage"); 8export const memoryUsage = new lc.RequestType<null, string, void>("rust-analyzer/memoryUsage");
9 9
10export type Status = "loading" | "ready" | "invalid" | "needsReload"; 10export type Status = "loading" | "ready" | "invalid" | "needsReload";
11export const status = new lc.NotificationType<Status>("rust-analyzer/status"); 11export interface StatusParams {
12 status: Status;
13}
14export const status = new lc.NotificationType<StatusParams>("rust-analyzer/status");
12 15
13export const reloadWorkspace = new lc.RequestType<null, null, void>("rust-analyzer/reloadWorkspace"); 16export const reloadWorkspace = new lc.RequestType<null, null, void>("rust-analyzer/reloadWorkspace");
14 17
diff --git a/editors/code/src/toolchain.ts b/editors/code/src/toolchain.ts
index 80a7915e9..a5dc3cf0c 100644
--- a/editors/code/src/toolchain.ts
+++ b/editors/code/src/toolchain.ts
@@ -121,12 +121,12 @@ export class Cargo {
121 } 121 }
122} 122}
123 123
124/** Mirrors `ra_toolchain::cargo()` implementation */ 124/** Mirrors `toolchain::cargo()` implementation */
125export function cargoPath(): string { 125export function cargoPath(): string {
126 return getPathForExecutable("cargo"); 126 return getPathForExecutable("cargo");
127} 127}
128 128
129/** Mirrors `ra_toolchain::get_path_for_executable()` implementation */ 129/** Mirrors `toolchain::get_path_for_executable()` implementation */
130export const getPathForExecutable = memoize( 130export const getPathForExecutable = memoize(
131 // We apply caching to decrease file-system interactions 131 // We apply caching to decrease file-system interactions
132 (executableName: "cargo" | "rustc" | "rustup"): string => { 132 (executableName: "cargo" | "rustc" | "rustup"): string => {
diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts
index 970fedb37..ec2087502 100644
--- a/editors/code/src/util.ts
+++ b/editors/code/src/util.ts
@@ -25,7 +25,6 @@ export const log = new class {
25 debug(...msg: [unknown, ...unknown[]]): void { 25 debug(...msg: [unknown, ...unknown[]]): void {
26 if (!log.enabled) return; 26 if (!log.enabled) return;
27 log.write("DEBUG", ...msg); 27 log.write("DEBUG", ...msg);
28 log.output.toString();
29 } 28 }
30 29
31 info(...msg: [unknown, ...unknown[]]): void { 30 info(...msg: [unknown, ...unknown[]]): void {
@@ -64,7 +63,8 @@ export async function sendRequestWithRetry<TParam, TRet>(
64 param: TParam, 63 param: TParam,
65 token?: vscode.CancellationToken, 64 token?: vscode.CancellationToken,
66): Promise<TRet> { 65): Promise<TRet> {
67 for (const delay of [2, 4, 6, 8, 10, null]) { 66 // The sequence is `10 * (2 ** (2 * n))` where n is 1, 2, 3...
67 for (const delay of [40, 160, 640, 2560, 10240, null]) {
68 try { 68 try {
69 return await (token 69 return await (token
70 ? client.sendRequest(reqType, param, token) 70 ? client.sendRequest(reqType, param, token)
@@ -84,8 +84,7 @@ export async function sendRequestWithRetry<TParam, TRet>(
84 log.warn("LSP request failed", { method: reqType.method, param, error }); 84 log.warn("LSP request failed", { method: reqType.method, param, error });
85 throw error; 85 throw error;
86 } 86 }
87 87 await sleep(delay);
88 await sleep(10 * (1 << delay));
89 } 88 }
90 } 89 }
91 throw 'unreachable'; 90 throw 'unreachable';