Skip to content

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

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

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

ДиапазонКатегорияОписание
E0xxxЛексика/СинтаксисОшибки лексического и синтаксического анализа
E1xxxПроверка типовНесоответствие типов, неопределённые переменные и т.д.
E2xxxСемантический анализСемантические ошибки
E4xxxGenerics/ТрейтыОшибки системы generics и traits
E5xxxМодули/ИмпортОшибки системы модулей
E6xxxRuntimeОшибки времени выполнения
E7xxxI/OОшибки I/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