# لغة Elixir في Maguyva: رسوم بيانية للشيفرة في تطبيقات Phoenix وOTP

Canonical source: https://maguyva.ai/ar/languages/elixir

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

يدعم Maguyva لغة Elixir بشجرة AST والرموز والرسم البياني، ليتمكن وكلاء الذكاء الاصطناعي من تتبّع الوحدات والسلوكيات والبروتوكولات والبُنى في شيفرة Phoenix وOTP.

## لمحة عن الدعم

- المستوى: دعم AST والرموز
- البرمجة
- الامتدادات: .ex, .exs
- تحليل AST حقيقي لبحث واعٍ بالصياغة النحوية وسياق بنيوي.
- تُغذّي الرموز المسمّاة البحث الدلالي والمراجع المتقاطعة. ويتوفر التنقل عبر الرسم البياني عند تمكين استخراج العلاقات.
- تُسهم هذه اللغة بالرموز والعلاقات في البحث المراعي لبنية الرسم البياني؛ وتختلف أنواع الحواف المدعومة بحسب التراكيب الأصلية في اللغة.
- يتوفر كل من تحليل AST واستخلاص الرموز.

## الأنسب لـ

- تطبيقات Phoenix التي تستدعي فيها المتحكّمات وصفحات LiveView والسياقات ومخططات Ecto بعضها بعضًا عبر وحدات كثيرة.
- أنظمة OTP المبنية من GenServer والمشرفين والمهام.
- المكتبات ومشاريع المظلّة التي تُنفَّذ فيها البروتوكولات لأنواع كثيرة.

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

- العثور على كل مستدعٍ لدالة سياق قبل تغيير شكل ما تُرجعه.
- سرد الوحدات التي تنفّذ سلوكًا أو بروتوكولًا قبل إضافة دالة رد نداء.
- تتبّع طلب من متحكّم Phoenix إلى طبقة Ecto.

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

كل شيء تقريبًا في Elixir هو استدعاء ماكرو. تُحلَّل `defmodule` و`def` و`use` و`alias` و`@impl` كلها بوصفها استدعاءات، ويجلب `use GenServer` سلوكًا لا يظهر في الملف أبدًا. والأداة التي لا ترى إلا صيغة الاستدعاء لا تستطيع التمييز بين التعريف والاعتمادية، ولا بين دالة رد نداء في GenServer ودالة مساعدة.

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

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

يغطي Maguyva ملفات `.ex` و`.exs`. وتُربط وحدات الماكرو في Elixir بالعلاقات على النحو التالي:

- تسجّل `alias` و`import` و`require` عمليات استيراد.
- يسجّل `use` عملية استيراد. ولسلوكيات OTP والأطر مثل `GenServer` و`Supervisor` و`Agent` و`Task` و`Phoenix.Controller` و`Phoenix.LiveView` و`Ecto.Schema`، يسجّل أيضًا أن الوحدة تنفّذ ذلك السلوك.
- تسجّل سمات `@behaviour` وكتل `defimpl` تنفيذ سلوك أو بروتوكول.
- تُسجَّل سمات الوحدة المحجوزة مثل `@doc` و`@spec` و`@impl` و`@callback` بوصفها توصيفات على الدالة التي تليها. أما سمات القيم مثل `@timeout 5_000` فلا تُسجَّل.
- تُحتسب حرفيات البنية `%User{}` إنشاءً لنسخة، ويسجّل `raise` رمي استثناء، ويسجّل `rescue` و`catch` التقاطه.

تُستبعد من الاستدعاءات وحدات الماكرو الخاصة باللغة مثل `def` و`defp` و`defmodule` و`case` و`with`، فيُظهر رسم الاستدعاءات دوالّك أنت.

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

- "من يستدعي `Accounts.register_user`، ومن أي متحكّمات؟" (`find_symbol` ثم `dependency_search` في الاتجاه الوارد)
- "ما الوحدات التي تنفّذ `GenServer`؟" (`dependency_search`)
- "تتبّع طلب الدفع من المتحكّم إلى قاعدة البيانات." (`get_task_context`)

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

- صيغ `def` و`defmodule` و`alias` و`import` المسمّاة هي عُقد استدعاء في القواعد النحوية، لذا لا يُرجع نتائج في `structural_search` إلا الإعداد المسبق `functions`، وللدوال المجهولة `fn` فقط. استخدم `find_symbol` للدوال والوحدات المسمّاة.
- يُستبعد من العلاقات نحو 55 استدعاءً من المكتبة القياسية، مثل `IO.puts` و`String.*` و`Enum.take` و`Process.*`. استخدم `text_pattern_search` لها.
- لا تعرف Elixir وراثة الفئات، لذا تُعلَّم علاقات الوراثة بأنها غير قابلة للتطبيق.

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

اربط مستودعًا عبر [دليل البدء السريع](/ar/docs/quickstart)، ثم راجع مصفوفة الدعم في [صفحة التوافق](/ar/docs/compatibility). ولقواعد الشيفرة الوظيفية الأخرى، اقرأ [دليل لغة Haskell](/ar/languages/haskell).

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

- يغطي دعم Elixir الملفات `.ex` و`.exs`. تسجّل `alias` و`import` و`require` و`use` عمليات استيراد.
- يسجّل `use GenServer` وغيره من سلوكيات OTP والأطر المدرجة، و`@behaviour` و`defimpl`، علاقات التنفيذ.
- توصّف السمات المحجوزة مثل `@spec` و`@impl` الدالة التالية، وتُحتسب حرفيات `%Struct{}` إنشاءً لنسخة.

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

- `find_symbol`: استخدمه لدالة سياق أو وحدة عندما تحتاج إلى التعريف والمستدعين؛ فالإعدادات البنيوية المسبقة لا تختار صيغ `def` المسمّاة.
- `dependency_search`: استخدم الاجتياز الوارد على سلوك أو بروتوكول لرؤية الوحدات التي تنفّذه.
- `get_task_context`: استخدمه لمطالبات مثل "تتبّع طلب الدفع من المتحكّم إلى قاعدة البيانات".
