✨ feat(vscode): 新增「了解一块代码」:AI 找功能代码占一栏,对话里接着改
主栏标题栏的放大镜问要了解哪一块,占一个栏位建一栏(和收藏共用 30 个栏位,视图改名 slot1..30,按 slotKindN 分收藏 / 功能挂标题栏按钮),同时开对话页让 Claude 只读地在全部工作区文件夹里找,按 --json-schema 交回环节 → 文件 + 符号 + 一句话。 对话复用预览顶部的聊天(CodeQa.askTop:会话续接、进行中的一轮、记录存 workspaceState);结构不合格算这一轮没答成、留着能再画出来。 条目每次画、点时按眼下的代码找:有语言插件的解析成代码块按「类名.方法名」找,没有的问 VS Code 文档符号;找不到画成灰的。
This commit is contained in:
1 parent
16d27004d8
commit
880bf7fc57
38 files changed
+3386
-378
No files matched your search
@@ -88,32 +88,33 @@ export async function resolveRepoEntry(root: string, rel: string): Promise<RepoE
|
||||
}
|
||||
|
||||
/**
|
||||
* 在文档符号里按名字找。`Agent` 找这个类或函数;`Agent.owner_id` 先找 `Agent`,再在它里面找 `owner_id`。
|
||||
* 名字对的是符号自己的 name,不看源码怎么写。
|
||||
* 在符号树里按名字找。`Agent` 找这个类或函数;`Agent.owner_id` 先找 `Agent`,再在它里面找 `owner_id`,点得更多的一层层往里找。
|
||||
* 同名的有几个时(Rust 的 `struct Order` 和 `impl Order`)挨个试,取第一个里面找得到后面几段的。
|
||||
* 名字对的是符号自己的 name,不看源码怎么写;有一段是空的(`Agent.`、`a..b`)找不到。
|
||||
*/
|
||||
export function findRepoSymbol<T extends NamedSymbol>(symbols: readonly T[], symbol: string): T | undefined {
|
||||
const dot = symbol.indexOf('.')
|
||||
const head = dot === -1 ? symbol : symbol.slice(0, dot)
|
||||
const member = dot === -1 ? undefined : symbol.slice(dot + 1)
|
||||
if (head === '' || member === '')
|
||||
return undefined
|
||||
const found = findNamed(symbols, head)
|
||||
if (!found || member === undefined)
|
||||
return found
|
||||
return findNamed((found.children ?? []) as readonly T[], member)
|
||||
const names = symbol.split('.')
|
||||
return names.includes('') ? undefined : findPath(symbols, names)
|
||||
}
|
||||
|
||||
function findNamed<T extends NamedSymbol>(symbols: readonly T[], name: string): T | undefined {
|
||||
for (const symbol of symbols) {
|
||||
if (symbol.name === name)
|
||||
return symbol
|
||||
const nested = findNamed((symbol.children ?? []) as readonly T[], name)
|
||||
if (nested)
|
||||
return nested
|
||||
/** 第一段按名字找(照先后、先往里再往后),每个同名的都在它里面接着找后面几段。 */
|
||||
function findPath<T extends NamedSymbol>(symbols: readonly T[], [name, ...rest]: readonly string[]): T | undefined {
|
||||
for (const found of named(symbols, name)) {
|
||||
const target = rest.length === 0 ? found : findPath((found.children ?? []) as readonly T[], rest)
|
||||
if (target)
|
||||
return target
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
function* named<T extends NamedSymbol>(symbols: readonly T[], name: string): Generator<T> {
|
||||
for (const symbol of symbols) {
|
||||
if (symbol.name === name)
|
||||
yield symbol
|
||||
yield* named((symbol.children ?? []) as readonly T[], name)
|
||||
}
|
||||
}
|
||||
|
||||
function hasControl(text: string): boolean {
|
||||
for (const char of text) {
|
||||
if (char.charCodeAt(0) <= 31)
|
||||
|
||||
Reference in new issue
Block a user