Skip to content

iFlyCode 错误/异常体系与辅助系统分析

版本: 3.4.2-222 | 分析日期: 2026-05-11

1. 概述

本文档分析 iFlyCode 的错误/异常体系、调试器过滤器、图标系统、消息包、状态服务、状态栏、UI 样式系统、工具窗口、插件更新器和语言支持系统。

2. 异常体系

2.1 RequestCancelException (31 strings)

路径: com/aicode/exception/RequestCancelException父类: RuntimeException职责: 请求取消异常 — 用户继续输入时取消前一个补全请求

使用场景: 当用户在补全结果返回前继续输入,前一个补全请求被取消时抛出。

2.2 RequestTimeoutException (31 strings)

路径: com/aicode/exception/RequestTimeoutException父类: RuntimeException职责: 请求超时异常 — 补全请求超过配置的超时时间

使用场景: Agent 响应超时时抛出,触发补全提示清理。

异常体系图:

RuntimeException
├── RequestCancelException — 请求取消
└── RequestTimeoutException — 请求超时

3. 调试器过滤器

3.1 DebuggerFilter (62 strings)

路径: com/aicode/error/search/DebuggerFilter职责: 调试器过滤器 — 拦截异常断点并触发 AI 调试

关键方法:

  • CreateExceptionBreakpointResult — 创建异常断点结果
  • exceptionClassName — 异常类名

关键依赖:

  • DebuggerFilter$V — 内部类
  • RequestTimeoutException — 超时异常
  • JComponentKt — Kotlin UI 工具

3.2 DebuggerFilter$V (38 strings)

路径: com/aicode/error/search/DebuggerFilter$V职责: 调试器过滤器内部类 — 检查是否启用代码调试

关键方法:

  • CreateExceptionBreakpointResult — 异常断点结果
  • createInlayRenderer — 创建 Inlay 渲染器
  • enableCodeDebug — 是否启用代码调试

关键依赖:

  • PluginStartupActivity.getApiKey() — 获取 API Key
  • AICodeSettingsState.getInstance() — 获取设置
  • Presentation — 调试呈现

3.3 Presentation (230 strings)

路径: com/aicode/error/search/Presentation职责: 调试呈现 — 在编辑器中显示 AI 调试结果

关键方法:

  • handleDebug(String, String, boolean, boolean) — 处理调试
  • handleCodeDebug(...) — 处理代码调试(两个重载)
  • getKey() — 获取键
  • getSourceCodeDirectories(Project) — 获取源码目录

UI 元素:

  • DebugIcon / DebugDarkIcon — 调试图标(亮色/暗色)
  • READONLY_FRAGMENT_BACKGROUND_COLOR — 只读背景色
  • inlay — Inlay 显示

关键依赖:

  • ChatService.handleCodeDebug() — AI 调试服务
  • FileUtil.getSourceCodeDirectories() — 源码目录
  • HandleCacheUtil — 缓存处理
  • CancelRequestTip — 取消补全
  • Icons — 图标

4. 图标系统

4.1 Icons (113 strings)

路径: com/aicode/icons/Icons职责: 插件图标集合 — 所有 UI 图标的统一管理

图标清单:

图标字段说明
PluginIconLogo插件 Logo
ToolWindowIcon工具窗口图标
PluginIcon插件图标
DebugIcon调试图标(亮色)
DebugDarkIcon调试图标(暗色)
StatusBarIcon状态栏图标
StatusBarIconDisabled状态栏禁用图标
StatusBarIconNotSignedIn状态栏未登录图标
StatusBarIconError状态栏错误图标
StatusBarCompletionInProgress状态栏补全中图标
I_FLY_CODEiFlyCode 品牌图标
STOP停止图标

关键方法:

  • isUnderDarcula() — 是否 Darcula 暗色主题
  • getIcon() — 获取图标
  • getCurrentIcon() — 获取当前主题图标

错误处理: get isUnderDarcula is error — 主题检测失败时的日志

5. 消息包

5.1 BasicActionsBundle (66 strings)

路径: com/aicode/message/BasicActionsBundle职责: 基础 Action 消息包 — 国际化消息和 UI 文本

关键方法:

  • getMessage(String, Object...) — 获取消息
  • getLazyMessage(String, Object...) — 获取延迟消息(Supplier)

资源路径: messages.BasicActionsBundle

关键依赖:

  • FileInfo — Diff 文件信息(H() 解码)
  • AICodeUtils — AI 代码工具(H() 解码)

6. 状态服务

6.1 AICodeStatusService (119 strings)

路径: com/aicode/status/AICodeStatusService职责: AI 代码状态服务 — 管理插件全局状态

关键方法:

  • getCurrentStatus() — 获取当前状态(返回 Pair<AICodeStatus, String>
  • getService(Project) — 获取服务实例
  • onAICodeStatus(AICodeStatus, String) — 状态变更回调
  • notifyApplication(AICodeStatus, String) — 通知应用状态变更
  • getMessageBus() — 获取消息总线
  • customMessage() — 自定义消息

关键依赖:

  • AICodeStatusListener — 状态监听器
  • AICodeStatus — 状态枚举
  • StatusBarPopup — 状态栏弹出
  • StringUtils — 字符串工具

6.2 AICodeStatusListener (25 strings)

路径: com/aicode/status/AICodeStatusListener职责: 状态监听接口 — IntelliJ Topic 消息总线

关键方法:

  • onAICodeStatus(AICodeStatus, String) — 状态变更回调

6.3 UserLoginListener (36 strings)

路径: com/aicode/status/UserLoginListener职责: 用户登录监听 — 监听登录事件

关键字符串:

  • USER_LOGIN — 登录事件标识
  • login — 登录

7. 状态栏

7.1 StatusBarPopup (190 strings)

路径: com/aicode/statusBar/StatusBarPopup职责: 状态栏弹出 — IDE 状态栏的 iFlyCode 状态指示器

关键方法:

  • getCurrentStatus() — 获取当前状态
  • createActionGroupPopup() — 创建 Action 弹出菜单
  • update(Project, String) — 更新状态
  • updateWidget() — 更新小部件
  • getWidgetState() — 获取小部件状态
  • createPopup() — 创建弹出菜单

状态图标映射:

状态图标
未登录StatusBarIconNotSignedIn
禁用StatusBarIconDisabled
补全中StatusBarCompletionInProgress
错误StatusBarIconError
正常StatusBarIcon

关键依赖:

  • AICodeStatusService — 状态服务
  • AICodeStatus — 状态枚举
  • Icons — 图标
  • BasicActionsBundle — 消息包

7.2 StatusBarWidgetFactory (66 strings)

路径: com/aicode/statusBar/StatusBarWidgetFactory职责: 状态栏小部件工厂 — 注册状态栏小部件

关键方法:

  • createWidget(Project) — 创建小部件
  • disposeWidget(StatusBarWidget) — 销毁小部件

8. UI 样式系统

8.1 Style (25 strings)

路径: com/aicode/ui/Style职责: UI 样式容器 — 统一管理颜色和边框

内部类结构:

Style
├── Colors — 颜色定义
│   └── InlineChat — 内联聊天颜色
│       ├── SEPARATOR_COLOR — 分隔线颜色
│       └── border — 边框颜色
└── Borders — 边框定义
    ├── getMessageHeaderBorder() — 消息头边框
    └── getTopMessageBorder() — 顶部消息边框

8.2 Font / FontKt (72 + 120 strings)

路径: com/aicode/ui/Font + com/aicode/ui/FontKt职责: 字体管理 — Kotlin 扩展函数

关键方法:

  • Font.getMedium() — 获取中等字体
  • FontKt.plain(JBFont) — 纯文本字体
  • FontKt.widthForFont(String, Font) — 计算文本宽度
  • FontKt.textWidthForFont(String, Font) — 文本像素宽度
  • getFontMetrics() — 获取字体度量

8.3 其他 UI 类

职责
ActionButtonAction 按钮 — 封装 AnAction 为 Swing 按钮
RoundLineBorder圆角线边框 — 继承 LineBorder
SendStopActionButtonPanel发送/停止按钮面板 — 切换发送和停止状态

SendStopActionButtonPanel 方法:

  • showSendButton() — 显示发送按钮
  • showStopButton() — 显示停止按钮
  • setEnabled(boolean) — 启用/禁用

关键依赖:

  • SendMessageAction — 发送消息 Action
  • StopAction — 停止 Action

9. 工具窗口

9.1 PluginEditorInlayHintsProvider (348 strings) — 最大类

路径: com/aicode/toolwindow/PluginEditorInlayHintsProvider职责: 编辑器 Inlay Hint 提供者 — 行级操作提示(代码解释/优化/拆分/注释/单测)

关键方法:

  • createSettings() — 创建设置
  • createConfigurable() — 创建配置界面
  • isLanguageSupported(Language) — 是否支持该语言
  • isVisibleInSettings() — 是否在设置中可见
  • handleCommand(PsiElement, Editor, CommandEnum) — 处理命令
  • handleAction(CommandEnum, Project, CodeInfoDto) — 处理 Action
  • handleUnitTest(...) — 处理单测
  • addLineAction(...) — 添加行级 Action
  • addGroupAction(...) — 添加组 Action
  • getAnchorOffset(PsiElement) — 获取锚点偏移
  • findRealOffsetBySpace(Editor, String) — 按空格查找真实偏移

支持的 CommandEnum:

命令说明
CODE_TEST单元测试
CODE_EXPLAIN代码解释
CODE_OPTIMIZE代码优化
CODE_SPLIT函数拆分
CODE_COMMENT文档注释
CODE_INLINE_COMMENT行间注释

内部类:

  • InlResult — Inlay 结果
  • InlCollectResult — Inlay 收集结果
  • $1 — InlayHintProvider 匿名实现(核心逻辑)
  • $2 — 列表弹出步骤
  • $3 — CommandEnum switch 映射

关键依赖:

  • CommandEnum — 命令枚举
  • PluginHintSettings — 提示设置
  • CodeInfoDto — 代码信息 DTO
  • PsiUtils / JavaPsiUtils — PSI 工具
  • LineToolsTypeEnum — 行工具类型
  • PermissionEnum — 权限枚举
  • AICodeSettingsState — 设置状态
  • ChatService — 聊天服务
  • UnitTestService — 单测服务
  • CppTestService — C++ 测试服务

9.2 CheckGutterIconRenderer (212 strings)

路径: com/aicode/toolwindow/CheckGutterIconRenderer职责: 检查 Gutter 图标渲染器 — 在编辑器 Gutter 中显示代码检查图标

关键方法:

  • getClickAction() — 获取点击 Action
  • getPopupMenuActions() — 获取弹出菜单 Action
  • handleActionPerformed(Project, CommandEnum) — 处理 Action 执行
  • handleAction(...) — 处理 Action

语言支持: CPP_LANGUAGE_01, C_LANGUAGE_01, PYTHON_LANGUAGE_01

9.3 ProjectToolWindowFactory (90 strings)

路径: com/aicode/toolwindow/ProjectToolWindowFactory职责: 项目工具窗口工厂 — 创建 iFlyCode 侧边栏

关键方法:

  • createToolWindowContent(Project, ToolWindow) — 创建工具窗口内容

关键依赖:

  • PluginToolWindowPanel — 插件面板
  • InlineChatInlay — 内联聊天 Inlay
  • OpenInlineChatAction — 打开内联聊天
  • RefreshAction — 刷新 Action

9.4 PluginHintSettings (11 strings)

路径: com/aicode/toolwindow/PluginHintSettings职责: 插件提示设置 — Inlay Hint 显示偏好

10. 插件更新器

10.1 PluginUpdater (291 strings)

路径: com/aicode/updater/PluginUpdater职责: 插件更新器 — 下载、安装和切换插件版本

关键方法:

  • checkUpdate(Project) — 检查更新
  • getUpdate() — 获取更新
  • doUpdate() — 执行更新
  • disableOrEnablePlugin() — 禁用/启用插件
  • isPluginInstalled() — 是否已安装
  • onPluginInstall() — 插件安装回调
  • addPreInstalledPlugin() — 添加预安装插件
  • isUpdater() — 是否为更新器
  • getPluginId() — 获取插件 ID
  • getPluginsPath() — 获取插件路径

更新流程命令:

  • ActionCommand — 动作命令
  • DeleteCommand — 删除命令
  • CopyCommand — 复制命令
  • UnzipCommand — 解压命令

关键日志:

  • [PluginUpdater] ready update — 准备更新
  • [PluginUpdater] update error : — 更新错误
  • [PluginUpdater] disableOrEnablePlugin: — 禁用/启用
  • [PluginUpdater] isOccurred: — 是否发生

关键依赖:

  • PluginSceneEnum — 部署场景枚举
  • LoginInfo — 登录信息(含更新 URL)
  • PluginInfoUtils — 插件信息
  • hutool FileUtil — Hutool 文件工具(外部依赖)

10.2 PluginUpdaterCheckService (184 strings)

路径: com/aicode/updater/PluginUpdaterCheckService职责: 插件更新检查服务 — 定期检查插件更新

关键方法:

  • scheduleRepeatedUpdateCheck() — 定期检查更新
  • queueUpdateCheck(Project) — 队列化更新检查
  • openAutoUpdate — 开启自动更新
  • findAvailableUpdates() — 查找可用更新

内部类:

  • CheckUpdatesTask — 更新检查任务
  • $k — 匿名回调类

关键依赖:

  • UpdaterChecker2021_1 / UpdaterCheckerFrom2021_2 — IDE 版本兼容的更新检查器
  • PluginUpdater — 更新执行器
  • ReflectUtil.classForName() — 反射加载类(IDE 版本兼容)

10.3 UpdaterChecker2021_1 / UpdaterCheckerFrom2021_2

职责: IDE 版本兼容的更新检查器 — 2021.1 和 2021.2+ 使用不同的 API

11. 语言支持系统

11.1 LanguageMap (52 strings)

路径: com/aicode/language/LanguageMap职责: 语言映射 — IntelliJ Language → VS Code Language ID 映射

关键方法:

  • getId(Language) — 获取 VS Code 语言 ID
  • unmodifiableMap — 不可变映射

11.2 AICodeLanguageInfo (97 strings)

路径: com/aicode/language/AICodeLanguageInfo职责: AI 代码语言信息 — 封装 Language + VS Code ID

字段:

  • language — IntelliJ Language
  • vscodeId — VS Code 语言 ID

关键方法:

  • getLanguage() — 获取 IntelliJ Language
  • getVscodeId() — 获取 VS Code ID
  • getVSCodeIdWithFallback() — 获取 VS Code ID(带回退)

11.3 LanguageInfoManager (123 strings)

路径: com/aicode/language/LanguageInfoManager职责: 语言信息管理器 — 统一管理语言检测和映射

关键方法:

  • findLanguageMapping(PsiFile, LanguageInfoSupport) — 查找语言映射
  • getExtensionList() — 获取扩展名列表
  • findVSCodeLanguageMapping(PsiFile) — 查找 VS Code 映射

11.4 CodeLanguageInfoSupport (92 strings)

路径: com/aicode/language/CodeLanguageInfoSupport职责: 代码语言信息支持 — 检测文件语言

11.5 AICodeExtendedLanguageSupport (69 strings)

路径: com/aicode/language/AICodeExtendedLanguageSupport职责: 扩展语言支持 — 支持自定义扩展名覆盖

内部类: $W — ExtensionOverrideLanguageInfoSupport.Key(languageId=, extension=)

11.6 CommonLanguageSupport (48 strings)

路径: com/aicode/language/CommonLanguageSupport职责: 通用语言支持 — 基础语言检测

12. 关键发现

  1. 轻量异常体系: 只有 2 个自定义异常(Cancel + Timeout),都继承 RuntimeException,设计简洁。

  2. AI 调试功能: DebuggerFilter + Presentation 实现异常断点拦截和 AI 调试建议,当程序抛出异常时自动触发 AI 分析。

  3. 12 个图标: Icons 类管理 12 个图标,覆盖状态栏(5 个)、调试(2 个)、品牌(2 个)、工具窗口和停止按钮。

  4. Darcula 主题适配: Icons 和 Presentation 都检测 Darcula 暗色主题,提供不同的图标和颜色。

  5. 6 个行级操作: PluginEditorInlayHintsProvider 支持 CODE_TEST/EXPLAIN/OPTIMIZE/SPLIT/COMMENT/INLINE_COMMENT 6 个行级操作,通过 Inlay Hint 在编辑器中显示操作按钮。

  6. VS Code 语言映射: LanguageMap 提供 IntelliJ Language → VS Code Language ID 的映射,因为 Agent 端使用 VS Code 语言标识。

  7. Hutool 依赖: PluginUpdater 使用 cn.hutool.core.io.FileUtil(Hutool 工具库),这是除 Gson 外的另一个外部依赖。

  8. IDE 版本兼容: UpdaterChecker2021_1 和 UpdaterCheckerFrom2021_2 分别适配不同 IDE 版本的更新 API,使用反射 (ReflectUtil.classForName) 确保兼容性。

  9. 状态栏 5 状态: StatusBarPopup 根据 AICodeStatus 显示 5 种不同图标(未登录/禁用/补全中/错误/正常)。

  10. 行工具权限: PluginEditorInlayHintsProvider 检查 PermissionEnum.getEditorAction()LineToolsTypeEnum,确保用户有权限使用行级操作。

本项目仅供学习研究,逆向分析内容归原厂商所有。