IDE untuk pengembangan LUA yang diketik secara statis.
Berasal dari emmylua.

self adalah tipe nyata@shape@not Tipe Casts@type anotasi pada pernyataan pengembalian 






Rilis terbaru tersedia untuk diunduh dalam Intellij atau dari situs web Plugin JetBrains.
Luanalisis berasal dari Emmylua dan mendukung semua fungsi pengeditan dan refactoring dasar yang disediakan oleh Emmylua.
Di luar kemampuan pengeditan LUA dasar, Luanalisis mendukung sejumlah besar fungsi tambahan yang diperlukan untuk mengetikkan basis kode canggih secara statis.
*Catatan*: Fitur secara kasar tercantum dalam urutan yang diimplementasikan, tidak berarti urutan kepentingan.
Cara yang bagus untuk melihat apa yang mungkin dalam hal pengetikan statis adalah dengan memeriksa proyek demo Luanalisis.

Selain mendefinisikan tipe baru, tag @type sekarang juga dapat digunakan untuk memberikan hasil ekspresi LUA.
Ini paling berguna dengan dukungan yang baru ditambahkan untuk komentar blok emmydoc karena kami dapat dengan mudah menentukan jenis gips inline:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/type_casts.lua
Emmylua berupaya menentukan apakah suatu jenis ditugaskan untuk tipe lain hanya dengan memeriksa apakah yang pertama adalah "subtipe" dari yang terakhir, namun jenis varian tipe yang tepat dari tipe kompleks tidak diimplementasikan. Misalnya, fungsi mungkin kovarian atau bertentangan dari jenis fungsi lainnya, tergantung pada parameter dan jenis nilai pengembalian:

Emmylua tidak melaporkan kesalahan di atas.
Selain itu, deteksi varians serikat telah diperbaiki:

Seperti di atas, rilis Emmylua saat ini tidak menangkap kesalahan ini.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/string_lerals.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics_scope.lua
IE Type Checking sekarang berfungsi di dalam fungsi "lambdas" yang ditetapkan untuk variabel dengan definisi emmydoc.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/lambda_params.lua
Berbagai perbaikan, misalnya emmydoc "array" sekarang ditugaskan untuk jenis tabel yang kompatibel misalnya misalnya

Rilis Emmylua saat ini akan melaporkan kesalahan di sini meskipun ini suara.
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/tables.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l-l249
Rilis emmylua saat ini tidak dapat menyimpulkan obat generik dengan benar dalam beberapa situasi dan dengan demikian melaporkan jenis kesalahan di mana tidak ada kesalahan, dan juga kehilangan kesalahan di mana kesalahan harus ada misalnya
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l15444
Secara default, ketik kesalahan keselamatan sekarang dilaporkan sebagai kesalahan, bukan peringatan. Ini dibuat layak oleh tiga hal:
Banyak peningkatan dalam kemampuan untuk menentukan jenis yang kompleks
Ketik Perbaikan Bug Keselamatan
Pengecoran
Casting secara khusus berarti bahwa jika pengguna melakukan sesuatu, sistem tipe dianggap tidak aman, tetapi mereka tahu saat runtime akan baik -baik saja, mereka hanya dapat menambahkan gips untuk menandakan ini dan kesalahan akan hilang.

Membayangi parameter generik dilarang dan laporan kesalahan:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_scope.luA

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.luaa#l444444444444444444444444444448
self adalah tipe nyata Pemeriksaan tipe yang ditingkatkan untuk self , misalnya self dapat ditugaskan ke variabel yang cocok dengan tipe induk dari suatu metode. Namun, tipe orang tua itu tidak dapat ditugaskan untuk self , karena kelas dapat dibahas (dalam hal ini self mengacu pada jenis yang lebih spesifik).

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/self.lua

Rilis Emmylua saat ini akan memungkinkan penugasan yang tidak valid ini.
Ketika suatu fungsi mengembalikan beberapa nilai, rilis emmylua saat ini akan menyimpulkan nilai dan menempatkannya di cache. Ini tidak akurat karena analisis tipe generik dapat mengakibatkan parameter generik yang sama diselesaikan secara berbeda berdasarkan nilai yang ditetapkan, sehingga cache tidak dapat digunakan dalam keadaan ini. Saat ini ini menghasilkan kesalahan yang hilang, dan kesalahan tambahan yang tidak akurat, tergantung pada penugasan.
@shapeSuatu bentuk dapat didefinisikan secara serupa dengan kelas, kecuali bahwa kontra ditentukan oleh kompatibilitas anggota bukan hierarki warisan.
Ini paling berguna saat bekerja dengan "struktur" (mis. Kelas OOP.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua
Apa yang membuat bentuk sangat berguna adalah bahwa mereka mendukung generik dan warisan (pada waktu definisi, bukan penugasan) seperti kelas:
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua#l36-l74
Bahkan lebih baik , inspeksi tipe tidak hanya dilaporkan pada `table`s yang tidak kompatibel secara keseluruhan, tetapi lebih tepatnya inspeksi tahu bagaimana melintasi literal tabel dan memberikan anotasi rinci ketidakcocokan antara dua bentuk misalnya

Alias sekarang dapat mengambil parameter generik, seperti kelas atau bentuk.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_alias.lua
Jenis fungsi sekarang dapat menggunakan …: T sebagai alternatif untuk vararg T :

Kami sekarang mendukung nilai pengembalian variadik:

Secara internal, TyTuple telah diganti dengan TyMultipleResults untuk mencerminkan fakta bahwa konstruk ini bukan ukuran tetap. Selain itu, beberapa hasil sekarang ditangani dengan baik di lebih banyak lokasi.
Berbagai perbaikan pada pengetikan Lua Built-In mengambil keuntungan dari nilai pengembalian variadik dll.
Kami sekarang dapat mengetik semua properti tabel, bukan hanya konstanta string. Mengingat bahwa luanalisis juga menambah dukungan untuk tipe literal primitif kita dapat menggunakan ini banyak cara berbeda misalnya

Di sini kita memiliki bidang pengidentifikasi string reguler, bidang literal angka [1] , [2] dan [3] dan bidang [boolean] . Yang terakhir itu sangat kuat, karena itu bukan konstan, itu tipe yang nyata.
Kami dapat mengetik struktur data khusus misalnya
--- @class Dictionary < K , V >
--- @field [ K] V Ini akan bekerja dengan benar untuk setiap K dan semuanya akan diperiksa secara statis seperti yang Anda harapkan.
Ada juga sintaks untuk jenis tabel, ini berfungsi untuk literal tabel dan kelas anonim (yaitu tabel yang tidak diketik secara eksplisit):

Kami sekarang mendukung tipe fun dengan daftar parameter opsional dan nilai pengembalian opsional yaitu fun: boolean dan fun(arg: boolean) . fun (dengan tidak ada yang ditentukan) juga berfungsi untuk anak cucu tetapi secara fungsional setara dengan tipe function yang ada.
Fungsi yang diketik sebagian sangat berguna untuk mengimplementasikan pola panggilan balik dan pawang. Misalnya, cukup umum untuk memiliki sistem acara yang dapat diperluas di mana setiap peristiwa memiliki argumen yang unik, tetapi pawang harus kembali true untuk menunjukkan acara tersebut ditangani:

Ini adalah fitur lain yang sangat berguna. Kita sekarang dapat dengan benar menunjukkan bahwa suatu objek dapat dipanggil (yaitu adalah table yang metatable memiliki metode __call ).

Ini dilakukan dengan menggunakan kata kunci @overload EMMYDOC yang ada, dan berfungsi dengan cara yang sama yaitu kami dapat menentukan banyak kelebihan beban dan jenis pemeriksaan dan penyelesaian akan berfungsi seperti yang Anda harapkan:

Tupel dapat diimplementasikan sebagai bentuk dengan indeks literal angka:

atau sebagai alias tipe literal tabel:

Seperti dapat dilihat di atas, ketika tuple kompatibel dengan array, itu dapat ditugaskan ke satu, tetapi tidak sebaliknya.
Anotasi @type mendukung daftar jenis. Ini dapat digunakan saat mendeklarasikan variabel:

atau untuk casting beberapa hasil yang dikembalikan oleh ekspresi (misalnya panggilan fungsi):

@not Tipe Casts Pemeran tipe @not menghilangkan jenis dari serikat pekerja. Ini berguna dalam berbagai keadaan, yang paling mudah di antaranya adalah menghilangkan nil :

Seperti @type , juga mendukung daftar jenis untuk casting beberapa nilai pengembalian fungsi, dan dapat dengan sendirinya menghilangkan serikat pekerja:

Ketika Anda hanya ingin menghilangkan jenis dari serikat pekerja, umumnya lebih aman untuk menggunakan @not cast daripada @type cast karena @type cast pada dasarnya menonaktifkan semua jenis pemeriksaan untuk tugas, di mana sebagai @not cast hanya mengecualikan jenis tertentu.
@type anotasi pada pernyataan pengembalianPernyataan pengembalian sekarang menerima jenis anotasi, yang merupakan cara yang aman untuk mengetik nilai pengembalian lambdas anonim.

Tidak seperti tipe gips, ini adalah tipe-aman:

Jenis alias sekarang diselesaikan dengan malas, yang memungkinkan kita mengetik struktur data rekursif. Misalnya, JSON:

Fungsi API dapat mengembalikan jumlah hasil yang tidak diketahui. Namun, saat memanggil fungsi -fungsi ini, Anda cenderung tahu berapa banyak hasil yang Anda harapkan.
Nilai pengembalian variadik dapat dilemparkan ke daftar jenis beton oleh @not casting Away nil :

Satu jenis variadik juga dapat dilemparkan ke yang lain:

Kami sekarang mendukung parameter opsional dalam definisi tipe fungsi pendek dan bentuk panjang misalnya

Yang penting, opsional tidak pendek untuk nil | type .

Anda tidak dapat memberikan nil kecuali jenis parameter opsional itu sendiri termasuk nil sebagai bagian dari serikat dalam definisi jenisnya. Ini diinginkan untuk tujuan kebenaran saat menerapkan fungsi di LUA, katakanlah misalnya jika implementasi memanfaatkan [ select('#', …) ] (https://www.lua.org/manual/5.3/manual.html#pdf-telect). Namun, di luar itu, LUA secara teratur digunakan sebagai bahasa skrip, mengikat fungsi Lua panggilan ke implementasi dalam bahasa lain yang memiliki dukungan untuk kelebihan beban dll. Di mana jumlah dan jenis argumen penting.
Inspeksi yang mencegah pesanan parameter opsional yang salah juga telah diimplementasikan:
Bangun plugin dengan:
./gradlew buildUntuk detail lebih lanjut tentang platform JetBrains SDK, silakan merujuk ke dokumentasi resmi.
Plugin .zip yang dihasilkan akan berakhir di direktori ./build/distributions/ .
Untuk menginstal .zip yang Anda bangun, Anda harus pergi ke Intellij ...
Preferensi -> Plugin -> Ikon Pengaturan Cog -> Instal Plugin dari Disk ...

Pilih .zip , lalu ketika diminta, restart intellij.
Luanalisis oleh: Benjamin Dobell
Emmylua oleh: @tangzx 阿唐
Kontributor
Silakan merujuk ke GitHub untuk daftar lengkap kontributor.
Terima kasih kepada sponsor dan pendukung Luanalisis yang membantu memastikan pengembangan luanalisis yang berkelanjutan.