D-Scanner adalah alat untuk menganalisis kode sumber D
Pertama pastikan bahwa Anda memiliki semua kode sumber. Jalankan git submodule update --init --recursive setelah mengkloning proyek.
Untuk membangun D-Scanner, jalankan make (atau file build.bat di windows). Waktu build bisa agak lama dengan bendera -inline pada versi front -end yang lebih tua dari 2.066, jadi Anda mungkin ingin menghapusnya dari skrip build. Makefile memiliki target "LDC" dan "GDC" jika Anda lebih suka mengkompilasi dengan salah satu kompiler ini daripada DMD. Untuk menginstal, cukup letakkan biner yang dihasilkan (di folder "bin") di suatu tempat di jalur $ Anda.
Pengujian tidak berfungsi dengan DUB. Di bawah Linux atau OSX menjalankan tes dengan make test . Di bawah Windows menjalankan tes dengan build.bat test .
> dub fetch dscanner && dub run dscannerDengan Docker tidak ada instalasi yang diperlukan:
docker run --rm -v $( pwd ) :/src dlangcommunity/dscannerContoh -contoh berikut menganggap bahwa kami menganalisis file sederhana yang disebut HelloWorld.d
import std.stdio ;
void main ( string [] args)
{
writeln( " Hello World " );
}Menggunakan
dscanner lint source/Untuk melihat daftar masalah yang dapat dibaca manusia.
Jenis diagnostik dapat diaktifkan / dinonaktifkan menggunakan file konfigurasi, lihat file --config / dscanner.ini untuk info lebih lanjut. Kiat: Beberapa IDE yang mengintegrasikan D-Scanner mungkin memiliki pembantu untuk mengonfigurasi diagnostik atau membantu menghasilkan file dscanner.ini.
Menggunakan
dscanner fix source/ untuk memperbaiki semua masalah yang dapat diperbaiki secara interaktif dalam direktori sumber. Hubungi dengan --applySingle untuk secara otomatis menerapkan perbaikan yang tidak memiliki beberapa solusi otomatis.
Banyak editor yang sudah dikirimkan dengan D-Scanner.
Untuk output parsable CLI / Tool, gunakan
dscanner -S source/
# or
dscanner --report source/ Sakelar --report mencakup semua informasi, ditambah murah untuk menghitung autofixes yang sudah diselesaikan sebelumnya, serta nama -nama untuk autofix yang perlu diselesaikan menggunakan sakelar --resolveMessage seperti yang dijelaskan di bawah ini.
Anda juga dapat menentukan format khusus menggunakan -f / --errorFormat , di mana ada juga format bawaan untuk tindakan github:
# for GitHub actions: (automatically adds annotations to files in PRs)
dscanner -S -f github source/
# custom format:
dscanner -S -f ' {filepath}({line}:{column})[{type}]: {message} ' source/Untuk menyelesaikan perbaikan masalah otomatis untuk penggunaan lokasi tertentu
# collecting automatic issue fixes
# --resolveMessage <line>:<column> <filename>
dscanner --resolveMessage 11:3 file.d
# --resolveMessage b<byteIndex> <filename>
dscanner --resolveMessage b512 file.d
# <filename> may be omitted to read from stdinOutput JSON:
// list of available auto-fixes at the given location
[
{
"name" : " Make function const " ,
// byte range `[start, end)` what code to replace
// this is sorted by range[0]
"replacements" : [
// replace: range[0 ] < range[1], newText != ""
{ "range" : [ 10 , 14 ], "newText" : " const " },
// insert: range[0] == range[1], newText != ""
{ "range" : [ 20 , 20 ], "newText" : " auto " },
// remove: range[0] < range[1], newText == ""
{ "range" : [ 30 , 40 ], "newText" : " " },
]
}
]Algoritma untuk menerapkan penggantian:
foreach_reverse (r; replacements)
codeBytes = codeBytes[ 0 .. r.range[ 0 ]] ~ r.newText ~ codeBytes[r.range[ 1 ] .. $]; Penggantian tidak tumpang tindih, diurutkan berdasarkan range[0] dalam urutan naik. Saat menggabungkan beberapa penggantian yang berbeda, pertama -tama Anda harus mengurutkannya berdasarkan range[0] untuk diterapkan menggunakan algoritma di atas.
Opsi "--okencount" atau "-t" mencetak jumlah token dalam file yang diberikan
$ dscanner --tokenCount helloworld.d
20
Opsi "--imports" atau "-i" mencetak daftar modul yang diimpor oleh file sumber yang diberikan.
$ dscanner --imports helloworld.d
std.stdio
Argumen lulus "-i" (lokasi impor) akan menyebabkan D-Scanner juga berusaha untuk menyelesaikan lokasi modul yang diimpor.
$ dscanner --imports helloworld.d -I ~/.dvm/compilers/dmd-2.071.1-b2/src/phobos/ -I ~/.dvm/compilers/dmd-2.071.1-b2/src/druntime/src/
/home/brian/.dvm/compilers/dmd-2.071.1-b2/src/phobos/std/stdio.d
Ingatlah untuk lulus peta lokasi impor saat Anda menggunakan Docker:
docker run --rm -v $(pwd):/src -v /usr/include/dlang/dmd:/d dlangcommunity/dscanner --imports helloworld.d -I/d
/d/std/stdio.d
Opsi "--CecursiveImports" mirip dengan "--Imports", kecuali bahwa ia mencantumkan impor impor (dan sebagainya) secara rekursif. Opsi impor rekursif memerlukan jalur impor untuk ditentukan agar berfungsi dengan benar.
Keterbatasan:
version atau static if .Opsi "--syntaxcheck" atau "-s" mencetak daftar kesalahan atau peringatan yang ditemukan saat lexing atau parsing file sumber yang diberikan. Itu tidak melakukan analisis semantik dan tidak menyusun kode. Format kesalahan atau peringatan dapat dikonfigurasi dengan opsi "--RorFormat" atau "-f".
Opsi "--Stylecheck" atau "-s" menjalankan beberapa pemeriksaan analisis statis dasar terhadap file sumber yang diberikan, sumber yang terkandung dalam folder yang diberikan, atau sumber yang terkandung dalam direktori kerja saat ini (ketika tidak ada yang disediakan). Format kesalahan atau peringatan dapat dikonfigurasi dengan opsi "--RorFormat" atau "-f".
Pemeriksaan statis dalam tes unit dapat menghasilkan peringatan yang tidak relevan. Misalnya, sah untuk mendeklarasikan variabel yang tidak digunakan jika tujuannya adalah untuk memverifikasi bahwa fungsi templatized dapat dipakai oleh inferensi jenis variabel ini. Untuk menghindari kasus-kasus ini, dimungkinkan untuk lulus opsi "--kiptests".
Secara default semua cek diaktifkan. Pemeriksaan individual dapat diaktifkan atau dinonaktifkan dengan menggunakan file konfigurasi. File seperti itu dapat ditempatkan, misalnya, adalah direktori root dari proyek Anda. Menjalankan dscanner --defaultConfig akan menghasilkan file konfigurasi default dan mencetak lokasi file. Anda juga dapat menentukan jalur ke file konfigurasi dengan menggunakan opsi "--figig" jika Anda ingin mengganti pengaturan default atau lokal.
Untuk setiap cek, tiga nilai dimungkinkan:
"disabled" : Cek tidak dilakukan."enabled" : cek dilakukan."skip-unittest" : Cek dilakukan tetapi tidak dalam tes unit.Nilai lain menonaktifkan cek.
Perhatikan bahwa opsi "--kiptests" adalah setara dengan mengubah periksa masing-masing "enabled" dengan pemeriksaan "skip-unittest" .
max_line_length .final digunakan tetapi dalam konteks ini NOOP.@trusted tidak diterapkan pada seluruh ruang lingkup. Mempercayai seluruh ruang lingkup bisa menjadi masalah ketika deklarasi baru ditambahkan dan jika mereka tidak diverifikasi secara manual untuk dapat dipercaya.if , sakelar case , loop, && , || , ?: , throw , catch , return , break , continue , goto dan fungsi literal) Lihat daftar masalah terbuka ini untuk wishlist.
Opsi "--Port" menulis laporan JSON pada dokumen pemeriksaan analisis statis di atas untuk output standar. File ini biasanya digunakan oleh plugin D untuk Sonarqube yang terletak di sini.
Menggunakan opsi "--Portformat Sonarqubegenericissuedata" Sebuah laporan dalam format data masalah generik yang didukung sonar dapat dibuat.
$ dscanner --reportFormat sonarQubeGenericIssueData . > sonar-generic-issue-data.json
Referensi Laporan nama file di sonar-project.properties menggunakan kunci "sonar.ExternalSuesReportPaths"
sonar.externalIssuesReportPaths=sonar-generic-issue-data.json
ACK, GREP, dan Pencari Perak berguna untuk menemukan penggunaan simbol, tetapi rasio sinyal terhadap noise tidak terlalu baik ketika mencari deklarasi simbol. Opsi "--declaration" atau "-d" memungkinkan Anda untuk mencari deklarasi simbol. Misalnya:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
Opsi "--sloc" atau "-l" mencetak jumlah baris kode dalam file. Alih -alih hanya mencetak jumlah istirahat garis, ini menghitung jumlah titik koma, sementara, jika, lakukan, selain itu, beralih, untuk, foreach, foreach_reverse, default, dan token case dalam file.
$ ./dscanner --sloc helloworld.d
2
Opsi "-highlight" mencetak file sumber yang diberikan sebagai html sintaksis-highlight ke output standar. Styling CSS menggunakan skema warna larutan secara default, tetapi dapat disesuaikan menggunakan opsi "--theme".
Tema berikut tersedia:
solarized
solarized-dark
gruvbox
gruvbox-dark
Tidak ada contoh. Itu akan memakan terlalu banyak ruang
Opsi "--ctags" atau "-c" menghasilkan informasi CTAG dan menulisnya ke output standar. Argumen direktori dipindai secara rekursif untuk file .d dan .di .
$ dscanner --ctags helloworld.d
!_TAG_FILE_FORMAT 2
!_TAG_FILE_SORTED 1
!_TAG_FILE_AUTHOR Brian Schott
!_TAG_PROGRAM_URL https://github.com/Hackerpilot/Dscanner/
main helloworld.d 3;" f arity:1
Output CTAGS menggunakan jenis tag berikut:
Informasi lebih lanjut tentang format CTAG dapat ditemukan di sini.
Opsi --etags , -e , dan --etagsAll mirip dengan --ctags kecuali bahwa file tag yang kompatibel dengan Emacs dihasilkan. Opsi --etagsAll menghasilkan tag untuk deklarasi pribadi dan paket di samping apa yang --etags dan -e menghasilkan.
Opsi "-Outline" mem-parsing file sumber D yang diberikan dan menulis garis besar sederhana dari deklarasi file ke stdout.
Jika file dscanner.ini ditemukan di direktori kerja atau orang tua itu, itu mengesampingkan file konfigurasi lainnya.
Sebagai lokasi akhir, D-Scanner menggunakan file konfigurasi yang diberikan dalam $HOME/.config/dscanner/dscanner.ini . Jalankan --defaultConfig untuk meregenerasi.
Opsi --config memungkinkan seseorang untuk menggunakan jalur file konfigurasi khusus.
Opsi "--ast" atau "--xml" akan membuang pohon sintaks abstrak lengkap dari file sumber yang diberikan ke output standar dalam format XML.
$ dscanner --ast helloworld.d< module >
< declaration >
< importDeclaration >
< singleImport >
< identifierChain >
< identifier >std</ identifier >
< identifier >stdio</ identifier >
</ identifierChain >
</ singleImport >
</ importDeclaration >
</ declaration >
< declaration >
< functionDeclaration line = " 3 " >
< name >main</ name >
< type pretty = " void " >
< type2 >
void
</ type2 >
</ type >
< parameters >
< parameter >
< name >args</ name >
< type pretty = " string[] " >
< type2 >
< symbol >
< identifierOrTemplateChain >
< identifierOrTemplateInstance >
< identifier >string</ identifier >
</ identifierOrTemplateInstance >
</ identifierOrTemplateChain >
</ symbol >
</ type2 >
< typeSuffix type = " [] " />
</ type >
< identifier >args</ identifier >
</ parameter >
</ parameters >
< functionBody >
< blockStatement >
< declarationsAndStatements >
< declarationOrStatement >
< statement >
< statementNoCaseNoDefault >
< expressionStatement >
< expression >
< assignExpression >
< functionCallExpression >
< unaryExpression >
< primaryExpression >
< identifierOrTemplateInstance >
< identifier >writeln</ identifier >
</ identifierOrTemplateInstance >
</ primaryExpression >
</ unaryExpression >
< arguments >
< argumentList >
< assignExpression >
< primaryExpression >
< stringLiteral >Hello World</ stringLiteral >
</ primaryExpression >
</ assignExpression >
</ argumentList >
</ arguments >
</ functionCallExpression >
</ assignExpression >
</ expression >
</ expressionStatement >
</ statementNoCaseNoDefault >
</ statement >
</ declarationOrStatement >
</ declarationsAndStatements >
</ blockStatement >
</ functionBody >
</ functionDeclaration >
</ declaration >
</ module >Untuk output yang lebih mudah dibaca, pipa perintah melalui xmllint menggunakan sakelar pemformatannya.
$ dscanner --ast helloworld.d | xmllint --format -
Dimungkinkan untuk membuat bagian baru analysis.config.ModuleFilters di dscanner.ini . Di bagian opsional ini, daftar pemilih inklusi dan pengecualian yang dipisahkan secara koma dapat ditentukan untuk setiap pemeriksaan yang harus diterapkan oleh pemfilteran selektif. Selektor yang diberikan ini cocok dengan nama modul dan kecocokan parsial ( std. Atau .foo. ) Dimungkinkan. Selain itu, setiap pemilih harus dimulai dengan + (inklusi) atau - (pengecualian). Pemilih eksklusi diutamakan daripada semua operator inklusi. Tentu saja, untuk setiap cek set pemilih yang berbeda dapat diberikan:
[analysis.config.ModuleFilters]
final_attribute_check = " +std.foo,+std.bar "
useless_initializer = " -std. "Beberapa contoh:
+std. : Termasuk semua modul pencocokan std.+std.bitmanip,+std.json : menerapkan cek hanya untuk dua modul ini-std.bitmanip,-std.json : Menerapkan cek untuk semua modul, tetapi keduanya+.bar : Termasuk semua modul yang cocok .bar (misalnya foo.bar , abcbarros )-etc. : Tidak termasuk semua modul dari .etc+std,-std.internal : Termasuk seluruh std , kecuali untuk modul internal