Система диагностики
Система кодов ошибок
Коды ошибок группируются по категориям:
| Диапазон | Категория | Описание |
|---|---|---|
| E0xxx | Лексика/Синтаксис | Ошибки лексического и синтаксического анализа |
| E1xxx | Проверка типов | Несоответствие типов, необъявленные переменные и т.д. |
| E2xxx | Семантический анализ | Семантические ошибки |
| E4xxx | Дженерики/Trait | Ошибки системы дженериков и trait |
| E5xxx | Модули/Импорт | Ошибки системы модулей |
| E6xxx | Runtime | Ошибки времени выполнения |
| E7xxx | 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: вывод в текстовом формате с поддержкой цветов и символов UnicodeJsonEmitter: вывод в формате JSON для CI и LSP
