Moonpick adalah linter alternatif untuk Moonscript. Meskipun skrip bulan dikirimkan dengan linter bawaan, saat ini kemampuan mendeteksinya terbatas. Linter bawaan misalnya akan mendeteksi variabel yang tidak digunakan, tetapi hanya untuk sebagian dari semua kemungkinan deklarasi yang tidak digunakan. Itu tidak akan mendeteksi variabel impor yang tidak digunakan, variabel dekomposisi, fungsi yang tidak digunakan, dll. Moonpick lahir dalam upaya untuk mendeteksi hal-hal di atas dan banyak lagi.
Moonpick dapat diinstal melalui Luarocks:
$ luarocks install moonpick
Itu kemudian dapat dijalankan dari baris perintah:
$ moonpick < path-to-file >
Keluarannya sangat mirip dengan keluaran linter bawaan Moonscript.
Itu juga dengan mudah digabungkan ke dalam aplikasi mandiri karena satu-satunya ketergantungannya adalah moonscript. Lihat bagian API untuk informasi selengkapnya tentang cara menjalankannya secara terprogram.
Moonpick mendeteksi variabel yang tidak digunakan dalam segala bentuknya, baik secara eksplisit digunakan sebagai variabel melalui penetapan atau secara implisit dibuat sebagai bagian dari pernyataan import
, pernyataan dekomposisi tabel, dll.
Moonpick juga dapat mendeteksi dan mengeluhkan parameter fungsi yang dideklarasikan tetapi tidak digunakan. Ini tidak diaktifkan secara default, karena sangat umum terdapat parameter yang tidak digunakan. Misalnya suatu fungsi mungkin mengikuti API eksternal dan tetap ingin menunjukkan parameter yang tersedia meskipun tidak semuanya digunakan. Untuk mengaktifkannya, setel opsi konfigurasi report_params
ke true
.
Moonpick dikirimkan dengan konfigurasi default yang memasukkan parameter apa pun yang dimulai dengan '_' ke dalam daftar putih, menyediakan cara untuk menjaga aspek dokumentasi suatu fungsi dan tetap menyenangkan linter.
Variabel loop yang tidak digunakan terdeteksi. Dimungkinkan untuk menonaktifkan ini sepenuhnya dalam konfigurasi, atau memberikan daftar putih eksplisit hanya untuk variabel loop. Moonpick dikirimkan dengan konfigurasi default yang memasukkan argumen 'i' dan 'j' ke daftar putih, atau variabel apa pun yang dimulai dengan '_'.
Mirip dengan linter bawaan, Moonpick mendeteksi referensi yang tidak ditentukan.
Deklarasi membayangi terjadi setiap kali sebuah deklarasi membayangi deklarasi sebelumnya dengan nama yang sama. Perhatikan kode berikut:
my_mod = require ' my_mod '
-- [.. more code in between.. ]
for my_mod in get_modules ( ' foo ' )
my_mod . bar!
Meskipun pada contoh di atas cukup jelas bahwa my_mod
yang dideklarasikan dalam loop berbeda dari my_mod
tingkat atas, hal ini dapat dengan cepat menjadi kurang jelas jika lebih banyak kode disisipkan di antara deklarasi for dan penggunaan selanjutnya. Pada saat itu kode tersebut menjadi ambigu. Deklarasi membayangi membantu dalam hal ini dengan memastikan bahwa setiap variabel didefinisikan paling banyak satu kali, dengan cara yang tidak ambigu.
Deteksi dapat dimatikan sepenuhnya dengan menyetel variabel konfigurasi report_shadowing
ke false, dan daftar putih dapat dikonfigurasi dengan menentukan daftar konfigurasi whitelist_shadowing
.
Perhatikan bahwa untuk versi Moonscript sebelum 0.5, bayangan semacam ini sebenarnya hanya akan menggunakan kembali deklarasi sebelumnya, sehingga menyebabkan bug yang mudah diabaikan dan membingungkan.
Penugasan ulang variabel yang telah ditentukan sebelumnya yang memiliki nilai fungsi jarang diinginkan, dan sering kali merupakan akibat dari kelupaan deklarasi sebelumnya.
-- with the following declaration and usage
done = ( x ) -> x . foo and x . bar
done ( {} )
-- one might mistakenly reuse the name further down
i = 1
-- [..]
done = i == 10
Hal ini dapat menyebabkan masalah debug yang sulit, terutama jika penugasan ulang hanya dilakukan di jalur kode yang tidak selalu dilakukan.
Deteksi dapat dimatikan sepenuhnya dengan mengatur variabel konfigurasi report_fndef_reassignments
ke false, dan daftar putih dapat dikonfigurasi dengan menentukan daftar konfigurasi whitelist_fndef_reassignments
.
Penugasan ulang variabel tingkat atas dari dalam suatu fungsi atau metode terkadang dapat menjadi penyebab bug yang tidak jelas dan sulit dipahami, misalnya:
module = require ' lib.module '
-- [..] much further down
get_foo = ( y ) ->
module = y match ( ' %w+ ' ) lower! -- mistakenly reusing the `module` var
return " #{module}_bar "
Jika get_foo
di atas hanya dipanggil secara kondisional, hal ini dapat menyebabkan bug serius luput dari perhatian.
Berbeda dengan deteksi lainnya, deteksi ini tidak diaktifkan secara default. Deteksi dapat diaktifkan dengan mengatur variabel konfigurasi report_top_level_reassignments
ke true, dan daftar putih dapat dikonfigurasi dengan menentukan daftar konfigurasi whitelist_top_level_reassignments
. Namun sangat disarankan untuk mengaktifkan ini.
Alasan mengapa hal ini tidak diaktifkan secara default adalah karena tidak jarang terdapat kode sah yang memanipulasi variabel tingkat atas dari dalam sub fungsi atau metode. Untuk menghindari keluhan dari linter, seseorang harus mengonfigurasi daftar putih, atau seseorang harus mengadopsi gaya pengkodean yang berbeda di mana variabel tingkat atas tidak ditetapkan ulang (misalnya dengan menggunakan tabel untuk menyimpan status modul).
Moonpick mendukung kumpulan super file konfigurasi dan format yang sama dengan linter bawaan.
Ini memberikan opsi konfigurasi tambahan dengan menambahkan dukungan untuk mengonfigurasi linting parameter fungsi dan variabel loop, dan juga mengizinkan pola Lua di semua daftar putih. File konfigurasi linter dapat ditulis dalam Lua atau Moonscript (masing-masing lint_config.lua
dan lint_config.moon
).
Lihat contoh di bawah ini (lint_config.moon, menggunakan sintaksis Moonscript):
{
whitelist_globals : {
-- whitelist for all files
[ " . " ] : { ' always_ignore ' } ,
-- whitelist for files matching 'spec'
spec : { ' test_helper ' } ,
}
whitelist_params : {
-- whitelist params for all files
[ " . " ] : { ' my_param ' } ,
-- ignore unused param for files in api
api : { ' extra_info ' } ,
}
whitelist_loop_variables : {
-- always allow loop variables 'i', 'j', 'k', as well as any
-- variable starting with '_' (using a Lua pattern)
[ " . " ] : { ' i ' , ' j ' , ' k ' , ' ^_ ' } ,
}
-- general whitelist for unused variables if desired for
-- some reason
whitelist_unused : {
[ " . " ] : {} ,
}
-- below you'll see the boolean switches controlling the
-- linting, shown with the default value
-- report_loop_variables: true
-- report_params: true
-- report_shadowing: true
-- report_fndef_reassignments: true
-- report_top_level_reassignments: false
}
Item daftar putih diperlakukan sebagai pola jika terdiri dari apa pun selain karakter alfanumerik.
local moonpick = require ( ' moonpick ' )
Lints kode yang diberikan dalam code
, mengembalikan tabel inspeksi linting. config
adalah konfigurasi linting yang akan digunakan untuk file tersebut, dan dapat berisi versi datar dari elemen yang biasanya ditemukan dalam file konfigurasi ( whitelist_globals
, whitelist_params
, whitelist_loop_variables
, whitelist_unused
, report_params
, report_loop_variables
).
Contoh tabel konfigurasi (sintaks Lua):
local moonpick = require ( ' moonpick ' )
local code = ' a = 2 '
moonpick . lint ( code , {
whitelist_globals = { ' foo ' , ' bar ' , }
whitelist_params = { ' ^_+ ' , ' other_+ ' }
})
Tabel inspeksi yang dikembalikan akan terlihat seperti ini untuk contoh di atas:
{
{
line = 1 ,
pos = 1 ,
msg = ' declared but unused - `a` ' ,
code = ' a = 2 '
}
}
Lints file
yang diberikan, mengembalikan tabel inspeksi linting. opts
saat ini dapat berisi satu nilai, lint_config
, yang menentukan file konfigurasi untuk memuat konfigurasi.
local moonpick_config = require ( ' moonpick.config ' )
Mengembalikan jalur file konfigurasi yang relevan untuk path
, atau nil
jika tidak ada yang ditemukan.
Memuat konfigurasi linting untuk file
file dari file konfigurasi yang diberikan oleh config_path
. Konfigurasi yang dikembalikan akan berupa tabel opsi konfigurasi yang diratakan untuk file
.
Mengembalikan instance evaluator untuk opsi linting tertentu (misalnya seperti yang dikembalikan oleh load_config_from
). Instance evaluator menyediakan fungsi-fungsi berikut (perhatikan bahwa ini adalah fungsi, yang akan dipanggil menggunakan operator titik biasa .
):
allow_global_access
, allow_unused_param
, allow_unused_loop_variable
, allow_unused
, allow_fndef_reassignment
, allow_top_level_reassignment
.
Semua ini mengambil argumen pertama sebagai simbol (sebagai string) dan mengembalikan true
atau false
tergantung pada apakah simbol lolos linting atau tidak.
Perhatikan bahwa Moonpick masih cukup muda pada tahap ini, dan meskipun telah dijalankan dengan sukses pada basis kode yang lebih besar, Moonpick mungkin menghasilkan laporan positif palsu dan salah. Jika Anda mengalami hal ini, silakan buka masalah dengan contoh kode yang menggambarkan perilaku yang salah.
Hak Cipta 2016-2017 Nils Nordman
Moonpick dirilis di bawah lisensi MIT (lihat file LISENSI untuk detail selengkapnya).
Pengujian memerlukan busted
untuk dijalankan, begitu pula modul pl
(Penlight - luarock install penlight
). Jalankan saja busted
di direktori root proyek.
Jalankan dengan LUA_PATH tertentu yang menunjuk ke direktori src
lokal. Menganggap lokasi checkout ~/code/moonpick
:
LUA_PATH= " $HOME /code/moonpick/src/?.lua; $HOME /code/moonpick/src/?/init.lua; $( lua -e ' print(package.path) ' ) " ~ /code/moonpick/bin/moonpick * .moon