D-Scanner هي أداة لتحليل رمز المصدر D
تأكد أولاً من أن لديك كل رمز المصدر. قم بتشغيل git submodule update --init --recursive -بعد استنساخ المشروع.
لبناء D-Scanner ، قم بتشغيل make (أو ملف build.bat على Windows). يمكن أن يكون وقت البناء طويلًا إلى حد ما مع العلم -في الإصدارات الأمامية التي تزيد عن 2.066 ، لذلك قد ترغب في إزالتها من البرنامج النصي. يحتوي Makefile على أهداف "LDC" و "GDC" إذا كنت تفضل التجميع مع أحد هذه المترجمين بدلاً من DMD. للتثبيت ، ما عليك سوى وضع الثنائي الذي تم إنشاؤه (في مجلد "Bin") في مكان ما على مسار $ الخاص بك.
الاختبار لا يعمل مع DUB. تحت 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 comment / dscanner.ini لمزيد من المعلومات. نصيحة: قد يكون لدى بعض IDEs التي تدمج D-Scanner مساعدين لتكوين التشخيصات أو المساعدة في إنشاء ملف dscanner.ini.
يستخدم
dscanner fix source/ لإصلاح جميع المشكلات القابلة للإصلاح بشكل تفاعلي داخل دليل المصدر. اتصل بـ --applySingle لتطبيق الإصلاحات تلقائيًا التي لا تحتوي على حلول تلقائية متعددة.
العديد من المحررين D يشحنون بالفعل مع D-Scanner.
للحصول على إخراج cli / tool arsable استخدم أيضًا
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" "-emports" ، باستثناء أنه يسرد واردات الواردات (وما إلى ذلك) بشكل متكرر. يتطلب خيار الاستيراد المتكرر تحديد مسارات الاستيراد من أجل العمل بشكل صحيح.
القيود:
version أو static if .يطبع خيار "-syntaxcheck" أو "-S" قائمة بأي أخطاء أو تحذيرات موجودة أثناء التحليل أو تحليل الملف المصدر المحدد. لا يقوم بأي تحليل دلالي ولا يجمع الرمز. يمكن تكوين تنسيق الأخطاء أو التحذيرات مع خيار "-errorformat" أو "-f".
يدير خيار "-stylecheck" أو "-S" بعض عمليات فحص التحليل الثابت الأساسي مقابل ملفات المصدر المحددة ، والمصادر الواردة في المجلدات المحددة ، أو المصادر الواردة في دليل العمل الحالي (عندما لا يتم توفير أي شيء). يمكن تكوين تنسيق الأخطاء أو التحذيرات مع خيار "-errorformat" أو "-f".
يمكن أن تنتج اختبارات الوحدة الثابتة في اختبارات الوحدة تحذيرات غير ذات صلة. على سبيل المثال ، من الشرعي أن نعلن عن متغير لا يتم استخدامه إذا كان الهدف هو التحقق من أنه يمكن إنشاء دالة المعبد عن طريق استنتاج نوع هذا المتغير. لتجنب هذه الحالات ، من الممكن تمرير خيار "-skiptests".
بشكل افتراضي يتم تمكين جميع الشيكات. يمكن تمكين الشيكات الفردية أو تعطيلها باستخدام ملف التكوين. يمكن وضع مثل هذا الملف ، على سبيل المثال ، هو الدليل الجذر لمشروعك. سيقوم تشغيل dscanner --defaultConfig بإنشاء ملف تكوين افتراضي وطباعة موقع الملف. يمكنك أيضًا تحديد المسار إلى ملف التكوين باستخدام خيار "---Config" إذا كنت تريد تجاوز الإعدادات الافتراضية أو الإعدادات المحلية.
لكل شيك ، ثلاث قيم ممكنة:
"disabled" : لا يتم إجراء الشيك."enabled" : يتم إجراء الشيك."skip-unittest" : يتم إجراء الشيك ولكن ليس في اختبارات الوحدة.أي قيمة أخرى تقوم بإلغاء تنشيط الشيك.
لاحظ أن خيار "-skiptests" هو ما يعادل تغيير كل شيك "enabled" بواسطة شيك "skip-unittest" .
max_line_length .final ولكن في هذا السياق هو noop.@trusted لا يتم تطبيقه على نطاق كامل. يمكن أن يكون الوثوق بمجموعة كاملة مشكلة عند إضافة إعلانات جديدة وإذا لم يتم التحقق منها يدويًا لتكون موثوقة.goto catch يبدأ break 1 continue زاد return throw في كل if ?: case التبديل && الحلقة || انظر هذه القائمة من القضايا المفتوحة لقائمة الأمنيات.
يكتب خيار "-التقارير" تقرير JSON حول مستند التحليل الثابت أعلاه إلى الإخراج القياسي. عادة ما يتم استخدام هذا الملف بواسطة المكون الإضافي D لـ Sonarqube الموجود هنا.
باستخدام الخيار "-Treportformat Sonarqubegenericissuedata" ، يمكن إنشاء تقرير في تنسيق بيانات القضية العامة المدعومة من سونار.
$ dscanner --reportFormat sonarQubeGenericIssueData . > sonar-generic-issue-data.json
الرجوع إلى اسم ملف التقرير في السونار.
sonar.externalIssuesReportPaths=sonar-generic-issue-data.json
يعد ACK و GREP والباحث الفضي مفيدًا لإيجاد استخدامات الرموز ، لكن نسبة الإشارة إلى الضوضاء ليست جيدة جدًا عند البحث عن إعلان الرمز. تتيح لك خيارات "-Declaration" أو "-D" البحث عن إعلان الرموز. على سبيل المثال:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
يطبع خيار "--Sloc" أو "-L" عدد خطوط التعليمات البرمجية في الملف. بدلاً من مجرد طباعة عدد فترات فترات الأسطر ، فإن هذا يحسب عدد المنقصين ، في حين ، إذا ، إذا كان ، آخر ، التبديل ، من أجل ، foreach_reverse ، الافتراضي ، ورموز الحالة في الملف.
$ ./dscanner --sloc helloworld.d
2
يطبع خيار "-Highlight" الملف المصدر المحدد على أنه HTML المضيء ببناء الجملة إلى الإخراج القياسي. يستخدم تصميم CSS نظام الألوان الشمسي بشكل افتراضي ، ولكن يمكن تخصيصه باستخدام خيار "-الموضوع".
السمات التالية متوفرة:
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 .
يخلق خيار "-Ooutline" ملف Source Source المعطى ويكتب مخططًا بسيطًا لإعلانات الملف إلى 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 بأكملها ، باستثناء الوحدات الداخلية