D-Scanner ist ein Tool zur Analyse von D-Quellcode
Stellen Sie zunächst sicher, dass Sie den gesamten Quellcode haben. Führen Sie git submodule update --init --recursive aus, nachdem Sie das Projekt kloniert haben.
Um D-Scanner zu erstellen, laufe make (oder die build.bat-Datei unter Windows). Die Build -Zeit kann mit der Flagge -Flagge auf Front -End -Versionen als 2,066 ziemlich lang sein, sodass Sie sie möglicherweise aus dem Build -Skript entfernen möchten. Das Makefile hat "LDC" und "GDC" -Ziele, wenn Sie es vorziehen möchten, mit einem dieser Compiler anstelle von DMD zu kompilieren. Um zu installieren, platzieren Sie einfach den generierten Binär (im Ordner "bin" irgendwo auf Ihrem $ Pfad.
Das Testen funktioniert nicht mit Dub. Führen Sie unter Linux oder OSX die Tests mit make test . Führen Sie unter Windows die Tests mit build.bat test aus.
> dub fetch dscanner && dub run dscannerMit Docker ist keine Installation erforderlich:
docker run --rm -v $( pwd ) :/src dlangcommunity/dscannerIn den folgenden Beispielen geht davon aus, dass wir eine einfache Datei namens HelloWorld.D analysieren
import std.stdio ;
void main ( string [] args)
{
writeln( " Hello World " );
}Verwenden
dscanner lint source/Um eine menschliche lesbare Liste von Problemen anzuzeigen.
Diagnosetypen können mit einer Konfigurationsdatei aktiviert / deaktiviert werden. Weitere Informationen finden Sie in der Argument / dscanner.ini --config : Weitere Informationen. TIPP: Einige IDEs, die D-Scanner integrieren, haben möglicherweise Helfer, um die Diagnose zu konfigurieren oder die Datei dscanner.ini zu generieren.
Verwenden
dscanner fix source/ Um alle fixierbaren Probleme im Quellverzeichnis interaktiv zu beheben. Rufen Sie mit --applySingle an, um automatisch Korrekturen anzuwenden, die nicht mehrere automatische Lösungen haben.
Viele D-Redakteure versenden bereits mit D-Scanner.
Für eine CLI / Tool -Parsable -Ausgabe verwenden Sie entweder
dscanner -S source/
# or
dscanner --report source/ Der --report -Switch enthält alle Informationen sowie billig, um autofixe zu berechnen, die bereits vorab aufgelöst werden, sowie die Namen für die Autofixen, die mit dem unten beschriebenen --resolveMessage -Switch aufgelöst werden müssen.
Sie können auch benutzerdefinierte Formate mit -f / --errorFormat angeben, wobei es auch integrierte Formate für GitHub -Aktionen gibt:
# 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/Um automatische Problemfixes für einen bestimmten Standort zu beheben
# 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 stdinAusgibt 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" : " " },
]
}
]Algorithmus zur Anwendung von Ersatz:
foreach_reverse (r; replacements)
codeBytes = codeBytes[ 0 .. r.range[ 0 ]] ~ r.newText ~ codeBytes[r.range[ 1 ] .. $]; Die Ersetzungen sind nicht überlappend, sortiert nach range[0] in aufsteigender Reihenfolge. Bei der Kombination mehrerer verschiedener Ersetzungen müssen Sie sie zunächst nach range[0] sortieren, um den obigen Algorithmus anzuwenden.
Die Option "-Tokencount" oder "-t" druckt die Anzahl der Token in der angegebenen Datei
$ dscanner --tokenCount helloworld.d
20
Die Option "-Imports" oder "-I" druckt eine Auflistung von Modulen, die von der angegebenen Quelldatei importiert werden.
$ dscanner --imports helloworld.d
std.stdio
Durch das Bestehen von "-I" -Argumenten (Importstandorte) wird der D-Scanner auch versucht, die Standorte der importierten Module zu lösen.
$ 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
Denken Sie daran, die Map die Import -Standorte zu übergeben, wenn Sie Docker verwenden:
docker run --rm -v $(pwd):/src -v /usr/include/dlang/dmd:/d dlangcommunity/dscanner --imports helloworld.d -I/d
/d/std/stdio.d
Die Option "-recursiveMports" ist ähnlich wie "-Imports", mit der Ausnahme, dass Importe (und so weiter) impoliert auflistet. Die rekursive Importoption erfordert, dass Importpfade angegeben werden, um korrekt zu arbeiten.
Einschränkungen:
version oder static if .Die Option "-Syntaxcheck" oder "-s" druckt eine Auflistung von Fehlern oder Warnungen, die beim Lexen oder an Parsen der angegebenen Quelldatei gefunden wurden. Es führt keine semantische Analyse durch und erstellt den Code nicht. Das Format der Fehler oder Warnungen kann mit der Option "-ERRORFORMAT" oder "-F" konfiguriert werden.
Die Option "-Stylecheck" oder "-S" führt einige grundlegende statische Analyseprüfungen mit den angegebenen Quelldateien, den in den angegebenen Ordnern enthaltenen Quellen aus oder den im aktuellen Arbeitsverzeichnis enthaltenen Quellen (wenn nichts geliefert wird). Das Format der Fehler oder Warnungen kann mit der Option "-ERRORFORMAT" oder "-F" konfiguriert werden.
Statische Überprüfungen in den Unit -Tests können irrelevante Warnungen erzeugen. Zum Beispiel ist es legitim, eine Variable zu deklarieren, die nicht verwendet wird, wenn das Ziel sicher ist, zu überprüfen, ob eine templatisierte Funktion durch Inferenz des Typs dieser Variablen instanziiert werden kann. Um diese Fälle zu vermeiden, ist es möglich, die Option "-Skiptests" zu bestehen.
Standardmäßig sind alle Schecks aktiviert. Einzelne Überprüfungen können mithilfe einer Konfigurationsdatei aktiviert oder deaktiviert werden. Eine solche Datei kann beispielsweise das Stammverzeichnis Ihres Projekts platziert werden. Ausführen dscanner --defaultConfig generiert eine Standardkonfigurationsdatei und druckt den Speicherort der Datei aus. Sie können den Pfad zu einer Konfigurationsdatei auch angeben, indem Sie die Option "--config" verwenden, wenn Sie die Standardeinstellungen oder die lokalen Einstellungen überschreiben möchten.
Für jede Prüfung sind drei Werte möglich:
"disabled" : Der Scheck wird nicht durchgeführt."enabled" : Der Scheck wird durchgeführt."skip-unittest" : Der Scheck wird durchgeführt, aber nicht in den Unit-Tests.Jeder andere Wert deaktiviert einen Scheck.
Beachten Sie, dass die Option "--Skiptests" das Äquivalent zum Ändern der einzelnen "enabled" Überprüfung durch eine "skip-unittest" -Prüfung entspricht.
max_line_length Zeichen.final Attribut wird verwendet, aber in diesem Zusammenhang ist es eine Noop.@trusted nicht auf einen ganzen Bereich angewendet wird. Das Vertrauen eines ganzen Umfangs kann ein Problem sein, wenn neue Erklärungen hinzugefügt werden und wenn sie nicht manuell verifiziert werden, um vertrauenswürdig zu sein.goto return beginnt continue break , erhöht catch throw an jedem if , case , Schleife, && , || ?: Sehen Sie sich diese Liste der offenen Probleme für die Wunschliste an.
Die Option "-Report" schreibt einen JSON-Bericht über das statische Analyse-Überprüfungsdokument oben in die Standardausgabe. Diese Datei wird normalerweise vom D -Plugin für Sonarqube verwendet, das sich hier befindet.
Verwenden Sie die Option "-ReportFormat Sonarqubegenericissuedata". Ein Bericht in einem Sonar-Scanner unterstützt das Datenformat für generische Probleme.
$ dscanner --reportFormat sonarQubeGenericIssueData . > sonar-generic-issue-data.json
Verweisen Sie auf den Bericht des Berichts in Sonar-Project.Properties unter Verwendung von Schlüssel "Sonar.externalIssuesReportPaths"
sonar.externalIssuesReportPaths=sonar-generic-issue-data.json
ACK, Grep und der Silbersuchende sind nützlich, um die Verwendung von Symbolen zu finden, aber ihr Signal -Rausch -Verhältnis ist bei der Suche nach der Erklärung eines Symbols nicht sehr gut. Mit den Optionen "-Deklaration" oder "-D" können Sie nach einer Symboldeklaration suchen. Zum Beispiel:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
Die Option "-Sloc" oder "-l" druckt die Anzahl der Codezeilen in der Datei. Anstatt einfach die Anzahl der Zeilenumbrüche zu drucken, zählt dies die Anzahl der Semikolon, während, wenn, sonst, sonst, für, foreach, foreach_reverse, standardisch und fallt Token in der Datei.
$ ./dscanner --sloc helloworld.d
2
Die Option "--Highlight" druckt die angegebene Quelldatei als Syntax-Highlight-HTML für die Standardausgabe. Das CSS-Styling verwendet standardmäßig das solarisierte Farbschema, kann jedoch mit der Option "-themen" angepasst werden.
Die folgenden Themen sind verfügbar:
solarized
solarized-dark
gruvbox
gruvbox-dark
Kein Beispiel. Es würde zu viel Platz in Anspruch nehmen
Die Option "-CTAGs" oder "-c" generiert CTAGS-Informationen und schreibt sie in die Standardausgabe. Verzeichnisargumente werden rekursiv für .d und .di -Dateien gescannt.
$ 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
Die CTAGS -Ausgabe verwendet die folgenden Tag -Arten:
Weitere Informationen zum CTAGS -Format finden Sie hier.
Die Optionen für --etags , -e und --etagsAll ähneln --ctags , außer dass eine EMACS -kompatible Tags -Datei generiert wird. Die Option --etagsAll generiert Tags für private und Paketdeklarationen zusätzlich zu dem, was --etags -e generieren.
Die Option "-Outline" analysiert die angegebene D-Quelldatei und schreibt einen einfachen Überblick über die Deklarationen der Datei an STDOut.
Wenn eine dscanner.ini -Datei im Arbeitsverzeichnis oder eines seiner Eltern gefunden wird, überschreibt sie alle anderen Konfigurationsdateien.
Als endgültiger Ort verwendet D-Scanner die Konfigurationsdatei in $HOME/.config/dscanner/dscanner.ini . Ausführen --defaultConfig um es zu regenerieren.
Mit der Option --config ermöglicht es man, einen benutzerdefinierten Konfigurationsdateipfad zu verwenden.
Die Optionen "-ast" oder "--xml" werden den vollständigen abstrakten Syntax-Baum der angegebenen Quelldatei in die Standardausgabe im XML-Format abgeben.
$ 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 >Für eine lesbare Ausgabe liefern Sie den Befehl mit seinem Formatierungsschalter über Xmllint.
$ dscanner --ast helloworld.d | xmllint --format -
Es ist möglich, eine neue analysis.config.ModuleFilters zu erstellen dscanner.ini In diesem optionalen Abschnitt kann für jede Überprüfung, in der die selektive Filterung angewendet werden sollte, angegeben werden. Diese angegebenen Selektoren übereinstimmen mit dem Modulnamen und teilweise Übereinstimmungen ( std. Oder .foo. ) Sind möglich. Darüber hinaus muss jeder Selektoren entweder mit + (Einschluss) oder - (Ausschluss) beginnen. Ausschlussauswahlern haben Vorrang vor allen Einschlussbetreibern. Natürlich kann für jede Überprüfung ein anderer Selektor -Set angegeben:
[analysis.config.ModuleFilters]
final_attribute_check = " +std.foo,+std.bar "
useless_initializer = " -std. "Ein paar Beispiele:
+std. : Enthält alle Module, std.+std.bitmanip,+std.json : Wendet den Scheck nur für diese beiden Module an-std.bitmanip,-std.json : Wendet den Scheck für alle Module an, aber diese beiden+.bar : Enthält alle Module, die .bar (z. B. foo.bar , abcbarros ) enthält.-etc. : Schließt alle Module von .etc aus+std,-std.internal : Enthält die gesamte std , mit Ausnahme der internen Module