Skip to content

28 事件监听体系

基于 class 文件常量池静态分析

监听器总览

监听器IntelliJ 接口触发条件核心功能
AutoCodeGenerateListenerCommandListener文档变更自动代码补全触发
CodeEditorListener编辑器事件代码选择/覆盖层管理
CodeFileEditorManagerListenerFileEditorManagerListener文件打开/关闭同步文档列表到 Agent
CodeLookupManagerListenerLookupManagerListener代码补全弹出补全交互控制
CommitHandlerFactoryCheckinHandlerFactoryVCS 提交提交前取消补全请求
FileWatchedAdapter文件系统变更Git 仓库文件监控
GitBranchChangeListenerGitRepositoryChangeListenerGit 分支切换仓库状态同步
PluginDocumentListenerDocumentListener文档内容变更Diff 检测
PluginManagerListener插件状态变更内联聊天状态管理
ThemeChangeListenerLafManagerListener + EditorColorsListener主题/颜色变更UI 主题同步
AICodeUnloadPluginListener插件卸载清理补全状态

AutoCodeGenerateListener — 自动补全触发器

实现: CommandListener (IntelliJ)

核心依赖:
  RequestTipServiceImpl  — 发送补全请求
  EditorManagerService   — 管理编辑器 Inlay 状态
  DocumentActionTracker  — 追踪文档操作
  CommandCache           — 命令缓存
  CodeTipRequestDto      — 补全请求 DTO

内部类:
  $Q — 编辑器状态快照 (用于去重判断)
  $T — 补全触发条件判断

流程:
  1. Document 变更 → CommandEvent 触发
  2. 获取当前 Editor、Document、CaretModel
  3. 检查 AICodeSettingsState 是否启用自动触发
  4. 判断 CodeTipRequestType (Automatic/Interact/Forced/Manual)
  5. 构建 CodeTipRequestDto
  6. 调用 RequestTipServiceImpl 发送请求
  7. EditorManagerService 管理 Inlay 生命周期

CodeFileEditorManagerListener — 文件切换同步

实现: FileEditorManagerListener

核心依赖:
  PluginWebsocketClient  — WebSocket 通信
  RecentFilesManager     — 最近文件管理
  MessageDto             — 消息 DTO
  CodeInfoDto            — 代码信息 DTO
  CommandEnum            — 命令枚举

流程:
  1. 文件打开/关闭事件触发
  2. 构建 MessageDto (command = action_sync_document_list)
  3. 填充 CodeInfoDto (文件路径、语言、范围)
  4. 通过 WebSocket 发送到 Agent
  5. Agent 更新文档列表缓存

CodeLookupManagerListener — 补全弹出控制

实现: LookupManagerListener

核心依赖:
  EditorManagerService   — 编辑器管理
  EditorUtil             — 编辑器工具
  CodeGenerateRequestState — 代码生成请求状态
  AICodeRequestSettings  — 请求设置

流程:
  1. IntelliJ 代码补全弹出时触发
  2. 检查是否有 iFlyCode Inlay 存在
  3. 如果有,调用 disposeTips(editor, OperateActionEnum)
  4. 防止 IntelliJ 补全和 iFlyCode 补全同时显示

GitBranchChangeListener — Git 状态同步

实现: GitRepositoryChangeListener

核心依赖:
  PluginWebsocketClient     — WebSocket 通信
  SocketMessageHandleListener — 消息处理
  ChatService              — 对话服务
  CommandEnum              — 命令枚举
  PermissionEnum           — 权限枚举
  GitRepoStatusEnum        — Git 仓库状态
  WebViewDataTypeEnum      — WebView 消息类型
  InlineChatStatusServiceKt — 内联聊天状态
  AICodeSettingsState      — 设置

内部类:
  $H — Git 状态处理器
  $R — 仓库状态回调
  $b — 分支变更回调

流程:
  1. Git 分支切换/仓库状态变更触发
  2. 获取 GitRepoStatusEnum (当前仓库状态)
  3. 构建 WebRequestDto 发送到 Agent
  4. 通过 ChatService 发送 git_repo_status 命令
  5. 通过 WebView 推送仓库状态到 UI
  6. InlineChatStatusService 更新内联聊天可用性

PluginManagerListener — 插件状态管理

核心依赖:
  PluginWebsocketClient  — WebSocket 通信
  ChatService            — 对话服务
  SqlService             — SQL 服务
  SessionController      — 内联聊天会话控制
  ChatInputController    — 聊天输入控制
  InlineChatInfo         — 内联聊天信息
  InlineChatStepEnum     — 内联聊天步骤
  CancelRequestTip       — 取消补全请求

流程:
  1. 插件状态变更触发
  2. 检查 InlineChatStepEnum 状态
  3. 如果有活跃的内联聊天,发送取消命令
  4. 通过 SessionController 管理会话生命周期

ThemeChangeListener — 主题同步

实现: LafManagerListener + EditorColorsListener

核心依赖:
  SocketMessageHandleListener — 消息处理
  WebViewResponseTypeEnum    — 响应类型
  Icons                      — 图标
  StatusBarPopup             — 状态栏
  FileExtensionLanguageDetails — 文件扩展名
  CancelRequestTip           — 取消补全

流程:
  1. IDE 主题/颜色方案变更触发
  2. 更新 Icons (亮/暗主题图标)
  3. 更新 StatusBarPopup 样式
  4. 通过 WebView 推送主题变更通知 (setting_change_theme)
  5. 取消当前补全请求 (避免样式不一致)

AICodeUnloadPluginListener — 插件卸载清理

核心依赖:
  EditorManagerService   — 编辑器管理
  CodeCompleteService    — 代码补全服务
  MethodGeneratorConfig  — 方法生成器配置
  OperateActionEnum      — 操作枚举
  PluginInfoUtils        — 插件信息
  MessageBundle          — 消息包

流程:
  1. 插件卸载/禁用时触发
  2. 调用 EditorManagerService.disposeTips() 清除所有 Inlay
  3. 停止 CodeCompleteService
  4. 清理 MethodGeneratorConfig 缓存

事件流总结

用户输入字符
    → AutoCodeGenerateListener (自动补全)
    → RequestTipServiceImpl → WebSocket → Agent → 云端

用户切换文件
    → CodeFileEditorManagerListener (文档同步)
    → WebSocket → Agent (action_sync_document_list)

用户切换 Git 分支
    → GitBranchChangeListener (仓库状态)
    → ChatService → WebSocket → Agent (git_repo_status)

用户弹出 IntelliJ 补全
    → CodeLookupManagerListener (补全冲突)
    → EditorManagerService.disposeTips() (清除 iFlyCode Inlay)

IDE 主题变更
    → ThemeChangeListener (UI 同步)
    → WebView (setting_change_theme)

插件卸载
    → AICodeUnloadPluginListener (清理)
    → EditorManagerService.disposeTips() + CodeCompleteService.stop()

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