TypeScript
AST ziyareti
forEachChild ile AST ziyaretini öğrenirsin.
forEachChild nedir?
ts.forEachChild(node, visitFn), bir AST düğümünün tüm doğrudan alt düğümlerini sırayla ziyaret eder ve her biri için visitFn'i çağırır. Özyinelemeli bir visit fonksiyonuyla tüm ağacı gezmenin temel yoludur.
import ts from "typescript";
const sf = ts.createSourceFile(
"app.ts", "const a = 1;", ts.ScriptTarget.Latest, true
);
function visit(node: ts.Node) {
console.log(ts.SyntaxKind[node.kind]);
ts.forEachChild(node, visit);
}
visit(sf);
SyntaxKind ve type guard'lar
Her düğümün bir .kind numarası vardır; ts.SyntaxKind[kind] ile adını alırsın. Belirli düğüm türlerini test etmek için ts.isIdentifier, ts.isFunctionDeclaration, ts.isVariableStatement gibi type guard'lar kullanılır.
function visit(node: ts.Node) {
if (ts.isIdentifier(node)) {
console.log(node.text);
}
ts.forEachChild(node, visit);
}
Uygulama Identifier'ları say
function topla(a: number, b: number): number { return a + b; } kaynağını ts.createSourceFile ile oluştur. Özyinelemeli bir visit fonksiyonu yaz; ts.isIdentifier ile Identifier düğümleri say ve ts.forEachChild ile alt düğümlere in. Toplam sayıyı yazdır.
Örnek çözümü göster
import ts from "typescript";
const sourceText = "function topla(a: number, b: number): number { return a + b; }";
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);
let count = 0;
function visit(node: ts.Node) {
if (ts.isIdentifier(node)) {
count++;
}
ts.forEachChild(node, visit);
}
visit(sf);
console.log(count);
Kendini test et
-
ts.forEachChild(node, fn) ne yapar?
- Düğümün metnini değiştirir
- Bir düğümün tüm alt düğümlerini sırayla ziyaret eder
- Tür denetimi yapar
- Yeni bir AST düğümü oluşturur
Cevabı göster
Bir düğümün tüm alt düğümlerini sırayla ziyaret eder — forEachChild bir düğümün doğrudan alt düğümlerini sırayla verilen fonksiyona geçirir; yeni düğüm üretmez, metin değiştirmez.
-
Identifier metni
function visit(node: ts.Node) {
if (ts.isIdentifier(node)) {
console.log(node.____);
}
ts.forEachChild(node, visit);
}
Cevabı göster
function visit(node: ts.Node) {
if (ts.isIdentifier(node)) {
console.log(node.text);
}
ts.forEachChild(node, visit);
}
-
AST ziyareti parçaları
- ts.forEachChild
- Alt düğümleri gezer
- node.kind
- Düğüm türü numarası
- ts.SyntaxKind[kind]
- Tür adını verir
- ts.isIdentifier(node)
- Düğüm Identifier mı
Sıradaki ders: Özet - Compiler API