Dart
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.
Örnek çözümü göster
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);
}
}
Kendini test et
-
analyzer ne üretir?
- AST (sözdizimsel ağaç)
- Derlenmiş ikili
- Sıkıştırılmış paket
- Test raporu
Cevabı göster
AST (sözdizimsel ağaç) — analyzer kaynağı AST'ye çözümler.
-
Analyzer parçalarını eşleştir
- parseString()
- Kaynak çözümleme
- CompilationUnit
- AST kökü
- RecursiveAstVisitor
- Ziyaretçi tabanı
- LibraryElement
- Kütüphane öğesi
-
Ziyaretçi kalıtımı
class MyVisitor extends Recursive____Visitor<void> { }
Cevabı göster
class MyVisitor extends RecursiveAstVisitor<void> { }
Sıradaki ders: Custom lint