feat: filter IDE reference candidates

This commit is contained in:
2026-08-17 13:55:12 +08:00
parent 35163e12b4
commit 0ff9477b5d
10 changed files with 138 additions and 15 deletions
+61
View File
@@ -63,4 +63,65 @@ describe('combineSnapshots', () => {
expect(combineSnapshots([parsed], 'main', 1).items).toHaveLength(1)
expect(combineSnapshots([parsed], 'main', 10).total).toBe(2)
})
it('excludes Visual Studio project and solution files by default', () => {
const parsed = parseSnapshot(snapshot('F:\\project\\main.cs', {
documents: [
{ path: 'F:\\project\\main.cs', label: 'main.cs', dirty: false },
{ path: 'F:\\project\\app.csproj', label: 'app.csproj', dirty: false },
{ path: 'F:\\project\\library.fsproj', label: 'library.fsproj', dirty: false },
{ path: 'F:\\project\\tools.vbproj', label: 'tools.vbproj', dirty: false },
{ path: 'F:\\project\\native.vcxproj', label: 'native.vcxproj', dirty: false },
{ path: 'F:\\project\\legacy.vsproj', label: 'legacy.vsproj', dirty: false },
{ path: 'F:\\project\\app.sln', label: 'app.sln', dirty: false },
{ path: 'F:\\project\\app.slnx', label: 'app.slnx', dirty: false },
],
}), now)!
expect(combineSnapshots([parsed]).items.map((item) => item.label)).toEqual(['main.cs'])
})
it('matches configured extensions without case sensitivity', () => {
const parsed = parseSnapshot(snapshot('F:\\project\\main.cs', {
documents: [
{ path: 'F:\\project\\main.cs', label: 'main.cs', dirty: false },
{ path: 'F:\\project\\APP.CSPROJ', label: 'APP.CSPROJ', dirty: false },
],
}), now)!
expect(combineSnapshots([parsed], '', 100, ['.csproj']).items.map((item) => item.label)).toEqual(['main.cs'])
})
it('accepts configured extensions without a leading dot', () => {
const parsed = parseSnapshot(snapshot('F:\\project\\main.cs', {
documents: [
{ path: 'F:\\project\\main.cs', label: 'main.cs', dirty: false },
{ path: 'F:\\project\\app.slnx', label: 'app.slnx', dirty: false },
],
}), now)!
expect(combineSnapshots([parsed], '', 100, ['slnx']).items.map((item) => item.label)).toEqual(['main.cs'])
})
it('disables filtering when excludedExtensions is empty', () => {
const parsed = parseSnapshot(snapshot('F:\\project\\main.cs', {
documents: [
{ path: 'F:\\project\\main.cs', label: 'main.cs', dirty: false },
{ path: 'F:\\project\\app.csproj', label: 'app.csproj', dirty: false },
],
}), now)!
expect(combineSnapshots([parsed], '', 100, []).total).toBe(2)
})
it('reports the filtered document count for each instance', () => {
const parsed = parseSnapshot(snapshot('F:\\project\\main.cs', {
documents: [
{ path: 'F:\\project\\main.cs', label: 'main.cs', dirty: false },
{ path: 'F:\\project\\app.csproj', label: 'app.csproj', dirty: false },
],
}), now)!
expect(combineSnapshots([parsed]).items[0]?.instanceOpenCount).toBe(1)
})
})
+2 -5
View File
@@ -16,10 +16,7 @@ describe('client reference projection', () => {
expect(serializeIdeReference(item.path)).toBe('<ide-open-file>{"path":"F:\\\\project\\\\a&b.ts"}</ide-open-file>')
})
it('shows IDE, count and dirty state', () => {
const candidate = candidateFromItem(item)
expect(candidate.description).toContain('VS Code')
expect(candidate.description).toContain('4 open')
expect(candidate.description).toContain('unsaved changes')
it('shows IDE, workspace, count and dirty state with ASCII separators', () => {
expect(candidateFromItem(item).description).toBe('VS Code | F:\\project | 4 open | unsaved changes')
})
})