## Поле `jsc.parser` в конфигурации SWC
### Назначение и место в архитектуре компиляции
В конфигурации SWC раздел `jsc` отвечает за поведение JavaScript/TypeScript-компилятора, а вложенное поле `parser` определяет, каким образом исходный код разбирается в абстрактное синтаксическое дерево (AST). Именно на этом этапе текст программы превращается в структурированное представление, пригодное для трансформаций, оптимизаций и генерации выходного кода.
Парсер является первой значимой стадией пайплайна SWC после чтения исходного файла. Любые ошибки или неточности в его настройке приводят к невозможности корректного построения AST, а значит — блокируют весь последующий процесс трансформации.
---
### Общая структура `jsc.parser`
Типичная конфигурация поля имеет вид:
```json
{
"jsc": {
"parser": {
"syntax": "ecmascript",
"jsx": false,
"dynamicImport": false,
"privateMethod": false,
"functionBind": false,
"exportDefaultFrom": false,
"exportNamespaceFrom": false,
"decorators": false,
"decoratorsBeforeExport": false,
"topLevelAwait": false,
"importAssertions": false
}
}
}
```
Каждое поле управляет поддержкой конкретного синтаксического расширения языка.
---
### `syntax`: выбор языка разбора
#### Возможные значения
* `"ecmascript"`
* `"typescript"`
* `"typescript"` с JSX (через отдельный флаг `tsx`)
#### Поведение
Поле `syntax` определяет базовый грамматический профиль:
* `ecmascript` — стандартный JavaScript без TypeScript-аннотаций
* `typescript` — расширенный парсер с поддержкой типов, интерфейсов и деклараций
* JSX поддерживается дополнительно через `jsx: true`
#### Влияние на AST
Выбор синтаксиса напрямую влияет на структуру дерева:
* В режиме `ecmascript` типы игнорируются (если они присутствуют — ошибка)
* В режиме `typescript` типовые узлы включаются в AST и далее могут быть удалены трансформером
---
### `jsx`: обработка JSX-выражений
#### Назначение
Флаг `jsx` включает поддержку JSX-синтаксиса:
```jsx
const element =
Hello
;
```
#### Поведение
* При `jsx: false` символ `<` интерпретируется как оператор сравнения
* При `jsx: true` активируется JSX-грамматика
#### Важные особенности
JSX в SWC не зависит от React напрямую. Это лишь синтаксический уровень. Трансформация JSX в вызовы функций происходит позже через плагины или пресеты.
---
### `tsx`: комбинация TypeScript + JSX
Хотя в некоторых конфигурациях используется `jsx`, в TypeScript-проектах часто активируется режим TSX.
#### Особенности:
* Разрешает одновременное использование типов и JSX
* Изменяет правила разбора угловых скобок
* Требует строгого разрешения неоднозначностей между generic и JSX-элементами
---
### `dynamicImport`: поддержка динамических импортов
```js
import("./module.js").then(m => m.run());
```
#### При `true`:
Парсер распознаёт `import()` как выражение.
#### При `false`:
`import` трактуется как синтаксическая ошибка вне статического контекста.
---
### `privateMethod`: приватные методы классов
```js
class A {
#secret() {}
}
```
#### Значение флага:
* `true` — разрешает парсинг приватных полей и методов
* `false` — синтаксическая ошибка при `#`
#### Влияние на AST:
Приватные методы формируют отдельные узлы класса, которые позже могут быть трансформированы в WeakMap или другие структуры (в зависимости от target).
---
### `functionBind`: оператор привязки функции
Поддержка устаревшего proposal:
```js
obj::method();
```
#### При включении:
Парсер принимает `::` как bind-оператор.
#### При выключении:
Синтаксическая ошибка.
---
### `exportDefaultFrom` и `exportNamespaceFrom`
Эти флаги управляют поддержкой нестандартных экспортных конструкций:
```js
export v from "module";
export * as ns from "module";
```
#### `exportDefaultFrom`
Позволяет синтаксис:
```js
export v from "mod";
```
#### `exportNamespaceFrom`
Поддерживает:
```js
export * as ns from "mod";
```
---
### `decorators` и `decoratorsBeforeExport`
Декораторы — один из наиболее сложных элементов синтаксиса, особенно в TypeScript и Stage-3 proposal.
#### `decorators`
Включает базовую поддержку:
```js
@readonly
class A {}
```
#### `decoratorsBeforeExport`
Указывает позицию декораторов:
* `true` — декоратор применяется до `export`
* `false` — после `export`
Различие критично, так как меняет порядок применения AST-трансформаций.
---
### `topLevelAwait`
Разрешает использование `await` вне async-функций:
```js
const data = await fetch(url);
```
#### При включении:
* Модуль интерпретируется как ES Module с поддержкой top-level await
* Влияет на кодогенерацию (часто требует async-обёрток в некоторых бандлерах)
---
### `importAssertions`
Поддержка импорт-assertions:
```js
import data from "./file.json" assert { type: "json" };
```
#### Поведение:
* Парсер распознаёт блок `assert { ... }`
* Формирует отдельный узел AST для assertions
---
### Взаимодействие параметров между собой
Поле `jsc.parser` не является набором независимых флагов. Многие комбинации влияют друг на друга:
#### JSX + TypeScript
* `syntax: "typescript"` + `jsx: true` → TSX режим
* Требует аккуратного разрешения грамматики generic/JSX
#### Decorators + Class Fields
* Часто используются вместе
* Порядок обработки влияет на итоговую структуру класса
#### Dynamic Import + Top-level Await
* Влияют на модульную систему
* Могут менять интерпретацию файла как ESM
---
### Ошибки конфигурации парсера
#### Конфликт JSX и syntax
При `syntax: "ecmascript"` и `jsx: false`:
```jsx
const x =
;
```
будет интерпретирован как ошибка или битовый сдвиг в зависимости от контекста.
---
#### Неподдерживаемые конструкции
Если флаг отключён, SWC выдаёт синтаксическую ошибку на этапе парсинга, не доходя до трансформации.
---
### Внутренняя роль `parser` в SWC pipeline
Этапы обработки:
1. Чтение исходного кода
2. Лексический анализ (tokenization)
3. Синтаксический анализ (`jsc.parser`)
4. Построение AST
5. Трансформации (`jsc.transform`)
6. Генерация кода
Парсер является критическим узлом, где определяется корректность дальнейшего компиляционного пути.
---
### AST-структуры, формируемые парсером
В зависимости от включённых флагов формируются дополнительные узлы:
* JSXElement
* TSInterfaceDeclaration
* TSTypeAnnotation
* Decorator
* ImportAssertion
* PrivateName
* DynamicImportExpression
Каждый тип узла влияет на нагрузку последующих трансформеров.
---
### Производительность парсинга
SWC использует Rust-реализацию парсера, что даёт:
* минимальные накладные расходы
* потоковую обработку токенов
* отсутствие необходимости в промежуточных строковых структурах
Конфигурация `jsc.parser` влияет не только на синтаксис, но и на количество активных ветвей грамматики, что отражается на скорости разбора.
---
### Практическое значение конфигурации
Правильная настройка `jsc.parser` обеспечивает:
* корректную интерпретацию современного JavaScript
* совместимость с TypeScript-проектами
* поддержку экспериментальных возможностей языка
* предсказуемость AST для трансформаций и плагинов
Неправильная настройка приводит к:
* ошибкам компиляции
* частичной потере синтаксических конструкций
* некорректной трансформации кода