aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/server.ts
blob: c1c95e00842622ffbd5c35e9a2803d61f3f10aef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import * as vscode from 'vscode';
import * as lc from 'vscode-languageclient'

import { Highlighter, Decoration } from './highlighting';

export class Config {
    highlightingOn = true;

    constructor() {
        vscode.workspace.onDidChangeConfiguration(_ => this.userConfigChanged());
        this.userConfigChanged();
    }

    userConfigChanged() {
        let config = vscode.workspace.getConfiguration('ra-lsp');
        if (config.has('highlightingOn')) {
            this.highlightingOn = config.get('highlightingOn') as boolean;
        };

        if (!this.highlightingOn) {
            Server.highlighter.removeHighlights();
        }
    }
}

export class Server {
    static highlighter = new Highlighter();
    static config = new Config();
    static client: lc.LanguageClient;


    static start() {
        let run: lc.Executable = {
            command: "ra_lsp_server",
            options: { cwd: "." }
        }
        let serverOptions: lc.ServerOptions = {
            run,
            debug: run
        };

        let clientOptions: lc.LanguageClientOptions = {
            documentSelector: [{ scheme: 'file', language: 'rust' }],
        };

        Server.client = new lc.LanguageClient(
            'ra-lsp',
            'rust-analyzer languge server',
            serverOptions,
            clientOptions,
        );
        Server.client.onReady().then(() => {
            Server.client.onNotification(
                "m/publishDecorations",
                (params: PublishDecorationsParams) => {
                    let editor = vscode.window.visibleTextEditors.find(
                        (editor) => editor.document.uri.toString() == params.uri
                    )
                    if (!Server.config.highlightingOn || !editor) return;
                    Server.highlighter.setHighlights(
                        editor,
                        params.decorations,
                    )
                }
            )
        })
        Server.client.start();
    }
}

interface PublishDecorationsParams {
    uri: string,
    decorations: Decoration[],
}