D-Scanner เป็นเครื่องมือในการวิเคราะห์ D COLOSE D
ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณมีซอร์สโค้ดทั้งหมด รัน git submodule update --init --recursive หลังจากโคลนนิ่งโครงการ
ในการสร้าง D-Scanner ให้เรียกใช้ make (หรือไฟล์ build.bat บน Windows) เวลาในการสร้างอาจยาวนานด้วยการตั้งค่าสถานะ -inline ในรุ่นหน้าเก่ากว่า 2.066 ดังนั้นคุณอาจต้องการลบออกจากสคริปต์บิลด์ MakeFile มีเป้าหมาย "LDC" และ "GDC" หากคุณต้องการรวบรวมกับหนึ่งในคอมไพเลอร์เหล่านี้แทน DMD ในการติดตั้งเพียงวางไบนารีที่สร้างขึ้น (ในโฟลเดอร์ "bin") ที่ไหนสักแห่งบนเส้นทาง $ ของคุณ
การทดสอบไม่ทำงานกับพากย์ ภายใต้ Linux หรือ OSX เรียกใช้การทดสอบด้วย make test ภายใต้ Windows เรียกใช้การทดสอบด้วย build.bat test
> dub fetch dscanner && dub run dscannerด้วย Docker ไม่จำเป็นต้องมีการติดตั้ง:
docker run --rm -v $( pwd ) :/src dlangcommunity/dscannerตัวอย่างต่อไปนี้สมมติว่าเรากำลังวิเคราะห์ไฟล์ง่าย ๆ ที่เรียกว่า helloWorld.d
import std.stdio ;
void main ( string [] args)
{
writeln( " Hello World " );
}ใช้
dscanner lint source/เพื่อดูรายการปัญหาที่มนุษย์อ่านได้
ประเภทการวินิจฉัยสามารถเปิดใช้งาน / ปิดใช้งานได้โดยใช้ไฟล์การกำหนดค่าตรวจสอบไฟล์ --config / dscanner.ini ไฟล์สำหรับข้อมูลเพิ่มเติม เคล็ดลับ: IDE บางตัวที่รวม D-scanner อาจมีผู้ช่วยในการกำหนดค่าการวินิจฉัยหรือช่วยสร้างไฟล์ dscanner.ini
ใช้
dscanner fix source/ เพื่อแก้ไขปัญหาที่สามารถแก้ไขได้ทั้งหมดภายในไดเรกทอรีต้นฉบับ โทรด้วย --applySingle เพื่อใช้การแก้ไขโดยอัตโนมัติที่ไม่มีโซลูชันอัตโนมัติหลายแบบ
บรรณาธิการ D หลายคนส่งไปพร้อมกับ D-Scanner แล้ว
สำหรับ CLI / Tool Parsable Output ใช้เช่นกัน
dscanner -S source/
# or
dscanner --report source/ สวิตช์ --report รายงานรวมถึงข้อมูลทั้งหมดรวมถึงราคาถูกเพื่อคำนวณ Autofixes ที่ได้รับการแก้ไขแล้วก่อนเวลาเช่นเดียวกับชื่อสำหรับ autofixes ที่ต้องแก้ไขโดยใช้สวิตช์ --resolveMessage ตามที่อธิบายไว้ด้านล่าง
นอกจากนี้คุณยังสามารถระบุรูปแบบที่กำหนดเองโดยใช้ -f / --errorFormat ซึ่งมีรูปแบบในตัวสำหรับการกระทำของ 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/เพื่อแก้ไขปัญหาการแก้ไขปัญหาอัตโนมัติสำหรับการใช้ตำแหน่งที่กำหนด
# 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 stdinเอาท์พุท 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" : " " },
]
}
]อัลกอริทึมในการใช้การเปลี่ยน:
foreach_reverse (r; replacements)
codeBytes = codeBytes[ 0 .. r.range[ 0 ]] ~ r.newText ~ codeBytes[r.range[ 1 ] .. $]; การเปลี่ยนเป็นแบบไม่ทับซ้อนเรียงตาม range[0] ตามลำดับจากน้อยไปมาก เมื่อรวมการเปลี่ยนที่แตกต่างกันหลายครั้งคุณต้องเรียงลำดับตาม range[0] เพื่อใช้โดยใช้อัลกอริทึมด้านบน
ตัวเลือก "-tokencount" หรือ "-t" พิมพ์จำนวนโทเค็นในไฟล์ที่กำหนด
$ dscanner --tokenCount helloworld.d
20
ตัวเลือก "-imports" หรือ "-i" พิมพ์รายชื่อของโมดูลที่นำเข้าโดยไฟล์ต้นฉบับที่กำหนด
$ dscanner --imports helloworld.d
std.stdio
อาร์กิวเมนต์ผ่าน "-i" (สถานที่นำเข้า) จะทำให้ D-Scanner พยายามแก้ไขตำแหน่งของโมดูลที่นำเข้า
$ 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
อย่าลืมผ่านแผนที่สถานที่นำเข้าเมื่อคุณใช้ Docker:
docker run --rm -v $(pwd):/src -v /usr/include/dlang/dmd:/d dlangcommunity/dscanner --imports helloworld.d -I/d
/d/std/stdio.d
ตัวเลือก "-recursiveimports" คล้ายกับ "-imports" ยกเว้นว่าจะแสดงรายการการนำเข้าการนำเข้า (และอื่น ๆ ) ซ้ำ ตัวเลือกการนำเข้าแบบเรียกซ้ำต้องใช้เส้นทางนำเข้าที่จะระบุเพื่อทำงานอย่างถูกต้อง
ข้อ จำกัด :
version หรือ static ifตัวเลือก "-Syntaxcheck" หรือ "-S" พิมพ์รายการของข้อผิดพลาดหรือคำเตือนใด ๆ ที่พบในขณะที่เล็กซิงหรือแยกวิเคราะห์ไฟล์ต้นฉบับที่กำหนด มันไม่ได้ทำการวิเคราะห์ความหมายใด ๆ และไม่ได้รวบรวมรหัส รูปแบบของข้อผิดพลาดหรือคำเตือนสามารถกำหนดค่าได้ด้วยตัวเลือก "-errorformat" หรือ "-f"
ตัวเลือก "-StyleCheck" หรือ "-S" เรียกใช้การวิเคราะห์แบบคงที่บางอย่างตรวจสอบกับไฟล์ต้นฉบับที่กำหนดแหล่งที่อยู่ในโฟลเดอร์ที่กำหนดหรือแหล่งที่อยู่ในไดเรกทอรีการทำงานปัจจุบัน (เมื่อไม่มีการจัดหา) รูปแบบของข้อผิดพลาดหรือคำเตือนสามารถกำหนดค่าได้ด้วยตัวเลือก "-errorformat" หรือ "-f"
การตรวจสอบแบบคงที่ในการทดสอบหน่วยสามารถสร้างคำเตือนที่ไม่เกี่ยวข้อง ตัวอย่างเช่นมันถูกต้องที่จะประกาศตัวแปรที่ไม่ได้ใช้หากเป้าหมายคือการตรวจสอบว่าฟังก์ชัน templatized สามารถสร้างอินสแตนซ์โดยการอนุมานประเภทของตัวแปรนี้ เพื่อหลีกเลี่ยงกรณีเหล่านี้เป็นไปได้ที่จะผ่านตัวเลือก "-skiptests"
โดยค่าเริ่มต้นการตรวจสอบทั้งหมดจะเปิดใช้งาน การตรวจสอบส่วนบุคคลสามารถเปิดใช้งานหรือปิดใช้งานได้โดยใช้ไฟล์กำหนดค่า ตัวอย่างเช่นไฟล์ดังกล่าวสามารถวางได้คือไดเรกทอรีรูทของโครงการของคุณ การเรียกใช้ dscanner --defaultConfig จะสร้างไฟล์กำหนดค่าเริ่มต้นและพิมพ์ตำแหน่งของไฟล์ นอกจากนี้คุณยังสามารถระบุพา ธ ไปยังไฟล์การกำหนดค่าโดยใช้ตัวเลือก "-config" หากคุณต้องการแทนที่ค่าเริ่มต้นหรือการตั้งค่าท้องถิ่น
สำหรับการตรวจสอบแต่ละครั้งจะมีค่าสามค่า:
"disabled" : การตรวจสอบไม่ได้ดำเนินการ"enabled" : การตรวจสอบจะดำเนินการ"skip-unittest" : การตรวจสอบดำเนินการ แต่ไม่ได้อยู่ในการทดสอบหน่วยค่าอื่น ๆ จะปิดการตรวจสอบ
โปรดทราบว่าตัวเลือก "-skiptests" นั้นเทียบเท่ากับการเปลี่ยนการตรวจสอบ "enabled" แต่ละรายการโดยการตรวจสอบ "skip-unittest"
max_line_lengthfinal ถูกใช้ แต่ในบริบทนี้มันเป็น Noop@trusted ไม่ได้ใช้กับขอบเขตทั้งหมด การไว้วางใจขอบเขตทั้งหมดอาจเป็นปัญหาเมื่อมีการเพิ่มการประกาศใหม่และหากพวกเขาไม่ได้รับการยืนยันด้วยตนเองเพื่อให้เชื่อถือได้if , case สวิตช์, วน, && , || , ?: , throw , catch , return , break , continue , goto และฟังก์ชั่นตามตัวอักษร) ดูรายการปัญหาเปิดนี้สำหรับสิ่งที่อยากได้
ตัวเลือก "-รายงาน" เขียนรายงาน JSON เกี่ยวกับการวิเคราะห์แบบคงที่ตรวจสอบเอกสารข้างต้นไปยังเอาต์พุตมาตรฐาน ไฟล์นี้มักจะใช้โดยปลั๊กอิน D สำหรับ Sonarqube ที่นี่
การใช้ตัวเลือก "-REPORTFORMAT SONARQUBEGENERICISIOUSAUDATA" รายงานในรูปแบบข้อมูลทั่วไปที่รองรับ Sonar-Scanner สามารถสร้างได้
$ dscanner --reportFormat sonarQubeGenericIssueData . > sonar-generic-issue-data.json
อ้างอิงชื่อไฟล์รายงานใน Sonar-Project.properties โดยใช้คีย์ "Sonar.externalissuesReportpaths"
sonar.externalIssuesReportPaths=sonar-generic-issue-data.json
ACK, GREP และ Silver Searcher มีประโยชน์สำหรับการค้นหาสัญลักษณ์ของสัญลักษณ์ แต่อัตราส่วนสัญญาณต่อเสียงไม่ดีมากเมื่อค้นหาการประกาศของสัญลักษณ์ ตัวเลือก "-การประกาศ" หรือ "-D" ช่วยให้คุณสามารถค้นหาการประกาศสัญลักษณ์ ตัวอย่างเช่น:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
ตัวเลือก "-SLOC" หรือ "-L" พิมพ์จำนวนบรรทัดของรหัสในไฟล์ แทนที่จะพิมพ์จำนวนเส้นแบ่งบรรทัดสิ่งนี้จะนับจำนวนของเครื่องหมายอัฒภาคในขณะที่ถ้า, ทำ, อื่น, สลับ, foreach, foreach_reverse, ค่าเริ่มต้นและโทเค็นกรณีในไฟล์
$ ./dscanner --sloc helloworld.d
2
ตัวเลือก "-ไฮไลต์" พิมพ์ไฟล์ต้นฉบับที่กำหนดเป็น HTML ที่มีไวยากรณ์สูงไปยังเอาต์พุตมาตรฐาน สไตล์ CSS ใช้โทนสีโซลาร์เซลล์โดยค่าเริ่มต้น แต่สามารถปรับแต่งได้โดยใช้ตัวเลือก "-theme"
ชุดรูปแบบต่อไปนี้มีอยู่:
solarized
solarized-dark
gruvbox
gruvbox-dark
ไม่มีตัวอย่าง มันต้องใช้พื้นที่มากเกินไป
ตัวเลือก "-CTAGS" หรือ "-C" สร้างข้อมูล CTAGS และเขียนลงในเอาต์พุตมาตรฐาน อาร์กิวเมนต์ไดเรกทอรีจะถูกสแกนซ้ำสำหรับไฟล์ .d และ .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
CTAGS เอาต์พุตใช้แท็กชนิดต่อไปนี้:
ข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ CTAGS สามารถดูได้ที่นี่
ตัวเลือก --etags , -e , และ --etagsAll นั้นคล้ายคลึงกับ --ctags ยกเว้นว่ามีการสร้างไฟล์แท็กที่เข้ากันได้กับ EMACS ตัวเลือก --etagsAll จะสร้างแท็กสำหรับการประกาศส่วนตัวและแพ็คเกจนอกเหนือจากสิ่งที่ --etags และ -e สร้าง
ตัวเลือก "-OUTLINE" จะวิเคราะห์ไฟล์แหล่ง D ที่กำหนดและเขียนโครงร่างง่าย ๆ ของการประกาศของไฟล์เป็น stdout
หากไฟล์ dscanner.ini อยู่ในไดเรกทอรีการทำงานหรือผู้ปกครองใด ๆ มันจะแทนที่ไฟล์การกำหนดค่าอื่น ๆ
เป็นตำแหน่งสุดท้าย D-Scanner ใช้ไฟล์กำหนดค่าที่ให้ไว้ใน $HOME/.config/dscanner/dscanner.ini Run --defaultConfig เพื่อสร้างใหม่
ตัวเลือก --config อนุญาตให้หนึ่งใช้เส้นทางไฟล์การกำหนดค่าที่กำหนดเอง
ตัวเลือก "-ast" หรือ "-xml" จะทิ้งแผนผังนามธรรมที่สมบูรณ์ของไฟล์ต้นฉบับที่กำหนดไปยังเอาต์พุตมาตรฐานในรูปแบบ 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 >สำหรับเอาต์พุตที่อ่านได้มากขึ้นให้ท่อคำสั่งผ่าน xmllint โดยใช้สวิตช์การจัดรูปแบบ
$ dscanner --ast helloworld.d | xmllint --format -
เป็นไปได้ที่จะสร้าง analysis.config.ModuleFilters ส่วนใหม่ config.modulefilters ใน dscanner.ini ในส่วนที่เป็นตัวเลือกนี้สามารถระบุรายการตัวเลือกการรวมและตัวเลือกการยกเว้นจุลภาคสำหรับการตรวจสอบทุกครั้งที่ควรใช้การกรองแบบเลือก ตัวเลือกที่กำหนดเหล่านี้ตรงกับชื่อโมดูลและการจับคู่บางส่วน ( std. หรือ .foo. ) เป็นไปได้ ยิ่งไปกว่านั้นตัวเลือกทุกคนจะต้องเริ่มต้นด้วย + (รวม) หรือ - (ยกเว้น) ตัวเลือกการยกเว้นจะมีความสำคัญเหนือกว่าตัวดำเนินการรวมทั้งหมด แน่นอนสำหรับการตรวจสอบทุกชุดตัวเลือกที่แตกต่างกันสามารถให้ได้:
[analysis.config.ModuleFilters]
final_attribute_check = " +std.foo,+std.bar "
useless_initializer = " -std. "ตัวอย่างบางส่วน:
+std. : รวมโมดูลทั้งหมดที่ตรงกัน std.+std.bitmanip,+std.json : ใช้การตรวจสอบเฉพาะสำหรับสองโมดูลนี้-std.bitmanip,-std.json : ใช้การตรวจสอบสำหรับโมดูลทั้งหมด แต่ทั้งสองนี้+.bar : รวมโมดูลทั้งหมดที่ตรงกัน .bar (เช่น foo.bar , abcbarros )-etc. : ไม่รวมโมดูลทั้งหมดจาก .etc+std,-std.internal : รวม std ทั้งหมดยกเว้นโมดูลภายใน