📝 docs(code-reader): 组件卡片、事件处理函数卡片能看调用树,查引用时 JSX 开始标签算调用处的规格

This commit is contained in:
cruldra committed 2026-10-17 04:09:01 +11:00
1 parent 57675665a7
commit 315f5a266c
1 file changed
+7 -5
+7 -5
View File
@@ -1136,7 +1136,7 @@ export type RowAction = CallTreeAction
/** /**
* 看调用树:查源码里一个名字被谁用、被谁调用,按钮上带次数(0 次只画图标),点开是调用树弹框。 * 看调用树:查源码里一个名字被谁用、被谁调用,按钮上带次数(0 次只画图标),点开是调用树弹框。
* calls 查谁调用了它(编辑器的调用关系,认不出这个名字时改查引用、只留调用处),次数是落在几棵调用树里; * calls 查谁调用了它(编辑器的调用关系,认不出这个名字时改查引用、只留调用处和 JSX 开始标签),次数是落在几棵调用树里;
* references 查所有用到它的地方,按所在的函数、组件分组,次数是用到几处(名字自己的定义处、落在 except 里的不算)。 * references 查所有用到它的地方,按所在的函数、组件分组,次数是用到几处(名字自己的定义处、落在 except 里的不算)。
*/ */
export interface CallTreeAction { export interface CallTreeAction {
@@ -1306,7 +1306,7 @@ export interface RuleCard {
concepts?: BlockConcept[] // 额外认出的概念,排在种类后面;语言的概念仍在更前面,同一个 id 只留第一个 concepts?: BlockConcept[] // 额外认出的概念,排在种类后面;语言的概念仍在更前面,同一个 id 只留第一个
languageKind?: BlockKind // 左边第一个图标(语言的种类)照这种内置种类画,不填是原块自己的种类(React 记忆函数的变量块画成函数) languageKind?: BlockKind // 左边第一个图标(语言的种类)照这种内置种类画,不填是原块自己的种类(React 记忆函数的变量块画成函数)
tint?: ThemeColor // 卡片淡底的颜色,不填用种类色;边框仍是种类色(React 钩子返回值描边是钩子紫,淡底按来源分) tint?: ThemeColor // 卡片淡底的颜色,不填用种类色;边框仍是种类色(React 钩子返回值描边是钩子紫,淡底按来源分)
calls?: true // 能看调用树,查卡片自己的名字(defines)被谁调用,按钮在卡片右上角(React 自定义钩子);属性表里各行自己查的名字见 RowAction calls?: true // 能看调用树,查卡片自己的名字(defines)被谁调用,按钮在卡片右上角(React 的组件、自定义钩子、事件处理函数);属性表里各行自己查的名字见 RowAction
expands?: Node[] // 原块里这几个函数值(实参里的箭头函数)的主体也排成卡片的子块(LanguageAdapter.functionBody),语言插件已经排成子块的不重复排 expands?: Node[] // 原块里这几个函数值(实参里的箭头函数)的主体也排成卡片的子块(LanguageAdapter.functionBody),语言插件已经排成子块的不重复排
rows: PropertyRow[] rows: PropertyRow[]
defines?: SourceRange // 块自己的名字(类名):跳到的定义是它时闪整块 defines?: SourceRange // 块自己的名字(类名):跳到的定义是它时闪整块
@@ -1915,7 +1915,9 @@ TSX 和 Python 一样,从上往下一块语法一张卡片,嵌套的块排
组件说明里的 `@param`:属性名对上的进「说明」一格(字段自己有注释的照旧用注释,没注释时才用它,Markdown);写成 `props.title`(属性参数名.属性名)的也算,属性参数是解构写的时点号前面写的那个名字当它的名字。 组件说明里的 `@param`:属性名对上的进「说明」一格(字段自己有注释的照旧用注释,没注释时才用它,Markdown);写成 `props.title`(属性参数名.属性名)的也算,属性参数是解构写的时点号前面写的那个名字当它的名字。
事件处理函数卡片:名称 / 说明(函数上面 JSDoc 的正文)/ 对不上的参数 / 参数(逗号隔开写在一行;说明里有参数对上了 `@param` 时排成「名称 \| 类型 \| 默认值 \| 说明」表)/ 返回(写了 `@return` 才有,值空着、后面跟说明)/ 异常 / 绑定事件。 组件卡片能看调用树(`RuleCard.calls`:右上角的按钮,同自定义钩子卡片),查这个组件在哪被渲染、被调用:JSX 的开始标签(`<DesktopSection …>`、`<DesktopSection />`)和直接调用(`DesktopSection(props)`)都算一处调用,闭合标签 `</DesktopSection>`、import、`typeof DesktopSection` 这类类型位置、当值传递的(`[DesktopSection]`、`component={DesktopSection}`)不算。函数声明、值是箭头函数 / 函数表达式的组件,编辑器的调用层级(`vscode.prepareCallHierarchy` 再问调用者)本来就把 JSX 开始标签算成调用(VS Code 1.141 自带的 TypeScript 实测,闭合标签、import、类型位置、当值传递的它也不算);`memo(…)` / `forwardRef(…)` 包着的(变量的值是调用表达式)准备不出调用层级,改查引用、只留调用处时 JSX 开始标签同样算(`callTree/referenceCalls.ts` 的 `isCallSite`,见下面钩子卡片「查所有引用」一条里的查调用)。
事件处理函数卡片:名称 / 说明(函数上面 JSDoc 的正文)/ 对不上的参数 / 参数(逗号隔开写在一行;说明里有参数对上了 `@param` 时排成「名称 \| 类型 \| 默认值 \| 说明」表)/ 返回(写了 `@return` 才有,值空着、后面跟说明)/ 异常 / 绑定事件。能看调用树(`RuleCard.calls`:右上角的按钮),查它在哪被调用;绑在 JSX 属性上(`onClick={handleClick}`)是把函数当值交出去,不算调用,「绑定事件」一行已经写了绑在哪。
直接返回 JSX 的箭头函数组件(`const Tag = ({ text }) => <span>{text}</span>`)没有子块可放,它渲染的大纲作为第四行「JSX 结构大纲」写在组件卡片里。 直接返回 JSX 的箭头函数组件(`const Tag = ({ text }) => <span>{text}</span>`)没有子块可放,它渲染的大纲作为第四行「JSX 结构大纲」写在组件卡片里。
@@ -1976,7 +1978,7 @@ react.effect 25
- 实参那一格按形参的种类:写在这里的函数都收成 fold 小框「函数 (next: 布尔) · 2 句」(没参数不写括号,直接返回表达式的算 1 句),函数体是卡片的子块(直接返回的表达式是一张「返回 …」卡片),小框能点,和卡片的折叠箭头是同一个开关(webview 的 `ChainFoldContext`,卡片有排在下面的子块时由卡片给);可以是函数的初始值传的函数写「首次渲染时调用」加小框;函数、引用种类传的是名字时(filterReducer、AuthContext)照抄成带源码下标的名字(函数的名字 function 色);别的照常翻(`null` 是「空」,`[]` 是「空数组」)。 - 实参那一格按形参的种类:写在这里的函数都收成 fold 小框「函数 (next: 布尔) · 2 句」(没参数不写括号,直接返回表达式的算 1 句),函数体是卡片的子块(直接返回的表达式是一张「返回 …」卡片),小框能点,和卡片的折叠箭头是同一个开关(webview 的 `ChainFoldContext`,卡片有排在下面的子块时由卡片给);可以是函数的初始值传的函数写「首次渲染时调用」加小框;函数、引用种类传的是名字时(filterReducer、AuthContext)照抄成带源码下标的名字(函数的名字 function 色);别的照常翻(`null` 是「空」,`[]` 是「空数组」)。
- 样子:左边两个图标,先是语言的种类(变量;记忆函数是函数,`RuleCard.languageKind`;副作用、钩子调用是语句),再是 React 的概念(上表的图标,悬停卡片种类的名字;状态悬停「React 状态」,useLayoutEffect 的副作用悬停「副作用 · 浏览器绘制前执行」,useInsertionEffect「副作用 · 布局副作用之前执行」,`KindBadge.tooltip`)。描边、淡底是 React 概念的颜色;记忆函数描边、淡底是函数色,sigma 图标是记忆值的绿(`KindBadge.iconColor`)。钩子返回值、钩子调用描边是钩子紫,淡底按来源(`RuleCard.tint`,webview 的 `.cr-block[data-tint]`):React 内置 #61dafb / #0a7ea4、第三方 #e5c07b / #9a6a00、自己写的 #89d185 / #388a34;内置钩子再加一个作用图标(`RuleCard.concepts`):状态 `toggle-right`、副作用 `zap`、引用 `anchor`、性能 `sigma`、上下文 `share-2`、并发 `hourglass`、外部数据源 `database` #dcdcaa / #795e26。 - 样子:左边两个图标,先是语言的种类(变量;记忆函数是函数,`RuleCard.languageKind`;副作用、钩子调用是语句),再是 React 的概念(上表的图标,悬停卡片种类的名字;状态悬停「React 状态」,useLayoutEffect 的副作用悬停「副作用 · 浏览器绘制前执行」,useInsertionEffect「副作用 · 布局副作用之前执行」,`KindBadge.tooltip`)。描边、淡底是 React 概念的颜色;记忆函数描边、淡底是函数色,sigma 图标是记忆值的绿(`KindBadge.iconColor`)。钩子返回值、钩子调用描边是钩子紫,淡底按来源(`RuleCard.tint`,webview 的 `.cr-block[data-tint]`):React 内置 #61dafb / #0a7ea4、第三方 #e5c07b / #9a6a00、自己写的 #89d185 / #388a34;内置钩子再加一个作用图标(`RuleCard.concepts`):状态 `toggle-right`、副作用 `zap`、引用 `anchor`、性能 `sigma`、上下文 `share-2`、并发 `hourglass`、外部数据源 `database` #dcdcaa / #795e26。
- 调用树:卡片右上角没有调用树按钮,接住返回值的每一项各一个调用树操作(`CallTreeAction`,见「属性表」的「操作」一列):解构的每一项在表的「操作」一列,只接一个名字时在「名称」一行最右边。悬停按接住它的名字能做什么写:值「谁用了」、状态的当前值「谁用了这个状态」(useState、useReducer 的第一项)、修改函数「谁改了这个状态」、派发函数「谁派发了动作」、别的函数「谁调用了」;签名表说不清的项(第三方、自己写的钩子、对象解构)在组件体、钩子体里被调用过的算函数,否则算值。都查所有引用(`mode: 'references'`,只查调用的话 `onTabChange={setActiveTab}`、`onSubmit={submit}` 这种当值传下去的都漏了),组件体、钩子体里 React 内置钩子依赖数组的那几段不算(`except`:依赖项只告诉 React 什么时候重跑,不是在用它)。按钮上的数是用到几处:搜索面板里 query 3、inputRef 2、别的各 1,同原型。 - 调用树:卡片右上角没有调用树按钮,接住返回值的每一项各一个调用树操作(`CallTreeAction`,见「属性表」的「操作」一列):解构的每一项在表的「操作」一列,只接一个名字时在「名称」一行最右边。悬停按接住它的名字能做什么写:值「谁用了」、状态的当前值「谁用了这个状态」(useState、useReducer 的第一项)、修改函数「谁改了这个状态」、派发函数「谁派发了动作」、别的函数「谁调用了」;签名表说不清的项(第三方、自己写的钩子、对象解构)在组件体、钩子体里被调用过的算函数,否则算值。都查所有引用(`mode: 'references'`,只查调用的话 `onTabChange={setActiveTab}`、`onSubmit={submit}` 这种当值传下去的都漏了),组件体、钩子体里 React 内置钩子依赖数组的那几段不算(`except`:依赖项只告诉 React 什么时候重跑,不是在用它)。按钮上的数是用到几处:搜索面板里 query 3、inputRef 2、别的各 1,同原型。
- 查所有引用(调用树服务的 references 查法,`callTree/query.ts` 的 `loadTargetCalls` / `loadCallEdges`):起点按名字起点自己写一个(变量);`vscode.executeReferenceProvider` 查名字的各处引用,去掉名字自己的定义处和起点落在 `except` 里的(`callTree/referenceCalls.ts` 的 `countedSites`),每处在文件大纲(`vscode.executeDocumentSymbolProvider`)里从里往外找第一个调用层级认得的符号当调用者(写在 `useCallback` 回调里的,调用者是组件 SearchPanel),都不认得时按文件算,同一个调用者的几处并成一项,再从调用者往上照常问编辑器。次数是直接连着起点的调用边条数(一处一条,`session.ts` 的 `countOf`)。查调用(calls,函数、类、自定义钩子卡片右上角的按钮)照旧:编辑器的调用层级认不出名字时(数组解构出来的、`const x = useCallback(…)` 的,`vscode.prepareCallHierarchy` 给空的)同样改查引用,但只留调用处(名字后面紧跟实参的括号,中间可以隔着 `?.`、泛型实参),次数是落在几棵调用树里。 - 查所有引用(调用树服务的 references 查法,`callTree/query.ts` 的 `loadTargetCalls` / `loadCallEdges`):起点按名字起点自己写一个(变量);`vscode.executeReferenceProvider` 查名字的各处引用,去掉名字自己的定义处和起点落在 `except` 里的(`callTree/referenceCalls.ts` 的 `countedSites`),每处在文件大纲(`vscode.executeDocumentSymbolProvider`)里从里往外找第一个调用层级认得的符号当调用者(写在 `useCallback` 回调里的,调用者是组件 SearchPanel),都不认得时按文件算,同一个调用者的几处并成一项,再从调用者往上照常问编辑器。次数是直接连着起点的调用边条数(一处一条,`session.ts` 的 `countOf`)。查调用(calls,函数、类、组件、自定义钩子、事件处理函数卡片右上角的按钮)照旧:编辑器的调用层级认不出名字时(数组解构出来的、`const x = useCallback(…)` 的、`memo(…)` / `forwardRef(…)` 包着的组件,`vscode.prepareCallHierarchy` 给空的)同样改查引用,但只留调用处(`isCallSite`:名字后面紧跟实参的括号,中间可以隔着 `?.`、泛型实参;或者是 JSX 开始标签的标签名,名字前面紧挨着 `<`、`<` 前面不是字母数字(那是泛型实参、比较),名字后面不跟 `.`、`:`(`<Name.Item />` 渲染的是别的组件);闭合标签 `</Name>` 不算,同编辑器的调用层级),次数是落在几棵调用树里。
- 调用树服务按「调用树的键」数、查(`callTree/session.ts` 的 `callTargets`):块自己的调用树键是块的记号,卡片上的操作键是操作的键(`actionKey`);`callTreeCounts` 消息按键发次数,页面点开发 `openCallTree { version, key }`,回 `callTree { key, … }`。同一版文档重发时问法(名字起点、查法、接口、不算的范围)没变的不再问。 - 调用树服务按「调用树的键」数、查(`callTree/session.ts` 的 `callTargets`):块自己的调用树键是块的记号,卡片上的操作键是操作的键(`actionKey`);`callTreeCounts` 消息按键发次数,页面点开发 `openCallTree { version, key }`,回 `callTree { key, … }`。同一版文档重发时问法(名字起点、查法、接口、不算的范围)没变的不再问。
自定义钩子卡片:名称(function 色,带下标,后面跟「具名导出」「默认导出」小标签,同组件卡片)/ 说明(JSDoc 的正文)/ 对不上的参数 / 参数(「名称 \| 类型」表,有参数带默认值时多一列默认值,说明里有参数对上了 `@param` 时多一列说明;没有参数写「无」)/ 返回(只列名称:从最后那句 return 读,对象写的取各个键(简写的、改了名的),数组取各项,标识符是它自己,直接返回表达式的箭头函数读那个表达式;读不出、说明里也没写 `@return` 时不出这一行)/ 异常。左边是函数、钩子两个图标,钩子紫描边、自己写的淡底,能看调用树(`RuleCard.calls`:右上角的按钮,查这个钩子在哪被调用);钩子体里的钩子调用同组件体里的一样按变量讲。 自定义钩子卡片:名称(function 色,带下标,后面跟「具名导出」「默认导出」小标签,同组件卡片)/ 说明(JSDoc 的正文)/ 对不上的参数 / 参数(「名称 \| 类型」表,有参数带默认值时多一列默认值,说明里有参数对上了 `@param` 时多一列说明;没有参数写「无」)/ 返回(只列名称:从最后那句 return 读,对象写的取各个键(简写的、改了名的),数组取各项,标识符是它自己,直接返回表达式的箭头函数读那个表达式;读不出、说明里也没写 `@return` 时不出这一行)/ 异常。左边是函数、钩子两个图标,钩子紫描边、自己写的淡底,能看调用树(`RuleCard.calls`:右上角的按钮,查这个钩子在哪被调用);钩子体里的钩子调用同组件体里的一样按变量讲。
@@ -2596,7 +2598,7 @@ vscode/webview-ui/code-reader.html + src/codeReader/ 预览界面(React,Vit
- 数据类(`rules/dataclass.test.ts`):`fixtures/dataclassModels.py` 的 `SandboxAccess` 逐字同上面的样例,`AdminUserRow`、`RedirectPayResult`(`field(init=False, default=…)`)、`SmsSent`(`default_factory=dict`)的行;种类 `dataclasses.dataclass`、叫「数据类」、颜色、访问级别同原来的类;编辑范围是整个类、写回原样,`__post_init__` 是子块;类名、字段名的定义范围和带下标的词指回源码原文;装饰器的写法(别名、`dataclasses.dataclass`、`dc.dataclass`)认,pydantic 的、`other.dataclass` 不认,没导入 dataclasses 不认;每个选项的译法、默认值不讲、别的照写、`**x`、别的装饰器一行;字段规则(`ClassVar`、`typing.ClassVar` 留作子块,`InitVar` 的类型和「仅初始化时使用」,`KW_ONLY` 记号并进来、后面的字段「只能按名字传参」、单独写 `kw_only=False` 的「可按位置传参」),`field(...)` 的默认值、`default_factory`(名字、lambda)、各参数、`metadata` 照写、`doc=`,说明取讲它的注释、行尾注释、属性 docstring;没注解的类属性、字段中间的方法照源码顺序是子块,「编辑」写回整个类。 - 数据类(`rules/dataclass.test.ts`):`fixtures/dataclassModels.py` 的 `SandboxAccess` 逐字同上面的样例,`AdminUserRow`、`RedirectPayResult`(`field(init=False, default=…)`)、`SmsSent`(`default_factory=dict`)的行;种类 `dataclasses.dataclass`、叫「数据类」、颜色、访问级别同原来的类;编辑范围是整个类、写回原样,`__post_init__` 是子块;类名、字段名的定义范围和带下标的词指回源码原文;装饰器的写法(别名、`dataclasses.dataclass`、`dc.dataclass`)认,pydantic 的、`other.dataclass` 不认,没导入 dataclasses 不认;每个选项的译法、默认值不讲、别的照写、`**x`、别的装饰器一行;字段规则(`ClassVar`、`typing.ClassVar` 留作子块,`InitVar` 的类型和「仅初始化时使用」,`KW_ONLY` 记号并进来、后面的字段「只能按名字传参」、单独写 `kw_only=False` 的「可按位置传参」),`field(...)` 的默认值、`default_factory`(名字、lambda)、各参数、`metadata` 照写、`doc=`,说明取讲它的注释、行尾注释、属性 docstring;没注解的类属性、字段中间的方法照源码顺序是子块,「编辑」写回整个类。
- Pydantic 数据模型(`rules/pydantic.test.ts`):`fixtures/aigcMetadata.py` 的 `AIGCMetadata` 逐字同上面的样例(7 个无默认值字段、选项「严格 · 禁止多余字段」、`model_config` 不单成一块),`TextTrace` 的可空字段默认值是「空」;`fixtures/createShareRequest.py` 的 `CreateShareRequest` 逐字核对字段、说明、长度约束,`@field_validator` 仍是子块;种类 `pydantic.model`、叫「数据模型」、颜色、图标 `braces`;同一文件里继承模型的也算,`TypedDict`、`NamedTuple`、普通类、没导入 pydantic 的不是;别名、`Field` 的默认值 / `default_factory` / 约束、说明优先于注释,`ClassVar` 和没注解的类属性留下;类型里的名字带源码下标;索引只收本文件里能确定的模型、没写 `BaseModel` 的文件不解析,别的文件里的父类查不到先当普通类、查到再换成卡片;差异:加一个字段标新增,改一个默认值标那一格。 - Pydantic 数据模型(`rules/pydantic.test.ts`):`fixtures/aigcMetadata.py` 的 `AIGCMetadata` 逐字同上面的样例(7 个无默认值字段、选项「严格 · 禁止多余字段」、`model_config` 不单成一块),`TextTrace` 的可空字段默认值是「空」;`fixtures/createShareRequest.py` 的 `CreateShareRequest` 逐字核对字段、说明、长度约束,`@field_validator` 仍是子块;种类 `pydantic.model`、叫「数据模型」、颜色、图标 `braces`;同一文件里继承模型的也算,`TypedDict`、`NamedTuple`、普通类、没导入 pydantic 的不是;别名、`Field` 的默认值 / `default_factory` / 约束、说明优先于注释,`ClassVar` 和没注解的类属性留下;类型里的名字带源码下标;索引只收本文件里能确定的模型、没写 `BaseModel` 的文件不解析,别的文件里的父类查不到先当普通类、查到再换成卡片;差异:加一个字段标新增,改一个默认值标那一格。
- FastAPI 接口(`rules/fastapi.test.ts`):`fixtures/routes.py` 的 `update_user` 逐字同上面的样例(查到 `Forbidden` 是 403 时四条消息写在一行,没查到时不列),名字、颜色、图标、列名、筛选属性、定义范围、编辑范围是整个函数、函数体是子块;着色(URL 的 `{参数}` / 路径,花括号里的参数名 `refers` 到函数的参数,方法的 Swagger 颜色、成功的状态码绿色、自动带的 422 淡色,带下标的词指回源码原文);`fixtures/skillHubRoutes.py` 的 `list_skills`(Annotated 里的 Query、`_` 的依赖)、`get_skill`(HTTPException 的 status_code / detail)、`install`(Request 不算、`-> None` 没有内容);`fixtures/consoleRoutes.py` 的 `create_user`(`status_code=201`、Pydantic 模型、调别的函数间接抛的不算)、`list_users`(查到的类型别名 `FilterQuery` 是依赖、Literal 是简单类型);参数放在哪儿的各条(路径里的名字含 `{x:path}`、各种标记两种写法、上传文件、枚举和类型别名查到的、Pydantic 模型、`Security`、`Depends()`);标签、依赖、`responses=` 叠上路由对象的,`status.HTTP_…` 常量、`response_model=None`、`response_description`、`raise … from`、只写 `raise`、嵌套函数里的;`FastAPI()` 上的接口、别的装饰器一行;不认的(没导入、路由对象在别的文件、不是路由对象、`websocket`、不带括号)。跨文件(工作区索引 + 假的语言扩展):`update_user` 的 `Forbidden` 按定义处查到 `core/exceptions/schemas.py` 的 403,同名的别处的类不算;索引认的类上的 `status_code`(带注解、常量)、枚举类、`Annotated` 类型别名,普通类不认。路由器卡片:`fixtures/routes.py` 的 `router` 逐字同上面的样例,名字、颜色、图标、列名、编辑范围、定义范围;接口表的函数名带下标、路径里的 `{user_id}` 各 `refers` 到各自函数的参数、方法的颜色;接口卡片的「路由器」行排在说明后面、名字带下标指回路由器;写了依赖、默认响应才有这两行,`FastAPI()` 没有前缀,属性 docstring 是说明,没挂接口时「0 个」、不画表格。 - FastAPI 接口(`rules/fastapi.test.ts`):`fixtures/routes.py` 的 `update_user` 逐字同上面的样例(查到 `Forbidden` 是 403 时四条消息写在一行,没查到时不列),名字、颜色、图标、列名、筛选属性、定义范围、编辑范围是整个函数、函数体是子块;着色(URL 的 `{参数}` / 路径,花括号里的参数名 `refers` 到函数的参数,方法的 Swagger 颜色、成功的状态码绿色、自动带的 422 淡色,带下标的词指回源码原文);`fixtures/skillHubRoutes.py` 的 `list_skills`(Annotated 里的 Query、`_` 的依赖)、`get_skill`(HTTPException 的 status_code / detail)、`install`(Request 不算、`-> None` 没有内容);`fixtures/consoleRoutes.py` 的 `create_user`(`status_code=201`、Pydantic 模型、调别的函数间接抛的不算)、`list_users`(查到的类型别名 `FilterQuery` 是依赖、Literal 是简单类型);参数放在哪儿的各条(路径里的名字含 `{x:path}`、各种标记两种写法、上传文件、枚举和类型别名查到的、Pydantic 模型、`Security`、`Depends()`);标签、依赖、`responses=` 叠上路由对象的,`status.HTTP_…` 常量、`response_model=None`、`response_description`、`raise … from`、只写 `raise`、嵌套函数里的;`FastAPI()` 上的接口、别的装饰器一行;不认的(没导入、路由对象在别的文件、不是路由对象、`websocket`、不带括号)。跨文件(工作区索引 + 假的语言扩展):`update_user` 的 `Forbidden` 按定义处查到 `core/exceptions/schemas.py` 的 403,同名的别处的类不算;索引认的类上的 `status_code`(带注解、常量)、枚举类、`Annotated` 类型别名,普通类不认。路由器卡片:`fixtures/routes.py` 的 `router` 逐字同上面的样例,名字、颜色、图标、列名、编辑范围、定义范围;接口表的函数名带下标、路径里的 `{user_id}` 各 `refers` 到各自函数的参数、方法的颜色;接口卡片的「路由器」行排在说明后面、名字带下标指回路由器;写了依赖、默认响应才有这两行,`FastAPI()` 没有前缀,属性 docstring 是说明,没挂接口时「0 个」、不画表格。
- React 组件(`rules/reactTree.test.ts`、`rules/react.test.ts`,luffy 的九个真实组件):认组件(七个文件里的组件、小写工具函数和不渲染 JSX 的不认;memo / forwardRef 包着的、默认导出、文件末尾 export 的、null 和 JSX 混着返回的;组件体里的语句、提前返回的 if 里的 return 认得出在哪个组件里);构造参数(行内类型字面量、同文件接口带 JSDoc、回调、children、默认值、改名、其余属性、方法签名、`FC<Props>`、`forwardRef<R, Props>`、导入的类型查不到和查到了);组件体的归类、钩子调用、自定义钩子(认哪些、钩子体里的语句、返回的各项)、名字用在哪(钩子调用、处理函数绑在每个按钮上);渲染大纲(原生标签、组件、类、条件、三元、列表、片段、注释、几处返回)和 className 的写法。卡片:组件卡片只有名称 / 说明 / 构造参数,组件体照源码顺序是子块,`"use client"` 不单独成块(文件里没组件时、它挂着注释时照常成块),JSDoc 是组件块的说明;`fixtures/planChecklist.tsx.txt` 逐字同上面的样例;QueuedBubble 的钩子、变量、两个事件处理函数、渲染输出照源码顺序、函数体是子卡片,提前 `return null` 是如果卡片;按变量讲的钩子卡片(原型 `react-state.js` 的三张画板:`fixtures/loginPage.tsx.txt` 的状态卡片、两个图标和悬停、各项的调用树操作,`fixtures/stateVariants.tsx.txt` 的未标注类型、函数形式的默认值和它的返回卡片子块、只取当前值,`fixtures/searchPanel.tsx.txt` 每种卡片的各行、样子、各项操作的悬停字和不算的依赖数组、宿主数的调用树键、函数参数的小框和子块;`fixtures/hooksPanel.tsx.txt` 的没传参数的说法、useLayoutEffect 的悬停、记忆函数的参数表、惰性初始值),签名表的重载和没传的参数,三种来源的淡底,没有自己那种卡片的内置钩子讲成钩子返回值、带作用图标,别的文件里自己写的钩子经索引查形参名;自定义钩子卡片(函数、钩子两个图标,右上角调用树)和钩子体里的钩子,没接返回值的钩子调用;没绑在 JSX 上的处理函数写由谁调用;直接返回 JSX 的组件把大纲写在卡片里;九个文件认领下来都合约定;差异:加一个属性、改一个副作用的依赖,组件卡片属性表那一行新加、副作用卡片的触发时机那一行逐截标。调用树改查引用(`callTree/referenceCalls.test.ts`:只留调用处、往外找第一个认得的调用者、文件顶层按文件算;查所有引用时不看名字后面、去掉定义处和依赖数组里的),调用树服务按键数(`callTree/session.test.ts`:卡片上的操作各数各的,查引用的次数是用到几处),发给页面的操作下标从块的开头算、键原样带着(`editor/pageBlocks.test.ts`)。宿主:`libraries` 空的规则都启用,`alwaysIn` 里的语言不看导入、别的语言照导入(导入了 react 的 .ts 出自定义钩子卡片和钩子卡片,没导入的不启用);略去的块不出块、有子块的不能略去。webview:小标签、条件小框、类名小标的样子(`SegmentText.test.tsx`)。 - React 组件(`rules/reactTree.test.ts`、`rules/react.test.ts`,luffy 的九个真实组件):认组件(七个文件里的组件、小写工具函数和不渲染 JSX 的不认;memo / forwardRef 包着的、默认导出、文件末尾 export 的、null 和 JSX 混着返回的;组件体里的语句、提前返回的 if 里的 return 认得出在哪个组件里);构造参数(行内类型字面量、同文件接口带 JSDoc、回调、children、默认值、改名、其余属性、方法签名、`FC<Props>`、`forwardRef<R, Props>`、导入的类型查不到和查到了);组件体的归类、钩子调用、自定义钩子(认哪些、钩子体里的语句、返回的各项)、名字用在哪(钩子调用、处理函数绑在每个按钮上);渲染大纲(原生标签、组件、类、条件、三元、列表、片段、注释、几处返回)和 className 的写法。卡片:组件卡片只有名称 / 说明 / 构造参数,右上角调用树(宿主按块的记号数、查法是 calls),组件体照源码顺序是子块,`"use client"` 不单独成块(文件里没组件时、它挂着注释时照常成块),JSDoc 是组件块的说明;`fixtures/planChecklist.tsx.txt` 逐字同上面的样例;QueuedBubble 的钩子、变量、两个事件处理函数、渲染输出照源码顺序、函数体是子卡片,事件处理函数卡片右上角调用树,提前 `return null` 是如果卡片;按变量讲的钩子卡片(原型 `react-state.js` 的三张画板:`fixtures/loginPage.tsx.txt` 的状态卡片、两个图标和悬停、各项的调用树操作,`fixtures/stateVariants.tsx.txt` 的未标注类型、函数形式的默认值和它的返回卡片子块、只取当前值,`fixtures/searchPanel.tsx.txt` 每种卡片的各行、样子、各项操作的悬停字和不算的依赖数组、宿主数的调用树键、函数参数的小框和子块;`fixtures/hooksPanel.tsx.txt` 的没传参数的说法、useLayoutEffect 的悬停、记忆函数的参数表、惰性初始值),签名表的重载和没传的参数,三种来源的淡底,没有自己那种卡片的内置钩子讲成钩子返回值、带作用图标,别的文件里自己写的钩子经索引查形参名;自定义钩子卡片(函数、钩子两个图标,右上角调用树)和钩子体里的钩子,没接返回值的钩子调用;没绑在 JSX 上的处理函数写由谁调用;直接返回 JSX 的组件把大纲写在卡片里;九个文件认领下来都合约定;差异:加一个属性、改一个副作用的依赖,组件卡片属性表那一行新加、副作用卡片的触发时机那一行逐截标。调用树改查引用(`callTree/referenceCalls.test.ts`:只留调用处(JSX 开始标签也算,闭合标签、成员标签、import、类型位置、当值传递的不算)、往外找第一个认得的调用者、文件顶层按文件算;查所有引用时不看名字前后、去掉定义处和依赖数组里的),调用树服务按键数(`callTree/session.test.ts`:卡片上的操作各数各的,查引用的次数是用到几处),发给页面的组件卡片带着调用树、操作下标从块的开头算、键原样带着(`editor/pageBlocks.test.ts`)。宿主:`libraries` 空的规则都启用,`alwaysIn` 里的语言不看导入、别的语言照导入(导入了 react 的 .ts 出自定义钩子卡片和钩子卡片,没导入的不启用);略去的块不出块、有子块的不能略去。webview:小标签、条件小框、类名小标的样子(`SegmentText.test.tsx`)。
- 规则查别的文件里的定义(`ruleLookups.test.ts`):第一遍当没查到、记下问了什么(同一索引同名的只记一处);查到后叫重排,交出定义处正是的那一项;同一版本不再查;索引里没有同名的不问语言扩展,定义处不是索引里的项算没有,没变不叫重排;新版本先用上一版的、再查、变了才叫重排;语言扩展没答时已知的不动、隔一会儿再查。 - 规则查别的文件里的定义(`ruleLookups.test.ts`):第一遍当没查到、记下问了什么(同一索引同名的只记一处);查到后叫重排,交出定义处正是的那一项;同一版本不再查;索引里没有同名的不问语言扩展,定义处不是索引里的项算没有,没变不叫重排;新版本先用上一版的、再查、变了才叫重排;语言扩展没答时已知的不动、隔一会儿再查。
- 带自己颜色的词(webview `SegmentText.test.tsx`):`cr-colored`,暗色、亮色写在 style 上;讲别处名字的段 `data-offset` 记那个名字的下标。 - 带自己颜色的词(webview `SegmentText.test.tsx`):`cr-colored`,暗色、亮色写在 style 上;讲别处名字的段 `data-offset` 记那个名字的下标。
- 异常(`languages/exceptions.test.ts`,真实解析 + 中文直译 + 视图数据):`fixtures/appExceptions.py` 的 `AppException`、`NotFound` 逐字同「异常」的样例(列名随有没有类型、说明变),`GatewayTimeout` 的多段说明,方法是子块;`fixtures/commerceExceptions.py` 16 个类都是异常、只有说明的四行、写了 `__init__` 的构造参数;认哪些类(自带的异常类、`Warning`、不合后缀的自带类 `StopIteration` / `KeyboardInterrupt`、`pkg.errors.AppException`、同一文件里写在后面的父类一层层往下传、泛型和别的父类混写,关键字参数、`Mapping[...]`、`*bases` 不算,函数里的类也认);类属性(带不带注解、只写注解、说明取讲它的注释 / 行尾注释 / 属性 docstring,连着赋值、解构赋值、方法留作子块,讲方法的注释、类主体最后的注释挂在方法、最后一块上),构造参数去掉 self、`*args` 开头的不去;`@dataclass` 的异常类照样是异常卡片;编辑范围是整个类、改卡片写回整个类,类名、属性名、参数名的定义范围和带下标的词指回源码原文;TypeScript `fixtures/exceptions.ts.txt`(`extends Error`、类字段含 static、参数属性、JSDoc、写在后面的父类、类表达式、`ns.X<T>`,父类名不合习惯的照常是类)、JavaScript 的类字段;TypeScript 和 Python 同样的异常得到一样的行和列名;筛选的种类叫「异常」、没有 badge;属性的中文名和去掉行尾记号。webview:异常块默认折叠(`viewState.test.ts`),跳到类名闪整块、属性名 / 构造参数名只闪表里那一行(`reveal.test.ts`)。 - 异常(`languages/exceptions.test.ts`,真实解析 + 中文直译 + 视图数据):`fixtures/appExceptions.py` 的 `AppException`、`NotFound` 逐字同「异常」的样例(列名随有没有类型、说明变),`GatewayTimeout` 的多段说明,方法是子块;`fixtures/commerceExceptions.py` 16 个类都是异常、只有说明的四行、写了 `__init__` 的构造参数;认哪些类(自带的异常类、`Warning`、不合后缀的自带类 `StopIteration` / `KeyboardInterrupt`、`pkg.errors.AppException`、同一文件里写在后面的父类一层层往下传、泛型和别的父类混写,关键字参数、`Mapping[...]`、`*bases` 不算,函数里的类也认);类属性(带不带注解、只写注解、说明取讲它的注释 / 行尾注释 / 属性 docstring,连着赋值、解构赋值、方法留作子块,讲方法的注释、类主体最后的注释挂在方法、最后一块上),构造参数去掉 self、`*args` 开头的不去;`@dataclass` 的异常类照样是异常卡片;编辑范围是整个类、改卡片写回整个类,类名、属性名、参数名的定义范围和带下标的词指回源码原文;TypeScript `fixtures/exceptions.ts.txt`(`extends Error`、类字段含 static、参数属性、JSDoc、写在后面的父类、类表达式、`ns.X<T>`,父类名不合习惯的照常是类)、JavaScript 的类字段;TypeScript 和 Python 同样的异常得到一样的行和列名;筛选的种类叫「异常」、没有 badge;属性的中文名和去掉行尾记号。webview:异常块默认折叠(`viewState.test.ts`),跳到类名闪整块、属性名 / 构造参数名只闪表里那一行(`reveal.test.ts`)。