Чтение сообщений об ошибках SWC

## Структура диагностических сообщений SWC Сообщения об ошибках в SWC формируются как диагностические записи, включающие несколько уровней информации: текстовое описание проблемы, контекст исходного кода, позиционные данные и дополнительные заметки компилятора. Основная цель такой структуры — обеспечить быстрое сопоставление ошибки с конкретным участком AST или строкой исходного файла. Типичное сообщение включает: * **тип ошибки (error / warning / note)** * **текст диагностики** * **позицию в исходном коде (line, column)** * **фрагмент кода (code frame)** * **внутренние коды диагностики** * **дополнительные пояснения (notes)** SWC стремится сохранять совместимость с форматами ошибок Babel и TypeScript, но при этом использует собственную систему диагностик, основанную на Rust-подобной модели ошибок. --- ## Базовый формат диагностического вывода В CLI-режиме сообщение об ошибке обычно представлено в текстовом виде: ``` error: Unexpected token × source.js:10:15 │ 10 │ const a = ; │ ^ ``` Ключевые элементы: * `error:` — уровень серьезности * описание проблемы * путь к файлу и позиция * визуальный указатель на место ошибки Внутренне SWC хранит это как структуру: ```ts { severity: "Error", message: "Unexpected token", location: { file: "source.js", line: 10, column: 15 } } ``` --- ## Code frame и локализация ошибки Code frame — один из наиболее информативных элементов диагностики. Он показывает контекст строки с ошибкой и визуально выделяет проблемный участок. Пример: ``` 8 │ function test() { 9 │ return 10 │ const x = 10; │ ^^^^^^ Unexpected token 11 │ } ``` Особенности формирования: * отображаются несколько строк до и после ошибки * используется моноширинное выравнивание * указатель `^` или подчеркивание указывает точный диапазон При синтаксических ошибках диапазон может охватывать целую конструкцию AST-узла, а не только один символ. --- ## Типы диагностических сообщений ### Синтаксические ошибки Возникают на этапе парсинга JavaScript/TypeScript. SWC использует парсер, написанный на Rust, поэтому ошибки формируются до этапа трансформации AST. Примеры: * пропущенные скобки * некорректные токены * нарушения грамматики ECMAScript ``` error: Unexpected token `}` × app.js:5:1 ``` Часто такие ошибки сопровождаются минимальным контекстом, так как парсер не всегда может восстановить AST. --- ### Ошибки трансформации AST Возникают во время работы плагинов или встроенных трансформаций (например, TypeScript → JavaScript, JSX → JS). Пример: ``` error: Failed to transform JSX element × component.tsx:12:8 ``` Причины: * некорректная структура AST * несовместимость плагина и версии SWC * нарушение ожидаемого типа узла --- ### Ошибки конфигурации `.swcrc` SWC активно использует JSON-конфигурацию, и ошибки в ней являются отдельной категорией диагностик. Пример: ``` error: Invalid configuration × .swcrc │ Unexpected field "jscx" ``` Характерные проблемы: * опечатки в ключах конфигурации * несовместимые опции * неверные типы значений SWC в таких случаях часто указывает путь до конкретного поля конфигурации, если возможно восстановить структуру JSON. --- ## Коды ошибок и диагностика Внутренняя система SWC может использовать коды диагностики, которые помогают классифицировать ошибку. Пример условного формата: ``` error[E1001]: Unexpected token error[E2203]: Invalid JSX syntax ``` Структура: * префикс `E` — ошибка * числовой код — категория * текстовое описание — человекочитаемая форма Коды полезны для: * автоматической обработки логов * интеграции с CI/CD * фильтрации ошибок по типам --- ## Многоуровневые сообщения (notes) SWC поддерживает вложенные диагностические заметки, расширяющие контекст ошибки. Пример: ``` error: Cannot find module note: imported here × index.js:2:1 ``` Структура notes: * дополнительная причина * цепочка вызовов * подсказки о происхождении ошибки Такие сообщения формируют цепочку диагностики, полезную при сложных трансформациях. --- ## Ошибки при работе с TypeScript При обработке TypeScript SWC может выявлять ошибки типов и синтаксиса. Пример: ``` error: Type annotations are not allowed here × file.ts:7:12 ``` Особенности: * SWC не выполняет полноценную type-checking систему как tsc * ошибки ограничены синтаксическим уровнем * типы рассматриваются как грамматические конструкции --- ## Ошибки JSX JSX-диагностика включает проверку структуры элементов: ``` error: Expected corresponding JSX closing tag for
× component.jsx:14:5 ``` Типичные случаи: * незакрытые теги * неверное вложение компонентов * использование зарезервированных имен --- ## Разбор позиции ошибки Позиционные данные включают: * `line` — номер строки * `column` — символ в строке * `span` — диапазон байтов или символов Пример внутренней структуры: ```ts { line: 15, column: 8, span: { start: 120, end: 128 } } ``` `span` особенно важен при трансформациях AST, так как позволяет точно сопоставить ошибку с исходным диапазоном после изменений кода. --- ## Работа с source maps При включённых source maps ошибки могут отображаться в исходном TypeScript/JSX, а не в сгенерированном JavaScript. Поведение: * ошибка трансформации → отображение в исходнике * ошибка рантайм-совместимости → маппинг через sourcemap * несоответствие маппинга → fallback на сгенерированный код Пример: ``` error: Unexpected token × src/app.tsx:22:9 ``` Даже если ошибка возникла в скомпилированном файле, SWC пытается восстановить оригинальную позицию через mapping table. --- ## Сложные цепочки ошибок При массовых ошибках SWC может агрегировать несколько диагностик: ``` error: Multiple errors occurred error[E1001]: Unexpected token error[E1002]: Invalid expression error[E1003]: Missing semicolon ``` Особенности: * ошибки группируются по фазам компиляции * каждая диагностика независима * порядок не всегда соответствует порядку в коде --- ## Практика интерпретации сообщений Чтение ошибок SWC сводится к последовательному анализу: 1. определение фазы (parse / transform / config) 2. анализ позиции (file + line + column) 3. проверка code frame 4. интерпретация message + code 5. анализ notes (если присутствуют) Особое значение имеет соотношение между AST-уровнем ошибки и текстовым представлением, поскольку SWC оперирует промежуточной структурой, а не только исходным кодом. --- ## Частые паттерны ошибок ### Незавершённые выражения ``` error: Unexpected end of input ``` Возникает при обрыве кода или незакрытых конструкциях. --- ### Несовместимость синтаксиса ``` error: Experimental syntax 'decorators' is not enabled ``` Связано с отсутствием соответствующих опций в `.swcrc`. --- ### Ошибки плагинов ``` error: Plugin transform failed ``` Обычно указывает на: * некорректный AST вход * исключение в пользовательском плагине * несовместимость версий --- ## Диагностика через логирование SWC позволяет выводить расширенные диагностические данные, полезные для анализа: * JSON-формат ошибок * структурированные AST-метаданные * трассировка этапов компиляции Пример JSON-ошибки: ```json { "severity": "Error", "code": "E1001", "message": "Unexpected token", "location": { "file": "index.js", "line": 3, "column": 10 } } ``` Такая форма удобна для интеграции с внешними инструментами анализа. --- ## Особенности интерпретации в больших проектах В монорепозиториях и сложных сборках диагностика SWC может включать: * агрегацию ошибок из разных пакетов * нормализацию путей файлов * кэширование диагностики между запусками При этом один и тот же тип ошибки может проявляться в разных слоях трансформации, что требует сопоставления span-диапазонов с исходными файлами через sourcemap цепочку.