0Pricing
TypeScript Academy · Урок

Обход 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 — локальная установка не требуется.

Все уроки этого курса

  1. Создание программы TypeScript с помощью API
  2. Обход AST с помощью посетителей
  3. Пользовательские преобразователи и генерация кода
  4. Создание простого инструмента проверки стиля кода
← Назад к TypeScript Academy