vscode: migrate highlighting to rust-analyzer-api.ts

This commit is contained in:
Veetaha 2020-02-25 00:49:54 +02:00
parent 21ab133966
commit 8c4409b3bb

View file

@ -1,5 +1,5 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as lc from 'vscode-languageclient'; import * as ra from './rust-analyzer-api';
import { ColorTheme, TextMateRuleSettings } from './color_theme'; import { ColorTheme, TextMateRuleSettings } from './color_theme';
@ -8,29 +8,25 @@ import { sendRequestWithRetry } from './util';
export function activateHighlighting(ctx: Ctx) { export function activateHighlighting(ctx: Ctx) {
const highlighter = new Highlighter(ctx); const highlighter = new Highlighter(ctx);
const client = ctx.client;
if (client != null) {
client.onNotification(
'rust-analyzer/publishDecorations',
(params: PublishDecorationsParams) => {
if (!ctx.config.highlightingOn) return;
const targetEditor = vscode.window.visibleTextEditors.find( ctx.client.onNotification(ra.publishDecorations, params => {
editor => { if (!ctx.config.highlightingOn) return;
const unescapedUri = unescape(
editor.document.uri.toString(), const targetEditor = vscode.window.visibleTextEditors.find(
); editor => {
// Unescaped URI looks like: const unescapedUri = unescape(
// file:///c:/Workspace/ra-test/src/main.rs editor.document.uri.toString(),
return unescapedUri === params.uri;
},
); );
if (!targetEditor) return; // Unescaped URI looks like:
// file:///c:/Workspace/ra-test/src/main.rs
highlighter.setHighlights(targetEditor, params.decorations); return unescapedUri === params.uri;
}, },
); );
} if (!targetEditor) return;
highlighter.setHighlights(targetEditor, params.decorations);
});
vscode.workspace.onDidChangeConfiguration( vscode.workspace.onDidChangeConfiguration(
_ => highlighter.removeHighlights(), _ => highlighter.removeHighlights(),
@ -45,13 +41,10 @@ export function activateHighlighting(ctx: Ctx) {
const client = ctx.client; const client = ctx.client;
if (!client) return; if (!client) return;
const params: lc.TextDocumentIdentifier = { const decorations = await sendRequestWithRetry(
uri: editor.document.uri.toString(),
};
const decorations = await sendRequestWithRetry<Decoration[]>(
client, client,
'rust-analyzer/decorationsRequest', ra.decorationsRequest,
params, { uri: editor.document.uri.toString() },
); );
highlighter.setHighlights(editor, decorations); highlighter.setHighlights(editor, decorations);
}, },
@ -60,17 +53,6 @@ export function activateHighlighting(ctx: Ctx) {
); );
} }
interface PublishDecorationsParams {
uri: string;
decorations: Decoration[];
}
interface Decoration {
range: lc.Range;
tag: string;
bindingHash?: string;
}
// Based on this HSL-based color generator: https://gist.github.com/bendc/76c48ce53299e6078a76 // Based on this HSL-based color generator: https://gist.github.com/bendc/76c48ce53299e6078a76
function fancify(seed: string, shade: 'light' | 'dark') { function fancify(seed: string, shade: 'light' | 'dark') {
const random = randomU32Numbers(hashString(seed)); const random = randomU32Numbers(hashString(seed));
@ -108,7 +90,7 @@ class Highlighter {
this.decorations = null; this.decorations = null;
} }
public setHighlights(editor: vscode.TextEditor, highlights: Decoration[]) { public setHighlights(editor: vscode.TextEditor, highlights: ra.Decoration[]) {
const client = this.ctx.client; const client = this.ctx.client;
if (!client) return; if (!client) return;
// Initialize decorations if necessary // Initialize decorations if necessary