Сюлун
В разделе Быстрый старт к плагинам 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.
Оригинальный источник
Краткое руководство по подключаемым модулям VSCode: диагностическая информация
Луи Лю 26 августа 2019 г. 169 Автор Xulun В разделе «Краткое руководство по подключаемым модулям VSCode: расширения языка программирования мы… www.alibabacloud.com»