CodeBlanks Logo Icon CodeBlanks

Meydan okuma 1: Compiler API

Compiler API ile bir analiz görevi çözersin.

Compiler API ile analiz

Bu meydan okumada Compiler API ile bir kaynak dosyayı analiz edeceksin. ts.createSourceFile ile kaynağı parse et, ts.forEachChild ile AST'yı gez, ts.isFunctionDeclaration ile fonksiyonları tanı. Fonksiyonların parametre sayılarını ve adlarını çıkaracaksın.

Uygulama Parametre sayılarını topla

function a(x: number) {} function b(y: string, z: number) {} kaynağından bir SourceFile oluştur. visit fonksiyonu yaz: her FunctionDeclaration'ın parametre sayısını topla. ts.forEachChild ile gez ve toplamı yazdır.

Başlangıç kodu

index.ts
import * as ts from "typescript";

// Kaynak: function a(x: number) {} function b(y: string, z: number) {}
// SourceFile oluştur
// visit fonksiyonu yaz: FunctionDeclaration bul
// Her fonksiyonun parametre sayısını topla
// forEachChild ile gez
// Toplamı yazdır

// kodunu buraya yaz

Örnek çözüm

index.ts
import ts from "typescript";

const sourceText = "function a(x: number) {} function b(y: string, z: number) {}";
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);

let total = 0;
function visit(node: ts.Node) {
  if (ts.isFunctionDeclaration(node)) {
    total += node.parameters.length;
  }
  ts.forEachChild(node, visit);
}
visit(sf);
console.log(total);

Beklenen çıktı

3

Uygulama Fonksiyon adlarını listele

function topla() {} function cikar() {} kaynağından bir SourceFile oluştur. visit fonksiyonu yaz: her FunctionDeclaration'ın adını node.name.text ile al ve yazdır. ts.forEachChild ile gez.

Başlangıç kodu

index.ts
import * as ts from "typescript";

// Kaynak: function topla() {} function cikar() {}
// SourceFile oluştur
// visit fonksiyonu yaz: FunctionDeclaration bul
// Her fonksiyonun adını yazdır
// forEachChild ile gez

// kodunu buraya yaz

Örnek çözüm

index.ts
import ts from "typescript";

const sourceText = "function topla() {} function cikar() {}";
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);

function visit(node: ts.Node) {
  if (ts.isFunctionDeclaration(node) && node.name) {
    console.log(node.name.text);
  }
  ts.forEachChild(node, visit);
}
visit(sf);

Beklenen çıktı

topla
cikar

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir FunctionDeclaration'ın parametre sayısına nasıl erişilir?

  • node.arguments.length
  • node.parameters.length Doğru cevap
  • node.params.length
  • node.args.length

Açıklama: FunctionDeclaration.parameters bir ReadonlyArray<ParameterDeclaration>'dır; length ile sayısı alınır. params, args veya arguments özellikleri yoktur.

2 Fonksiyon adını al

Soru
if (ts.isFunctionDeclaration(node) && node.name) {
  console.log(node.name.____);
}
Cevap
if (ts.isFunctionDeclaration(node) && node.name) {
  console.log(node.name.text);
}

Açıklama: Identifier.text tanımlayıcının yazısal değerini verir; value, name ve key Identifier üzerinde özellik değildir.

3 Compiler API analiz parçaları

Kavram Anlamı
ts.createSourceFile Kaynağı parse eder
ts.forEachChild AST'yı gezer
ts.isFunctionDeclaration Fonksiyon tanır
node.parameters Parametrelere erişir

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