跳转到内容
cd /languages
  • 长寿桌面应用
  • 编程语言
  • AST 和符号支持

Maguyva 的 Pascal 与 Delphi 支持:单元与类图谱

Maguyva 以 AST、符号和图谱支持 Pascal 和 Delphi 单元,让 AI 智能体在修改之前梳理 uses 子句、类和过程。

为什么 Pascal 代码库需要先有一张地图

Delphi 和 Free Pascal 应用往往围绕几个大型单元成长,其他所有代码都在使用它们。窗体继承自基础窗体,组件继承自基础组件,业务规则则放在十几个界面都会调用的过程里。逐个文件读起来很顺,但出问题的地方恰恰是依赖关系。

Maguyva 先把单元和类的结构交给智能体,让它在写任何代码之前就能说清一次修改会影响哪些地方。

Maguyva 在 Pascal 中提取什么

Maguyva 覆盖 .pas 和 .pp 源码单元。过程和函数定义会被提取为可调用符号,定义名中的 procedure、function、var 和 const 关键字会被去掉。类和接口可以在结构搜索中作为类型定义选取。

导入来自 uses 子句,关键字会被去掉,图谱中保存的是单元名。调用会经过规范化处理,去掉成员前缀、参数和外层括号,因此写成 Self.Save(x) 的调用会被保存为 Save。

图谱记录调用、继承、接口实现、重写、实例化、类型引用、读写,以及异常的抛出与处理边。约 107 个运行时库例程(WriteLn、ReadLn、Inc、Dec、Ord 等)会被排除在关系之外。

智能体提示词示例

  • “哪些单元使用了 DataModuleMain,它们从中调用了什么?”(dependency_search 的 incoming 方向)
  • “哪些窗体继承自 TBaseEditForm,它们重写了哪些方法?”(先用 find_symbol,再用 dependency_search)
  • “解释一张发票从按钮处理程序到数据库单元是如何过账的。”(get_task_context)

已知限制

  • 只有 .pas 和 .pp 被映射为 Pascal。.dpr、.dfm 等 Delphi 项目文件和窗体文件不在扩展名列表中,因此窗体布局和项目配置不在图谱范围内。
  • 方法与普通过程使用相同的语法,因此 structural_search 中的 methods 预设不会选中任何内容。请使用 functions 预设。
  • 对已过滤运行时库例程的调用不会作为图谱的边出现。查找它们请使用 text_pattern_search。

后续步骤

通过快速入门连接仓库,然后在兼容性页面查看支持矩阵。如果应用链接了 C 库,也请阅读 C 指南。

最适合场景

  • > 维护 Delphi 或 Lazarus/Free Pascal 应用、而原作者早已离开的团队。
  • > 拥有深层类层次、接口和大型共享单元的 Object Pascal 代码库。
  • > 现代化改造或移植工作,第一份交付物就是一张单元及其依赖关系图。

智能体工作流

  • > 在修改某个共享单元之前,列出所有在 `uses` 子句中引用它的单元。
  • > 找出继承自基础窗体或基础组件的类,以及它们重写的方法。
  • > 在修改例程参数之前,追踪有哪些过程调用了它。

引擎细节

  • > Pascal 支持覆盖 `.pas` 和 `.pp` 单元。`.dpr`、`.dfm` 等 Delphi 项目文件和窗体文件不在扩展名列表中。
  • > `uses` 子句会成为导入关系,调用会去掉成员前缀、参数和外层括号进行规范化。
  • > 约 107 个运行时库例程(如 `WriteLn`、`Inc` 和 `Ord`)会从关系中过滤掉,让应用代码更加突出。

常用 MCP 入口工具

  • find_symbol

    需要定义和引用时,用类、窗体或过程名来查找。

  • dependency_search

    对共享单元或基类使用 incoming 遍历,查看哪些单元和派生类依赖它。

  • get_task_context

    适用于“解释一张发票从按钮处理程序到数据库单元是如何过账的”这类提示词。