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 ,除了内部模块