diff options
Diffstat (limited to 'editors/code/src')
-rw-r--r-- | editors/code/src/ctx.ts | 15 | ||||
-rw-r--r-- | editors/code/src/inlay_hints.ts | 7 |
2 files changed, 16 insertions, 6 deletions
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index ca4319064..75b3542f4 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts | |||
@@ -61,6 +61,21 @@ export class Ctx { | |||
61 | pushCleanup(d: { dispose(): any }) { | 61 | pushCleanup(d: { dispose(): any }) { |
62 | this.extCtx.subscriptions.push(d); | 62 | this.extCtx.subscriptions.push(d); |
63 | } | 63 | } |
64 | |||
65 | async sendRequestWithRetry<R>(method: string, param: any): Promise<R> { | ||
66 | await this.client.onReady(); | ||
67 | const nRetries = 3; | ||
68 | for (let triesLeft = nRetries; ; triesLeft--) { | ||
69 | try { | ||
70 | return await this.client.sendRequest(method, param); | ||
71 | } catch (e) { | ||
72 | if (e.code === lc.ErrorCodes.ContentModified && triesLeft > 0) { | ||
73 | continue; | ||
74 | } | ||
75 | throw e; | ||
76 | } | ||
77 | } | ||
78 | } | ||
64 | } | 79 | } |
65 | 80 | ||
66 | export type Cmd = (...args: any[]) => any; | 81 | export type Cmd = (...args: any[]) => any; |
diff --git a/editors/code/src/inlay_hints.ts b/editors/code/src/inlay_hints.ts index aae9de69c..16faea22e 100644 --- a/editors/code/src/inlay_hints.ts +++ b/editors/code/src/inlay_hints.ts | |||
@@ -5,8 +5,6 @@ import { Ctx } from './ctx'; | |||
5 | 5 | ||
6 | export function activateInlayHints(ctx: Ctx) { | 6 | export function activateInlayHints(ctx: Ctx) { |
7 | const hintsUpdater = new HintsUpdater(ctx); | 7 | const hintsUpdater = new HintsUpdater(ctx); |
8 | console.log('activateInlayHints'); | ||
9 | |||
10 | vscode.window.onDidChangeVisibleTextEditors(async _ => { | 8 | vscode.window.onDidChangeVisibleTextEditors(async _ => { |
11 | await hintsUpdater.refresh(); | 9 | await hintsUpdater.refresh(); |
12 | }, ctx.subscriptions); | 10 | }, ctx.subscriptions); |
@@ -69,7 +67,6 @@ class HintsUpdater { | |||
69 | 67 | ||
70 | private async refreshEditor(editor: vscode.TextEditor): Promise<void> { | 68 | private async refreshEditor(editor: vscode.TextEditor): Promise<void> { |
71 | const newHints = await this.queryHints(editor.document.uri.toString()); | 69 | const newHints = await this.queryHints(editor.document.uri.toString()); |
72 | |||
73 | const newDecorations = (newHints ? newHints : []).map(hint => ({ | 70 | const newDecorations = (newHints ? newHints : []).map(hint => ({ |
74 | range: hint.range, | 71 | range: hint.range, |
75 | renderOptions: { | 72 | renderOptions: { |
@@ -101,9 +98,7 @@ class HintsUpdater { | |||
101 | const request: InlayHintsParams = { | 98 | const request: InlayHintsParams = { |
102 | textDocument: { uri: documentUri }, | 99 | textDocument: { uri: documentUri }, |
103 | }; | 100 | }; |
104 | await this.ctx.client.onReady(); | 101 | return this.ctx.sendRequestWithRetry<InlayHint[] | null>( |
105 | |||
106 | return this.ctx.client.sendRequest<InlayHint[] | null>( | ||
107 | 'rust-analyzer/inlayHints', | 102 | 'rust-analyzer/inlayHints', |
108 | request, | 103 | request, |
109 | ); | 104 | ); |