D-Scanner-это инструмент для анализа исходного кода D
Сначала убедитесь, что у вас есть весь исходный код. Запустите git submodule update --init --recursive после клонирования проекта.
Чтобы построить D-Scanner, запустите make (или файл build.bat в Windows). Время сборки может быть довольно длинным с флагом -INLINE на передних версиях старше 2,066, поэтому вы можете удалить его из сценария сборки. Makefile имеет цели «LDC» и «GDC», если вы предпочитаете компилировать с одним из этих компиляторов вместо DMD. Чтобы установить, просто поместите сгенерированный двоичный файл (в папке "Bin") где -то на вашем пути.
Тестирование не работает с Dub. Под Linux или OSX запустите тесты с помощью make test . Под Windows запустите тесты с помощью build.bat test .
> dub fetch dscanner && dub run dscannerС докером не требуется установка:
docker run --rm -v $( pwd ) :/src dlangcommunity/dscannerСледующие примеры предполагают, что мы анализируем простой файл под названием helloworld.d
import std.stdio ;
void main ( string [] args)
{
writeln( " Hello World " );
}Использовать
dscanner lint source/Чтобы просмотреть человеческий читаемый список проблем.
Диагностические типы могут быть включены / отключены с помощью файла конфигурации, ознакомьтесь с файлом --config Argiry / dscanner.ini для получения дополнительной информации. Совет: Некоторые IDE, которые интегрируют D-Scanner, могут иметь помощников для настройки диагностики или помочь генерировать файл dscanner.ini.
Использовать
dscanner fix source/ Чтобы интерактивно исправить все исправленные проблемы в справочнике. Позвоните с --applySingle , чтобы автоматически применять исправления, которые не имеют нескольких автоматических решений.
Многие редакторы D уже поставляются с D-Scanner.
Для проанализируемого вывода CLI / инструмента используйте либо
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
Параметр «-Импорты» или «-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
Опция «--рекурсивных импортов» похожа на «Импорты», за исключением того, что он перечисляет импорт импорта (и т. Д.) Рекурсивно. Опция рекурсивного импорта требует, чтобы пути импорта были указаны для правильной работы.
Ограничения:
version или static if .Параметр «-syntaxcheck» или «-s» печатает список любых ошибок или предупреждений, найденных при лексинге или анализе данного исходного файла. Он не делает никакого семантического анализа и не составляет код. Формат ошибок или предупреждений может быть настроен с помощью опции «-иеррориформы» или «-f».
Параметр «---Stylecheck» или «-s» выполняет некоторые базовые проверки статического анализа по данным исходным файлам, источникам, содержащимися в данных папках, или источники, содержащиеся в текущем рабочем каталоге (когда ничего не поставляется). Формат ошибок или предупреждений может быть настроен с помощью опции «-иеррориформы» или «-f».
Статические проверки в модульных тестах могут создавать не относящиеся к делу предупреждения. Например, законно объявлять переменную, которая не используется, если цель состоит в том, чтобы убедиться, что временная функция может быть создана путем вывода типа этой переменной. Чтобы избежать этих случаев, можно передать опцию «--Skiptests».
По умолчанию все проверки включены. Индивидуальные проверки могут быть включены или отключены с помощью файла конфигурации. Такой файл может быть размещен, например, является корневым каталогом вашего проекта. Запуск dscanner --defaultConfig будет генерировать файл конфигурации по умолчанию и распечатать местоположение файла. Вы также можете указать путь к файлу конфигурации, используя опцию «-config», если вы хотите переопределить по умолчанию или локальные настройки.
Для каждой проверки возможны три значения:
"disabled" : чек не выполняется."enabled" : проверка выполняется."skip-unittest" : проверка выполняется, но не в модульных тестах.Любое другое значение деактивирует чек.
Обратите внимание, что опция «--skiptests» является эквивалентом изменения каждой "enabled" проверки с помощью проверки "skip-unittest" .
max_line_length .final атрибут используется, но в этом контексте это поход.@trusted не применяется к целой области. Доверие целой области может быть проблемой, когда добавляются новые объявления, и если они не проверены вручную, чтобы быть доверенными.break порога на функцию return continue catch начинается с 1, увеличивается по throw при goto case if , Clase, Loop, && , || ?: Смотрите этот список открытых проблем для списка желаний.
Опция «-Report» записывает отчет JSON по статическому анализу, проверенному документу выше, чтобы получить стандартный вывод. Этот файл обычно используется плагином D для Sonarqube, расположенного здесь.
Использование опции »-REPORTFORMAT SonarquegenericissIssuedata». Можно создать отчет в Sonar-Scanner, поддерживаемом форматом данных об общих выпусках.
$ dscanner --reportFormat sonarQubeGenericIssueData . > sonar-generic-issue-data.json
Ссылка на имя файла отчета в Sonar-Project.Properties с использованием ключа "Sonar.externalisseReportPaths"
sonar.externalIssuesReportPaths=sonar-generic-issue-data.json
ACK, GREP и SISCER Searcher полезны для поиска использования символов, но их отношение сигнал к шуму не очень хорошее при поиске объявления символа. Параметры «-декларация» или «-d» позволяют искать декларацию символов. Например:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
Параметр «--sloc» или «-l» печатает количество строк кода в файле. Вместо того, чтобы просто печатать количество разрывов строки, это считается количеством полуколона, в то время как, если, DO, ELE, Switch, For Foreach, Foreach_Reverse, Default и Case токены в файле.
$ ./dscanner --sloc helloworld.d
2
Параметр «-Highlight» напечатает заданный исходный файл в виде синтаксиса 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 использует следующие виды тегов:
Более подробную информацию о формате CTAGS можно найти здесь.
Параметры --etags , -e и --etagsAll аналогичны --ctags , за исключением того, что создается файл тегов, совместимые с EMACS. Параметр --etagsAll генерирует теги для частных и пакетных объявлений в дополнение к тому, что --etags и -e генерируют.
Параметр «-Вуть» анализирует данный исходный файл 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 -
Можно создать новый раздел analysis.config.ModuleFilters в dscanner.ini . В этом необязательном разделе можно указать список селекторов включения и исключения, разделенного запятыми, может быть указан для каждой проверки, на которой должна применяться селективная фильтрация. Эти заданные селекторы совпадают с именем модуля и частичными совпадениями ( 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 , за исключением внутренних модулей