D-Scannerは、Dソースコードを分析するためのツールです
まず、すべてのソースコードがあることを確認してください。 git submodule update --init --recursiveプロジェクトをクローニングした後、再回復します。
D-Scannerを構築するには、 make (またはWindowsのBuild.Batファイル)を実行します。ビルド時間は、2.066を超えるフロントエンドバージョンの-Inlineフラグを使用するとかなり長くなる可能性があるため、ビルドスクリプトから削除することをお勧めします。 MakeFileには、DMDの代わりにこれらのコンパイラのいずれかをコンパイルすることを好む場合、「LDC」および「GDC」ターゲットがあります。インストールするには、生成されたバイナリ(「ビン」フォルダー)を$パスのどこかに配置するだけです。
テストはDUBでは機能しません。 LinuxまたはOSXの下で、 make testでテストを実行します。 Windowsではbuild.bat testでテストを実行します。
> dub fetch dscanner && dub run dscannerDockerではインストールは必要ありません。
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を統合する一部のIDESには、診断を構成するヘルパーがある場合や、DSCanner.iniファイルの生成を支援する場合があります。
使用
dscanner fix source/ソースディレクトリ内のすべての修正可能な問題をインタラクティブに修正します。 with --applySingleと呼び出して、複数の自動ソリューションを持たない修正を自動的に適用します。
多くのD編集者はすでにDスキャナーで出荷されています。
CLI / Toolの場合、解析可能な出力も使用します
dscanner -S source/
# or
dscanner --report source/ --reportスイッチには、すべての情報に加えて、以下のような--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」オプションで構成できます。
「--stelecheck」または「-s」オプションは、指定されたソースファイル、指定されたフォルダーに含まれるソース、または現在の作業ディレクトリに含まれるソースに対していくつかの基本的な静的分析チェックを実行します(何も提供されていない場合)。エラーまたは警告の形式は、「-errorformat」または「-f」オプションで構成できます。
ユニットテストでの静的チェックは、無関係な警告を生成する可能性があります。たとえば、この変数のタイプの推論によって、テンプル化された関数がインスタンス化できることを目標が確認できる場合、使用されない変数を宣言することが合法です。これらのケースを回避するために、「 - スキー」オプションを渡すことができます。
デフォルトでは、すべてのチェックが有効になります。構成ファイルを使用して、個々のチェックを有効または無効にすることができます。このようなファイルは、たとえば、プロジェクトのルートディレクトリです。 dscanner --defaultConfigは、デフォルトの構成ファイルを生成し、ファイルの場所を印刷します。デフォルトまたはローカル設定をオーバーライドする場合は、「-config」オプションを使用して、構成ファイルへのパスを指定することもできます。
チェックごとに、3つの値が可能です。
"disabled" :チェックは実行されません。"enabled" :チェックが実行されます。"skip-unittest" :チェックは実行されますが、単体テストでは実行されません。その他の値はチェックを無効にします。
「 - スキップテスト」オプションは"skip-unittest"チェックによって"enabled"チェックを変更することに相当することに注意してください。
max_line_length文字より長い行。final属性が使用されますが、この文脈ではNOOPです。@trustedスコープ全体に適用されていないことを確認してください。新しい宣言が追加された場合、およびそれらが信頼できるように手動で検証されていない場合、範囲全体を信頼することは問題になる可能性があります。ifスイッチcase 、ループ、 && 、 || 、 ?: 、 throw 、 catch 、 return 、 break 、 continue 、 goto 、関数リテラル) ウィッシュリストのオープン問題のこのリストを参照してください。
「-report」オプションは、上記の静的分析チェックドキュメントに関するJSONレポートを標準出力に書き込みます。このファイルは通常、ここにあるSonarqubeのDプラグインで使用されます。
オプションを使用する " - Reportformat Sonarqubegenericissuedata" 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 SEARTERは、シンボルの使用を見つけるのに役立ちますが、シンボルの宣言を検索する場合、ノイズとノイズの比率はあまり良くありません。 「-declaration」または「-d」オプションを使用すると、シンボル宣言を検索できます。例えば:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
「 - sloc」または「-l」オプションは、ファイル内のコードの行数を印刷します。ラインブレークの数を単純に印刷する代わりに、これによりセミコロンの数がカウントされますが、もし、foreach、foreach_reverse、デフォルト、およびファイル内のケーストークンの場合は、do、switch、foreach、foreach、foreach、foreach、foreach、foreach、foreach、foreach、foreach、
$ ./dscanner --sloc helloworld.d
2
「-highlight」オプションは、Syntax-Highlighted HTMLとして標準出力に与えられたソースファイルを印刷します。 CSSスタイリングでは、デフォルトではSolarized Corile Schemeを使用しますが、「-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オプションは、EMACS互換タグファイルが生成されることを除いて、 --ctagsに似ています。 --etagsAllオプションは、what --etagsと-e生成に加えて、プライベートおよびパッケージ宣言のタグを生成します。
「-outline」オプションは、指定された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 :これら2つのモジュールのみのチェックを適用します-std.bitmanip,-std.json :すべてのモジュールのチェックを適用しますが、これら2つ+.bar : .bar ( foo.bar 、 abcbarrosなど)に一致するすべてのモジュールが含まれています。-etc. : .etcからすべてのモジュールを除外します+std,-std.internal :内部モジュールを除き、 std全体を含む