From 9ccc56860107ed46f3abdc0f7c0d53766a3eded2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20Ochagav=C3=ADa?= Date: Sat, 6 Oct 2018 22:53:12 +0200 Subject: Dynamically apply highlightingOn config Fixes #84 --- editors/code/package.json | 2 +- editors/code/src/extension.ts | 47 +++++++++++++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 12 deletions(-) (limited to 'editors') diff --git a/editors/code/package.json b/editors/code/package.json index 305d6eaf1..9f05fe91a 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -111,7 +111,7 @@ ], "configuration": { "type": "object", - "title": "Rust Analyzer configuration", + "title": "Rust Analyzer", "properties": { "ra-lsp.highlightingOn": { "type": "boolean", diff --git a/editors/code/src/extension.ts b/editors/code/src/extension.ts index dc1792e94..fde6a480d 100644 --- a/editors/code/src/extension.ts +++ b/editors/code/src/extension.ts @@ -11,10 +11,22 @@ let uris = { let highlightingOn = true; export function activate(context: vscode.ExtensionContext) { - let config = vscode.workspace.getConfiguration('ra-lsp'); - if (config.has('highlightingOn')) { - highlightingOn = config.get('highlightingOn') as boolean; - } + let applyHighlightingOn = () => { + let config = vscode.workspace.getConfiguration('ra-lsp'); + if (config.has('highlightingOn')) { + highlightingOn = config.get('highlightingOn') as boolean; + }; + + if (!highlightingOn) { + removeHighlights(); + } + }; + + // Apply the highlightingOn config now and whenever the config changes + applyHighlightingOn(); + vscode.workspace.onDidChangeConfiguration(_ => { + applyHighlightingOn(); + }); let textDocumentContentProvider = new TextDocumentContentProvider() let dispose = (disposable: vscode.Disposable) => { @@ -130,7 +142,7 @@ export function activate(context: vscode.ExtensionContext) { }) }, null, context.subscriptions) vscode.window.onDidChangeActiveTextEditor(async (editor) => { - if (!editor || editor.document.languageId != 'rust') return + if (!highlightingOn || !editor || editor.document.languageId != 'rust') return let params: lc.TextDocumentIdentifier = { uri: editor.document.uri.toString() } @@ -179,7 +191,7 @@ function startServer() { let editor = vscode.window.visibleTextEditors.find( (editor) => editor.document.uri.toString() == params.uri ) - if (editor == null) return; + if (!highlightingOn || !editor) return; setHighlights( editor, params.decorations, @@ -213,10 +225,11 @@ class TextDocumentContentProvider implements vscode.TextDocumentContentProvider } } +let decorations: { [index: string]: vscode.TextEditorDecorationType } = {}; -const decorations: { [index: string]: vscode.TextEditorDecorationType } = (() => { +function initDecorations() { const decor = (obj: any) => vscode.window.createTextEditorDecorationType({ color: obj }) - return { + decorations = { background: decor("#3F3F3F"), error: vscode.window.createTextEditorDecorationType({ borderColor: "red", @@ -232,14 +245,26 @@ const decorations: { [index: string]: vscode.TextEditorDecorationType } = (() => attribute: decor("#BFEBBF"), literal: decor("#DFAF8F"), } -})() +} + +function removeHighlights() { + for (let tag in decorations) { + decorations[tag].dispose(); + } + + decorations = {}; +} function setHighlights( editor: vscode.TextEditor, highlights: Array ) { - if (!highlightingOn) { - return; + // Initialize decorations if necessary + // + // Note: decoration objects need to be kept around so we can dispose them + // if the user disables syntax highlighting + if (Object.keys(decorations).length === 0) { + initDecorations(); } let byTag: Map = new Map() -- cgit v1.2.3