🐛 fix(vscode): 注释里不带路径的引用从被注释的声明起一层层往外找,同类的方法、类的成员都能链到

This commit is contained in:
cruldra committed 2026-10-12 16:56:31 +11:00
1 parent 15972c0b35
commit 5120e50228
15 files changed
+450 -167

No files matched your search

@@ -1,9 +1,13 @@
import type { BlockView } from '../blockView'
import type { DiffBase, OpenedFrom } from '../diff/diffBase'
import type { ProfileChoice } from '../qa/askProfiles'
import type { RewriteRequest } from '../qa/codeQa'
import type { SymbolNode } from '../symbolLinks'
import type { ExtensionToWebview, WebviewToExtension } from './messages'
import { describe, expect, it, vi } from 'vitest'
import { window, workspace } from 'vscode'
import { documentMessage } from './documentMessage'
import { documentSymbolNodes } from './documentSymbols'
import { PreviewEditorProvider } from './previewEditor'
vi.mock('vscode', () => ({
@@ -40,6 +44,8 @@ vi.mock('./documentMessage', () => ({
imports: [],
})),
}))
/** 文档符号由各个测试给 */
vi.mock('./documentSymbols', () => ({ documentSymbolNodes: vi.fn(async () => []) }))
const SOURCE = ['// 旧说明', 'export function load() {}']
@@ -345,3 +351,40 @@ describe('问 AI 和重写注释的 profile 下拉各管各的', () => {
expect(page.posted()).not.toContainEqual(expect.objectContaining({ type: 'profiles', kind: 'rewrite' }))
})
})
describe('注释里不带路径的引用按它写在哪块的注释里找', () => {
const METHOD = 'class AgentService > function get_default_agent'
const HELPER = 'function helper'
/** 一块有名字的代码:名字在源码里的下标是 at */
function declared(anchor: string, at: number, children: BlockView[] = []): BlockView {
return { id: anchor, anchor, kind: 'function', startLine: 0, endLine: 0, headerEndLine: 0, code: '', codeTokens: [], defines: { startIndex: at, endIndex: at + 1 }, attributes: { kind: 'function' }, concepts: [], children, translation: [] }
}
function symbol(name: string, start: number, end: number, children: SymbolNode[] = []): SymbolNode {
return { name, range: { startIndex: start, endIndex: end }, selection: { startIndex: start, endIndex: start + name.length }, children }
}
it('同一个名字:方法说明里的找得到同类的另一个方法,顶层函数说明里的找不到;标坏链接、点了打开都按各自那块找', async () => {
const blocks = [declared('class AgentService', 100, [declared(METHOD, 400)]), declared(HELPER, 950)]
vi.mocked(documentMessage).mockImplementationOnce(async input => ({
message: { type: 'document', version: input.version, languageId: input.languageId, blocks, attributes: [], translators: [], translatorId: '', names: [] },
displayNames: [],
symbols: [],
imports: [],
}) as never)
vi.mocked(documentSymbolNodes).mockResolvedValue([
symbol('AgentService', 100, 900, [symbol('get_agent_admitted', 200, 300), symbol('get_default_agent', 400, 500)]),
symbol('helper', 950, 990),
])
const { provider, document } = opening()
const page = tab()
provider.resolveCustomTextEditor(document as never, page.panel)
await page.send({ type: 'ready' })
await page.send({ type: 'checkRepoLinks', id: 1, paths: [], references: [{ symbol: 'get_agent_admitted', block: METHOD }, { symbol: 'get_agent_admitted', block: HELPER }] })
expect(page.posted()).toContainEqual({ type: 'repoLinksChecked', id: 1, missing: [], unresolved: [{ symbol: 'get_agent_admitted', block: HELPER }] })
await page.send({ type: 'openRepoLink', symbol: 'get_agent_admitted', block: HELPER })
expect(page.posted()).toContainEqual({ type: 'repoLinkBroken', symbol: 'get_agent_admitted', block: HELPER })
})
})