⚡ perf(vscode): 代码阅读预览发给页面的块只记相对位置:块在源码里占的地方记成离前一块多远、自己多长,块里名字的下标从块的开头算,页面从文件开头累加回文件里的位置、和扩展端打交道的地方都在一处换算;靠前改了代码,后面内容没变的块发过去一模一样,扩展端自己的块和发给页面的块分成两种类型

This commit is contained in:
cruldra committed 2026-10-13 16:32:18 +11:00
1 parent 3a2815c19c
commit ad5f559e92
43 files changed
+980 -424

No files matched your search

@@ -36,14 +36,14 @@ function find(occ: OccurrenceHighlight, offset: number, text: string): void {
describe('occurrences:哪些段画高亮', () => {
it('段在源码里的范围和一处出现重叠就画,边界相接不算,没有下标的不画', () => {
const occurrences = [at(10, 18)]
expect(segmentOccurrence(name('ALPHABET', 10), occurrences)).toBe('normal')
expect(segmentOccurrence(name('x', 2), occurrences)).toBeUndefined()
expect(segmentOccurrence(name('ab', 8), occurrences)).toBeUndefined()
expect(segmentOccurrence(name('ab', 18), occurrences)).toBeUndefined()
expect(segmentOccurrence(name('ab', 17), occurrences)).toBe('normal')
expect(segmentOccurrence({ text: '常量', role: 'storage' }, occurrences)).toBeUndefined()
expect(segmentOccurrence(name('ALPHABET', 10), 0, occurrences)).toBe('normal')
expect(segmentOccurrence(name('x', 2), 0, occurrences)).toBeUndefined()
expect(segmentOccurrence(name('ab', 8), 0, occurrences)).toBeUndefined()
expect(segmentOccurrence(name('ab', 18), 0, occurrences)).toBeUndefined()
expect(segmentOccurrence(name('ab', 17), 0, occurrences)).toBe('normal')
expect(segmentOccurrence({ text: '常量', role: 'storage' }, 0, occurrences)).toBeUndefined()
// 整段字符串比名字长:出现落在字符串里面也算
expect(segmentOccurrence({ text: '\'./util\'', role: 'string', offset: 9 }, occurrences)).toBe('normal')
expect(segmentOccurrence({ text: '\'./util\'', role: 'string', offset: 9 }, 0, occurrences)).toBe('normal')
})
it('出现很多、乱序、有长有短还互相重叠时,结果和逐处比一样', () => {
@@ -63,7 +63,7 @@ describe('occurrences:哪些段画高亮', () => {
})
for (let offset = 0; offset < 2020; offset += 3) {
const segment = name('x'.repeat(1 + (offset % 7)), offset)
expect(segmentOccurrence(segment, occurrences), `offset ${offset}`).toBe(brute(segment, occurrences))
expect(segmentOccurrence(segment, 0, occurrences), `offset ${offset}`).toBe(brute(segment, occurrences))
}
})
@@ -71,18 +71,28 @@ describe('occurrences:哪些段画高亮', () => {
expect(occurrenceStyle('write')).toBe('strong')
expect(occurrenceStyle('read')).toBe('normal')
expect(occurrenceStyle('text')).toBe('normal')
expect(segmentOccurrence(name('a', 0), [at(0, 1, 'text')])).toBe('normal')
expect(segmentOccurrence(name('a', 0), [at(0, 1, 'read'), at(0, 1, 'write')])).toBe('strong')
expect(segmentOccurrence(name('a', 0), 0, [at(0, 1, 'text')])).toBe('normal')
expect(segmentOccurrence(name('a', 0), 0, [at(0, 1, 'read'), at(0, 1, 'write')])).toBe('strong')
})
it('讲别处名字的段(refers,写在字符串里的参数名)按那个名字算:那个名字的出现盖住它就画、能是当前那一处,自己照抄的位置不算', () => {
const param: Segment = { text: 'user_id', role: 'variable', offset: 40, refers: { startIndex: 100, endIndex: 107 } }
expect(sourceOf(param)).toEqual({ start: 100, end: 107 })
expect(segmentOccurrence(param, [at(100, 107, 'write')])).toBe('strong')
expect(segmentOccurrence(param, [at(40, 47)])).toBeUndefined()
expect(isCurrent(param, { name: 'user_id', occurrences: [at(100, 107)], current: 0 })).toBe(true)
expect(sourceOf(name('x', 3))).toEqual({ start: 3, end: 4 })
expect(sourceOf({ text: '常量', role: 'storage' })).toBeUndefined()
expect(sourceOf(param, 0)).toEqual({ start: 100, end: 107 })
expect(segmentOccurrence(param, 0, [at(100, 107, 'write')])).toBe('strong')
expect(segmentOccurrence(param, 0, [at(40, 47)])).toBeUndefined()
expect(isCurrent(param, 0, { name: 'user_id', occurrences: [at(100, 107)], current: 0 })).toBe(true)
expect(sourceOf(name('x', 3), 0)).toEqual({ start: 3, end: 4 })
expect(sourceOf({ text: '常量', role: 'storage' }, 0)).toBeUndefined()
})
it('段里的下标从所在那块的开头算:加上那块的开头(base)才是文件里的,和各处出现比、认当前那一处都按文件里的', () => {
const param: Segment = { text: 'user_id', role: 'variable', offset: 4, refers: { startIndex: 10, endIndex: 17 } }
expect(sourceOf(param, 1000)).toEqual({ start: 1010, end: 1017 })
expect(sourceOf(name('x', 3), 1000)).toEqual({ start: 1003, end: 1004 })
expect(segmentOccurrence(name('x', 3), 1000, [at(1003, 1004, 'write')])).toBe('strong')
expect(segmentOccurrence(name('x', 3), 1000, [at(3, 4, 'write')])).toBeUndefined()
expect(isCurrent(param, 1000, { name: 'user_id', occurrences: [at(1010, 1017)], current: 0 })).toBe(true)
expect(isCurrent(param, 0, { name: 'user_id', occurrences: [at(1010, 1017)], current: 0 })).toBe(false)
})
it('真实的 Python 译文和属性表:定义处按写入、用到的地方按读取画;点分模块名每一节各按自己的范围认', async () => {
@@ -98,7 +108,7 @@ describe('occurrences:哪些段画高亮', () => {
const py = createPythonAdapter(WASM_DIR)
const views = await withBlocks(py, 'python', source, blocks => toBlockViews(blocks, { source, language: py, markers: [] }, pythonZhTranslator))
const highlighted = (occurrences: Occurrence[]): string[] => allSegments(views).flatMap((segment) => {
const style = segmentOccurrence(segment, occurrences)
const style = segmentOccurrence(segment, 0, occurrences)
return style ? [`${segment.text}:${style}`] : []
})
const range = (needle: string, kind: Occurrence['kind'], from = 0): Occurrence => {
@@ -318,10 +328,10 @@ describe('occurrences:用键盘在各处出现之间跳', () => {
it('当前那一处:和它重叠的段描边,别的出现、没下标的段不描', () => {
const highlight = { name: 'ALPHABET', occurrences: [at(10, 18), at(40, 48)], current: 1 }
expect(isCurrent(name('ALPHABET', 40), highlight)).toBe(true)
expect(isCurrent(name('ALPHABET', 10), highlight)).toBe(false)
expect(isCurrent({ text: 'ALPHABET', role: 'plain' }, highlight)).toBe(false)
expect(isCurrent(name('ALPHABET', 40), { ...highlight, current: undefined })).toBe(false)
expect(isCurrent(name('ALPHABET', 40), 0, highlight)).toBe(true)
expect(isCurrent(name('ALPHABET', 10), 0, highlight)).toBe(false)
expect(isCurrent({ text: 'ALPHABET', role: 'plain' }, 0, highlight)).toBe(false)
expect(isCurrent(name('ALPHABET', 40), 0, { ...highlight, current: undefined })).toBe(false)
})
it('能不能用键盘跳:有高亮、页面有焦点、焦点不在输入框里;第一次都告诉扩展端,之后变了才告诉', () => {