mcpField
E
explain-abap-code

explain-abap-code

github.com/arc-mcp开发239274 次安装2 天前更新
代码仓库

关于 explain-abap-code

explain-abap-code 是面向 ABAP 开发者的代码解释技能,可按对象类型读取代码并结合依赖上下文说明用途与结构。它还可按需分析 ATC 代码质量问题,并研究 SAP 文档。

主要功能

  1. 01自动识别 ABAP 对象类型
  2. 02读取源码与相关对象
  3. 03获取压缩依赖图和 API 信息
  4. 04按需分析 ATC 检查结果
  5. 05查询 SAP 文档与最佳实践

适用场景

  1. 01了解 ABAP 类、CDS 实体或程序
  2. 02追踪 RAP 行为定义及其处理类
  3. 03查看对象依赖和下游影响
  4. 04解释 ATC 发现的问题

MCP 相关

技能通过 ARC-1 调用 SAP 系统访问能力,并结合 mcp-sap-docs 查询文档与最佳实践。它未说明向 MCP 客户端提供服务。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/arc-mcp/arc-1 --skill explain-abap-code

安装后在 Claude Code 中输入/explain-abap-code确认已加载。

详细介绍

解释 ABAP 代码

结合完整依赖上下文解释 ABAP 对象,并可选择进行 ATC 代码质量分析。

此技能通过结合 ARC-1(SAP 系统访问)和 mcp-sap-docs(文档与最佳实践),复现 SAP Joule 的“解释代码”功能。它通过 SAPContext 提供压缩的依赖图,能力超越 J4D。

智能默认设置(静默应用,切勿询问)

设置默认值原因
对象类型通过 SAPSearch 自动检测不要让用户查找类型
深度概览从高层次开始,用户可按需了解详情
ATC否仅在用户询问代码质量时运行
依赖项通过 SAPContext 获取始终获取依赖图
BDEF 处理程序类从 implementation in class 子句中发现行为逻辑位于绑定的池类中

输入

用户提供一个 ABAP 对象名称(例如,ZCL_TRAVEL_HANDLER、ZI_SALESORDER、Z_REPORT_POSTING)。

只需提供对象名称。如果用户只提供对象名称,则自动检测类型,并立即开始概览说明。

用户也可以指定:

  • 对象类型(默认:自动检测)
  • 解释 ATC 发现项?(默认:否)
  • 深度——“概览”或“详细”(默认:概览)

第 1 步:读取对象

1a. 确定类型(如果未提供)

如果用户未指定类型,则搜索该对象:

SAPSearch(query="<object_name>")

使用第一个结果的类型。如果存在歧义(有多个匹配项),则询问用户。

1b. 读取源代码
SAPRead(type="<type>", name="<object_name>")
1c. 对于类——同时获取方法列表
SAPRead(type="CLAS", name="<class_name>", method="*")

这会返回所有方法及其签名、可见性(public/protected/private)和参数类型。这对于理解类 API 至关重要。

1d. 对于 CDS 实体——同时获取结构化字段列表
SAPRead(type="DDLS", name="<entity_name>", include="elements")

返回所有字段的格式化列表,其中包含键标记、别名、关联和表达式类型。

1e.(可选)读取相关制品

根据类型,还要读取相关对象:

  • CLAS:SAPRead(type="CLAS", name="<class>", include="testclasses")——检查是否存在测试
  • DDLS:SAPRead(type="BDEF", name="<entity>")——检查是否存在行为定义;SAPRead(type="DCLS", name="<entity>_DCL")——检查 CDS 访问控制;SAPRead(type="DDLX", name="<entity>")——检查是否存在元数据扩展
  • BDEF:SAPRead(type="DDLS", name="<entity>")——读取相关的 CDS 视图

如果相关制品不存在,这些操作可能会失败——没关系,跳过即可。

1f. 对于行为定义(BDEF)——遍历 RAP 图

行为定义只有与其绑定的 CDS 根实体和行为池(处理程序)类一起才有意义。当对象是 BDEF 时,请执行以下操作,以替代或补充上述步骤:

读取 BDEF 源码:

SAPRead(type="BDEF", name="<bdef_name>")

通过读取 BDEF 源码,确定实现类型和绑定的池类:

  • 第一个非注释标记:managed / unmanaged / projection / abstract / interface——这是实现类型
  • strict ( 2 ) → 最新的 RAP 语法检查;with draft / with collaborative draft → 启用草稿
  • 子句 ... implementation in class <ZBP_NAME> unique; 指定了行为池类。使用类似 implementation\s+in\s+class\s+(\S+) 的正则表达式提取 <ZBP_NAME>。(projection; BDEF 可能没有池类——它会通过 use ... 复用基础行为。)

读取行为池类(处理程序逻辑位于其本地包含文件中,通常是 CCIMP):

SAPRead(type="CLAS", name="<ZBP_NAME>", include="implementations")

如果返回结果为空,还要尝试 include="definitions"(CCDEF)和主包含文件。本地处理程序类命名为 lhc_<alias>,每个 FOR DETERMINE / FOR VALIDATE / FOR MODIFY 方法都会实现相应的 BDEF 声明。

读取绑定的 CDS 根实体,以了解该行为所管理的数据模型:

SAPRead(type="DDLS", name="<root_cds>", include="elements")

根 CDS 名称出现在 define behavior for <root_cds> alias <alias> 中。

对于投影 BDEF,还要读取其底层基础 BDEF(即它所投影的 BDEF),查看复用了哪些操作(use create; use update; use action ...)。

如果某个制品不存在(例如纯抽象 BDEF),读取可能会失败——请妥善跳过。

1g. 对于函数组(FUGR)——读取完整代码树

函数组的逻辑分布在嵌套的包含文件中:主程序引用 TOP(全局数据)和 UXX(函数模块分发器)包含文件;实际的 FUNCTION … ENDFUNCTION 函数体位于更深层的 LZ<grp>U01/U02… 包含文件中,这些文件由 UXX 引入(PBO/PAI 子例程位于 …O…/…I… 包含文件中)。使用 expand_includes 一次调用即可读取整棵树:

SAPRead(type="FUGR", name="<group>", expand_includes=true)

这会返回主源码以及所有嵌套包含文件(递归展开,并受深度和数量上限限制),每段内容前都有 === <name> === 标记——这样一次读取就能获取所有函数模块函数体和流程逻辑。不使用 expand_includes 时,只能获取函数模块列表。

无法获取屏幕流程。 ADT over REST 不会公开 Dynpro(屏幕)和 GUI 状态(CUA)——它们只能通过 SAPGUI(SE51/SE41)访问,相关端点会返回 404。因此,对于 FUGR,你可以根据代码说明其业务用途、函数模块职责和流程逻辑,但无法说明屏幕布局或超出 PBO/PAI 模块 代码 所揭示内容的 PBO-PAI 屏幕顺序。如果用户具体询问屏幕流程,请说明此限制。

步骤 2:获取依赖上下文

SAPContext(type="<type>", name="<object_name>")

此操作会自动提取所有依赖项,并获取每个依赖项经过压缩的公共 API 契约。它会提供:

  • 对于类:使用的接口、超类、注入的依赖项、对其他类中方法的调用
  • 对于 CDS 视图:数据源(FROM、JOIN)、关联、组合、投影基视图
  • 对于程序:调用的函数模块、使用的类、包含的程序

对于依赖链较深的复杂对象,请使用 depth=2:

SAPContext(type="<type>", name="<object_name>", depth=2)

如果 SAPContext 失败(例如,遇到不支持的类型),请改为手动读取源代码中识别出的关键依赖项。

支持的类型:SAPContext 接受 CLAS、INTF、PROG、FUNC、DDLS(本地部署)/ CLAS、INTF、DDLS(BTP)。它不接受 BDEF。因此,解释 BDEF 时,请改为对绑定的 CDS 根实体运行依赖项/影响分析:

SAPContext(action="impact", name="<root_cds>")

action="impact"(仅限 DDLS)会返回下游影响范围——构建于该行为之上的投影视图、消费视图和服务。这就是针对行为定义回答“依赖项 / 谁在使用它”的方法。对于处理程序类的内部逻辑,请运行 SAPContext(type="CLAS", name="<ZBP_NAME>")。

步骤 3:(可选)运行 ATC 检查

如果用户要求解释代码质量或 ATC 检查结果:

SAPDiagnose(action="atc", type="<type>", name="<object_name>")

如果需要特定的 ATC 变体(例如,S/4HANA 就绪性):

SAPDiagnose(action="atc", type="<type>", name="<object_name>", variant="<variant>")

按优先级对检查结果分组:

  • 优先级 1(错误):必须修复的问题——已弃用的 API、语法问题
  • 优先级 2(警告):应该修复的问题——性能、可维护性
  • 优先级 3(信息):可考虑修复的问题——风格、约定
  • 检查每条结果的 hasQuickfix 标志。如果值为 true,请说明 SAP 为该位置提供了可由机器应用的快速修复建议。

步骤 4:(可选)使用 mcp-sap-docs 进行调研

对于源代码中发现的不熟悉的 SAP API:

search("<class_or_function_name> ABAP documentation")

对于需要解释的 ATC 检查结果:

search("<checkTitle> simplification item S/4HANA")

对于可用的 SAP Notes:

sap_notes_search(q="<finding_or_api_name>")

使用文档结果补充说明中的 SAP 官方背景信息。

步骤 5:解释

按以下章节组织说明。根据用户偏好(概览或详细说明)调整深度。

摘要
  • 用途:用一句话说明该对象的作用
  • 类型:对象类型和分类(例如,“RAP 行为池”“接口 CDS 视图”“ALV 报表”)
  • 范围:方法/字段/行数、复杂度评估
公共 API

对于类:

  • 关键公共方法及其签名和用途
  • 实现的接口
  • 构造函数参数(尤其是注入的依赖项)
  • 引发的事件

对于 CDS 视图:

  • 暴露字段及其业务含义
  • 参数(如有)
  • 可用于导航的关联
业务逻辑
  • 核心处理流程(调用关键方法时会发生什么)
  • 重要业务规则和条件
  • 数据转换和计算
  • 错误处理方式
行为定义(如果对象是 BDEF)

围绕你在步骤 1f 中读取的 RAP 行为图来组织说明:

  • 实现类型:托管 / 非托管 / 投影 / 抽象 / 接口 — 以及其含义(框架提供 CRUD、自定义处理程序,还是复用 / 类型定义层)。如果存在,请注明 strict(2) 和 with draft。
  • 业务用途:根据绑定的 CDS 根实体和 BDEF 头部注释推导。
  • 每个实体的模型:对于每个 define behavior for <CDS> alias <alias> — 持久化表、lock master / lock dependent、authorization master / authorization dependent、etag。
  • 操作(CRUD 图):create / update / delete、通过关联创建(association _X { create; }),以及是否存在草稿操作(Edit、Activate、Discard、Resume、Prepare)。
  • 判定:determination <name> on save|on modify — 说明每项判定派生的内容,查阅池类中匹配的 FOR DETERMINE 方法。
  • 验证:validation <name> on save — 说明每项验证强制执行的规则,查阅 FOR VALIDATE 方法。
  • 操作 / 函数:action <name>(以及 static / factory / parameter / result),查阅 FOR MODIFY / FOR READ 方法。
  • 副作用:side effects { ... } 声明(说明其触发的 UI 刷新 / 重新计算)。
  • 字段控制:field ( readonly | mandatory | numbering : managed )、mapping for <table>。
  • 对于投影 BDEF:说明通过 use ... 复用的基类操作 / 动作。
依赖项

根据 SAPContext 结果:

  • 直接依赖项及其作用(数据源、辅助项、框架)
  • 使用的关键接口 / 类及其用途
  • 外部系统调用(RFC、HTTP 等)(如有)
  • 访问的数据库表
安全性 / 授权
  • CDS 访问控制(DCLS)规则(如存在),包括行级限制和角色映射
  • 行为级授权提示(BDEF 中的 authorization master、authorization dependent by)(如存在)
  • 实际影响:运行时可能受到限制的数据 / 操作
代码质量(如果运行了 ATC)

根据 ATC 结果:

  • 摘要:按优先级统计问题总数
  • 主要问题及其影响说明
  • 改进建议
后续选项

为用户提供后续步骤:

  • “要我详细解释某个特定方法吗?”
  • “要我获取针对 ATC 问题的 SAP 快速修复建议吗?”(→ SAPDiagnose(action="quickfix"))
  • “要我应用 SAP 针对 的快速修复吗?”(使用 SAP 验证过的修复建议 + apply_quickfix)
  • “要我分析 ATC 问题并提出修复建议吗?”(→ migrate-custom-code 技能)
  • “要我为这个类生成单元测试吗?”(→ generate-abap-unit-test 技能)
  • “要我展示完整的依赖关系图吗?”(→ SAPContext,depth=2)
  • 对于 BDEF:“要我实现缺失的判定 / 验证 / 操作主体吗?”(→ generate-rap-logic 技能),或“要我搭建行为池处理程序的框架吗?”(→ SAPWrite(action="scaffold_rap_handlers"))

错误处理

常见问题与修复方法
错误原因修复方法
找不到对象名称拼写错误或对象不存在使用 SAPSearch 查找相似名称
SAPContext 失败对象类型不支持依赖分析改为手动读取源码中找到的关键依赖项
ATC 检查未返回任何发现未配置 ATC,或代码质量良好告知用户——没有发现是好消息
找不到 ATC 变体系统中不存在指定的变体运行默认 ATC,列出可用变体
方法列表为空对象不是类或没有方法跳过方法列表,仅根据源码进行说明
源码为空对象存在,但没有源码(例如,生成的代理)告知用户,改为尝试读取相关对象
SAPContext 拒绝 BDEF 类型BDEF 不是受支持的 SAPContext 类型在绑定的 CDS 根上运行 SAPContext(action="impact", name="<root_cds>")
找不到 BDEF 池类projection; BDEF(没有自己的池类),或类名解析错误跳过类的读取;根据 projection 的 use 子句和基础 BDEF 进行说明

备注

BTP 与本地部署的区别
  • BTP:可用对象类型较少——没有 PROG、INCL、FUGR。重点关注已发布的 API 和 ABAP Cloud 对象。DDLS、DCLS、CLAS、INTF、BDEF、DDLX、SRVD 是主要类型。ATC 变体仅限于云就绪检查。
  • 本地部署:支持完整的对象类型。所有 ATC 变体均可用。可说明旧版对象(FORM 例程、函数模块、经典报表)。
此技能不执行的操作
  • 不修改代码:此技能仅用于读取和说明——不会编写或更改代码
  • 不提供重构建议:如需改进建议,请使用 ATC 分析或迁移技能
  • 不生成测试:如需生成测试,请使用 generate-abap-unit-test 或 generate-cds-unit-test 技能
  • 不进行跨系统比较:每次仅说明一个系统上的对象
何时使用此技能
  • 刚开始接触不熟悉的代码库时
  • 调查错误或了解现有行为时
  • 迁移前审查代码质量时
  • 为缺少文档的对象编写说明时
  • 了解更改共享类或 CDS 视图的影响时

评论

支持 Markdown