D-Scanner是分析D源代碼的工具
首先確保您擁有所有源代碼。在克隆項目後,運行git submodule update --init --recursive 。
要構建D-Scanner,請運行make (或Windows上的Build.Bat文件)。在前端版本上,構建時間可能很長,超過2.066,因此您可能希望將其從構建腳本中刪除。如果您希望使用其中一個編譯器而不是DMD編譯,則MakeFile具有“ LDC”和“ GDC”目標。要安裝,只需將生成的二進制(在“ 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文件以獲取更多信息。提示:某些集成D-Scanner的IDE可能具有配置診斷或幫助生成dscanner.ini文件的幫助者。
使用
dscanner fix source/交互式解決源目錄中的所有可解決問題。致電--applySingle以自動應用沒有多個自動解決方案的修復程序。
許多D編輯已經與D-Scanner一起運送。
用於CLI /工具可放鬆輸出
dscanner -S source/
# or
dscanner --report source/ --report Switch包括所有信息,加上便宜的計算自動框,這些自動框已提前解決,以及需要使用--resolveMessage Switch進行解決的自動框的名稱,如下所述。
您還可以使用-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時,請通過MAP通過MAP:
docker run --rm -v $(pwd):/src -v /usr/include/dlang/dmd:/d dlangcommunity/dscanner --imports helloworld.d -I/d
/d/std/stdio.d
“ - 搜索”選項類似於“ - iMports”,除了它遞歸列出導入(等)。遞歸導入選項需要指定導入路徑才能正確工作。
限制:
version或static if導入。“ - SyntaxCheck”或“ -s”選項將在Lexing或解析給定源文件時發現的任何錯誤或警告的列表。它不進行任何語義分析,也不會編譯代碼。錯誤或警告的格式可以使用“ -erorformat”或“ -f”選項配置。
“ - stylecheck”或“ -s”選項對給定的源文件,給定文件夾中包含的源或當前工作目錄中包含的源(當不提供任何內容時)運行了一些基本的靜態分析檢查。錯誤或警告的格式可以使用“ -erorformat”或“ -f”選項配置。
單位測試中的靜態檢查可能會產生無關緊要的警告。例如,如果目標是通過推斷該變量的類型來驗證可以實例化的變量,則聲明一個不使用的變量是合法的。為了避免這些情況,可以通過“ - kiptests”選項。
默認情況下,啟用了所有檢查。可以使用配置文件啟用或禁用單個檢查。例如,可以放置這樣的文件是項目的根目錄。運行dscanner --defaultConfig將生成默認配置文件並打印文件的位置。如果要覆蓋默認設置或本地設置,也可以通過使用“ -config”選項來指定配置文件的路徑。
對於每次檢查,可以進行三個值:
"disabled" :不執行檢查。"enabled" :進行檢查。"skip-unittest" :進行檢查,但在單元測試中不進行。任何其他值都停用了支票。
請注意,“ -skiptest”選項等同於通過"skip-unittest"檢查更改每個"enabled"檢查。
max_line_length字符。final屬性是使用的,但在這種情況下是一個NOOP。@trusted不會應用於整個範圍。當添加新聲明以及未經手動驗證以值得信賴時,信任整個範圍可能是一個問題。if開關case ,循環, && , || , ?: , throw , catch , return , break ,繼續,繼續, continue , goto和功能字面) 請參閱此願望清單的開放問題列表。
“ - 報告”選項將靜態分析檢查文檔的JSON報告寫入標準輸出。該文件通常由D插件用於Sonarqube。
可以使用選項“ - reportformat Sonarqubegenericissuedata”可以創建聲納 - 掃描儀支持的通用問題數據格式的報告。
$ dscanner --reportFormat sonarQubeGenericIssueData . > sonar-generic-issue-data.json
使用鍵“ Sonar.Externalseseeportpaths”中的聲音項目中的報告文件名。
sonar.externalIssuesReportPaths=sonar-generic-issue-data.json
ACK,GREP和Silver Searcher對於查找符號的用法很有用,但是在搜索符號聲明時,它們的信號與噪聲比不是很好。 “ - 刪除”或“ -d”選項允許您搜索符號聲明。例如:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
“ - sloc”或“ -l”選項打印文件中代碼行的數量。它不簡單地打印線路斷裂的數量,而是計算半分離量的數量,而如果,如果,如果,否則,switch,for,foreach,foreach,foreach_reverse,for each_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輸出使用以下標籤類型:
有關CTAG格式的更多信息,請參見此處。
--etags , -e和--etagsAll選項類似於--ctags ,只是生成了與Emacs兼容的標籤文件。除了--etags和-e生成的內容外, --etagsAll選項還生成了私人和軟件包聲明的標籤。
“ - 外線”選項解析了給定的D源文件,並將文件聲明的簡單輪廓寫入Stdout。
如果dscanner.ini文件位於工作目錄或任何父母中,則覆蓋任何其他配置文件。
作為最終位置,D-Scanner使用$HOME/.config/dscanner/dscanner.ini中給出的配置文件。運行--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 -
可以在dscanner.ini中創建一個新的部分analysis.config.ModuleFilters 。在此可選部分中,可以針對應應用選擇性過濾的每張檢查指定逗號分隔的包含和排除選擇器列表。這些給定的選擇器可以在模塊名稱和部分匹配項( 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 ,除了內部模塊