Обработка ошибок в SWC строится вокруг принципа строгой типизации диагностик и максимально точного восстановления контекста исходного кода. Компилятор стремится не просто фиксировать факт сбоя, а сохранять структурированное описание ошибки, включая диапазон исходного текста, стадию компиляции и тип нарушения синтаксиса или семантики.
Внутри SWC ядро написано на Rust, и ошибки представлены как строго типизированные структуры. Каждая диагностическая запись включает:
Такой подход позволяет разделять этапы обнаружения проблемы: парсинг, трансформация AST, генерация кода и интеграционные фазы (например, работа через CLI или API).
Диагностическая модель отделена от логики компилятора, что делает ошибки предсказуемыми и сериализуемыми для внешних инструментов (bundler’ов, IDE и сборочных систем).
На раннем этапе компиляции — в swc_ecma_parser —
фиксируются синтаксические и лексические ошибки. Это наиболее частый
класс проблем, возникающих при обработке JavaScript и TypeScript.
Типовые категории:
Возникают при невозможности токенизации входного потока:
Такие ошибки фиксируются на уровне токенизатора и практически всегда считаются фатальными.
Обнаруживаются при построении AST:
await вне async-контекста)
Парсер SWC старается предоставлять максимально точное позиционирование, используя span-диапазоны, которые указывают не только на точку ошибки, но и на её предполагаемую область.
Ключевой механизм диагностики — система Span. Каждый узел
AST и каждая ошибка связаны с диапазоном символов исходного файла.
Span содержит:
Эта модель позволяет:
В сложных случаях, когда код проходит через несколько трансформационных стадий, SWC сохраняет цепочку span-преобразований.
При включении поддержки TypeScript (swc_ecma_parser с
TS-флагами) добавляется дополнительный слой диагностики.
SWC не выполняет полноценную типовую проверку, но фиксирует структурные ошибки:
Важно, что SWC отделяет синтаксический анализ TS от семантической типизации, оставляя последнюю внешним инструментам (например, TypeScript compiler API).
Ошибки JSX включают:
{}
JSX анализируется как расширение грамматики JavaScript, и ошибки здесь часто пересекаются с синтаксическими ошибками общего парсера.
После успешного построения AST начинается этап трансформаций
(swc_ecma_transforms). Здесь ошибки имеют иной характер:
они уже не синтаксические, а логические или структурные.
Категории ошибок трансформации:
Трансформеры ожидают строго определённые формы AST. Если узел повреждён или не соответствует ожидаемому паттерну, фиксируется ошибка трансформации.
SWC поддерживает plugin-based архитектуру (через WASM или внешние расширения). Ошибки здесь могут включать:
При включении оптимизирующих проходов:
Диагностическая система SWC разделяет ошибки по степени критичности.
Полностью прерывают компиляцию:
Позволяют продолжить компиляцию с деградацией функциональности:
Такой подход особенно важен для интеграции SWC в сборщики, где требуется частичная выдача результата даже при наличии проблем в отдельных модулях.
SWC способен собирать множественные ошибки за один проход. Вместо остановки на первой найденной проблеме компилятор может:
Этот механизм реализуется через error recovery стратегии в парсере. Они позволяют пропускать повреждённые участки кода и продолжать анализ следующих токенов.
Ошибки трансформации часто возникают уже после изменения структуры кода. Для корректного отображения позиции используется source map слой.
SWC:
В результате пользователь видит ошибку не в сгенерированном коде, а в оригинальном источнике.
При использовании SWC через CLI или @swc/core API добавляется
дополнительный слой ошибок:
.swcrc
В Node.js биндингах ошибки часто оборачиваются в стандартные
Error объекты, но с расширенными полями диагностики.
Типичная ошибка SWC включает:
E1001)
Сообщения формируются на уровне Rust ядра и затем сериализуются в формат, удобный для JavaScript окружения.
SWC часто используется в сборочных системах (Next.js, Vite-плагины через интеграции). В таких сценариях ошибки обрабатываются по стратегии:
Это достигается за счёт того, что каждый файл компилируется в отдельном контексте с собственным lifecycle ошибок.
При инкрементальной компиляции ошибки могут сохраняться между итерациями. SWC использует кеширование AST и результатов трансформаций, что накладывает требования:
Ошибки здесь рассматриваются как часть состояния компиляции, а не одноразовый результат.
SWC стремится сохранять максимальную устойчивость пайплайна:
Такая модель позволяет использовать компилятор в production-сборках без полной остановки пайплайна при единичных ошибках модулей