السلطان
  1. الرئيسية
  2. التوثيق
  3. المرجع

التشخيصات

صفحات التوثيق

التشخيصات

تصف هذه الصفحة ما يطبعه السلطان حين يبلغ عن مشكلة: تخطيط الطرفية، ومخطط JSON، والأكواد العامة وشروحها، والاقتراحات والإصلاحات، والضمانات التي يحفظها كل منها. أما كيف تبنى التشخيصات داخل المترجم ففي iSpeak، والمقارنة بالمترجمات الأخرى في مقارنة التشخيصات.

اختيار الإخراج

الخيار أثره
--lang=ar (الافتراضي)، --lang=en، --lang=auto لغة كل رسالة
--diagnostic-format=human (الافتراضي)، short، json تخطيط الطرفية، أو سطر لكل تشخيص، أو أسطر JSON
`--color=always never
sultanc explain CODE، sultanc --explain CODE الشرح الطويل لكود عام

تخطيط الطرفية

خطأ[SULTANC-NAME-UNKNOWN]: الاسم `cuont` غير معروف — الاسم المطلوب مفقود أثناء حل المراجع.
  --> main.sn:6:18..6:23
   |
 6 |     let y: i32 = cuont + 1;
   |                  ^^^^^
   |
  = مساعدة: يوجد هنا اسم مرئي بتهجئة قريبة — البديل المقترح هو `count`.
  • السطر الأول هو الشدة، ثم الكود العام بين قوسين، ثم الرسالة: عنوان وجملة لكل حقيقة.
  • يعطي --> الملف وسطر البداية وعمودها، والنهاية حين يكون للنطاق نهاية. الأسطر والأعمدة تبدأ من 1، والأعمدة تعد محارف يونيكود (قيما عددية).
  • يعد سطر العلامات عناقيد المحارف الممتدة (UAX #29)، فالحرف مع حركاته علامة واحدة، وينسخ الجدول جدولا.
  • للموقع المرتبط (:::) مقتطفه وتسميته، وقد يكون في ملف آخر.
  • تليها أسطر = ملاحظة: و= مساعدة:.
  • في الرسائل العربية تحاط كل حقيقة مقتبسة بعازلي اتجاه أول قوي (U+2068 إلى U+2069) لتحفظ الحقيقة ذات الاتجاه من اليسار إلى اليمين ترتيبها داخل الجملة. ولا يحمل JSON هذه العلامات.

المقتطفات الآمنة

يعرض سطر المصدر في المقتطف كما كتب، إلا المحارف التي تغير طريقة عرض السطر أو تؤثر في الطرفية:

  • محارف التضمين والتجاوز والعزل ثنائية الاتجاه (U+202A إلى U+202E، وU+2066 إلى U+2069) تعرض بصيغة \u{202E}، ويرفضها المحلل المعجمي في المصدر أصلا (SULTANC-LEX-INVALID-TOKEN) لأنها قد تعرض الشفرة بترتيب غير الذي تترجم به (CVE-2021-42574)؛
  • محارف التحكم الأخرى (C0 عدا الجدول، وDEL، وC1) تعرض بصيغة \u{001B}؛
  • البايت الذي ليس جزءا من محرف يوتيف-8 يعرض بصيغة \xFF.

وتقع العلامة تحت التهريب.

JSON

يكتب --diagnostic-format=json كائن JSON في كل سطر، بالمخطط 3. حقوله:

الحقل معناه
schema، language 3، وen أو ar
id الكود العام، مثل SULTANC-NAME-UNKNOWN، ولا يتغير باللغة
kind النوع الآلي، مثل unknown-name
severity error أو warning أو note
category user أو environment أو internal أو unimplemented
message الرسالة كاملة بلغة language
primary_span، primary_role، primary_label الموقع الرئيسي
arguments الحقائق ذات الأنواع: {"key", "type", "value"} (انظر iSpeak)
related_spans {"role", "label", "span"}
dependencies نطاقات أخطاء سابقة يتبعها هذا الخطأ
notes، help {"message", "arguments"}
fixes {"span", "replacement", "message", "applicability", "key", "edits"}، وكل تعديل {"span", "replacement", "range_utf16"}
trace، trace_count مدخلات الأثر المفصل

النطاق هو {"file", "source_id", "start_byte", "end_byte", "line", "column", "end_line", "end_column", "column_utf16", "end_column_utf16", "snippet"}. البايتات إزاحات داخل الملف، وline وcolumn وend_column تبدأ من 1 وتعد المحارف. وcolumn_utf16 وend_column_utf16 هما العمودان نفساهما معدودين بوحدات UTF-16 (من 1)، كمواضع LSP، فيطرح عميل LSP واحدا. ويكونان null حين لا يكون السطر يوتيف-8. وهما دقيقان عند الطرفين وفي أي سطر للنطاق المبني من مصدره، وإلا اشتقا من السطر المعروض ويكون end_column_utf16 قيمة null حين ينتهي النطاق في سطر آخر. ولمواقع سي القيمة 4294967295 في source_id واسم ملف سي.

وkey في الإصلاح هو النوع الآلي الثابت للاقتراح (insert-semicolon، import-module، declare-mutable، ...، وnull لمفتاح بلا نوع). وrange_utf16 في كل تعديل مدى LSP {"start": {"line", "character"}, "end": {"line", "character"}} يبدأ من 0، أو null حين لا يتاح المصدر. وتعديلات الإصلاح الواحد تطبق معا ولا تتداخل.

قابلية تطبيق الإصلاح:

القيمة معناها
machine-applicable التعديل هو المقصود يقينا، ويجوز للأداة تطبيقه
maybe-incorrect التعديل صحيح على الأرجح، لكن ينبغي أن ينظر فيه إنسان (اقتراحات التهجئة)
has-placeholders في التعديل نص يجب ملؤه
unspecified بلا دعوى

المخطط يكبر ولا يتغير: يضاف الحقل الجديد، ويحفظ الحقل القائم اسمه ونوعه ومعناه.

الأكواد العامة

لكل تشخيص كود عام واحد. الأكواد وصفية (SULTANC-<المجال>-<الشيء>)، ولا يعاد استعمالها ولا ترقيمها. ويثبت tests/{ar,en}/ispeak/check_public_codes.sn كل كود ونوعه الآلي بترتيب السجل: إعادة تسمية أحدها أو حذفه أو تغيير ترتيبه تفشل ذلك الاختبار. ويضاف الكود الجديد في آخر السجل وآخر القائمتين في ذلك الاختبار، مع كلماته العربية والإنجليزية ومجموعة شرحه وقرار قالبه.

الاقتراحات

لا يعطى اقتراح إلا بدليل:

  • اسم مشابه. للاسم القيمي غير المعروف يقارن المترجم تهجئته المقننة (الهوية التي يقارنها محلل الأسماء بعد تقنين المعرفات) بالأسماء المرئية من النطاق نفسه وفي الحيز نفسه: المتغيرات المحلية من أعمق نطاق إلى أبعده، وتصريحات الوحدة، وبدائيات المترجم، والأسماء العامة للوحدات المستوردة كاملة. المسافة عدد عمليات الإدراج والحذف والاستبدال لمحرف واحد ومبادلة محرفين متجاورين، ويجب ألا تزيد على ثلث الطول، ولا اقتراح لاسم أقصر من ثلاثة محارف. وعند تساوي المسافة يفوز الأعمق ثم الأسبق. ويحل المرشح من جديد من النطاق نفسه قبل عرضه، ولا يقترح المتغير المحلي داخل عبارة تصريحه. ويأتي سطر مساعدة وإصلاح maybe-incorrect.
  • استيراد ناقص. حين تصرح وحدة من المكتبة القياسية حملتها الترجمة بالاسم عاما، يسمي سطر مساعدة تلك الوحدة، ويدرج إصلاح سطر استيرادها بعد آخر استيراد في الملف (أو قبل أول سطر شفرة فيه) بكلمات الملف نفسه (استورد أو import). ويكون الإصلاح machine-applicable حين تصرح بالاسم وحدة واحدة، وإلا maybe-incorrect. ولا يبحث في وحدات لم تحملها الترجمة.
  • متغير. الكتابة إلى ربط دع بلا متغير: سطر مساعدة وإصلاح machine-applicable يدرج متغير (mutable ) قبل النوع المصرح.
  • & و*. حين يتوقع مرجع إلى نوع القيمة وتكون القيمة اسما أو حقلا، يستعيرها إصلاح maybe-incorrect (& أو &متغير). وحين تكون القيمة مرجعا إلى النوع المتوقع، يقرأ إصلاح عبره (*): machine-applicable للعدد والمنطقي والحرف، وإلا maybe-incorrect.
  • مثل. حين يجمع تحويل صريح بين نوعين عدديين، يلف إصلاح القيمة بالصورة (القيمة مثل النوع) بتهجئة الملف. ويكون machine-applicable حين تكون كل قيمة من النوع الموجود قيمة من النوع المتوقع (عدد صحيح أعرض يحفظ الإشارة، أو عدد بإشارة أعرض)، وإلا maybe-incorrect.
  • الكلمات المحجوزة. الكلمة المحجوزة في موضع اسم (حقل أو معامل أو معامل نوع) تأتي معها مساعدة باختيار اسم آخر.

ويفحص كل إصلاح على بايتات المصدر قبل عرضه. ولا تحذير بعد للأسماء غير المستخدمة، فلا إصلاح لها.

والأدوات التي تستورد المترجم (خادم LSP) تقرأ البيانات نفسها التي في JSON من compiler.diagnostics.suggestions: يعيد اقتراحات_تشخيص(&التشخيص, اللغة) كل اقتراح (اقتراح_تشخيص: المفتاح والنوع الآلي والكلمات والقابلية والتعديلات) وكل تعديل بإزاحات البايت ومواضع LSP (تعديل_اقتراح_تشخيص)، ويبقي اقتراحات_آلية_لتشخيص الاقتراحات الآلية وحدها، ويطبق طبق_اقتراحا_على_نص اقتراحا على نص الملف أو يعيد لا شيء حين يخرج تعديل عن النطاق أو يتداخل تعديلان. ويطبق tests/{ar,en}/ispeak/check_suggestion_roundtrip.sn كل إصلاح آلي ثم يترجم الناتج.

أخطاء متعددة

يبلغ عن الأسماء غير المعروفة في الوحدة كلها، لكل منها دليله، وأولها هو الخطأ الذي كان المترجم يبلغ عنه قبل. وحين يلي اسما غير معروف خطأ من نوع آخر لا يبلغ عنه، فقد يكون ناتجا عن الاسم غير المربوط. وتبلغ أخطاء الملكية والاستعارة (SSF) كلها. أما المحلل المعجمي والمحلل النحوي ومدقق الأنواع فما زالت تقف عند أول خطأ. وتحمل المجموعة 100 خطأ على الأكثر، ولا تسقط التحذيرات أبدا. والتشخيص الذي يسمي الإخفاق المصدري الذي يعتمد عليه (dependencies) يسقط حين يكون ذلك الإخفاق قد بلغ.

تشخيصات سي

تستعمل تشخيصات استيرادات سي (SULTANC-C-*) التخطيط وJSON نفسيهما. الموقع هو ملف سي وسطره وعموده، وتشتق الأعمدة من سطر سي، وتعرض سلسلة #include نطاقات مرتبطة بالدور included-from. وتعرض تحذيرات استيراد سي حتى حين تنجح الترجمة.

الأخطاء الداخلية

إخفاق المترجم الذي ليس ذنب البرنامج فئته internal وكوده SULTANC-ICE-* أو SULTANC-INTERNAL-*، وتسمي رسالته مرحلة المترجم، وتطلب مساعدته إعادة التشغيل بتشخيصات JSON والإبلاغ عن الخلل. أما إخفاق البرنامج نفسه وقت التشغيل فليس تشخيصا من المترجم: انظر الأخطاء.

انظر أيضا