Skip to content

iFlyCode 内容处理器与编辑器工具分析

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

1. 概述

com/aicode/content/ 包提供编辑器内容操作的工具类,包括编辑器选择、文件跳转、内容插入和覆盖层提示等功能。这些工具被多个子系统(代码补全、内联聊天、代码检查等)共享使用。

2. 核心类

2.1 EditorUtils (247 strings)

路径: com/aicode/content/util/EditorUtils职责: 编辑器操作工具集 — 最核心的编辑器辅助类

关键方法:

  • createEditor(Project, String) — 创建编辑器实例
  • getSelectedEditor(Project) — 获取当前选中编辑器
  • getSelectedTextEditor(Project) — 获取选中的文本编辑器
  • getAndJumpToFileByIndex(Project, String, int, int) — 跳转到文件指定位置
  • getFilePath(Editor) — 获取编辑器当前文件路径
  • findFileByIoFile(Project, File) — 通过 IO 文件查找 VirtualFile
  • openTextEditor(Project, VirtualFile, boolean) — 打开文本编辑器
  • replaceMainEditorSelection(Project, Editor, String) — 替换主编辑器选中内容
  • insertContentUnderMethod(Project, Editor, String, PsiMethod) — 在方法下插入内容
  • insertContentOnMethod(Project, Editor, String, PsiMethod) — 在方法上插入内容
  • getPsiFile(Project, Editor) — 获取 PSI 文件
  • getFileIndexDto(Editor) — 获取文件索引 DTO
  • isMainEditorTextSelected(Editor) — 主编辑器是否有文本选中
  • disableHighlighting(Project, Document) — 禁用高亮

关键依赖:

  • OverlayUtils — 覆盖层工具
  • FileIndexDto — 文件索引 DTO

H() 混淆: 使用 H() 方法进行字符串解码

2.2 OverlayUtils (61 strings)

路径: com/aicode/content/util/OverlayUtils职责: 覆盖层提示工具 — 在编辑器上显示信息气泡

关键方法:

  • showInfoBalloon(String, MessageType, Point) — 显示信息气泡

H() 混淆: 使用 H() 方法

3. 文件工具子包

3.1 FileUtils (170 strings)

路径: com/aicode/content/util/file/FileUtils职责: 文件操作工具

关键方法:

  • getEditorFile(Editor) — 获取编辑器当前文件
  • createFile(Project, String, String) — 创建文件
  • toFile(VirtualFile) — VirtualFile 转 java.io.File
  • getFileExtension(String) — 获取文件扩展名
  • isUtf8File(VirtualFile) — 是否 UTF-8 文件
  • getResourceContent(Class, String) — 读取资源内容
  • getExtensions(LanguageFileExtensionDetails) — 获取语言扩展名列表
  • tryCreateDirectory(String) — 创建目录

关键依赖:

  • LanguageFileExtensionDetails — 语言文件扩展映射
  • FileInfo — Diff 文件信息
  • Application — 应用工具

3.2 LanguageFileExtensionDetails (47 strings)

路径: com/aicode/content/util/file/LanguageFileExtensionDetails职责: 语言 → 文件扩展名映射

字段:

  • name — 语言名称
  • extensions — 扩展名列表

方法:

  • getName() / setName() — 语言名称
  • getExtensions() / setExtensions() — 扩展名列表

3.3 FileExtensionLanguageDetails (37 strings)

路径: com/aicode/content/util/file/FileExtensionLanguageDetails职责: 文件扩展名 → 语言映射(反向映射)

字段:

  • extension — 文件扩展名

4. 使用关系

EditorUtils ←── CodeCompleteService (补全后插入)
         ←── InlineChatCommandService (内联聊天修改)
         ←── GitReviewService (评审跳转)
         ←── ChatService (聊天代码操作)
         ←── CommonService (通用跳转)

FileUtils ←── PluginEditorInlayHintsProvider (语言检测)
         ←── CodeTipUtil (补全语言判断)

LanguageFileExtensionDetails ←── AICodeSettingsState (禁用语言配置)
                           ←── AICodeStatusService (状态检查)

5. 关键发现

  1. 双映射体系: LanguageFileExtensionDetails(语言→扩展名)和 FileExtensionLanguageDetails(扩展名→语言)提供双向映射,用于语言检测和文件类型判断。

  2. PSI 集成: EditorUtils 深度集成 IntelliJ PSI 系统,支持 PsiMethod 级别的内容插入(insertContentUnderMethod/insertContentOnMethod),用于内联聊天和单测生成的代码插入。

  3. WriteCommandAction: replaceMainEditorSelectioninsertContent* 方法使用 IntelliJ 的 WriteCommandAction 确保文档修改在正确的线程和命令上下文中执行。

  4. 文件索引 DTO: getFileIndexDto() 将编辑器状态(文件路径、选区起止行号)封装为 FileIndexDto,用于 WebSocket 请求中传递文件上下文。

  5. H() 混淆广泛: 所有工具类都使用 H() 方法解码字符串,说明这些类包含需要保护的逻辑路径或配置信息。

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