Skip to content

Commit 36a5928

Browse files
author
Benjamin Pasero
committed
1 parent 587a104 commit 36a5928

2 files changed

Lines changed: 42 additions & 7 deletions

File tree

src/vs/base/common/scorer.ts

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -373,25 +373,47 @@ export function compareItemsByScore<T>(itemA: T, itemB: T, query: string, access
373373
return scoreA > scoreB ? -1 : 1;
374374
}
375375

376-
// 6.) at this point, scores are identical for both paths
376+
// 6.) at this point, scores are identical for both items so we start to sort by length
377377

378+
// check for label + description length and prefer shorter
378379
const labelA = accessor.getItemLabel(itemA);
379380
const labelB = accessor.getItemLabel(itemB);
380381

381-
if (labelA.length !== labelB.length) {
382-
return labelA.length - labelB.length; // prefer shorter labels
382+
const descriptionA = accessor.getItemDescription(itemA);
383+
const descriptionB = accessor.getItemDescription(itemB);
384+
385+
const labelDescriptionALength = labelA.length + (descriptionA ? descriptionA.length : 0);
386+
const labelDescriptionBLength = labelB.length + (descriptionB ? descriptionB.length : 0);
387+
388+
if (labelDescriptionALength !== labelDescriptionBLength) {
389+
return labelDescriptionALength - labelDescriptionBLength;
383390
}
384391

392+
// check for path length and prefer shorter
385393
const pathA = accessor.getItemPath(itemA);
386394
const pathB = accessor.getItemPath(itemB);
387395

388396
if (pathA && pathB && pathA.length !== pathB.length) {
389-
return pathA.length - pathB.length; // prefer shorter paths
397+
return pathA.length - pathB.length;
398+
}
399+
400+
// 7.) finally we have equal scores and equal length, we fallback to comparer
401+
402+
// compare by label
403+
if (labelA !== labelB) {
404+
return compareAnything(labelA, labelB, query);
405+
}
406+
407+
// compare by description
408+
if (descriptionA && descriptionB && descriptionA !== descriptionB) {
409+
return compareAnything(descriptionA, descriptionB, query);
390410
}
391411

392-
if (labelA === labelB && pathA && pathB) {
393-
return compareAnything(pathA, pathB, query); // compare paths if labels are identical
412+
// compare by path
413+
if (pathA && pathB && pathA !== pathB) {
414+
return compareAnything(pathA, pathB, query);
394415
}
395416

396-
return compareAnything(labelA, labelB, query); // finally compare by labels
417+
// equal
418+
return 0;
397419
}

src/vs/base/test/common/scorer.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,4 +366,17 @@ suite('Scorer', () => {
366366
assert.equal(res[1], resourceB);
367367
assert.equal(res[2], resourceC);
368368
});
369+
370+
test('compareFilesByScore - prefer shorter paths (bug #17443)', function () {
371+
const resourceA = URI.file('config/test/t1.js');
372+
const resourceB = URI.file('config/test.js');
373+
const resourceC = URI.file('config/test/t2.js');
374+
375+
let query = 'co/te';
376+
377+
let res = [resourceA, resourceB, resourceC].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, ResourceAccessor, cache));
378+
assert.equal(res[0], resourceB);
379+
assert.equal(res[1], resourceA);
380+
assert.equal(res[2], resourceC);
381+
});
369382
});

0 commit comments

Comments
 (0)