diff options
Diffstat (limited to 'editors/code/src/highlighting.ts')
-rw-r--r-- | editors/code/src/highlighting.ts | 60 |
1 files changed, 21 insertions, 39 deletions
diff --git a/editors/code/src/highlighting.ts b/editors/code/src/highlighting.ts index 77b4a1a68..3e0cbdc56 100644 --- a/editors/code/src/highlighting.ts +++ b/editors/code/src/highlighting.ts | |||
@@ -1,5 +1,5 @@ | |||
1 | import * as vscode from 'vscode'; | 1 | import * as vscode from 'vscode'; |
2 | import * as lc from 'vscode-languageclient'; | 2 | import * as ra from './rust-analyzer-api'; |
3 | 3 | ||
4 | import { ColorTheme, TextMateRuleSettings } from './color_theme'; | 4 | import { ColorTheme, TextMateRuleSettings } from './color_theme'; |
5 | 5 | ||
@@ -8,29 +8,25 @@ import { sendRequestWithRetry } from './util'; | |||
8 | 8 | ||
9 | export function activateHighlighting(ctx: Ctx) { | 9 | export function activateHighlighting(ctx: Ctx) { |
10 | const highlighter = new Highlighter(ctx); | 10 | const highlighter = new Highlighter(ctx); |
11 | const client = ctx.client; | ||
12 | if (client != null) { | ||
13 | client.onNotification( | ||
14 | 'rust-analyzer/publishDecorations', | ||
15 | (params: PublishDecorationsParams) => { | ||
16 | if (!ctx.config.highlightingOn) return; | ||
17 | |||
18 | const targetEditor = vscode.window.visibleTextEditors.find( | ||
19 | editor => { | ||
20 | const unescapedUri = unescape( | ||
21 | editor.document.uri.toString(), | ||
22 | ); | ||
23 | // Unescaped URI looks like: | ||
24 | // file:///c:/Workspace/ra-test/src/main.rs | ||
25 | return unescapedUri === params.uri; | ||
26 | }, | ||
27 | ); | ||
28 | if (!targetEditor) return; | ||
29 | 11 | ||
30 | highlighter.setHighlights(targetEditor, params.decorations); | 12 | ctx.client.onNotification(ra.publishDecorations, params => { |
13 | if (!ctx.config.highlightingOn) return; | ||
14 | |||
15 | const targetEditor = vscode.window.visibleTextEditors.find( | ||
16 | editor => { | ||
17 | const unescapedUri = unescape( | ||
18 | editor.document.uri.toString(), | ||
19 | ); | ||
20 | // Unescaped URI looks like: | ||
21 | // file:///c:/Workspace/ra-test/src/main.rs | ||
22 | return unescapedUri === params.uri; | ||
31 | }, | 23 | }, |
32 | ); | 24 | ); |
33 | } | 25 | if (!targetEditor) return; |
26 | |||
27 | highlighter.setHighlights(targetEditor, params.decorations); | ||
28 | }); | ||
29 | |||
34 | 30 | ||
35 | vscode.workspace.onDidChangeConfiguration( | 31 | vscode.workspace.onDidChangeConfiguration( |
36 | _ => highlighter.removeHighlights(), | 32 | _ => highlighter.removeHighlights(), |
@@ -45,13 +41,10 @@ export function activateHighlighting(ctx: Ctx) { | |||
45 | const client = ctx.client; | 41 | const client = ctx.client; |
46 | if (!client) return; | 42 | if (!client) return; |
47 | 43 | ||
48 | const params: lc.TextDocumentIdentifier = { | 44 | const decorations = await sendRequestWithRetry( |
49 | uri: editor.document.uri.toString(), | ||
50 | }; | ||
51 | const decorations = await sendRequestWithRetry<Decoration[]>( | ||
52 | client, | 45 | client, |
53 | 'rust-analyzer/decorationsRequest', | 46 | ra.decorationsRequest, |
54 | params, | 47 | { uri: editor.document.uri.toString() }, |
55 | ); | 48 | ); |
56 | highlighter.setHighlights(editor, decorations); | 49 | highlighter.setHighlights(editor, decorations); |
57 | }, | 50 | }, |
@@ -60,17 +53,6 @@ export function activateHighlighting(ctx: Ctx) { | |||
60 | ); | 53 | ); |
61 | } | 54 | } |
62 | 55 | ||
63 | interface PublishDecorationsParams { | ||
64 | uri: string; | ||
65 | decorations: Decoration[]; | ||
66 | } | ||
67 | |||
68 | interface Decoration { | ||
69 | range: lc.Range; | ||
70 | tag: string; | ||
71 | bindingHash?: string; | ||
72 | } | ||
73 | |||
74 | // Based on this HSL-based color generator: https://gist.github.com/bendc/76c48ce53299e6078a76 | 56 | // Based on this HSL-based color generator: https://gist.github.com/bendc/76c48ce53299e6078a76 |
75 | function fancify(seed: string, shade: 'light' | 'dark') { | 57 | function fancify(seed: string, shade: 'light' | 'dark') { |
76 | const random = randomU32Numbers(hashString(seed)); | 58 | const random = randomU32Numbers(hashString(seed)); |
@@ -108,7 +90,7 @@ class Highlighter { | |||
108 | this.decorations = null; | 90 | this.decorations = null; |
109 | } | 91 | } |
110 | 92 | ||
111 | public setHighlights(editor: vscode.TextEditor, highlights: Decoration[]) { | 93 | public setHighlights(editor: vscode.TextEditor, highlights: ra.Decoration[]) { |
112 | const client = this.ctx.client; | 94 | const client = this.ctx.client; |
113 | if (!client) return; | 95 | if (!client) return; |
114 | // Initialize decorations if necessary | 96 | // Initialize decorations if necessary |