✨ feat(vscode): 代码阅读标出项目写明的入口文件和入口函数
This commit is contained in:
1 parent
78d5748b81
commit
718bbb7f6c
19 files changed
+761
-83
No files matched your search
@@ -31,6 +31,7 @@
|
||||
| 侧栏文件树 | 只看和打开:展开目录、打开文件、刷新、全部折叠,外加给目录 / 文件记注释、按审查工单只看 PR 改过的文件;不做新建 / 重命名 / 删除 |
|
||||
| 审查工单 | 标题栏第一个按钮「选工单」列出看板「审查」列的工单和「进行中」列里已经有 PR 的工单(按列分组),选中后树里只剩这张工单的 PR 改过的文件(目录层级照留、全部展开,按 M / A / D 着色,删掉的列出来但打不开);点开的是本机这张工单的工作副本里 PR 最新的代码,不标差异、不开 diff;本机没有工作副本就拉 PR 分支建一个。弹框列的是看板上现在摆着的工单(不再加载一遍),选中后重读那张工单和它的 PR。见「审查工单」 |
|
||||
| 文件注释 | 读代码时给目录 / 文件随手记一句:存在各工作区文件夹的 `.spx/code-notes.json`,跟着仓库走;在 VS Code 里改名、挪位置、删除时注释跟着变 |
|
||||
| 入口 | 只认项目自己写明的启动项:pyproject.toml 的 `[project.scripts]` / `[project.gui-scripts]`、Cargo.toml 的 `src/main.rs` 和 `[[bin]]` 的 `path`、go.mod 模块里 `package main` 加 `func main` 的文件、package.json 的 `bin`;不按文件名、函数名猜。侧栏灰字「入口」(有注释时「注释 · 入口」),预览里名字对上的块名称后面加浅色「入口」。见「入口」 |
|
||||
| 问 AI | 块右上角「问 AI」,在块下面问 Claude Code(`claude -p`,只读,用输入框旁边选的 profile,记住上次选的,没选过用插件默认的)这块代码,回答逐字出来按 Markdown 显示、能追问(接着这块最近一次的会话,收起再展开、重启 VS Code 也接得上)、能停;输入框里能粘贴 / 拖进图片随问题发(存在 `.spx/code-qa/`,跟着问答删);问答存进各工作区文件夹的 `.spx/code-qa.json`,灰字挂在块下面免得重复问,理解了就删。问答按块的位置记号挂,记号只由和语言无关的块数据(种类、facts 里的名字、源码哈希)算出,文件别处改了照样认得;认不回来的不显示,留在文件里,代码改回来又挂回去。见「问 AI」 |
|
||||
| 译文用词 | 结构照抄原语言,只翻关键字、内置类型、运算符;用专业术语(`export` → 公共,`catch` → 捕获,`===` → 全等) |
|
||||
| 函数、类、导入、常量、变量块 | 预览不显示一行译文,显示树形属性表;属性值里的类型、表达式照常直译 |
|
||||
@@ -84,7 +85,24 @@
|
||||
- 在 VS Code 里改名、挪位置(资源管理器拖动、`WorkspaceEdit` 等,走 `workspace.onDidRenameFiles`):注释跟着走,目录连带里面各层的注释一起走;挪到另一个工作区文件夹就搬到那边的文件里,挪出工作区就不要了。删除(`onDidDeleteFiles`):连带目录里各层的注释一起删。在 VS Code 外面(终端、git)改名删除不跟。
|
||||
- 外部改了 `code-notes.json`(git pull、手改):文件监听重读,树上跟着变。
|
||||
- 刷新:只重画注释变了的那几行(文件树按 Uri 记住交给 VS Code 的节点对象,VS Code 按对象认行);还没展开过的行不用管。
|
||||
- 注释和代码阅读的解析、翻译无关,单独放在 `notes/`;文件树只留一个「给行添信息」的接口(`FileTreeDecorator`),由 `index.ts` 接上。
|
||||
- 注释和代码阅读的解析、翻译无关,单独放在 `notes/`;文件树只留一个「给行添信息」的接口(`FileTreeDecorator`),由 `explorer/rowDecorator.ts` 的 `RowDecorator` 把注释和项目入口(见下节)合成一行的灰字和提示(纯函数 `explorer/rowDecoration.ts`),`index.ts` 接上。
|
||||
|
||||
### 入口
|
||||
|
||||
读一个陌生项目先找它从哪儿启动:侧栏标出项目的入口文件,点进预览再标出入口函数。只认项目自己写明的启动项,不靠文件名、函数名猜——叫 `main.py`、里面有个 `main` 函数、写了 `if __name__ == "__main__"`、`src/lib.rs`、`index.js` 都不算入口。
|
||||
|
||||
- 认这四种,每种只有一条(`entries/entryPoints.ts` 的 `findEntryPoints`,纯函数:传入找到的文件路径,读内容、问「这个路径在不在」都经传进来的 `FolderReader`):
|
||||
| 项目 | 读哪儿 | 入口文件 | 预览里标的名字 |
|
||||
| --- | --- | --- | --- |
|
||||
| Python | `pyproject.toml` 的 `[project.scripts]`、`[project.gui-scripts]`,值 `模块.路径:名字` | 相对 pyproject.toml 所在目录按顺序找第一个存在的:`src/<模块路径>.py`、`<模块路径>.py`、`src/<模块路径>/__init__.py`、`<模块路径>/__init__.py`(点换成 `/`);都没有就不标 | `:` 后面的名字(带点的取第一节,`[extra]` 不管);只写了模块的只标文件 |
|
||||
| Rust | `Cargo.toml` | 所在目录的 `src/main.rs`;`[[bin]]` 写了 `path` 的,那个路径(相对 Cargo.toml 所在目录,不存在的不标) | `main` |
|
||||
| Go | `go.mod` | 这个模块自己的目录里(递归,但别的 go.mod 的子目录归那个模块)同时有 `package main` 和最外层 `func main(` 的 `.go` 文件;注释、字符串里的,方法 `func (T) main()` 不算 | `main` |
|
||||
| JavaScript / TypeScript | `package.json` 的 `"bin"`:字符串,或 `{ "命令名": "文件" }` | 那些文件(相对 package.json 所在目录,不存在的不标) | 不标,只标文件 |
|
||||
- 不认的:`[tool.poetry.scripts]` 等别的表、`[[bin]]` 没写 `path` 的、`src/bin/*.rs` 自动发现、`src/lib.rs`、package.json 的 `main` / `exports` / `scripts`。
|
||||
- 一个工作区文件夹里可以有很多个项目(子目录各有自己的清单),各算各的;同一个文件被几条指到,名字合在一起。不进 `node_modules`、`.venv`、`vendor`、`dist`、`__pycache__`(还有 `.git`)。
|
||||
- 什么时候算(`entries/workspaceEntries.ts` 的 `WorkspaceEntries`):打开时每个工作区文件夹扫一遍(`findFiles` 找清单和 `.go`,排除上面那几个目录);清单、`.go` 改了,或文件增删了(入口文件出现、消失),过 500ms 重扫那个工作区文件夹;入口变了的文件报给侧栏重画那几行、开着的预览重新发文档。
|
||||
- 侧栏:入口文件那一行名字后面的灰字,没注释时是「入口」,有注释时是「注释 · 入口」,不盖掉注释;悬停提示在注释下面再写一行「入口,从 `app` 开始读」(没有名字的写「入口」)。contextValue 不变,菜单照旧只按有没有注释换。目录、工作区外面的行(审查的工作副本)不标。
|
||||
- 预览:入口文件里,文件最外层、名字对上的那一块(函数、常量、变量、库规则的卡片,谁对上就是谁;Python 的 `app = typer.Typer()` 是变量块),属性表里写着这个名字的那一行、名字后面加一个浅色的「入口」——就是属性表里的说明词(`hint`),不另做标记。宿主在翻译好的结果上加(`entries/entryMarks.ts` 的 `markEntryNames`,`documentMessage` 里调),各语言的翻译插件不用管:块的名字按定义处(`defines`)在源码里的那一段认,属性表里按词的源码下标找到写名字的那个词;对不上就什么都不加。标差异时旧版本按同样的入口标,「入口」不会被当成改动。
|
||||
|
||||
### 审查工单
|
||||
|
||||
@@ -2003,9 +2021,13 @@ vscode/src/codeReader/
|
||||
folderStore.ts FolderStore:每个工作区文件夹一份表,内存里的一份、文件监听、跟着改名 / 删除走、读写排队、改表后删掉不再有条目带着的文件
|
||||
notes/noteMap.ts 保存一条注释(纯函数)
|
||||
notes/store.ts .spx/code-notes.json 叫什么、每条怎么认
|
||||
notes/noteItem.ts 有注释的行怎么显示:描述、悬停提示、contextValue(纯函数)
|
||||
notes/fileNotes.ts FileNotes:注释的 FolderStore、给树画行
|
||||
notes/fileNotes.ts FileNotes:注释的 FolderStore、一行的注释
|
||||
notes/commands.ts 「添加注释 / 编辑注释」输入框
|
||||
explorer/rowDecoration.ts 一行名字后面的灰字、悬停提示、contextValue:注释,后面接入口(纯函数)
|
||||
explorer/rowDecorator.ts RowDecorator:把注释和入口交给 rowDecoration 画行(FileTreeDecorator)
|
||||
entries/entryPoints.ts 项目写明的入口:四种清单 / Go 源码 → 入口文件和名字(纯函数,读文件经 FolderReader)
|
||||
entries/entryMarks.ts 预览里名字对上的块,名称后面加「入口」(纯函数)
|
||||
entries/workspaceEntries.ts WorkspaceEntries:各工作区文件夹扫一遍、文件变了重扫、报出入口变了的文件
|
||||
qa/anchor.ts 块的位置记号(BlockAnchors)(不碰 VS Code)
|
||||
qa/qaMap.ts .spx/code-qa.json 的形状、每条怎么认、记一次 / 删一次、再问时接着哪个会话(纯函数)
|
||||
qa/prompt.ts 问 AI 的话:找到那块、外层块的开头、带行号的代码、追问
|
||||
|
||||
Reference in new issue
Block a user