✨ feat(vscode): 代码阅读预览标出新增 / 修改 / 删除的卡片(左侧改动色条、新增淡绿底挂小标、删掉的块原位收成一行可展开),筛选栏第二行写对比基准和改动统计,新文件顶部横幅

This commit is contained in:
cruldra committed 2026-09-30 08:41:55 +08:00
1 parent 2a5806c6b5
commit 3b7ce69842
10 files changed
+491 -20

No files matched your search

@@ -0,0 +1,71 @@
import type { BlockView, DocumentDiff, RemovedView } from './types'
import { describe, expect, it } from 'vitest'
import { diffTree, openedByDiff, removedTitle, statsParts } from './diffView'
function block(id: string, anchor: string, children: BlockView[] = [], extra: Partial<BlockView> = {}): BlockView {
return { id, anchor, kind: 'function', startLine: 0, endLine: 0, code: '', codeTokens: [], attributes: { kind: 'function' }, children, translation: [], ...extra } as BlockView
}
function removed(parent: string, after: string | undefined, kind = 'function'): RemovedView {
return { parent, ...(after !== undefined && { after }), block: block('9', `${kind} gone`, [], { kind }), line: 3, kindName: '函数' }
}
function diff(parts: Partial<DocumentDiff>): DocumentDiff {
return { base: '上一次提交', version: 2, blocks: {}, removed: [], stats: { add: 0, mod: 0, del: 0 }, lineCount: 10, ...parts }
}
const BLOCKS = [
block('0', 'function a', [block('0.0', 'function a > return @1')]),
block('1', 'function b'),
]
describe('diffTree', () => {
it('块按记号认成页面上的 id;页面上找不到的记号(文档刚改)不标', () => {
const tree = diffTree(BLOCKS, diff({ blocks: { 'function a': { change: 'mod' }, 'function a > return @1': { change: 'mod', own: true }, 'function gone': { change: 'add' } } }), 2, () => true)
expect([...tree!.changes]).toEqual([['0', { change: 'mod' }], ['0.0', { change: 'mod', own: true }]])
expect(tree!.current).toBe(true)
})
it('页面上不是差异算的那一版时,卡片里的标记不画', () => {
expect(diffTree(BLOCKS, diff({}), 3, () => true)?.current).toBe(false)
})
it('删掉的块按层挂:父块、排在后面的那块换成页面上的 id,找不到的不画,被筛掉的不画', () => {
const tree = diffTree(BLOCKS, diff({ removed: [
removed('', 'function b'),
removed('function a', undefined),
removed('function missing', undefined),
removed('', 'function missing'),
removed('', undefined, 'import'),
] }), 2, item => item.block.kind !== 'import')
expect(tree!.removed.get('')).toEqual([{ id: 'removed-0', after: '1', removed: removed('', 'function b') }])
expect(tree!.removed.get('0')).toEqual([{ id: 'removed-1', removed: removed('function a', undefined) }])
expect(tree!.removed.size).toBe(2)
})
it('不比、基准里没有这个文件时不逐块标', () => {
expect(diffTree(BLOCKS, null, 2, () => true)).toBeUndefined()
expect(diffTree(BLOCKS, diff({ newFile: '上一次提交里没有这个文件' }), 2, () => true)).toBeUndefined()
})
it('标了改动的块默认展开', () => {
const tree = diffTree(BLOCKS, diff({ blocks: { 'function b': { change: 'add', outermost: true } } }), 2, () => true)
expect([...openedByDiff(tree)]).toEqual(['1'])
expect(openedByDiff(undefined).size).toBe(0)
})
})
describe('statsParts', () => {
it('没有的那种不写', () => {
expect(statsParts({ add: 2, mod: 0, del: 1 })).toEqual([{ change: 'add', text: '新增 2' }, { change: 'del', text: '删除 1' }])
expect(statsParts({ add: 0, mod: 0, del: 0 })).toEqual([])
})
})
describe('removedTitle', () => {
it('属性表取第一行的值,一行译文取译文,只取第一行', () => {
expect(removedTitle(block('0', 'x', [], { properties: [{ label: '名称', value: [{ text: '_is_owner', role: 'function' }] }] } as Partial<BlockView>))).toBe('_is_owner')
expect(removedTitle(block('0', 'x', [], { translation: [{ text: '调用 f\n接着', role: 'plain' }] }))).toBe('调用 f')
expect(removedTitle(block('0', 'x', [], { kind: 'comment', translation: { markdown: '说明第一行\n第二行' } }))).toBe('说明第一行')
})
})