diff options
Diffstat (limited to 'editors/code/src/highlighting.ts')
-rw-r--r-- | editors/code/src/highlighting.ts | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/editors/code/src/highlighting.ts b/editors/code/src/highlighting.ts index 333319b85..c7ee8c0a1 100644 --- a/editors/code/src/highlighting.ts +++ b/editors/code/src/highlighting.ts | |||
@@ -10,6 +10,36 @@ import { Server } from './server'; | |||
10 | import { Ctx } from './ctx'; | 10 | import { Ctx } from './ctx'; |
11 | 11 | ||
12 | export function activateHighlighting(ctx: Ctx) { | 12 | export function activateHighlighting(ctx: Ctx) { |
13 | const highlighter = new Highlighter(); | ||
14 | |||
15 | ctx.client.onReady().then(() => { | ||
16 | ctx.client.onNotification( | ||
17 | 'rust-analyzer/publishDecorations', | ||
18 | (params: PublishDecorationsParams) => { | ||
19 | if (!ctx.config.highlightingOn) return; | ||
20 | |||
21 | const targetEditor = vscode.window.visibleTextEditors.find( | ||
22 | editor => { | ||
23 | const unescapedUri = unescape( | ||
24 | editor.document.uri.toString(), | ||
25 | ); | ||
26 | // Unescaped URI looks like: | ||
27 | // file:///c:/Workspace/ra-test/src/main.rs | ||
28 | return unescapedUri === params.uri; | ||
29 | }, | ||
30 | ); | ||
31 | if (!targetEditor) return; | ||
32 | |||
33 | highlighter.setHighlights(targetEditor, params.decorations); | ||
34 | }, | ||
35 | ); | ||
36 | }); | ||
37 | |||
38 | vscode.workspace.onDidChangeConfiguration( | ||
39 | _ => highlighter.removeHighlights(), | ||
40 | ctx.subscriptions, | ||
41 | ); | ||
42 | |||
13 | vscode.window.onDidChangeActiveTextEditor( | 43 | vscode.window.onDidChangeActiveTextEditor( |
14 | async (editor: vscode.TextEditor | undefined) => { | 44 | async (editor: vscode.TextEditor | undefined) => { |
15 | if (!editor || editor.document.languageId !== 'rust') return; | 45 | if (!editor || editor.document.languageId !== 'rust') return; |
@@ -22,11 +52,17 @@ export function activateHighlighting(ctx: Ctx) { | |||
22 | 'rust-analyzer/decorationsRequest', | 52 | 'rust-analyzer/decorationsRequest', |
23 | params, | 53 | params, |
24 | ); | 54 | ); |
25 | Server.highlighter.setHighlights(editor, decorations); | 55 | highlighter.setHighlights(editor, decorations); |
26 | }, | 56 | }, |
57 | ctx.subscriptions, | ||
27 | ); | 58 | ); |
28 | } | 59 | } |
29 | 60 | ||
61 | interface PublishDecorationsParams { | ||
62 | uri: string; | ||
63 | decorations: Decoration[]; | ||
64 | } | ||
65 | |||
30 | export interface Decoration { | 66 | export interface Decoration { |
31 | range: lc.Range; | 67 | range: lc.Range; |
32 | tag: string; | 68 | tag: string; |
@@ -81,7 +117,7 @@ function createDecorationFromTextmate( | |||
81 | return vscode.window.createTextEditorDecorationType(decorationOptions); | 117 | return vscode.window.createTextEditorDecorationType(decorationOptions); |
82 | } | 118 | } |
83 | 119 | ||
84 | export class Highlighter { | 120 | class Highlighter { |
85 | private static initDecorations(): Map< | 121 | private static initDecorations(): Map< |
86 | string, | 122 | string, |
87 | vscode.TextEditorDecorationType | 123 | vscode.TextEditorDecorationType |