Сюлун

В разделе Быстрый старт к плагинам VSCode: расширения языка программирования мы представили общую ситуацию с языковыми расширениями в VSCode. В этой части серии руководств мы начинаем вдаваться в некоторые подробности о диагностической информации, найденной в VSCode.

Диагностическая информация, особенно для сканирования кода, является важной функцией расширения языка. Такого рода диагностическая информация представлена ​​на основе VSCode.

Классы диагностической информации

В этой части этой серии руководств, состоящей из нескольких частей, давайте рассмотрим классы диагностической информации VSCode:

На приведенном выше рисунке вы можете увидеть основные классы диагностической информации:

  • Позиция: этот тип диагностической информации используется для определения координат символа в строке.
  • Диапазон: этот тип определяется двумя позициями: начальной и конечной точками.
  • Расположение: этот тип представляет собой URI, которому соответствует диапазон.
  • DiagnosticRelatedInformation: этот тип представляет собой сообщение о совпадении местоположения.
  • Диагностика: типом является строка сообщения, включающая диапазон и DiagnosticRelatedInformation.

Создание диагностической информации

Ниже мы создадим некоторую диагностическую информацию с помощью следующих шагов:

Создайте пример BASIC и сохраните его как test.bas:

dim i as integer
for i = 1 to 10 step 1
    for i = 1 to 10 step 1
        print "*";
    next i
next i

В этом примере переменная управления циклом повторно используется во внешнем и внутреннем циклах, что приводит к отказу внешнего цикла. Проблемный диапазон — это символы с 9-го по 10-й в строке 4. Позиция начинается с 0, поэтому мы строим диапазон от (3, 8) до (3, 9) с двумя позициями в качестве начала и конца.

new vscode.Range(
            new vscode.Position(3, 8), new vscode.Position(3, 9),
        )

Используя диапазон, а также сообщение с описанием проблемы и программу серьезности проблемы, можно создать диагностическую информацию.

let diag1: vscode.Diagnostic = new vscode.Diagnostic(
        new vscode.Range(
            new vscode.Position(3, 8), new vscode.Position(3, 9),
        ),
        'Repeated assignment of loop variables',
        vscode.DiagnosticSeverity.Hint,
    )

Один тип диагностической информации может быть создан с помощью диапазона, описательного сообщения и программы серьезности.

Кроме того, можно установить некоторую дополнительную информацию. Первый – это источник. Например, проблема исходит от определенной версии ESlint, потому что используется определенное правило. Это можно записать в свойство источник диагностической информации.

diag1.source = 'basic-lint';

Второй — это код ошибки, который полезен для классификации и запросов. Это представлено свойством code. Это может быть либо число, либо строка.

diag1.code = 102;

В-третьих, связанная информация. В приведенном выше примере i было присвоено значение, но мы можем дополнительно указать разработчикам, где ему было присвоено значение. Поэтому для поиска адреса кода требуется URI. Кроме того, для указания конкретного местоположения в URI требуется диапазон. Это структура vscode.Location.

diag1.relatedInformation = [new vscode.DiagnosticRelatedInformation(
        new vscode.Location(document.uri,
            new vscode.Range(new vscode.Position(2, 4), new vscode.Position(2, 5))),
        'First assignment')];

Затем мы объединяем их вместе и выводим сообщение об ошибке для test.bas выше. В основном он записывает указанную выше информацию о подсказке в переданный DiagnosticCollection.

import * as vscode from 'vscode';
import * as path from 'path';
export function updateDiags(document: vscode.TextDocument,
    collection: vscode.DiagnosticCollection): void {
    let diag1: vscode.Diagnostic = new vscode.Diagnostic(
        new vscode.Range(
            new vscode.Position(3, 8), new vscode.Position(3, 9),
        ),
        'Repeated assignment of loop variables',
        vscode.DiagnosticSeverity.Hint,
    );
    diag1.source = 'basic-lint';
    diag1.relatedInformation = [new vscode.DiagnosticRelatedInformation(
        new vscode.Location(document.uri,
            new vscode.Range(new vscode.Position(2, 4), new vscode.Position(2, 5))),
        'First assignment')];
    diag1.code = 102;
    if (document && path.basename(document.uri.fsPath) === 'test.bas') {
        collection.set(document.uri, [diag1]);
    } else {
        collection.clear();
    }
}

События, запускающие диагностическую информацию

Далее добавляем вызов только что написанной функции updateDiags в функцию activate плагина.

const diag_coll = vscode.languages.createDiagnosticCollection('basic-lint-1');
    if (vscode.window.activeTextEditor) {
        diag.updateDiags(vscode.window.activeTextEditor.document, diag_coll);
    }
    context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(
        (e: vscode.TextEditor | undefined) => {
            if (e !== undefined) {
                diag.updateDiags(e.document, diag_coll);
            }
        }));

Запустить его. Откройте test.bas во вновь запущенном VSCode, а затем произвольно отредактируйте код в конце, чтобы вызвать активацию. Рабочий интерфейс выглядит следующим образом:

Мы видим подсказку под переменной «i» в строке 4. Код ошибки — 102, а источник — basic-lint. Вторая строка — это информация DiagnosticRelatedInformation.

Оригинальный источник