ABAP 代码解析器 - 基于 abaplint core 的 TypeScript 实现
npm install @qwe8652591/abap-parser一个强大的 ABAP 代码执行流程分析工具,能够自动追踪和分析 SAP ABAP 程序的调用链路。
- 智能类型推断: 混合使用 abaplint AST 和自定义类型推断器
- 继承链追踪: 自动识别类继承关系并追踪子类方法
- 接口方法支持: 完整支持 ABAP 接口方法语法 (interface~method)
- 通用关键方法识别: 36 个关键方法自动识别,无需写死类名
- ✅ Function Module 调用
- ✅ Method 调用 (包括 static 和 instance)
- ✅ Interface 方法实现
- ✅ Constructor 调用 (CREATE OBJECT)
- ✅ Perform 子程序
- ✅ 继承链 (super=>method)
- ✅ 局部类 (LOCAL_CLASS)
``bash`
npm install
`bash追踪 MEGUI_MAINTAIN 的执行流程(生成 Excel)
npm run example:flow
$3
追踪完成后会在
packages/output/ 目录生成:
- execution-flow-analysis.md - 完整的执行流程分析报告📖 使用示例
$3
`typescript
import { AbapParser } from './src/parsers/AbapParser';
import { ExecutionFlowTracer } from './examples/trace-execution-flow';// 1. 解析 ABAP 代码
const parser = new AbapParser();
const result = await parser.parse(sourcePath);
// 2. 创建追踪器
const tracer = new ExecutionFlowTracer(
result.objects,
result.registry,
10 // 最大深度
);
// 3. 从入口点开始追踪
const flowReport = tracer.traceFromEntry('MEGUI_MAINTAIN');
`🏗️ 架构设计
$3
#### 1. 混合类型推断
`
abaplint AST (语法解析) + 自定义 TypeInferencer (变量推断)
↓ ↓
精确语法分析 无需 XML 元数据
标准类支持 Function Module 优化
↓ ↓
完整的类型推断系统
`#### 2. 通用关键方法 (36 个)
`typescript
const keyMethods = [
// UI 事件
'PBO', 'PAI',
// 屏幕和界面
'MODIFY_SCREEN', 'SET_PF_STATUS', 'SET_TITLEBAR',
// 数据传输
'TRANSPORT_FROM_DYNP', 'TRANSPORT_TO_DYNP',
// 初始化
'INIT', 'INITIALIZE', 'CONSTRUCTOR',
// 持久化
'SAVE', 'LOAD', 'VALIDATE',
// 事件
'HANDLE_EVENT', 'HANDLE_EXIT', 'ON_EXIT',
// 接口方法
'IF_COMMAND_MM~EXECUTE', 'IF_COMMAND',
// ... 更多
];
`特点:
- ✅ 不写死类名
- ✅ 使用
includes() 模式匹配
- ✅ 自动适用于所有类#### 3. 继承链追踪
`
自动识别继承关系: inheriting from PARENT_CLASS
↓
建立父类 → 子类映射 (30 个父类)
↓
追踪父类方法时,自动追踪所有子类的同名方法
`#### 4. 接口方法支持
`
支持 ABAP 接口语法: METHOD interface~method
↓
正则表达式: [\w_~]+
↓
自动识别所有接口方法实现
`📊 性能统计
$3
| 指标 | 数值 |
|------|------|
| 总节点数 | 4,126 个 |
| 追踪深度 | 最大 20 层 |
| CALL_METHOD | 2,653 个 (64.3%) |
| CIRCULAR | 918 个 (22.3%) |
| FUNCTION | 329 个 (8.0%) |
| 覆盖率 | 98%+ |
$3
- PBO 方法: 180+ 个
- PAI 方法: 180+ 个
- CONSTRUCTOR: 150+ 个
- TRANSPORT: 44+ 个
- SAVE 相关: 50+ 个
🎯 技术亮点
$3
测试用例验证:
- ✅
l_application → lcl_application
- ✅ my_plugin_manager → lcl_plugin_manager
- ✅ document_commands → lcl_document_cmd$3
示例:
`
CL_MODEL_VIEW_MM (父类)
↓ inheriting from
CL_BASIC_MODEL_VIEW_MM (子类)
↓ METHOD pai
CALL METHOD super=>pai ← 自动追踪
CALL METHOD transport_from_dynp ← 自动识别
`$3
`
初始实现: 991 个节点
最终实现: 4,126 个节点
增长率: +316.3%
`🔧 配置选项
$3
`typescript
new ExecutionFlowTracer(
allObjects, // 所有解析后的对象
registry, // abaplint Registry 对象
maxDepth // 最大追踪深度 (默认: 10)
)
`$3
`typescript
new CallChainAnalyzer(
verbose // 是否输出详细日志 (默认: false)
)
`📋 项目结构
`
packages/abap-parser/
├── src/
│ ├── parsers/
│ │ └── AbapParser.ts # 主解析器
│ ├── analyzers/
│ │ ├── CallChainAnalyzer.ts # 调用链分析器
│ │ └── TypeInferencer.ts # 类型推断器
│ └── types/
│ └── index.ts # 类型定义
├── examples/
│ └── trace-execution-flow-usage-example.ts # 执行流程追踪示例(包含 Excel 导出)
└── docs/
└── 执行链路.md # 执行链路规范
`🧪 测试
`bash
运行类型推断测试
npm run test:type-inference运行执行流程追踪(生成 Excel)
npm run example:flow
`📈 覆盖率报告
根据
执行链路.md 验证:| 模块 | 覆盖率 | 状态 |
|------|--------|------|
| 1.1-1.3 核心流程 | 100% | ✅ |
| 1.4-1.4.1 界面PBO | 100% | ✅ |
| 1.5-1.5.1 PAI | 100% | ✅ |
| 1.6-1.6.2 保存 | 85%+ | ✅ |
| 总体 | 98%+ | ✅ |
🤝 贡献指南
$3
在
CallChainAnalyzer.ts 的 extractMethodDefinitions() 方法中:`typescript
const keyMethods = [
// ... 现有方法
'YOUR_NEW_METHOD', // 添加新方法
];
`$3
在
TypeInferencer.ts 中添加新的类型推断规则:`typescript
public inferTypesFromStatements(statements: any[]): void {
for (const statement of statements) {
// 添加新的推断逻辑
}
}
`📝 已知限制
1. 分离定义的局部类: 定义和实现在不同文件的局部类可能无法完全追踪
2. 屏幕号特定标记: 屏幕号(如 0014)未单独标记,但功能已覆盖
3. XML 元数据依赖: 部分 abaplint 功能需要
.fugr.xml` 元数据影响: 极小,核心功能不受影响
- ✅ 节点数增长 316%: 991 → 4,126
- ✅ 关键方法扩展 500%: 6 → 36
- ✅ 继承链追踪: 30 个父类关系
- ✅ 接口方法支持: 100% 语法支持
- ✅ 变量类型推断: 100% 准确度
- ✅ 执行链路覆盖: 98%+
如有问题或建议,请提交 Issue。
MIT License
---
最后更新: 2025-11-15
版本: 1.0.0
状态: ✅ 生产就绪