Skip to content

Система диагностики ​

Система кодов ошибок ​

Коды ошибок группируются по категориям:

ДиапазонКатегорияОписание
E0xxxЛексика/СинтаксисОшибки лексического и синтаксического анализа
E1xxxПроверка типовНесоответствие типов, необъявленные переменные и т.д.
E2xxxСемантический анализСемантические ошибки
E4xxxДженерики/TraitОшибки системы дженериков и trait
E5xxxМодули/ИмпортОшибки системы модулей
E6xxxRuntimeОшибки времени выполнения
E7xxxI/OОшибки ввода-вывода и системные ошибки
E8xxxВнутренниеВнутренние ошибки компилятора
W1xxxПредупрежденияМёртвый код, неиспользуемые переменные и т.д.

Структура данных Diagnostic ​

rust
pub struct Diagnostic {
    pub code: String,           // Код ошибки, например "E1001"
    pub severity: Severity,     // Error / Warning / Info / Hint
    pub message: String,        // Отрендеренное сообщение
    pub span: Option<Span>,     // Позиция в исходном коде
    pub help: Option<String>,   // Предложение по исправлению
    pub related: Vec<Box<Diagnostic>>,  // Связанные диагностики
}

Паттерн DiagnosticBuilder ​

Получение builder через ErrorCodeDefinition с цепочечным вызовом для установки параметров:

rust
let diagnostic = ErrorCodeDefinition::unknown_variable("x")
    .at(span)
    .help("did you mean 'y'?")
    .build();

Поддержка i18n ​

Заголовки и справочные тексты всех кодов ошибок управляются через I18nRegistry, поддерживается переключение между китайским и английским языками. Шаблоны сообщений поддерживают плейсхолдеры {param}.

Вывод Emitter ​

  • TextEmitter: вывод в текстовом формате с поддержкой цветов и символов Unicode
  • JsonEmitter: вывод в формате JSON для CI и LSP