تخطَّ إلى المحتوى
cd /languages
  • برمجة نصية مضمّنة
  • البرمجة
  • دعم AST والرموز

لغة Lua في Maguyva: رسوم بيانية للشيفرة في الألعاب والإضافات وOpenResty

يدعم Maguyva لغة Lua بشجرة AST والرموز والرسم البياني، ليتمكن وكلاء الذكاء الاصطناعي من تتبّع الوحدات وتوابع النقطتين وفئات الجداول الوصفية وسلاسل require في شيفرة Lua.

أين تُربك Lua أدوات الذكاء الاصطناعي السطحية

لا توجد في Lua كلمة مفتاحية للفئات. الكائنات جداول، والتوابع دوال مخزّنة فيها، والوراثة استدعاء لـ setmetatable. والوحدة هي أي شيء يُرجعه require. البنية حقيقية، لكنها تعيش في أعراف لا يفهمها البحث النصي.

يقرأ Maguyva هذه الأعراف بوصفها بنية، فيسأل الوكيل عمّن يستدعي تابعًا أو أي الجداول توسّع فئة أساس، ويحصل على إجابة مباشرة.

ما الذي يستخرجه Maguyva من Lua

يغطي Maguyva ملفات .lua. تُستخرج تصريحات الدوال وتعريفات local function وتعابير الدوال، وتُنسب توابع النقطتين مثل function Account:deposit() إلى الجدول المالك لها، Account. وتُتتبّع سلاسل التوابع استدعاءً تلو الآخر، وتبقى الاستدعاءات على self مرتبطة بالكائن المحيط.

تُربط أعراف Lua بالعلاقات على النحو التالي:

  • تسجّل require وdofile وloadfile عمليات استيراد.
  • يسجّل استدعاء setmetatable على مستوى الوحدة وراثةً.
  • تُحتسب ClassName:new() وClassName.new() وsetmetatable({...}, ClassName) إنشاءً لنسخة.
  • يسجّل error() رمي خطأ، ويسجّل pcall وxpcall التقاطه.

ويسجّل الرسم البياني أيضًا القراءة والكتابة وتدفق التحكم.

أمثلة على مطالبات الوكلاء

  • “من يستدعي Inventory:addItem، ومن أي نصوص؟” (find_symbol ثم dependency_search في الاتجاه الوارد)
  • “ما الوحدات التي تحمّل util.http؟” (dependency_search)
  • “تتبّع ما يحدث عندما يتلقى اللاعب ضررًا.” (get_task_context)

القيود المعروفة

  • يُستبعد من العلاقات نحو 150 اسمًا: مكتبة Lua القياسية (string وtable وmath وio وos وcoroutine وdebug وutf8) إضافة إلى واجهتي Neovim vim.* وOpenResty ngx.*. الاستدعاءات إلى هذه الواجهات ليست حوافَّ في الرسم البياني، لذا استخدم text_pattern_search للعثور عليها.
  • لأن الوحدات والفئات تُبنى من استدعاءات وجداول عادية، لا يختار الإعدادان المسبقان classes وimports في structural_search شيئًا في Lua. استخدم بدلًا منهما find_symbol أو text_pattern_search.
  • لا توجد في Lua واجهات ولا توصيفات أنواع، لذا تُعلَّم علاقات تنفيذ الواجهات ومراجع الأنواع بأنها غير قابلة للتطبيق.

الخطوات التالية

اربط مستودعًا عبر دليل البدء السريع، ثم راجع مصفوفة الدعم في صفحة التوافق. وللمحرّكات التي تضمّن Lua في شيفرة أصلية، اقرأ أيضًا دليل لغة C.

الأنسب لـ

  • > شيفرة الألعاب ونصوص المحرّكات التي تستدعي فيها الوحدات والفئات المبنية على الجداول ومعالجات الأحداث بعضها بعضًا.
  • > إضافات Neovim وإعدادات المحرّر الموزّعة على وحدات كثيرة تُحمَّل عبر require.
  • > OpenResty وغيرها من بيئات Lua المضمّنة، حيث تجاور معالجاتُ الطلبات وحداتٍ مساعدة مشتركة.

سير عمل الوكلاء

  • > العثور على كل مستدعٍ لدالة في وحدة قبل تغيير وسائطها.
  • > تتبّع الوحدات التي تحمّل وحدة مساعدة مشتركة عبر require قبل نقلها.
  • > رسم خريطة للجداول التي ترث من فئة أساس عبر `setmetatable`.

تفاصيل المحرك

  • > يغطي دعم Lua الملفات `.lua`. تُنسب توابع النقطتين مثل `function Account:deposit()` إلى الجدول المالك لها.
  • > تسجّل `require` و`dofile` و`loadfile` عمليات استيراد، ويسجّل `setmetatable` على مستوى الوحدة وراثةً، ويُحتسب `ClassName:new()` إنشاءً لنسخة.
  • > يسجّل `error()` رمي خطأ ويسجّل `pcall` التقاطه، بينما يُستبعد نحو 150 اسمًا من المكتبة القياسية و`vim.*` و`ngx.*`.

نقاط دخول مفيدة عبر MCP

  • find_symbol

    استخدمه لدالة وحدة أو تابع نقطتين عندما تحتاج إلى التعريف والمستدعين.

  • dependency_search

    استخدم الاجتياز الوارد على وحدة مشتركة لرؤية الملفات التي تحمّلها عبر require قبل نقلها.

  • text_pattern_search

    استخدمه للاستدعاءات إلى `vim.*` أو `ngx.*` أو المكتبة القياسية، وهي مستبعدة من الرسم البياني.