TypeScript Academy · レッスン

VisitorによるASTの走査

構文木のノードをたどってコード構造を分析します。

レッスン 2/413 ステップ

「VisitorによるASTの走査」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

AST とは

TypeScript はソースコードを抽象構文木(AST)に解析します。AST は、変数、関数、式などの言語構造を表すノードの木構造です。

import ts from "typescript";
const sf = ts.createSourceFile(
  "example.ts",
  "const x = 1;",
  ts.ScriptTarget.Latest
);

ノードの種類

すべての AST ノードにはkindプロパティがあります。これは、そのノードが何を表すかを示すts.SyntaxKindの enum 値です。

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 の走査

forEachChildと型ガード関数を使って TypeScript AST を走査します。型チェッカーと組み合わせることで、高度な静的解析ツールやコード生成ツールを構築できます。

理解度チェック

TypeScript AST で子ノードを再帰的に訪問する関数はどれですか?

学習内容

AST の走査では、ts.forEachChildと型ガード関数を使って TypeScript ファイル内のすべてのノードを走査・検査します。型チェッカーと組み合わせることで、リンター、コードアナライザー、リファクタリングツールを実現できます。

無料で開始

AI チューターと学ぶ TypeScript — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
101
レッスン
352

よくある質問

「VisitorによるASTの走査」レッスンは無料ですか?

はい。「VisitorによるASTの走査」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「VisitorによるASTの走査」で何を学びますか?

構文木のノードをたどってコード構造を分析します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「VisitorによるASTの走査」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. APIによるTypeScriptプログラムの作成
  2. VisitorによるASTの走査
  3. カスタムTransformerとコード生成
  4. 簡単なLintツールの構築
← TypeScript Academyに戻る