📝 docs(code-reader): 规格补上 Translator.verbatim 和 Rust 卡片类型逐个名字可点

This commit is contained in:
cruldra committed 2026-10-15 19:48:56 +11:00
1 parent 55595e948c
commit 58cd63a93e
1 file changed
+5 -1
+5 -1
View File
@@ -1107,6 +1107,7 @@ export interface Translator {
translate: (block: TextBlock, document: SourceDocument) => TextTranslation // 只翻 header 那一段;注释块(文件开头的说明、挂在块上的注释)给 Markdown 原文;跨几行写的字面量带拆开的各项、调用带实参表
describe: (block: FactBlock, document: SourceDocument) => PropertyRow[] // 函数、类、枚举、异常、导入、常量、变量块 → 属性表
expression: (node: Node, document: SourceDocument) => Inline[] // 一个表达式 / 类型节点整个翻成一行译文,译法同属性表的值;库规则借它
verbatim: (node: Node, document: SourceDocument, role?: TokenRole) => Inline[] // 一个类型 / 签名节点照抄成一行原文,不翻关键字:叶子按源码着色(给了 role 就都按它),名字各自带下标,跨几行写的压成一行、连着的空白收成一个空格;库规则借它
doc: (node: Node, document: SourceDocument) => Doc | undefined // 说明文字(注释、docstring、当说明用的字符串)→ 正文和块标签(Doc);正文同属性表的「说明」;连着几行的行文档注释(Rust 的 `///`)node 是第一条,翻译插件自己往下连
attributeNames?: AttributeNames // 筛选属性和值叫什么,和属性表的叫法一致;筛选栏、种类图标的悬停提示用它
}
@@ -1165,6 +1166,7 @@ export interface RuleContext {
imports: ImportFacts[] // 这份源码里各处导入,照源码顺序:认别名用
displayLanguage?: string // 当前翻译插件的 displayLanguage;没有翻译插件时没有
translate: (node: Node) => Inline[] // 借当前翻译插件的 expression;没有翻译插件时照抄源码
verbatim: (node: Node, role?: TokenRole) => Inline[] // 借当前翻译插件的 verbatim;没有翻译插件时照抄源码
doc: (node: Node) => Doc | undefined // 借当前翻译插件的 doc:正文和块标签,规则按自己的卡片把标签放到对应的行
lookup: (index: WorkspaceIndex, name: Node) => IndexEntry | undefined // name 指的定义在 index 里认出的那一项(见「规则认领时查别的文件里的定义」);还没查到是 undefined
}
@@ -1269,7 +1271,7 @@ export interface CommandRule {
- 规则自己的卡片(`RuleCard`),下面几条都说的是它。
- 卡片必须给:`kind`(写成「规则 id.名字」,宿主核对前缀;筛选记住的就是它,要稳定)、`badge`(种类的名字、暗 / 亮两种颜色和 lucide 图标名)、`rows`(用现成的 `PropertyRow`:属性名 + 着色的值或 Markdown,表格就是带 `columns` 的子行)、`absorbs`(并进来的子块)。可以给:`defines`(块自己的名字,跳到定义是它时闪整块)、`attributes`(自己的筛选属性)、`concepts`(额外认出的概念,排在种类图标后面)、`slots`(挂在卡片某一行的子行上、点子行才展开的子块,见下);表格子行填 `PropertyItem.defines`(字段名),跳到这个定义时只闪那一行。
- 挂在卡片子行上的子块(`RuleSlot`):留下的子块(没并进来的)可以不排在卡片后面,挂在卡片第 `row` 行的第 `item` 个子行上(讲它的那一个子行);它默认收着,点那个子行的第一格才在这一行下面展开当子卡片、同一行里别的收起(Rust 实现块的方法表点方法名)。它照常转成块,照样问各规则,编辑、问 AI、差异、筛选都照常。一块只能放一处,不能同时并进来;`row` 要有这一行、`item` 要有这个子行。只有这一种放法:子块要么挂在讲它的子行上,要么照常排在卡片后面。
- 只经契约:规则拿到的是块(kind、node、header、children、facts)和 `RuleContext`;源码里的名字照抄时自己带下标(`Segment.offset`),表达式、类型交给 `context.translate`(当前翻译插件的 `expression`,名字带下标,⌘ + 点击、高亮各处出现照常),说明文字交给 `context.doc`(当前翻译插件的 `doc`,给正文和块标签:正文和别的「说明」一样按 Markdown 显示,标签放到规则自己卡片对应的行,共用的几行在同目录的 `docRows.ts`),别的文件里定义的名字交给 `context.lookup`(见「规则认领时查别的文件里的定义」);库自己的配色(HTTP 方法)写在段的 `color` 上。规则可以读自己那门语言的语法树(规则声明了 `languageIds`),但不 import 语言插件、翻译插件和宿主模块(`rules/contractOnly.test.ts` 检查 `rules/` 下非测试文件只 import `../contract` 和同目录的文件)。
- 只经契约:规则拿到的是块(kind、node、header、children、facts)和 `RuleContext`;源码里的名字照抄时自己带下标(`Segment.offset`),表达式、类型交给 `context.translate`(当前翻译插件的 `expression`,名字带下标,⌘ + 点击、高亮各处出现照常),要照原文显示的类型、签名交给 `context.verbatim`(当前翻译插件的 `verbatim`:不翻关键字,压成一行,名字各自带下标),说明文字交给 `context.doc`(当前翻译插件的 `doc`,给正文和块标签:正文和别的「说明」一样按 Markdown 显示,标签放到规则自己卡片对应的行,共用的几行在同目录的 `docRows.ts`),别的文件里定义的名字交给 `context.lookup`(见「规则认领时查别的文件里的定义」);库自己的配色(HTTP 方法)写在段的 `color` 上。规则可以读自己那门语言的语法树(规则声明了 `languageIds`),但不 import 语言插件、翻译插件和宿主模块(`rules/contractOnly.test.ts` 检查 `rules/` 下非测试文件只 import `../contract` 和同目录的文件)。
- 用词归规则:属性名、表头、种类名、类型译名都在规则自己的词表里,按 `context.displayLanguage`(翻译插件的 `displayLanguage`)挑,没有这种语言的词表就用规则默认的那份;加一种显示语言就是给规则加一份词表。webview 只画结构,不认识「数据表」这些字。
### 启用、认领、优先
@@ -1956,6 +1958,8 @@ shell 脚本大半是一条条命令,一条命令读成什么取决于命令
可见性:`pub` 公开,没写是本模块,`pub(super)` 父模块,`pub(crate)` 和 `pub(in …)` 本 crate。公开写在 `facts.access`,其余写在块的 `access` 属性上(筛选值 `module` / `super` / `crate`)。说明是紧挨在前面的文档注释(`///`、`/**`)正文的第一句,句号留着;连着几行的 `///` 算一段(`facts.doc` 是第一条,中文直译的 `docNodes` 往下连),中间可以隔着 `#[…]`。卡片(含 Rust 库规则的)都经翻译插件的 `doc`(规则经 `context.doc`)读说明,块标签拆开放:函数的 `@param` 进参数表的「说明」列、`@return` 跟在「返回」后面、`@throws` 成「异常」表,结构体的 `@param` 对到字段表的「说明」列,对不上的列成「对不上的参数」。
卡片(含 Rust 库规则的)里照抄源码的类型、签名都经翻译插件的 `verbatim`(规则经 `context.verbatim`)照抄成一行:参数类型、「返回」、字段类型、变体携带的数据、方法表的参数和返回、导入的来源、tauri 的参数类型、axum 的路径参数、sqlx 的返回类型。名字一个个各自带源码下标、按词性着色(`State<'_, AppState>` 里 `State`、`AppState` 各自能悬停、⌘ + 点击跳到定义,导入来源 `std::collections` 每一节各自能点、按类型着色),跨几行写的压成一行;没写返回类型的 `fn` 的 `()` 是普通文字。
注释和别的语言走同一条路(`listBlocks`,Rust 的 `CommentRules` 在 `languages/rust.ts`),文件顶层、`mod` 身体、`trait` / `impl` 身体、函数体(含条件、match、循环里的各层)都一样:
- 连续的行注释合成一段注释:相邻行、写法相同才合,`//`、讲所在模块或 crate 的 `//!`、讲下一项的 `///` 各是一种写法,不混着合。中间空的 `//` 不打断,是 Markdown 里的空行、分段;隔着空行、隔着别的语句就断开。合好的注释挂到它讲的项上(见「注释挂到它讲的块上」);`//!` 写在文件开头是文件的说明,写在 `mod` 身体里交给那个模块。