AST (Abstract Syntax Tree) в SWC представляет собой строго типизированную и иерархическую структуру, отражающую синтаксис JavaScript/TypeScript после парсинга исходного кода. Узлы AST формируются на основе спецификации ECMAScript и расширяются собственными типами SWC для поддержки современных возможностей языка и трансформаций.
Каждый узел AST в SWC имеет фиксированный набор полей, обеспечивающих идентификацию типа конструкции, её позицию в исходном коде, а также внутренние метаданные, используемые при трансформациях и генерации кода.
Практически все узлы AST в SWC содержат общий набор полей, определяемых через базовые интерфейсы:
type
Ключевое поле, определяющее разновидность узла.
“BinaryExpression”,
“FunctionDeclaration”, “Identifier”
span
Описание позиции узла в исходном коде.
Содержит:
start: начальная позиция
end: конечная позиция
ctxt: контекст (используется для внутренних целей
компилятора)
Это поле критично для:
comments
Необязательное поле, содержащее привязанные комментарии.
leading: комментарии перед узлом
trailing: комментарии после узла
inner: комментарии внутри конструкции
Корневой узел AST.
Содержит:
body: массив инструкций верхнего уровня
shebang: строка shebang (если присутствует)
span: диапазон всего файла
Применяется как контейнер для модулей и скриптов.
Представляет ES Module.
Поля:
body: список ModuleItem
span: границы модуля
type: всегда “Module”
ModuleItem включает:
ModuleDecl)
Описывает объявление переменной.
Основные поля:
kind: “var” | “let” | “const”
decls: массив VariableDeclarator
span
Один элемент объявления.
Содержит:
id: паттерн (Identifier или Object/Array pattern)
init: выражение инициализации (может быть
null)
span
Функция в декларативной форме.
Поля:
identifier: имя функции
params: список параметров
body: блок инструкций
generator: признак генератора
async: асинхронная функция
span
Объявление класса.
Содержит:
identifier: имя класса
class: структура Class
span
Базовый узел идентификатора.
Поля:
value: имя переменной
optional: флаг optional chaining контекста
span
Используется практически во всех синтаксических конструкциях.
value: строка
raw: исходное представление
span
value: число
raw: строковое представление
value: true | false
Не содержит дополнительных полей, кроме span.
Бинарные операции.
Поля:
left: левый операнд
operator: строка оператора (+, -,
*, /, ==, и др.)
right: правый операнд
span
Вызов функции.
Содержит:
callee: вызываемое выражение
arguments: массив аргументов
typeArguments: generics (для TypeScript)
span
Доступ к свойству объекта.
Поля:
object: объект
property: свойство
computed: доступ через []
optional: optional chaining (?.)
Условная конструкция.
Поля:
test: условие
consequent: блок при истинном условии
alternate: блок else (может отсутствовать)
span
Цикл for.
Поля:
init: инициализация
test: условие
update: обновление
body: тело цикла
Цикл while.
test: условие
body: тело
Возврат значения из функции.
argument: возвращаемое выражение (может быть
null)
Блок кода.
Содержит:
stmts: массив инструкций
span
Используется в функциях, циклах, условных конструкциях.
Аналог Module, используется для non-module контекста.
SWC поддерживает расширения TypeScript через дополнительные AST-узлы.
Интерфейс.
Поля:
id: имя интерфейса
body: описание свойств
typeParams: generics
Аннотация типа.
typeAnnotation: выражение типа
Ссылка на тип.
typeName: идентификатор типа
typeParams: параметры типа
Шаблонные строки.
Поля:
quasis: статические части
expressions: вставляемые выражения
Шаблон с тегом.
tag: функция-обработчик
template: TemplateLiteral
Используются в деструктуризации и объявлениях.
properties: список свойств
elements: элементы массива
argument: остаточный элемент (…rest)
AST-узлы SWC проектируются как неизменяемые структуры. Трансформации создают новые узлы, а не модифицируют существующие.
Поле type используется для строгой типизации:
Большинство сложных конструкций строится из базовых:
Это обеспечивает единообразие структуры и предсказуемость трансформаций.
Поле span присутствует практически в каждом узле,
обеспечивая:
AST SWC формирует строгую иерархию:
Program / Module
ModuleItem
Statement
ModuleDeclaration
Import / Export
Declaration
ExpressionStatement
Expression
Эта структура обеспечивает предсказуемую навигацию по дереву и упрощает реализацию трансформационных проходов (passes), используемых в компиляции и оптимизации кода.