AST в SWC представляет собой строго типизированное дерево синтаксических узлов, в котором каждый элемент кода описывается отдельной структурой: идентификаторы, литералы, выражения, объявления функций, JSX-элементы и другие конструкции. Изменение узлов означает преобразование этих структур в процессе обхода дерева без изменения исходного текста напрямую.
Любая трансформация строится вокруг идеи неизменяемости входного дерева. Вместо редактирования узлов «на месте» создаются новые экземпляры, которые заменяют старые в результате обхода.
Каждый узел AST содержит:
Identifier,
CallExpression, BinaryExpression);
Изменение узлов заключается в том, чтобы:
Основной способ работы с AST в SWC — паттерн Visitor. Он позволяет описывать функции, которые вызываются при входе или выходе из конкретных типов узлов.
Обход дерева реализуется через трансформеры, где каждый тип узла может быть обработан отдельно:
null или эквивалента).
Visitor обеспечивает предсказуемую структуру изменений, особенно при сложных вложенных выражениях.
Трансформация в SWC строится через функцию, возвращающую новый AST:
В JavaScript API чаще всего используется пакет @swc/core, где
трансформации задаются через plugin или
transform.
Одной из самых частых операций является переименование переменных.
Принцип работы:
Identifier;
Пример логики трансформации:
count → totalCount
temp → _temp
При этом важно учитывать контекст, чтобы не затронуть свойства объектов или ключи.
Особенность SWC заключается в том, что идентификатор может встречаться в разных ролях:
Поэтому простая замена строки без проверки типа контекста приводит к некорректному коду.
Литералы (строки, числа, булевы значения) изменяются аналогичным образом:
Пример типовой трансформации:
“debug” → ““
0 → 1 (в тестовых режимах)
true → false
SWC требует создания нового узла литерала, а не изменения существующего поля.
Удаление узла осуществляется возвратом null в трансформере.
Это применяется, например, для:
console.log;
Вставка узлов выполняется через замену текущего узла на новый составной узел, например:
{ … } с дополнительными выражениями;
SequenceExpression.
Важно учитывать, что удаление узла может повлиять на синтаксическую
корректность, поэтому часто требуется замена на «пустой» эквивалент,
например undefined или пустой блок.
Выражения являются наиболее частым объектом трансформаций.
Типичные операции:
Пример:
2 + 2 → 4
x * 1 → x
true && expr → expr
Такие преобразования требуют анализа вложенных узлов и их типов.
При работе с JSX-деревом изменяются:
Пример трансформации:
<Button /> → <PrimaryButton />
className → cls
JSX-узлы в SWC представлены отдельной структурой, поэтому их обработка требует специализированных visitor-функций.
SWC позволяет комбинировать несколько трансформеров:
Композиция выполняется последовательно, где результат одного этапа становится входом для следующего.
Порядок трансформаций критичен:
При изменении узлов важно учитывать область видимости:
SWC использует механизмы hygiene (гигиены), чтобы предотвращать случайные конфликты имён при генерации нового AST.
Fold-трансформации позволяют не просто обходить дерево, а «сворачивать» узлы, заменяя их результатами вычислений.
Принцип:
Это особенно полезно для:
При работе с вложенными структурами важно:
null-узлы после удаления.
Пример типичной операции:
Изменение AST требует строгого соблюдения структурной целостности дерева: каждый возвращаемый узел должен быть валидным с точки зрения синтаксиса JavaScript/TypeScript.
Эффективность изменений узлов зависит от:
Оптимизация достигается через: