AST ziyareti
- TypeScript kursu
- Uzman
- Ders 3/35
- 4 dk
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.
Başlangıç kodu
import * as ts from "typescript";
// Kaynak: function topla(a: number, b: number): number { return a + b; }
// SourceFile oluştur
// visit fonksiyonu yaz: Identifier düğümleri say
// forEachChild ile alt düğümlere in
// Toplam sayıyı yazdır
// kodunu buraya yazÖrnek çözüm
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);Beklenen çıktı
5
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 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 Doğru cevap
- Tür denetimi yapar
- Yeni bir AST düğümü oluşturur
Açıklama: forEachChild bir düğümün doğrudan alt düğümlerini sırayla verilen fonksiyona geçirir; yeni düğüm üretmez, metin değiştirmez.
2 Identifier metni
function visit(node: ts.Node) {
if (ts.isIdentifier(node)) {
console.log(node.____);
}
ts.forEachChild(node, visit);
}
function visit(node: ts.Node) {
if (ts.isIdentifier(node)) {
console.log(node.text);
}
ts.forEachChild(node, visit);
}
Açıklama: Identifier.text tanımlayıcının yazısal değerini verir; Identifier düğümünün name, value veya key özelliği yoktur.
3 AST ziyareti parçaları
| Kavram | Anlamı |
|---|---|
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ı |