CodeBlanks Logo Icon CodeBlanks

Diagnostic üretimi

Kendi diagnostic'lerini üretmeyi öğrenirsin.

Konum bilgisi

Bir kural ihlali bulunduğunda hatayı konum bilgisiyle raporlarsın. node.getStart(sourceFile) düğümün başlangıç offsetini verir; ts.getLineAndCharacterOfPosition(sf, offset) ise { line, character } nesnesi döndürür. line 0-indekslidir.

const start = node.getStart(sf);
const { line } = ts.getLineAndCharacterOfPosition(sf, start);
console.log(`line ${line + 1}: hata`);

Hata toplama

Hataları tek seferde toplamak için bir dizi kullanırsın. Her ihlalde errors.push(...) ile metin eklersin, en sonunda errors.join("\n") ile yazdırırsın. Bu kalıp TypeScript'in kendi diagnostic mekanizmasına benzer.

const errors: string[] = [];
// ihlal bulunca:
errors.push(`line ${line + 1}: mesaj`);
console.log(errors.join("\n"));

Uygulama any türlerini raporla

Her biri ayrı satırda olmak üzere üç değişken içeren bir kaynak oluştur: let a: any = 1;, let b: number = 2; ve let c: any = 3;. visit fonksiyonu yaz: tür eklemesi any olan VariableDeclaration düğümlerini bul ve satır numarasıyla bir hatayı listeye topla. ts.forEachChild ile gez, sonuçları her satırda bir tane olacak biçimde yazdır.

Başlangıç kodu

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

// Üç satırlık kaynak: let a: any = 1; / let b: number = 2; / let c: any = 3;
// SourceFile oluştur
// visit fonksiyonu yaz: any türü olan VariableDeclaration bul
// Satır numarasıyla hatayı topla
// forEachChild ile gez
// Hataları her satırda bir tane olarak yazdır

// kodunu buraya yaz

Örnek çözüm

index.ts
import ts from "typescript";

const sourceText = 'let a: any = 1;\nlet b: number = 2;\nlet c: any = 3;';
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);

const errors: string[] = [];
function visit(node: ts.Node) {
  if (ts.isVariableDeclaration(node) && node.type?.kind === ts.SyntaxKind.AnyKeyword) {
    const { line } = ts.getLineAndCharacterOfPosition(sf, node.getStart(sf));
    errors.push(`line ${line + 1}: any`);
  }
  ts.forEachChild(node, visit);
}
visit(sf);
console.log(errors.join("\n"));

Beklenen çıktı

line 1: any
line 3: any

Soru ve cevaplar

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

1 ts.getLineAndCharacterOfPosition(sf, offset) ne döndürür?

  • { line, character } nesnesi Doğru cevap
  • Sadece line numarası
  • Bir offset numarası
  • Bir Type nesnesi

Açıklama: getLineAndCharacterOfPosition bir { line, character } nesnesi döndürür; line 0-indekslidir. Type, tek line numarası veya offset döndürmez.

2 Satır numarasını al

Soru
const start = node.getStart(sf);
const pos = ts.____(sf, start);
console.log(pos.line + 1);
Cevap
const start = node.getStart(sf);
const pos = ts.getLineAndCharacterOfPosition(sf, start);
console.log(pos.line + 1);

Açıklama: ts.getLineAndCharacterOfPosition bir { line, character } nesnesi döndürür; getLineOfPosition, getPosition ve getLineNumber diye yöntemler yoktur.

3 Hata raporlama parçaları

Kavram Anlamı
node.getStart(sf) Başlangıç offsetini verir
getLineAndCharacterOfPosition Satır ve sütun verir
errors.push Hatayı listeye ekler
errors.join Listeyi metne çevirir

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