D-scanner est un outil pour analyser le code source D
Assurez-vous d'abord que vous avez tout le code source. Exécutez git submodule update --init --recursive après le clonage du projet.
Pour construire d-scanner, exécutez make (ou le fichier build.bat sur Windows). Le temps de construction peut être assez long avec l'indicateur -inline sur les versions frontales de plus de 2.066, vous pouvez donc le supprimer du script de construction. Le MakeFile a des cibles "LDC" et "GDC" si vous préférez compiler avec l'un de ces compilateurs au lieu de DMD. Pour installer, placez simplement le binaire généré (dans le dossier "bin") quelque part sur votre chemin $.
Les tests ne fonctionnent pas avec Dub. Sous Linux ou OSX exécutez les tests avec make test . Sous Windows, exécutez les tests avec build.bat test .
> dub fetch dscanner && dub run dscannerAvec docker, aucune installation n'est requise:
docker run --rm -v $( pwd ) :/src dlangcommunity/dscannerLes exemples suivants supposent que nous analysons un fichier simple appelé helloworld.d
import std.stdio ;
void main ( string [] args)
{
writeln( " Hello World " );
}Utiliser
dscanner lint source/pour voir une liste de problèmes lisible par l'homme.
Les types de diagnostic peuvent être activés / désactivés à l'aide d'un fichier de configuration, consultez le fichier --config Argument / dscanner.ini pour plus d'informations. Astuce: certains IDE qui intègrent D-scanner peuvent avoir des aides pour configurer les diagnostics ou aider à générer le fichier dscanner.ini.
Utiliser
dscanner fix source/ Pour résoudre de manière interactive tous les problèmes réparables dans le répertoire source. Appelez avec --applySingle pour appliquer automatiquement des correctifs qui n'ont pas plusieurs solutions automatiques.
De nombreux éditeurs D expédient déjà avec D-Scanner.
Pour une sortie CLI / outil à pontable, utilisez soit
dscanner -S source/
# or
dscanner --report source/ Le commutateur --report comprend toutes les informations, ainsi que bon marché pour calculer les autofixes qui sont déjà résolus à l'avance, ainsi que les noms des autofixes qui doivent être résolus à l'aide du commutateur --resolveMessage comme décrit ci-dessous.
Vous pouvez également spécifier des formats personnalisés à l'aide de -f / --errorFormat , où il existe également des formats intégrés pour les actions 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/Pour résoudre les correctifs de problèmes automatiques pour une utilisation de localisation donnée
# 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 stdinSorte 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" : " " },
]
}
]Algorithme pour appliquer les remplacements:
foreach_reverse (r; replacements)
codeBytes = codeBytes[ 0 .. r.range[ 0 ]] ~ r.newText ~ codeBytes[r.range[ 1 ] .. $]; Les remplacements sont non chevauchants, triés par range[0] dans l'ordre croissant. Lors de la combinaison de plusieurs remplacements différents, vous devez d'abord les trier par range[0] pour s'appliquer en utilisant l'algorithme ci-dessus.
L'option "--tokencount" ou "-t" imprime le nombre de jetons dans le fichier donné
$ dscanner --tokenCount helloworld.d
20
L'option "--imports" ou "-i" imprime une liste des modules importés par le fichier source donné.
$ dscanner --imports helloworld.d
std.stdio
Les arguments «-I» (emplacements d'importation) provoqueront également que D-scanner tentera également de résoudre les emplacements des modules importés.
$ 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
N'oubliez pas de passer la carte des emplacements d'importation lorsque vous utilisez Docker:
docker run --rm -v $(pwd):/src -v /usr/include/dlang/dmd:/d dlangcommunity/dscanner --imports helloworld.d -I/d
/d/std/stdio.d
L'option "---recursiveImports" est similaire à "--mports", sauf qu'il répertorie les importations d'importations (et ainsi de suite) récursivement. L'option d'importation récursive nécessite la spécification des chemins d'importation afin de fonctionner correctement.
Limites:
version ou static if .L'option "--syntaxcheck" ou "-s" imprime une liste de toute erreur ou avertissement trouvé lors de la lexing ou de l'analyse du fichier source donné. Il ne fait aucune analyse sémantique et ne compile pas le code. Le format des erreurs ou des avertissements peut être configuré avec l'option "--errorformat" ou "-f".
L'option "--stylecheck" ou "-s" exécute certaines vérifications d'analyse statique de base par rapport aux fichiers source donnés, les sources contenues dans les dossiers donnés ou les sources contenues dans le répertoire de travail actuel (lorsque rien n'est fourni). Le format des erreurs ou des avertissements peut être configuré avec l'option "--errorformat" ou "-f".
Les vérifications statiques dans les tests unitaires peuvent produire des avertissements non pertinents. Par exemple, il est légitime de déclarer une variable qui n'est pas utilisée si l'objectif est de vérifier qu'une fonction templatée peut être instanciée par l'inférence du type de cette variable. Pour éviter ces cas, il est possible de passer l'option "--skiptests".
Par défaut, toutes les vérifications sont activées. Les vérifications individuelles peuvent être activées ou désactivées à l'aide d'un fichier de configuration. Un tel fichier peut être placé, par exemple, est le répertoire racine de votre projet. L'exécution dscanner --defaultConfig générera un fichier de configuration par défaut et imprimera l'emplacement du fichier. Vous pouvez également spécifier le chemin d'accès à un fichier de configuration en utilisant l'option "- Config" si vous souhaitez remplacer la valeur par défaut ou les paramètres locaux.
Pour chaque chèque, trois valeurs sont possibles:
"disabled" : le chèque n'est pas effectué."enabled" : le chèque est effectué."skip-unittest" : le contrôle est effectué mais pas dans les tests unitaires.Toute autre valeur désactive un chèque.
Notez que l'option "--skiptests" est l'équivalent de la modification de chaque vérification "enabled" par une vérification "skip-unittest" .
max_line_length .final est utilisé mais dans ce contexte, c'est un NOOP.@trusted n'est pas appliqué à une portée entière. La confiance à toute une portée peut être un problème lorsque de nouvelles déclarations sont ajoutées et si elles ne sont pas vérifiées manuellement pour être fiables.if , case , boucle, && , || ,? ?: , throw , catch , return , break , continue , goto et fonction littérale) Voir cette liste de problèmes ouverts pour la liste de souhaits.
L'option "--Report" écrit un rapport JSON sur le document d'analyse statique vérifie le document ci-dessus à la sortie standard. Ce fichier est généralement utilisé par le plugin D pour Sonarqube situé ici.
Utilisation de l'option "--Reportformat SonarQueGeneRissedata" Un rapport dans un format de données sur les problèmes génériques pris en charge sonar-scanner peut être créé.
$ dscanner --reportFormat sonarQubeGenericIssueData . > sonar-generic-issue-data.json
Référencer le nom de fichier du rapport dans sonar-project.properties en utilisant les clés "sonar.externalisuesReportPaths"
sonar.externalIssuesReportPaths=sonar-generic-issue-data.json
ACK, Grep et le chercheur d'argent sont utiles pour trouver des usages de symboles, mais leur rapport signal / bruit n'est pas très bon lors de la recherche de la déclaration d'un symbole. Les options "--Declaration" ou "-D" vous permettent de rechercher une déclaration de symboles. Par exemple:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
L'option "--sloc" ou "-l" imprime le nombre de lignes de code dans le fichier. Au lieu d'imprimer simplement le nombre de ruptures de ligne, cela compte le nombre de demi-colons, tandis que, si, sinon, Sinon, pour, pour, foreach, foreach_reverse, par défaut et les jetons de cas dans le fichier.
$ ./dscanner --sloc helloworld.d
2
L'option "--highlight" imprime le fichier source donné en Syntax-éclairé HTML à la sortie standard. Le style CSS utilise le schéma de couleurs solarisé par défaut, mais peut être personnalisé à l'aide de l'option "- Theme".
Les thèmes suivants sont disponibles:
solarized
solarized-dark
gruvbox
gruvbox-dark
Aucun exemple. Ça prendrait trop de place
L'option "--ctags" ou "-c" génère des informations CTAGS et l'écrit à la sortie standard. Les arguments d'annuaire sont analysés récursivement pour les fichiers .d et .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
La sortie CTAGS utilise les types de balises suivantes:
Plus d'informations sur le format CTAGS peuvent être trouvées ici.
Les options --etags , -e et --etagsAll sont similaires à --ctags sauf qu'un fichier de balises compatible EMACS est généré. L'option --etagsAll génère des balises pour les déclarations privées et de package en plus de quoi --etags et -e générer.
L'option "- Outline" analyse le fichier source D donné et écrit un simple aperçu des déclarations du fichier à Stdout.
Si un fichier dscanner.ini est localisé dans le répertoire de travail ou l'un de ses parents, il remplace tout autre fichier de configuration.
Comme l'emplacement final, D-scanner utilise le fichier de configuration donné dans $HOME/.config/dscanner/dscanner.ini . Exécutez --defaultConfig pour le régénérer.
L'option --config permet d'utiliser un chemin de fichier de configuration personnalisé.
Les options "--ast" ou "--xml" videront l'arborescence de syntaxe abstraite complète du fichier source donné en sortie standard au format 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 >Pour une sortie plus lisible, tuyau la commande via XMLLINT à l'aide de son commutateur de formatage.
$ dscanner --ast helloworld.d | xmllint --format -
Il est possible de créer une nouvelle section analysis.config.ModuleFilters dans le dscanner.ini . Dans cette section facultative, une liste de sélecteurs d'inclusion et d'exclusion séparées par des virgules peut être spécifiée pour chaque vérification sur quel filtrage sélectif doit être appliqué. Ces sélecteurs donnés correspondent au nom du module et aux correspondances partielles ( std. Ou .foo. ) Sont possibles. De plus, tous les sélecteurs doivent commencer par + (inclusion) ou - (exclusion). Les sélecteurs d'exclusion ont priorité sur tous les opérateurs d'inclusion. Bien sûr, pour chaque chèque, un ensemble de sélecteur différent peut donner:
[analysis.config.ModuleFilters]
final_attribute_check = " +std.foo,+std.bar "
useless_initializer = " -std. "Quelques exemples:
+std. : Comprend tous les modules correspondant std.+std.bitmanip,+std.json : applique le chèque uniquement pour ces deux modules-std.bitmanip,-std.json : applique le chèque pour tous les modules, mais ces deux+.bar : inclut tous les modules correspondant .bar (par exemple foo.bar , abcbarros )-etc. : Exclut tous les modules de .etc+std,-std.internal : comprend std entière, à l'exception des modules internes