✨ feat(vscode): 代码阅读把字典、对象字面量的值展开成键值树
This commit is contained in:
1 parent
51f2ef7bfa
commit
4930dc0d42
20 files changed
+578
-103
No files matched your search
@@ -1,7 +1,7 @@
|
||||
import type { BlockView, PreviewText, SourceRange } from './types'
|
||||
import type { BlockView, PreviewText, PropertyItem, SourceRange } from './types'
|
||||
import { propertyItemId, propertyRowId } from './viewState'
|
||||
|
||||
/** 跳到定义时要滚到的块,就是这处定义的属性行 / 子行(只闪它),以及要展开的块和属性行:它们折叠着,目标就不在页面上。 */
|
||||
/** 跳到定义时要滚到的块,就是这处定义的属性行 / 子行(只闪它),以及要展开的块、属性行和子行:它们折叠着,目标就不在页面上。 */
|
||||
export interface RevealPlan {
|
||||
id: string
|
||||
/** 属性行 id(propertyRowId)或子行 id(propertyItemId);没有时闪整块 */
|
||||
@@ -38,8 +38,9 @@ function shows(text: PreviewText, offset: number): boolean {
|
||||
/**
|
||||
* 块里哪儿是 offset 处的定义,从具体到笼统:
|
||||
* ① 块自己的名字(函数名、类名、只声明一个变量时的变量名)→ 整块;
|
||||
* ② 属性表里讲这个定义的一行 / 子行(defines 盖住 offset:参数、导入项、多变量声明里的一个)→ 只闪它,子行连它所在的行一起展开;
|
||||
* ③ 块里只是显示着这个名字(一行译文里的循环变量、没填 defines 的翻译插件)→ 整块,名字在子行里时展开那一行。
|
||||
* ② 属性表里讲这个定义的一行 / 子行(defines 盖住 offset:参数、导入项、多变量声明里的一个、对象一项的键)→ 只闪它,
|
||||
* 子行连它上面的各层(所在的行、嵌套时外层的子行)一起展开;
|
||||
* ③ 块里只是显示着这个名字(一行译文里的循环变量、没填 defines 的翻译插件)→ 整块,名字在子行里时展开它上面的各层。
|
||||
* 不在这块里是 undefined。
|
||||
*/
|
||||
function locate(block: BlockView, offset: number): Spot | undefined {
|
||||
@@ -51,15 +52,41 @@ function locate(block: BlockView, offset: number): Spot | undefined {
|
||||
for (const { row, id } of rows) {
|
||||
if (covers(row.defines, offset))
|
||||
return { row: id, expand: [] }
|
||||
const item = row.items?.findIndex(entry => covers(entry.defines, offset)) ?? -1
|
||||
if (item >= 0)
|
||||
return { row: propertyItemId(id, item), expand: [id] }
|
||||
const item = definingItem(row.items, id, offset)
|
||||
if (item)
|
||||
return item
|
||||
}
|
||||
for (const { row, id } of rows) {
|
||||
if (shows(row.value, offset))
|
||||
return { expand: [] }
|
||||
if (row.items?.some(item => item.cells.some(cell => shows(cell, offset))))
|
||||
return { expand: [id] }
|
||||
const expand = showingItem(row.items, id, offset)
|
||||
if (expand)
|
||||
return { expand }
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
/** parentId 下面一层层的子行里,defines 盖住 offset 的那个:闪它,展开它上面的各层(parentId 和它所在的那串上层子行)。 */
|
||||
function definingItem(items: PropertyItem[] | undefined, parentId: string, offset: number): Spot | undefined {
|
||||
for (const [index, item] of (items ?? []).entries()) {
|
||||
const id = propertyItemId(parentId, index)
|
||||
if (covers(item.defines, offset))
|
||||
return { row: id, expand: [parentId] }
|
||||
const inner = definingItem(item.items, id, offset)
|
||||
if (inner)
|
||||
return { ...inner, expand: [parentId, ...inner.expand] }
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
/** parentId 下面一层层的子行里,哪个显示着 offset 处的名字:要展开的各层(parentId 到那个子行所在的那一层)。 */
|
||||
function showingItem(items: PropertyItem[] | undefined, parentId: string, offset: number): string[] | undefined {
|
||||
for (const [index, item] of (items ?? []).entries()) {
|
||||
if (item.cells.some(cell => shows(cell, offset)))
|
||||
return [parentId]
|
||||
const inner = showingItem(item.items, propertyItemId(parentId, index), offset)
|
||||
if (inner)
|
||||
return [parentId, ...inner]
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user