✨ feat(vscode): 代码阅读把说明里的 @param / @return / @throws 拆到参数表、输出、异常表

This commit is contained in:
cruldra committed 2026-10-08 07:17:26 +08:00
1 parent c2982537d7
commit 0958506681
43 files changed
+1300 -323

No files matched your search

+8 -9
View File
@@ -1,5 +1,5 @@
import type { CodeBlock, Inline, KindBadge, LibraryRule, Node, PropertyRow, RuleCard, ThemeColor } from '../contract'
import { commentPlain, firstSentence, macroInvocation, named, oneLine, stringContent } from './rustTree'
import type { CodeBlock, Inline, KindBadge, LibraryRule, Node, PropertyRow, RuleCard, RuleContext, ThemeColor } from '../contract'
import { docSummary, macroInvocation, named, oneLine, stringContent } from './rustTree'
/** 查询卡用字符串那种橙。 */
const COLOR: ThemeColor = { dark: '#ce9178', light: '#a31515' }
@@ -15,16 +15,16 @@ export const sqlxRule: LibraryRule = {
label: 'sqlx 查询',
languageIds: ['rust'],
libraries: ['sqlx'],
claim: (block) => {
claim: (block, context) => {
if (block.kind === 'comment')
return nextQuery(block.node) ? { omit: true } : undefined
const macro = block.kind === 'statement' ? findQuery(block.node) : undefined
return macro ? card(block, macro) : undefined
return macro ? card(block, macro, context) : undefined
},
attributeNames: () => ({ attributes: {}, values: { kind: { 'sqlx.query': '查询' } } }),
}
function card(block: CodeBlock, macro: Node): RuleCard {
function card(block: CodeBlock, macro: Node, context: RuleContext): RuleCard {
const call = macroInvocation(macro)
const args = call?.args ?? []
const typed = call?.name.split('::').pop() !== 'query'
@@ -32,7 +32,7 @@ function card(block: CodeBlock, macro: Node): RuleCard {
const sql = stringContent(sqlNode) ?? ''
const params = args.slice(typed ? 2 : 1)
const returned = typed ? args[0] : undefined
const note = precedingNote(block.node)
const note = precedingNote(block.node, context)
const rows: PropertyRow[] = [
...(note ? [{ label: '说明', value: { markdown: note } }] : []),
{ label: 'SQL', value: [{ text: sql, role: 'string', ...(sqlNode && { offset: sqlNode.startIndex }) }] },
@@ -65,14 +65,13 @@ function nextQuery(comment: Node): Node | undefined {
return next ? findQuery(next) : undefined
}
function precedingNote(node: Node): string | undefined {
function precedingNote(node: Node, context: RuleContext): string | undefined {
let prev = node.previousNamedSibling
while (prev?.type === 'attribute_item')
prev = prev.previousNamedSibling
if (!prev || (prev.type !== 'line_comment' && prev.type !== 'block_comment'))
return undefined
const sentence = firstSentence(commentPlain(prev))
return sentence || undefined
return docSummary(context.doc(prev))
}
function hint(text: string): Inline {