Обход AST с помощью посетителей
Обходите узлы синтаксического дерева, чтобы анализировать структуру кода
«Обход AST с помощью посетителей» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Что такое AST?
TypeScript разбирает исходный код в абстрактное синтаксическое дерево (AST) — дерево узлов, представляющих языковые конструкции, такие как переменные, функции и выражения.
import ts from "typescript";
const sf = ts.createSourceFile(
"example.ts",
"const x = 1;",
ts.ScriptTarget.Latest
);Виды узлов
Каждый узел AST имеет свойство kind — значение перечисления ts.SyntaxKind, указывающее, что он представляет.
import ts from "typescript";
// Common kinds:
// ts.SyntaxKind.VariableDeclaration
// ts.SyntaxKind.FunctionDeclaration
// ts.SyntaxKind.IdentifierОбход с помощью forEachChild
ts.forEachChild(node, visitor) вызывает Ваш обходчик для каждого непосредственного дочернего узла. Используйте рекурсию, чтобы обойти всё дерево.
function visit(node: ts.Node) {
if (ts.isFunctionDeclaration(node)) {
console.log("Function:", node.name?.text);
}
ts.forEachChild(node, visit);
}
visit(sourceFile);Функции проверки типов
TypeScript предоставляет функции проверки типов, такие как ts.isVariableDeclaration и ts.isFunctionDeclaration, для безопасного сужения типа узла.
ts.forEachChild(sf, node => {
if (ts.isClassDeclaration(node)) {
console.log("Class:", node.name?.getText());
}
if (ts.isInterfaceDeclaration(node)) {
console.log("Interface:", node.name.getText());
}
});Получение текста узла
Используйте node.getText(sourceFile), чтобы получить точный исходный текст узла, или node.getFullText(), чтобы включить служебные пробелы и комментарии.
ts.forEachChild(sf, node => {
if (ts.isIdentifier(node)) {
console.log("Id:", node.text);
}
});Позиции узлов
У каждого узла есть позиции pos и end — смещения в символах, которые можно использовать для поиска узлов в исходном коде.
ts.forEachChild(sf, node => {
console.log(node.kind, "at", node.pos, "-", node.end);
});Обход с помощью рекурсивной вспомогательной функции
Распространённая вспомогательная функция — это функция walk, которая рекурсивно применяет обходчик к каждому узлу дерева.
function walk(node: ts.Node, visitor: (n: ts.Node) => void) {
visitor(node);
ts.forEachChild(node, child => walk(child, visitor));
}Поиск всех вызовов функций
Используйте рекурсивный обход, чтобы найти все выражения вызова в исходном файле — это полезно для обнаружения использования API.
walk(sf, node => {
if (ts.isCallExpression(node)) {
const expr = node.expression.getText(sf);
console.log("Call:", expr);
}
});Доступ к родительским узлам
У узлов AST по умолчанию нет указателя на родительский узел. Вызовите ts.setParent(sourceFile) или используйте program.getSourceFile, который автоматически устанавливает родительские связи для программ.
// For manually created source files:
// (ts as any).setParents(sf);Использование TypeChecker с узлами
Объедините обход AST с проверяющим типы, чтобы определить тип TypeScript любого узла-выражения.
const checker = program.getTypeChecker();
walk(sf, node => {
if (ts.isExpression(node)) {
const type = checker.getTypeAtLocation(node);
console.log(checker.typeToString(type));
}
});Итоги: обход AST
Обходите AST TypeScript с помощью forEachChild и функций проверки типов. Объедините этот подход с проверяющим типы, чтобы создавать мощные инструменты статического анализа и генерации кода.
Быстрая проверка
Какая функция рекурсивно посещает дочерние узлы в AST TypeScript?
Что Вы узнали
Обход AST использует ts.forEachChild вместе с функциями проверки типов, чтобы обходить и проверять каждый узел в файле TypeScript. В сочетании с проверяющим типы это позволяет создавать линтеры, анализаторы кода и инструменты рефакторинга.
Часто задаваемые вопросы
Урок «Обход AST с помощью посетителей» бесплатный?
Да — полный текст урока «Обход AST с помощью посетителей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Обход AST с помощью посетителей»?
Обходите узлы синтаксического дерева, чтобы анализировать структуру кода Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Обход AST с помощью посетителей»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание программы TypeScript с помощью API
- Обход AST с помощью посетителей
- Пользовательские преобразователи и генерация кода
- Создание простого инструмента проверки стиля кода