VisitorによるASTの走査
構文木のノードをたどってコード構造を分析します。
「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.IdentifierforEachChild による走査
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- APIによるTypeScriptプログラムの作成
- VisitorによるASTの走査
- カスタムTransformerとコード生成
- 簡単なLintツールの構築