iFlyCode 请求管理与代码补全系统分析
版本: 3.4.2-222 | 分析日期: 2026-05-11
1. 请求管理系统
1.1 概述
iFlyCode 的请求管理负责代码补全请求的调度、取消、超时和重试。核心类位于 com/aicode/request/ 包。
1.2 核心类
RequestResultList
路径: com/aicode/request/RequestResultList职责: 请求结果列表 — 管理所有活跃的补全请求
关键方法:
addRequestResult(RequestResult)— 添加请求结果removeRequestResult(RequestResult)— 移除请求结果getRequestResult(String requestId)— 获取指定请求结果clearAll()— 清除所有请求结果
功能: 维护一个请求 ID → 请求结果的映射表,用于追踪所有活跃的补全请求。
RequestResult
路径: com/aicode/request/RequestResult职责: 单个补全请求的结果
字段:
requestId— 请求唯一标识result— 补全结果文本isCompleted— 是否已完成isCancelled— 是否已取消
RequestCancelException
路径: com/aicode/request/RequestCancelException父类: RuntimeException职责: 请求取消异常
RequestTimeoutException
路径: com/aicode/request/RequestTimeoutException父类: RuntimeException职责: 请求超时异常
1.3 请求生命周期
1. 用户输入 → 触发代码补全
└── RequestTipService.createRequest()
├── 生成 requestId
├── 创建 RequestResult
└── RequestResultList.addRequestResult()
2. 请求发送到 Agent
└── CommonService.sendWsMessage(CODE_COMPLETE, data)
└── PluginWebsocketClient.send()
3a. 正常响应
└── SocketMessageHandleListener.onMessage()
├── RequestResult.setResult(text)
├── RequestResult.setCompleted(true)
└── 渲染补全提示到编辑器
3b. 用户继续输入 → 取消前一个请求
└── RequestTipService.cancelPreviousRequest()
├── RequestResult.setCancelled(true)
└── RequestResultList.removeRequestResult()
3c. 请求超时
└── RequestTimeoutException
└── 清理补全提示2. 代码补全系统
2.1 概述
iFlyCode 的代码补全系统基于 IntelliJ 的 Inlay Presentation API 实现,支持单行和多行补全。补全请求通过 WebSocket 发送到 Agent 进程,Agent 返回补全建议后渲染为 Inlay Hint。
2.2 核心类
RequestTipService (接口)
路径: com/aicode/complete/RequestTipService职责: 代码补全请求服务接口
关键方法:
requestTip(Editor, int offset)— 请求代码补全cancelRequestTip()— 取消当前补全请求isRequesting()— 是否正在请求中
RequestTipServiceImpl
路径: com/aicode/complete/RequestTipServiceImpl实现: RequestTipService职责: 代码补全请求服务实现
关键依赖:
PluginWebsocketClient— WebSocket 客户端CodeCompleteService— 代码补全服务RequestResultList— 请求结果列表AICodeSettingsState— 设置状态OpenTelemetryUtil— APM 追踪
关键方法:
requestTip(Editor, int offset)— 请求补全- 检查是否启用自动补全
- 检查当前文件语言是否支持
- 收集代码上下文(prefix, suffix, 文件路径, 语言)
- 发送
CODE_COMPLETE命令到 Agent - 启动 APM Span 追踪
cancelRequestTip()— 取消补全- 发送
ABORT命令到 Agent - 清理 Inlay Hint
- 关闭 APM Span
- 发送
CancelRequestTip
路径: com/aicode/complete/CancelRequestTip职责: 取消补全请求
功能: 封装补全请求的取消逻辑,包括:
- 发送 ABORT 命令
- 清理编辑器中的 Inlay Hint
- 重置补全状态
InlayPresentationFactory
路径: com/aicode/complete/InlayPresentationFactory职责: Inlay 展示工厂 — 创建补全提示的视觉元素
关键方法:
createInlayPresentation(String text, Editor)— 创建 Inlay 展示- 创建单行补全展示
- 创建多行补全展示
Inlay 展示类型:
- 单行补全: 灰色文字显示在光标后
- 多行补全: 代码块展示在当前行下方
DeclarativeInlayHintsProvider
路径: com/aicode/complete/DeclarativeInlayHintsProvider职责: 声明式 Inlay Hint 提供者
实现: IntelliJ 的 InlayHintsProvider 接口
功能: 注册到 IntelliJ 的 Inlay Hint 系统,使 iFlyCode 的补全提示与 IDE 原生 Inlay Hint 框架集成。
2.3 补全触发机制
触发方式:
1. 自动触发 (autoTrigger = true)
└── DocumentListener.onDocumentChange()
├── 防抖处理 (triggerTime 延迟)
└── RequestTipService.requestTip()
2. 手动触发
└── CodeCompleteAction.actionPerformed()
└── RequestTipService.requestTip()
3. Tab 键触发
└── CodeCompleteTabAction.actionPerformed()
└── 接受当前补全建议2.4 补全数据流
┌──────────────────────────────────────────────────────────────┐
│ IntelliJ Editor │
│ DocumentListener │
│ └── 防抖 (triggerTime ms) │
│ └── RequestTipServiceImpl.requestTip() │
│ ├── 收集上下文: │
│ │ ├── prefix (光标前文本) │
│ │ ├── suffix (光标后文本) │
│ │ ├── filePath (文件路径) │
│ │ ├── language (编程语言) │
│ │ └── lineCount (文件行数) │
│ └── APM Span: CODE_COMPLETE │
└──────────────────────────────────────────────────────────────┘
│
WebSocket: CODE_COMPLETE
│
┌──────────────────────────────────────────────────────────────┐
│ Node.js Agent │
│ Code Complete Handler │
│ ├── Tree-sitter 解析代码结构 │
│ ├── 调用 AI 模型生成补全 │
│ └── 流式返回补全结果 │
└──────────────────────────────────────────────────────────────┘
│
WebSocket: Response (stream)
│
┌──────────────────────────────────────────────────────────────┐
│ IntelliJ Editor │
│ CodeCompleteService.dealStreamAgentTips() │
│ ├── 解析流式响应 │
│ ├── InlayPresentationFactory 创建展示 │
│ ├── 渲染到编辑器 (灰色文字/代码块) │
│ └── APM: COMPLETE_DURATION, COMPLETE_FIRST_DURATION │
│ │
│ 用户操作: │
│ ├── Tab → 接受补全 (插入文本) │
│ ├── Esc → 拒绝补全 (移除 Inlay) │
│ └── 继续输入 → 取消补全 (ABORT + 清理) │
└──────────────────────────────────────────────────────────────┘2.5 代码增强模式
enableCodeEnhance 标志控制代码增强模式:
- 关闭: 仅返回 AI 生成的补全文本
- 开启: Agent 可能返回额外的代码改进建议(如优化、重构建议)
2.6 语言支持与禁用
codeCompleteDisableLang 字段允许用户禁用特定语言的代码补全:
- 格式: 逗号分隔的语言 ID 列表
- 通过
LanguageFileExtensionDetails映射语言到文件扩展名
3. 关键发现
请求取消机制: 用户继续输入时自动取消前一个补全请求(发送 ABORT 命令),避免过时的补全结果显示。
双触发模式: 支持自动触发(防抖延迟)和手动触发(快捷键),自动触发延迟时间可配置。
流式补全: Agent 通过 WebSocket 流式返回补全结果,
dealStreamAgentTips()逐步渲染,实现打字机效果。APM 全链路追踪: 代码补全从请求到渲染全链路追踪,包含首字耗时 (TTFT) 和总耗时两个关键指标。
Inlay Presentation API: 使用 IntelliJ 的 Inlay Presentation API 渲染补全提示,而非自绘 UI,与 IDE 原生体验一致。
请求结果管理:
RequestResultList维护所有活跃请求的映射表,支持按 ID 查询和批量清理。异常体系:
RequestCancelException和RequestTimeoutException分别处理取消和超时场景,继承自RuntimeException。