Шаблон для множественной диагностики в коде Visual Studio без языкового сервера. - PullRequest
0 голосов
/ 09 февраля 2019

Я написал небольшой плагин для языка Visual Studio с подсветкой синтаксиса и автозаполнением.До сих пор это работало довольно хорошо.Теперь я хотел включить некоторую диагностику для проверки моего языка.

Я создал DiagnosticsCollection, как описано здесь

Для начала я "адаптировал" некоторый код этот официальный пример vs-кода .

'use strict';
import * as vscode from 'vscode';
import * as path from 'path';

export function activate(context: vscode.ExtensionContext) {

    const collection = vscode.languages.createDiagnosticCollection('test');
    if (vscode.window.activeTextEditor) {
        updateDiagnostics(vscode.window.activeTextEditor.document, collection);
    }
    context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(e => updateDiagnostics(e.document, collection)));

}

function updateDiagnostics(document: vscode.TextDocument, collection: vscode.DiagnosticCollection): void {
    if (document && path.basename(document.uri.fsPath) === 'sample-demo.rs') {
        collection.set(document.uri, [{
            code: '',
            message: 'cannot assign twice to immutable variable `x`',
            range: new vscode.Range(new vscode.Position(3, 4), new vscode.Position(3, 10)),
            severity: vscode.DiagnosticSeverity.Error,
            source: '',
            relatedInformation: [
                new vscode.DiagnosticRelatedInformation(new vscode.Location(document.uri, new vscode.Range(new vscode.Position(1, 8), new vscode.Position(1, 9))), 'first assignment to `x`')
            ]
        }]);
    } else {
        collection.clear();
    }
}

// this method is called when your extension is deactivated
export function deactivate() {
}

Это довольно чистое решение, когда есть только 1 проверка.Потому что либо есть одна ошибка, либо нет.(Коллекция установлена ​​или очищена)

Теперь мой вопрос: каков хороший способ разработки множественной диагностики?Конечно, я мог бы заполнить массив collection[] несколькими диагностическими объектами, но это также означает, что я должен удалить их один за другим, так как удаление одной ошибки не означает, что я могу использовать функцию clear на collection[].

...