提交 ea2c3d89 编写于 作者: J Johannes Rieken

improve nearestReference search by using common prefix len, #5893

上级 3b1e28db
......@@ -203,28 +203,30 @@ export class ReferencesModel {
}
public nearestReference(resource: URI, position: IPosition): OneReference {
let candidate: OneReference;
let candiateDist: number;
for (let ref of this._references) {
if (ref.uri.toString() !== resource.toString()) {
continue;
}
if (Range.containsPosition(ref.range, position)) {
// best match (!)
return ref;
const nearest = this._references.map((ref, idx) => {
return {
idx,
prefixLen: strings.commonPrefixLength(ref.uri.toString(), resource.toString()),
offsetDist: Math.abs(ref.range.startLineNumber - position.lineNumber) * 100 + Math.abs(ref.range.startColumn - position.column)
};
}).sort((a, b) => {
if (a.prefixLen > b.prefixLen) {
return -1;
} else if (a.prefixLen < b.prefixLen) {
return 1;
} else if (a.offsetDist < b.offsetDist) {
return -1;
} else if (a.offsetDist > b.offsetDist) {
return 1;
} else {
return 0;
}
})[0];
let dist =
(Math.abs(ref.range.startLineNumber - position.lineNumber) * 100)
+ Math.abs(ref.range.startColumn - position.column);
if (!candidate || dist <= candiateDist) {
candidate = ref;
candiateDist = dist;
}
if (nearest) {
return this._references[nearest.idx];
}
return candidate || this._references[0];
}
private static _compareReferences(a: Location, b: Location): number {
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import URI from 'vs/base/common/uri';
import {Range} from 'vs/editor/common/core/range';
import {Position} from 'vs/editor/common/core/position';
import {ReferencesModel} from 'vs/editor/contrib/referenceSearch/browser/referencesModel';
suite('references', function () {
test('neartestReference', function () {
const model = new ReferencesModel([{
uri: URI.file('/out/obj/can'),
range: new Range(1, 1, 1, 1)
}, {
uri: URI.file('/out/obj/can2'),
range: new Range(1, 1, 1, 1)
}, {
uri: URI.file('/src/can'),
range: new Range(1, 1, 1, 1)
}]);
let ref = model.nearestReference(URI.file('/src/can'), new Position(1, 1));
assert.equal(ref.uri.fsPath, '/src/can');
ref = model.nearestReference(URI.file('/src/someOtherFileInSrc'), new Position(1, 1));
assert.equal(ref.uri.fsPath, '/src/can');
ref = model.nearestReference(URI.file('/out/someOtherFile'), new Position(1, 1));
assert.equal(ref.uri.fsPath, '/out/obj/can');
ref = model.nearestReference(URI.file('/out/obj/can2222'), new Position(1, 1));
assert.equal(ref.uri.fsPath, '/out/obj/can2');
});
});
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册