dart analyze membaca kode Dart lalu melaporkan masalah yang ditemukan tanpa menjalankan programnya sedikit pun. Topik ini membahas cara membaca pesan pemeriksaan, cara mengaktifkan aturan pemeriksaan gaya melalui analysis_options.yaml, arti tingkat info, warning, dan error, serta cara menuntaskan pemeriksaan sampai keluaran No issues found! diperoleh. Seluruh contoh dijalankan dengan Dart SDK 3.13 pada proyek penghitung kata sederhana, sehingga setiap keluaran dapat direproduksi ulang.
Analisis statis tanpa menjalankan kode#
Analisis statis (static analysis) memeriksa program dengan membaca teksnya, bukan dengan mengeksekusinya. Pada Dart, pemeriksaan itu dilakukan oleh analyzer, yaitu komponen toolchain yang memeriksa tipe, nama, dan aturan bahasa pada setiap berkas sebelum program berjalan. Karena tidak ada eksekusi, pemeriksaan dapat dijalankan dengan aman kapan saja, termasuk pada kode yang masih setengah selesai. Masalah yang biasanya baru muncul saat program berjalan, seperti pemanggilan metode yang tidak ada, tertangkap lebih dulu oleh pemeriksaan ini.
Blok berikut menyiapkan proyek latihan, yaitu package penghitung_kata dengan satu berkas program pada folder bin. Versi pertamanya sengaja memuat beberapa masalah agar pesan pemeriksaan dapat diamati langsung. Proyek ini belum bergantung pada package apa pun, sehingga dart pub get belum diperlukan pada tahap ini.
# buat proyek penghitung kata dari nol
rm -rf ~/contoh/alat-dan-kualitas/dart-analyze/penghitung_kata
mkdir -p ~/contoh/alat-dan-kualitas/dart-analyze/penghitung_kata/bin
cd ~/contoh/alat-dan-kualitas/dart-analyze/penghitung_kata
export PATH=/home/kal/dart-sdk/bin:$PATH
cat > pubspec.yaml <<'EOF'
name: penghitung_kata
description: Penghitung kata sederhana untuk latihan dart analyze.
version: 1.0.0
environment:
sdk: ^3.13.0
EOF
cat > bin/penghitung_kata.dart <<'EOF'
import 'dart:math';
int hitungKata(String teks) {
var kata = teks.trim().split(RegExp(r'\s+'));
var kataBersih = kata.where((item) => item.isNotEmpty).toList();
return kataBersih.length;
}
void main() {
var teks = "Penghitung kata membantu menulis dengan penuh perhatian";
var belumDipakai = 42;
var jumlah = hitungKata(teks);
print('jumlah kata: ${jumlah.toUpperCase()}');
}
EOFPemeriksaan dijalankan dengan perintah berikut.
# periksa seluruh proyek
dart analyzeAnalyzing penghitung_kata...
error - bin/penghitung_kata.dart:13:32 - The method 'toUpperCase' isn't defined for the type 'int'. Try correcting the name to the name of an existing method, or defining a method named 'toUpperCase'. - undefined_method
warning - bin/penghitung_kata.dart:1:8 - Unused import: 'dart:math'. Try removing the import directive. - unused_import
warning - bin/penghitung_kata.dart:11:7 - The value of the local variable 'belumDipakai' isn't used. Try removing the variable or using it. - unused_local_variable
3 issues found.Setiap pesan pada keluaran memuat empat bagian yang selalu sama, yaitu tingkat keparahan, lokasi berkas beserta nomor baris dan kolomnya, isi masalah, dan kode aturan. Kode aturan seperti undefined_method dan unused_import membuat penjelasan resminya mudah dicari. Pesan pertama adalah error karena metode toUpperCase tidak dimiliki oleh tipe int, sedangkan dua pesan berikutnya adalah warning berupa import dart:math dan variabel belumDipakai yang tidak pernah digunakan. Banyak pesan juga ditutup dengan saran berawalan Try yang langsung menunjukkan arah perbaikannya. Apabila pemeriksaan menemukan error atau warning, perintah ditutup dengan kode keluar bukan nol sehingga hasilnya mudah dipasangkan dengan alat otomatis. Pesan info saja tidak mengubah kode keluar.
Mengaktifkan aturan linter dengan analysis_options.yaml#
Analyzer dapat diperluas dengan linter, yaitu pemeriksa gaya dan kebiasaan penulisan yang bekerja melalui aturan (rule) yang dipilih satu per satu. Pada proyek tanpa berkas konfigurasi analisis, tidak ada aturan linter yang aktif, sehingga pelanggaran gaya lolos tanpa pesan. Berkas analysis_options.yaml pada akar proyek menjadi tempat pengaturannya, dan setiap nama aturan pada daftar rules mengaktifkan satu pemeriksaan. Dua aturan berikut dipilih karena keduanya mengubah kebiasaan yang langsung terlihat, yaitu penggunaan final untuk variabel lokal dan penggunaan kutip tunggal untuk string.
linter:
rules:
- prefer_final_locals
- prefer_single_quotes# tulis analysis_options.yaml lalu periksa ulang
cat > analysis_options.yaml <<'EOF'
linter:
rules:
- prefer_final_locals
- prefer_single_quotes
EOF
dart analyzeAnalyzing penghitung_kata...
error - bin/penghitung_kata.dart:13:32 - The method 'toUpperCase' isn't defined for the type 'int'. Try correcting the name to the name of an existing method, or defining a method named 'toUpperCase'. - undefined_method
warning - bin/penghitung_kata.dart:1:8 - Unused import: 'dart:math'. Try removing the import directive. - unused_import
warning - bin/penghitung_kata.dart:11:7 - The value of the local variable 'belumDipakai' isn't used. Try removing the variable or using it. - unused_local_variable
info - bin/penghitung_kata.dart:4:3 - Local variables should be final. Try making the variable final. - prefer_final_locals
info - bin/penghitung_kata.dart:5:3 - Local variables should be final. Try making the variable final. - prefer_final_locals
info - bin/penghitung_kata.dart:10:3 - Local variables should be final. Try making the variable final. - prefer_final_locals
info - bin/penghitung_kata.dart:10:14 - Unnecessary use of double quotes. Try using single quotes unless the string contains single quotes. - prefer_single_quotes
info - bin/penghitung_kata.dart:11:3 - Local variables should be final. Try making the variable final. - prefer_final_locals
info - bin/penghitung_kata.dart:12:3 - Local variables should be final. Try making the variable final. - prefer_final_locals
9 issues found.Enam pesan info baru muncul setelah berkas konfigurasi dibaca, yaitu lima pelanggaran prefer_final_locals dan satu pelanggaran prefer_single_quotes. Tingkat info tidak menandai kebenaran kode, tetapi kebiasaan penulisan, sehingga program yang masih berisi pesan info tetap dapat dijalankan. Urutan pesan tetap mengutamakan tingkat yang lebih tinggi, yaitu error dan warning didahulukan sebelum info. Nama aturan pada akhir setiap pesan menunjuk aturan yang dilanggar, sehingga halaman dokumentasi aturannya mudah ditemukan.
Memperbaiki sampai bersih#
Urutan perbaikan mengikuti tingkat pesannya, yaitu error didahulukan karena menghalangi jalannya program, lalu warning, dan info paling akhir. Dengan mengikuti saran pada setiap pesan, baris import 'dart:math'; dihapus, variabel belumDipakai dibuang, pemanggilan toUpperCase pada int diganti dengan interpolasi biasa, seluruh variabel lokal diubah menjadi final, dan tanda kutip ganda diganti dengan kutip tunggal. Hasil akhirnya adalah berkas berikut.
int hitungKata(String teks) {
final kata = teks.trim().split(RegExp(r'\s+'));
final kataBersih = kata.where((item) => item.isNotEmpty).toList();
return kataBersih.length;
}
void main() {
final teks = 'Penghitung kata membantu menulis dengan penuh perhatian';
final jumlah = hitungKata(teks);
print('jumlah kata: $jumlah');
}# tulis versi bersih lalu periksa ulang
cat > bin/penghitung_kata.dart <<'EOF'
int hitungKata(String teks) {
final kata = teks.trim().split(RegExp(r'\s+'));
final kataBersih = kata.where((item) => item.isNotEmpty).toList();
return kataBersih.length;
}
void main() {
final teks = 'Penghitung kata membantu menulis dengan penuh perhatian';
final jumlah = hitungKata(teks);
print('jumlah kata: $jumlah');
}
EOF
dart analyzeAnalyzing penghitung_kata...
No issues found!Program yang sudah bersih dijalankan sekali untuk memastikan perilakunya tetap benar.
# jalankan program yang sudah bersih
dart run bin/penghitung_kata.dartjumlah kata: 7Keluaran No issues found! adalah kondisi akhir yang biasanya dijadikan syarat sebelum commit. Tujuh kata pada kalimat uji dihitung tepat karena pola \s+ menggabungkan spasi berlebih menjadi satu pemisah. Program yang bersih tersebut juga lebih mudah dibaca, karena variabel final menandai nilai yang tidak pernah ditulis ulang dan kutip tunggal menghindarkan penulisan escape saat string memuat tanda kutip ganda.
Kesalahan umum#
Kesalahan yang umum terjadi saat menyunting analysis_options.yaml adalah salah ketik nama aturan. Nama yang tidak dikenal tetap dilaporkan, dan lokasinya menunjuk berkas konfigurasi itu sendiri, bukan berkas program. Blok berikut menuliskan aturan prefer_finale_locals yang salah ketik, menjalankan pemeriksaan, lalu memulihkan isi berkasnya.
# tulis nama aturan yang salah ketik lalu periksa
cat > analysis_options.yaml <<'EOF'
linter:
rules:
- prefer_finale_locals
EOF
dart analyze
# pulihkan isi berkas konfigurasi
cat > analysis_options.yaml <<'EOF'
linter:
rules:
- prefer_final_locals
- prefer_single_quotes
EOFAnalyzing penghitung_kata...
warning - analysis_options.yaml:3:7 - 'prefer_finale_locals' isn't a recognized lint rule. Try using the name of a recognized lint rule. - undefined_lint
1 issue found.Pesan warning dengan kode undefined_lint menyebut nama aturan yang tidak dikenal beserta barisnya pada analysis_options.yaml. Penyebabnya murni salah ketik, dan perbaikannya adalah menggunakan nama resmi yang terdaftar pada halaman Linter rules dart.dev. Berkas konfigurasi ikut diperiksa seperti berkas program, sehingga masalah konfigurasi tidak bersembunyi. Setelah isi berkas dipulihkan pada blok yang sama, pemeriksaan kembali berakhir dengan No issues found!.
Ringkasan#
dart analyzememeriksa kode tanpa menjalankannya dan melaporkan setiap masalah dengan tingkat, lokasi berkas beserta baris dan kolomnya, isi masalah, serta kode aturan.- Tingkat pesan tersusun dari info, warning, dan error, dan setiap pesan umumnya ditutup dengan saran berawalan
Try. - Aturan linter diaktifkan melalui
analysis_options.yamldan pelanggarannya dilaporkan sebagai pesan info, sedangkan nama aturan yang salah ketik dilaporkan sebagaiundefined_lint. - Tujuan akhir setiap perbaikan adalah keluaran
No issues found!dengan program yang tetap berjalan benar.
Referensi#
- dart analyze — dart.dev — Dokumentasi resmi perintah dart analyze beserta perilaku dasarnya.
- Customizing static analysis — dart.dev — Panduan mengatur analyzer dan linter melalui analysis_options.yaml.
- Linter rules — dart.dev — Daftar aturan linter resmi beserta penjelasan tiap aturan.