✨ feat(vscode): 代码阅读把字典、对象字面量的值展开成键值树

This commit is contained in:
cruldra committed 2026-09-25 20:57:27 +08:00
1 parent 51f2ef7bfa
commit 4930dc0d42
20 files changed
+578 -103

No files matched your search

@@ -1,7 +1,7 @@
import type { BlockKind, BlockView } from './types'
import type { ViewStateStorage } from './viewState'
import { describe, expect, it } from 'vitest'
import { collapsedIds, createViewStateStore, propertyRowId } from './viewState'
import { collapsedIds, createViewStateStore, propertyItemId, propertyRowId } from './viewState'
/** 模拟 VS Code 的 webview 状态:存进去的要能序列化,页面重新加载后原样取回;也能塞进旧版本存的东西 */
function memoryStorage(initial?: unknown): ViewStateStorage {
@@ -73,6 +73,32 @@ describe('webview 状态', () => {
createViewStateStore(storage).update({ folds: { 6.1: false, [propertyRowId('6.1.0', 3)]: true } })
expect(createViewStateStore(storage).get().folds).toEqual({ '6.1': false, '6.1.0/p3': true })
})
it('子行 id 是上一层的 id 加子行序号,一层层往后接;不同位置的不会撞上,也不会和块 id、属性行 id 撞上', () => {
const row = propertyRowId('6.1.0', 3)
expect(propertyItemId(row, 1)).toBe('6.1.0/p3/1')
expect(propertyItemId(propertyItemId(row, 1), 0)).toBe('6.1.0/p3/1/0')
const ids = [
'6',
'6.1',
propertyRowId('6', 1),
propertyRowId('6', 11),
propertyItemId(propertyRowId('6', 1), 1),
propertyItemId(propertyRowId('6', 11), 1),
propertyItemId(propertyItemId(propertyRowId('6', 1), 1), 1),
propertyItemId(propertyItemId(propertyRowId('6', 1), 11), 1),
propertyItemId(propertyItemId(propertyRowId('6', 1), 1), 11),
propertyItemId(propertyRowId('6.1', 1), 1),
]
expect(new Set(ids).size).toBe(ids.length)
})
it('嵌套子行的折叠选择也存在 folds 里,页面重新加载后还在', () => {
const storage = memoryStorage()
const nested = propertyItemId(propertyItemId(propertyRowId('2', 2), 0), 1)
createViewStateStore(storage).update({ folds: { [nested]: true, [propertyItemId(propertyRowId('2', 2), 0)]: false } })
expect(createViewStateStore(storage).get().folds).toEqual({ '2/p2/0/1': true, '2/p2/0': false })
})
})
describe('眼下折叠着哪些', () => {
@@ -84,4 +110,11 @@ describe('眼下折叠着哪些', () => {
const folds = { '1': false, '2': false, '1.0': true, '1.0.0': false, [propertyRowId('0', 2)]: true, [propertyRowId('2.0', 1)]: false }
expect([...collapsedIds(BLOCKS, folds)].sort()).toEqual(['0/p2', '1.0', '2.0'])
})
it('带下一层的子行默认展开,用户折叠过的按他的', () => {
const outer = propertyItemId(propertyRowId('0', 2), 0)
const inner = propertyItemId(outer, 3)
expect(collapsedIds(BLOCKS, {}).has(outer)).toBe(false)
expect([...collapsedIds(BLOCKS, { [outer]: false, [inner]: true })].sort()).toEqual(['0/p2/0/3', '1', '1.0.0', '2', '2.0'])
})
})