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