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 KeyAICodeSettingsState.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_CODE | iFlyCode 品牌图标 |
| 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 类
| 类 | 职责 |
|---|---|
| ActionButton | Action 按钮 — 封装 AnAction 为 Swing 按钮 |
| RoundLineBorder | 圆角线边框 — 继承 LineBorder |
| SendStopActionButtonPanel | 发送/停止按钮面板 — 切换发送和停止状态 |
SendStopActionButtonPanel 方法:
showSendButton()— 显示发送按钮showStopButton()— 显示停止按钮setEnabled(boolean)— 启用/禁用
关键依赖:
SendMessageAction— 发送消息 ActionStopAction— 停止 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)— 处理 ActionhandleUnitTest(...)— 处理单测addLineAction(...)— 添加行级 ActionaddGroupAction(...)— 添加组 ActiongetAnchorOffset(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— 代码信息 DTOPsiUtils/JavaPsiUtils— PSI 工具LineToolsTypeEnum— 行工具类型PermissionEnum— 权限枚举AICodeSettingsState— 设置状态ChatService— 聊天服务UnitTestService— 单测服务CppTestService— C++ 测试服务
9.2 CheckGutterIconRenderer (212 strings)
路径: com/aicode/toolwindow/CheckGutterIconRenderer职责: 检查 Gutter 图标渲染器 — 在编辑器 Gutter 中显示代码检查图标
关键方法:
getClickAction()— 获取点击 ActiongetPopupMenuActions()— 获取弹出菜单 ActionhandleActionPerformed(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— 内联聊天 InlayOpenInlineChatAction— 打开内联聊天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()— 获取插件 IDgetPluginsPath()— 获取插件路径
更新流程命令:
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 语言 IDunmodifiableMap— 不可变映射
11.2 AICodeLanguageInfo (97 strings)
路径: com/aicode/language/AICodeLanguageInfo职责: AI 代码语言信息 — 封装 Language + VS Code ID
字段:
language— IntelliJ LanguagevscodeId— VS Code 语言 ID
关键方法:
getLanguage()— 获取 IntelliJ LanguagegetVscodeId()— 获取 VS Code IDgetVSCodeIdWithFallback()— 获取 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. 关键发现
轻量异常体系: 只有 2 个自定义异常(Cancel + Timeout),都继承 RuntimeException,设计简洁。
AI 调试功能:
DebuggerFilter+Presentation实现异常断点拦截和 AI 调试建议,当程序抛出异常时自动触发 AI 分析。12 个图标: Icons 类管理 12 个图标,覆盖状态栏(5 个)、调试(2 个)、品牌(2 个)、工具窗口和停止按钮。
Darcula 主题适配: Icons 和 Presentation 都检测 Darcula 暗色主题,提供不同的图标和颜色。
6 个行级操作: PluginEditorInlayHintsProvider 支持 CODE_TEST/EXPLAIN/OPTIMIZE/SPLIT/COMMENT/INLINE_COMMENT 6 个行级操作,通过 Inlay Hint 在编辑器中显示操作按钮。
VS Code 语言映射: LanguageMap 提供 IntelliJ Language → VS Code Language ID 的映射,因为 Agent 端使用 VS Code 语言标识。
Hutool 依赖: PluginUpdater 使用
cn.hutool.core.io.FileUtil(Hutool 工具库),这是除 Gson 外的另一个外部依赖。IDE 版本兼容: UpdaterChecker2021_1 和 UpdaterCheckerFrom2021_2 分别适配不同 IDE 版本的更新 API,使用反射 (
ReflectUtil.classForName) 确保兼容性。状态栏 5 状态: StatusBarPopup 根据 AICodeStatus 显示 5 种不同图标(未登录/禁用/补全中/错误/正常)。
行工具权限: PluginEditorInlayHintsProvider 检查
PermissionEnum.getEditorAction()和LineToolsTypeEnum,确保用户有权限使用行级操作。