IDE لتطوير LUA المكتوبة بشكل ثابت.
مشتق من Emmylua.

self نوع حقيقي@shape@not النوع يلقي@type على بيانات العودة 






أحدث إصدار متاح للتنزيل داخل Intellij أو من موقع JetBrains Plugin.
يتم اشتقاق Luanalysis من Emmylua ويدعم جميع وظائف التحرير والإعادة الطالبة الأساسية التي توفرها Emmylua.
إلى جانب إمكانيات تحرير LUA الأساسية ، يدعم Luanalysis قدرًا كبيرًا من الوظائف الإضافية اللازمة لكتابة كودات متقدمة بشكل ثابت.
*ملاحظة*: يتم سرد الميزات تقريبًا بالترتيب الذي تم تنفيذه ، بأي حال من الأحوال ترتيب أهمية.
هناك طريقة رائعة لمعرفة ما هو ممكن من حيث الكتابة الثابتة هو الخروج من مشروع العرض التجريبي Luanalysis.

بالإضافة إلى تحديد الأنواع الجديدة ، يمكن الآن استخدام علامة @type لإلقاء نتيجة تعبير LUA.
هذا مفيد للغاية مع الدعم المضافة حديثًا لتعليقات كتلة Emmydoc حيث يمكننا بسهولة تحديد قوالب من النوع المضمّن:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/type_casts.lua
يحاول Emmylua تحديد ما إذا كان النوع قابل للتخصيص لنوع آخر ببساطة عن طريق التحقق مما إذا كان الأول هو "نوع فرعي" من الأخير ، ولكن لا يتم تنفيذ تباين النوع المناسب لأنواع معقدة. على سبيل المثال ، قد تكون الوظائف متغيرة أو مخالفة لأنواع الوظائف الأخرى ، اعتمادًا على المعلمات وأنواع قيمة الإرجاع:

Emmylua لا يبلغ عن الخطأ أعلاه.
بالإضافة إلى ذلك ، تم إصلاح الكشف عن تباين الاتحاد:

على النحو الوارد أعلاه ، فإن الإصدار الحالي من Emmylua لا يلتقط هذا الخطأ.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/string_literals.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics_scope.lua
يعمل فحص نوع IE الآن داخل الوظيفة "Lambdas" المعينة لمتغير مع تعريف EmmyDoc.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/lambda_params.lua
التحسينات المختلفة ، على سبيل المثال Emmydoc "صفائف" يمكن تعيينها الآن لأنواع الجداول المتوافقة على سبيل المثال

سيقوم إصدار Emmylua الحالي بالإبلاغ عن خطأ هنا على الرغم من أن هذا سليم.
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/tables.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l2249
إن إصدار Emmylua الحالي غير قادر على استنتاج الأدوية بشكل صحيح في العديد من المواقف ، وبالتالي تقارير أخطاء في النوع حيث لا يوجد خطأ ، ويغيب أيضًا عن الأخطاء التي يجب أن توجد فيها الأخطاء على سبيل المثال
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l181
افتراضيًا ، يتم الآن الإبلاغ عن أخطاء السلامة في الكتابة كخطايا بدلاً من التحذيرات. هذا ممكن من خلال ثلاثة أشياء:
العديد من التحسينات في القدرة على تحديد الأنواع المعقدة
اكتب إصلاحات أخطاء السلامة
صب
يعني الإلقاء على وجه الخصوص أنه إذا كان المستخدم يقوم بشيء ما ، فإن نظام النوع الذي يراه غير آمن ، لكنهم يعرفون في وقت التشغيل على ما يرام ، فيمكنهم فقط إضافة ممثلين للدلالة على ذلك وسيختفي الخطأ.

يُمنع تظليل المعلمة العامة ويبلغ الخطأ:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_scope.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua cdl444
self نوع حقيقي يمكن تعيين فحص النوع المحسّن self ، على سبيل المثال self يطابق نوع الأصل للطريقة. ومع ذلك ، لا يمكن تعيين هذا النوع من الوالدين self ، حيث قد يتم تصنيف الفصل (وفي هذه الحالة يشير self إلى نوع أكثر تحديدًا).

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/self.lua

سيسمح إصدار Emmylua الحالي بهذه المهمة غير الصالحة.
عندما تقوم دالة بإرجاع قيم متعددة ، فإن إصدار Emmylua الحالي سيستنتج القيم ويضعها في ذاكرة التخزين المؤقت. هذا غير دقيق لأن تحليل الأنواع العامة قد يؤدي إلى حل المعلمة العامة نفسها بشكل مختلف بناءً على القيمة التي يتم تعيينها ، وبالتالي لا يمكن استخدام ذاكرة التخزين المؤقت في هذا الظروف. يؤدي هذا في الوقت الحالي إلى كل من الأخطاء المفقودة ، وأخطاء غير دقيقة إضافية ، اعتمادًا على المهمة.
@shapeيمكن تعريف الشكل بشكل مشابه لفئة ما ، باستثناء أن المخالفات يتم تحديدها من خلال توافق الأعضاء وليس التسلسل الهرمي للميراث.
هذا مفيد للغاية عند العمل مع "الهياكل" (مثل JSON) بدلاً من فئات OOP.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua
ما الذي يجعل الأشكال مفيدة بشكل خاص هو أنها تدعم الأدوية والميراث (في وقت التعريف ، وليس المهمة) تمامًا مثل الفئات:
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua#l36-l74
والأفضل من ذلك ، لا يتم الإبلاغ عن عمليات التفتيش من النوع فقط على "Table" ككل ، ولكن عمليات التفتيش تعرف كيفية اجتياز حرفيات الطاولة وتوفير تعليقات مفصلة عن عدم التوافق بين شكلين على سبيل المثال

يمكن الآن أن تأخذ الأسماء المستعارة معلمات عامة ، تمامًا مثل فئة أو شكل.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_alas.lua
يمكن الآن استخدام أنواع الوظائف …: T كبديل لـ vararg T :

نحن ندعم الآن قيم الإرجاع المتغير:

داخليًا ، تم استبدال TyTuple بـ TyMultipleResults لتعكس حقيقة أن هذا البناء ليس ثابتًا. بالإضافة إلى ذلك ، يتم الآن التعامل مع نتائج متعددة بشكل صحيح في المزيد من المواقع.
التحسينات المختلفة على كتابة LUA مدمجة في الاستفادة من قيم الإرجاع المتنوع وما إلى ذلك.
يمكننا الآن كتابة جميع خصائص الجداول ، وليس فقط ثوابت السلسلة. بالنظر إلى أن التحليل luanalysis يضيف أيضًا دعمًا للأنواع الحرفية البدائية ، يمكننا استخدام هذا الكثير من الطرق المختلفة على سبيل المثال

هنا لدينا حقول معرف السلسلة العادية ، عدد الحقول الحرفية [1] ، [2] و [3] وحقل [boolean] . هذا الأخير قوي حقًا ، لأنه ليس ثابتًا ، إنه نوع حقيقي.
يمكننا كتابة هياكل البيانات المخصصة على سبيل المثال
--- @class Dictionary < K , V >
--- @field [ K] V سيعمل هذا بشكل صحيح لأي K وسيتم فحص كل شيء بشكل ثابت كما تتوقع.
هناك أيضًا بناء جملة لأنواع الجداول ، ويعمل على حرفي الجدول والفئات المجهولة (أي الجداول التي لم تكتب صراحة):

نحن ندعم الآن أنواع fun مع قوائم المعلمات الاختيارية وقيم الإرجاع الاختيارية ، أي fun: boolean ومتعة fun(arg: boolean) . fun (مع عدم تحديد أي منهما) يعمل أيضًا من أجل الأجيال القادمة ولكنه مكافئ وظيفيًا لنوع function الحالي.
الوظائف المكتوبة جزئيًا مفيدة للغاية لتنفيذ أنماط رد الاتصال والمعالج. على سبيل المثال ، من الشائع جدًا أن يكون لديك نظام أحداث قابل للتمديد حيث يكون لكل حدث حجج فريدة ، ولكن يجب أن يعود المعالج true للإشارة إلى أن الحدث تمت معالجته:

هذه ميزة أخرى مفيدة حقًا . يمكننا الآن الإشارة بشكل صحيح إلى أن الكائن قابل للاستدعاء (أي هو table له طريقة metatable لها طريقة __call ).

يتم ذلك باستخدام الكلمة الرئيسية الحالية @overload EmmyDoc ، ويعمل بشكل مشابه ، أي يمكننا تحديد العديد من الأحمال الزائدة ونوع الفحص والإنجاز سيعمل كما تتوقع:

يمكن تنفيذ tuples كأشكال ذات فهارس حرفية عدد:

أو كمستعيرات للأنواع الحرفية الجدول:

كما يتضح أعلاه ، عندما يكون النعمة متوافقة مع صفيف ، يمكن تعيينه إلى واحد ، ولكن ليس العكس.
يدعم التعليق التوضيحي @type قائمة الأنواع. يمكن استخدام هذا عند إعلان المتغيرات:

أو لإلقاء نتائج متعددة تم إرجاعها بواسطة تعبير (على سبيل المثال استدعاء الوظيفة):

@not النوع يلقي يلقي نوع @not type الأنواع من الاتحاد. إنه مفيد في مجموعة متنوعة من الظروف ، وأكثرها بشكل مستقيم ، والتي تقضي على nil :

مثل @type ، يدعم أيضًا قوائم النوع لإلقاء قيم إرجاع متعددة للدالة ، ويمكنها أن تقضي على النقابات:

عندما ترغب ببساطة في القضاء على الأنواع من الاتحاد ، يكون من المماثل عمومًا استخدام @not المصبوب من مجموعة @type لأن مجموعة @type تعطل بشكل أساسي جميع أنواع التحقق من المهمة ، حيث يستبعد @not فقط أنواعًا معينة.
@type على بيانات العودةتقبل عبارات الإرجاع الآن التعليقات التوضيحية نوعًا ، والتي هي طريقة آمنة لكتابة قيمة الإرجاع لـ Lambdas المجهولة.

على عكس نوع المصبوب ، فهذه آمنة من النوع:

يتم الآن حل أنواع الاسم المستعار ، مما يتيح لنا كتابة هياكل البيانات المتكررة. على سبيل المثال ، JSON:

واجهة برمجة تطبيقات الوظائف قد تُرجع عدد غير معروف من النتائج. ومع ذلك ، عند استدعاء هذه الوظائف ، تميل إلى معرفة عدد النتائج التي تتوقعها مرة أخرى.
يمكن nil قيمة الإرجاع المتنوع على قائمة @not ملموس

قد يتم أيضًا إلقاء نوع واحد متغير إلى آخر:

نحن الآن ندعم المعلمات الاختيارية في كل من تعريفات نوع الوظيفة القصيرة والطويلة على سبيل المثال

الأهم من ذلك ، الاختياري ليس قصيرًا بالنسبة nil | type .

لا يمكنك توفير nil ما لم يتضمن نوع المعلمة الاختيارية نفسه nil كجزء من الاتحاد في تعريف النوع. هذا أمر مرغوب فيه لأغراض الصواب عند تنفيذ وظائف في LUA ، على سبيل المثال ، إذا كان التنفيذ يستخدم [ select('#', …) ] (https://www.lua.org/manual/5.3/manual.html#pdf-select). ومع ذلك ، علاوة على ذلك ، يتم استخدام LUA بانتظام كلغة نصية ، وربط دالة LUA إلى التطبيقات بلغات أخرى لها دعم للأحمال الزائدة وما إلى ذلك حيث يكون عدد ونوع الوسائط مهمًا.
تم أيضًا تنفيذ عمليات التفتيش التي تمنع ترتيب المعلمة الاختياري غير الصحيح:
بناء البرنامج المساعد مع:
./gradlew buildلمزيد من التفاصيل حول منصة JetBrains SDK ، يرجى الرجوع إلى الوثائق الرسمية.
سينتهي المكون الإضافي الناتج .zip في الدليل ./build/distributions/ .
لتثبيت .zip الذي قمت ببنائه ، ستحتاج إلى الذهاب إلى Intellij ...
التفضيلات -> المكونات الإضافية -> الإعدادات COG ICON -> قم بتثبيت البرنامج المساعد من القرص ...

حدد .zip ، ثم عند المطالبة ، أعد تشغيل Intellij.
luanalysis بواسطة: بنيامين دوبيل
emmylua بواسطة: tangzx 阿唐
المساهمين
يرجى الرجوع إلى github للحصول على قائمة كاملة من المساهمين.
شكرًا لك على الرعاة والمؤيدين الذين يساعدون في Luanalysis الذين يساعدون في ضمان التطوير المستمر في التحليل.