CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

index.ts
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

index.ts
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

Soru
function visit(node: ts.Node) {
  if (ts.isIdentifier(node)) {
    console.log(node.____);
  }
  ts.forEachChild(node, visit);
}
Cevap
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ı

Uzman bölümündeki tüm dersler