CodeBlanks Logo Icon CodeBlanks

Analyzer

dart analyzer ve plugin öğrenirsin.

Analyzer

analyzer paketi, Dart kaynak kodunu sözdizimsel bir ağaca (AST) çözümler. Kod üretimi ve lint denetimlerinin temelidir.

parseString(content: ...) bir ParseStringResult döndürür; .unit alanı CompilationUnit'i (AST kökü) verir. Düğümler arasında gezmek için ziyaretçi (visitor) deseni kullanılır.

RecursiveAstVisitor<T> her düğümü gezer; visitClassDeclaration, visitMethodDeclaration gibi metodları ezersin (override). Bu, kodu programlı olarak analiz etmenin standart yoludur.

Ziyaretçi deseni

Ziyaretçi deseni (visitor pattern), AST düğümlerini türüne göre gezmeyi sağlar. Her düğüm türü için ayrı bir visit... metodu çağrılır.

Örnek: sınıf adlarını toplamak için visitClassDeclaration metodunu ezersin. Her sınıf bildiriminde adını bir listeye eklersin.

Bu desen, kod analizi ve üretiminde yaygındır. source_gen ve custom_lint dahil birçok araç analyzer'ın ziyaretçi API'sini kullanır.

Uygulama Sınıf adı toplayıcı tanımla

Bir ElementInfo sınıfı tanımla: final String name; ElementInfo(this.name);. Bir ClassCollector sınıfı tanımla: final List<ElementInfo> classes = []; alanı ve void add(String name) => classes.add(ElementInfo(name)); metodu. main içinde final collector = ClassCollector(); yarat; collector.add('User') ve collector.add('Book') çağır; collector.classes.length yazdır; sonra for (final e in collector.classes) { print(e.name); } ile adları yazdır.

Başlangıç kodu

main.dart
void main() {
  // ElementInfo sınıfını tanımla (name alanı)
  // ClassCollector sınıfını tanımla (öğe listesi ve add metodu)
  // bir collector yarat; iki sınıf adı ekle; sayı ve adları yazdır
}

Örnek çözüm

main.dart
class ElementInfo {
  final String name;
  ElementInfo(this.name);
}

class ClassCollector {
  final List<ElementInfo> classes = [];
  void add(String name) => classes.add(ElementInfo(name));
}

void main() {
  final collector = ClassCollector();
  collector.add('User');
  collector.add('Book');
  print(collector.classes.length);
  for (final e in collector.classes) {
    print(e.name);
  }
}

Beklenen çıktı

2
User
Book

Soru ve cevaplar

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

1 analyzer ne üretir?

  • AST (sözdizimsel ağaç) Doğru cevap
  • Derlenmiş ikili
  • Sıkıştırılmış paket
  • Test raporu

Açıklama: analyzer kaynağı AST'ye çözümler.

2 Analyzer parçalarını eşleştir

Kavram Anlamı
parseString() Kaynak çözümleme
CompilationUnit AST kökü
RecursiveAstVisitor Ziyaretçi tabanı
LibraryElement Kütüphane öğesi

3 Ziyaretçi kalıtımı

Soru
class MyVisitor extends Recursive____Visitor<void> { }
Cevap
class MyVisitor extends RecursiveAstVisitor<void> { }

Açıklama: RecursiveAstVisitor tüm AST düğümlerini gezer.

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