Eligos, alat analisis kode statis untuk bahasa pemrograman Kotlin .
Dalam versi saat ini, kita dapat mendeteksi 13 CINT Bau berikut:
| Jenis | Label | Keterangan |
| Referensi melingkar | ? | Dua atau lebih kelas atau file memiliki saling ketergantungan yang membentuk loop tertutup |
| Parameter berlebihan | ? | Metode memiliki terlalu banyak argumen |
| Impor yang tidak digunakan | ? | Kelas, atribut, metode, atau paket yang telah diimpor ke dalam file, tetapi belum pernah digunakan |
| Metode yang kompleks | ? | Kompleksitas loop terlalu besar |
| Berikan koleksi yang tidak dapat diubah | ? | Kotlin menyediakan jenis koleksi yang tidak dapat diubah saat Java menelepon API Kotlin |
| Internal terpapar | ? | Java mengekspos deklarasi internal Kotlin kepada publik. |
| Penggunaan ekspresi platform yang tidak dapat ditentang | ? | Kotlin secara lokal menyebut metode java yang mengembalikan tipe null-agnostik, dan menggunakan hasil ini secara langsung dalam metode Kotlin yang mengharapkan argumen yang sepenuhnya non-nol |
| Penelepon platform yang tidak dapat ditaklukkan | ? | Hubungi metode atau akses properti yang tipe ekspresi peneleponnya adalah tipe platform di Kotlin. |
| Nullable diteruskan ke parameter platform | ? | Kotlin melewati parameter nullable ke metode Java yang mengambil parameter platform. |
| Jenis platform yang tidak dapat ditahan di properti | ? | Kotlin menyebut metode atau properti Java agnostik kosong dan menggunakan nilai ini sebagai nilai pengembalian pengambil untuk properti kelas |
| Fungsi pendamping non jvmstatic | ? | Fungsi publik dalam objek pendamping harus dijelaskan dengan @JVMStatic untuk diekspos sebagai metode statis. Tanpa anotasi, fungsi -fungsi ini hanya tersedia sebagai metode instance di bidang pendamping statis. |
| Nilai Non JVMfield Companion | ? | Properti publik, non-konstan yang merupakan konstanta yang efektif dalam objek pendamping harus dianotasi dengan @JVMField untuk diekspos sebagai bidang statis. |
| Nama JavaFacade yang tidak dapat dipahami | ? | Ketika sebuah file berisi fungsi atau properti tingkat atas, selalu anotasi dengan @file: jvmname ("foo") untuk memberikan nama yang bagus. ODY default, anggota tingkat atas dalam file myclass.kt akan berakhir di kelas yang disebut myclasskt yang tidak menarik dan bocor bahasa sebagai detail implementasi. |
| Mengabaikan pengecualian | ? | Fungsi yang dapat melempar pengecualian yang diperiksa harus mendokumentasikannya dengan @throws. Pengecualian runtime harus didokumentasikan dalam KDOC. Menjaga API yang didelegasikan oleh API karena mereka dapat melempar pengecualian yang diperiksa yang diizinkan oleh Kotlin secara diam -diam. |
| Kapan bukannya kaskade jika | ? | Jika pernyataan dengan terlalu banyak kaskade harus diganti dengan saat pernyataan |
| Fungsi ekspresi tunggal implisit | ? | Metode satu ekspresi Kotlin mengembalikan nilai tipe selain unit, tetapi tidak menentukan tipe pengembalian |
| Objek meluas | ? | Kelas yang dihiasi dengan objek Kotlin mewarisi dari yang dapat dilemparkan |
| Rekursi ekor yang dioptimalkan | ? | Fungsi rekursi ekor di Kotlin tidak menunjukkan bahwa itu adalah rekursif ekor |
Di meja, kuning adalah umum untuk Java Kotlin, hijau dihasilkan ketika Koltin Java saling memanggil, dan ungu unik untuk Kotlin.
git clone https://github.com/TnoAlex/Eligos.git| Lulusan | Kotlin | Level target Java | Versi JDK Min |
|---|---|---|---|
8.0+ | 1.9.10 | 17 | 17 |
./gradlew build # on linux
./gradlew.bat build # on windowseligos-cli/build/libs dan plugin yang dapat diinstal di eligos-plugin/build/distributions .Klone repo ini
git clone https://github.com/TnoAlex/Eligos.gitBangun gambar Docker
docker build -t eligos:1.0 .Jalankan Eligos oleh Docker
docker run -v $PROJECT :/dist/project -v $RESULT :/dist/result eligos:1.0 kotlin ./project ./result --with java Dalam perintah di atas, $PRJECT mengacu pada lokasi lokal item yang akan dianalisis, $RESULT lokasi di mana hasil lokal disimpan, pastikan semuanya ada sebelum menggunakan perintah ini . Dua folder yang terletak setelah parameter Kotlin adalah pemetaan Docker internal, yang diperbaiki.
Penggunaan alat CLI dapat dicantumkan oleh eligos --help , seperti berikut:
Usage: command-parser [<options>] <major language> <source path> [<result
output path>]
Options:
-w, --with=<text> Secondary languages that are analyzed in
collaboration with the primary language
-ecp, --class-path=<path> The classpath of the project to be analyzed.
(Default is source path and '.',If your project
has external jar dependencies, add the paths of
them)
-jh, --jdk-home=<path> The path of 'JAVA_HOME'. (Default is current jvm's
base dir)
-kv, --kotlin-v=<text> The version of kotlin in the project
-jt, --jvm-target=<text> The target of project's bytecode
-kl, --kotlin-lib=<path> The path of kotlin-std-lib. (Default is current
kotlin lib's path)
-p, --prefix=<text> The result file name prefix
-f, --format=(JSON|XML|HTML|TEXT)
The Presentation of results
-r, --rules=<path> Specify the rules to use
-D, --debug Out put exception stack
-Nr, --no-report Disable reporter (debug only)
-h, --help Show this message and exit
Arguments:
<major language> The major language to be analyzed
<source path> The path of source files
<result output path> The path to out put result
Jika YOB menggunakan pustaka pihak ketiga, atau menggunakan alat build seperti Maven atau Gradlle , silakan atur classpath yang benar sehingga alat dapat menemukan ketergantungan ini dan menghindari masalah bahwa beberapa dependensi eksternal tidak dapat diselesaikan.
Kami menyediakan mekanisme sederhana untuk memperluas Eligos. Langkah -langkah berikut memungkinkan Anda untuk membuat aturan yang menjadi milik Anda:
Buat prosesor file psi yang mengimplementasikan PsiProcessor , dan mendefinisikan masalah yang memperpanjang Issue
Tambahkan pendengar file psi dengan anotasi @EventListener dan laporkan masalah seperti ini:
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
context.reportIssue( MyIssue (hashSetOf(ktFile.virtualFilePath)))
}
}
class MyIssue ( affectedFiles : HashSet < String >) : Issue( AnalysisHierarchyEnum . FILE , affectedFiles, " My Issue " , null ) Buat aturan Anda dapat dipindai oleh manajer komponen dengan anotasi @Component seperti ini
@Component
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
} Jika Anda ingin aturan ini hanya dijalankan di plugin, silakan gunakan anotasi @Suitable
@Component
@Suitable( LaunchEnvironment . IDE_PLUGIN )
class MyProcessor : PsiProcessor {
@EventLinster
fun process ( ktFile : PsiFile ){
// do someting
}
}Itu saja? Jika Anda ingin menyesuaikan Eligos secara lebih rinci, silakan merujuk ke diagram Arsitektur Eligos, proses eksekusi.