smarter sorting of references, better merging of neighour references, fixes

This commit is contained in:
Johannes Rieken
2016-05-20 15:28:28 +02:00
parent f791940868
commit 45d6ed4bfa
7 changed files with 86 additions and 68 deletions

View File

@ -50,6 +50,10 @@ var ContentProvider = (function () {
// printing, and formatting references
var _a = decodeLocation(uri), target = _a[0], pos = _a[1];
return vscode.commands.executeCommand('vscode.executeReferenceProvider', target, pos).then(function (locations) {
// sort by locations and shuffle to begin with target
var idx = 0;
locations.sort(ContentProvider._compareLocations).find(function (loc, i) { return loc.uri.toString() === target.toString() && (idx = i) && true; });
locations.push.apply(locations, locations.splice(0, idx));
var document = new referencesDocument_1.default(_this._onDidChange, uri, locations);
_this._documents.set(uri.toString(), document);
return document.value;
@ -67,6 +71,17 @@ var ContentProvider = (function () {
doc.join().then(function () { return editor.setDecorations(_this._editorDecoration, doc.ranges); });
}
};
ContentProvider._compareLocations = function (a, b) {
if (a.uri.toString() < b.uri.toString()) {
return -1;
}
else if (a.uri.toString() > b.uri.toString()) {
return 1;
}
else {
return a.range.start.compareTo(b.range.start);
}
};
ContentProvider.scheme = 'references';
return ContentProvider;
}());

View File

@ -1 +1 @@
{"version":3,"file":"contentProvider.js","sourceRoot":"","sources":["../src/contentProvider.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"contentProvider.js","sourceRoot":"","sources":["../src/contentProvider.ts"],"names":[],"mappings":"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"}

View File

@ -7,7 +7,7 @@ var ReferencesDocument = (function () {
function ReferencesDocument(emitter, uri, locations) {
this._emitter = emitter;
this._uri = uri;
this._locations = locations.sort(ReferencesDocument._compareLocations);
this._locations = locations;
// print header
this._lines = [("Found " + this._locations.length + " references")];
this._ranges = [];
@ -70,48 +70,40 @@ var ReferencesDocument = (function () {
return vscode.workspace.openTextDocument(uri).then(function (doc) {
_this._lines.push('', uri.toString());
for (var i = 0; i < ranges.length; i++) {
var range = ranges[i];
var line = range.start.line;
var prev = ranges[i - 1];
_this._appendContext(doc, line, prev ? Math.min(2, line - prev.start.line) : 2, false);
_this._appendMatch(doc, range);
var next = ranges[i + 1];
_this._appendContext(doc, line + 1, next ? Math.min(2, next.start.line - line) : 2, true);
if (next) {
_this._lines.push(' ...');
}
var line = ranges[i].start.line;
_this._appendLeading(doc, line, ranges[i - 1]);
_this._appendMatch(doc, line, ranges[i]);
_this._appendTrailing(doc, line, ranges[i + 1]);
}
}, function (err) {
_this._lines.push('', "Failed to load '" + uri.toString() + "'\n\n" + String(err), '');
});
};
ReferencesDocument.prototype._appendContext = function (doc, line, offset, down) {
var from = down ? line : line - offset;
var to = down ? line + offset : line;
while (from < to) {
if (from >= 0 && from < doc.lineCount) {
var text = doc.lineAt(from).text;
this._lines.push((" " + (from + 1)) + (text && " " + text));
}
from++;
ReferencesDocument.prototype._appendLeading = function (doc, line, previous) {
var from = Math.max(0, line - 3, previous && previous.end.line || 0);
while (++from < line) {
var text = doc.lineAt(from).text;
this._lines.push((" " + (from + 1)) + (text && " " + text));
}
};
ReferencesDocument.prototype._appendMatch = function (doc, range) {
var line = range.start.line;
ReferencesDocument.prototype._appendMatch = function (doc, line, match) {
var text = doc.lineAt(line).text;
var preamble = " " + (line + 1) + ": ";
this._ranges.push(new vscode.Range(this._lines.length, preamble.length + range.start.character, this._lines.length, preamble.length + range.end.character));
this._ranges.push(new vscode.Range(this._lines.length, preamble.length + match.start.character, this._lines.length, preamble.length + match.end.character));
this._lines.push(preamble + text);
};
ReferencesDocument._compareLocations = function (a, b) {
if (a.uri.toString() < b.uri.toString()) {
return -1;
ReferencesDocument.prototype._appendTrailing = function (doc, line, next) {
var to = Math.min(doc.lineCount, line + 3);
if (next && next.start.line - to <= 2) {
// next is too close
return;
}
else if (a.uri.toString() > b.uri.toString()) {
return 1;
while (++line < to) {
var text = doc.lineAt(line).text;
this._lines.push((" " + (line + 1)) + (text && " " + text));
}
else {
return a.range.start.compareTo(b.range.start);
if (next) {
this._lines.push(" ...");
}
};
return ReferencesDocument;

View File

@ -1 +1 @@
{"version":3,"file":"referencesDocument.js","sourceRoot":"","sources":["../src/referencesDocument.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"referencesDocument.js","sourceRoot":"","sources":["../src/referencesDocument.ts"],"names":[],"mappings":"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"}

View File

@ -24,6 +24,9 @@
"languages": [
{
"id": "locations",
"aliases": [
"Locations"
],
"extensions": [
".locations"
]

View File

@ -61,6 +61,11 @@ export default class ContentProvider implements vscode.TextDocumentContentProvid
const [target, pos] = decodeLocation(uri);
return vscode.commands.executeCommand<vscode.Location[]>('vscode.executeReferenceProvider', target, pos).then(locations => {
// sort by locations and shuffle to begin with target
let idx = 0;
locations.sort(ContentProvider._compareLocations).find((loc, i) => loc.uri.toString() === target.toString() && (idx = i) && true);
locations.push(...locations.splice(0, idx));
let document = new ReferencesDocument(this._onDidChange, uri, locations);
this._documents.set(uri.toString(), document);
return document.value;
@ -78,6 +83,16 @@ export default class ContentProvider implements vscode.TextDocumentContentProvid
doc.join().then(() => editor.setDecorations(this._editorDecoration, doc.ranges));
}
}
private static _compareLocations(a: vscode.Location, b: vscode.Location): number {
if (a.uri.toString() < b.uri.toString()) {
return -1;
} else if (a.uri.toString() > b.uri.toString()) {
return 1;
} else {
return a.range.start.compareTo(b.range.start)
}
}
}
let seq = 0;

View File

@ -18,7 +18,7 @@ export default class ReferencesDocument {
constructor(emitter: vscode.EventEmitter<vscode.Uri>, uri: vscode.Uri, locations: vscode.Location[]) {
this._emitter = emitter;
this._uri = uri;
this._locations = locations.sort(ReferencesDocument._compareLocations);
this._locations = locations;
// print header
this._lines = [`Found ${this._locations.length} references`];
@ -66,8 +66,8 @@ export default class ReferencesDocument {
resolve(this);
return;
}
let [uri, ranges] = entry.value;
let [uri, ranges] = entry.value;
this._fetchAndFormatLocation(vscode.Uri.parse(uri), ranges).then(lines => {
this._emitter.fire(this._uri);
next();
@ -82,21 +82,12 @@ export default class ReferencesDocument {
return vscode.workspace.openTextDocument(uri).then(doc => {
this._lines.push('', uri.toString());
for (let i = 0; i < ranges.length; i++) {
const range = ranges[i];
const {start: {line}} = range;
let prev = ranges[i - 1];
this._appendContext(doc, line, prev ? Math.min(2, line - prev.start.line) : 2, false);
this._appendMatch(doc, range);
let next = ranges[i + 1];
this._appendContext(doc, line + 1, next ? Math.min(2, next.start.line - line) : 2, true);
if (next) {
this._lines.push(' ...');
}
const {start: {line}} = ranges[i];
this._appendLeading(doc, line, ranges[i - 1]);
this._appendMatch(doc, line, ranges[i]);
this._appendTrailing(doc, line, ranges[i + 1]);
}
}, err => {
@ -104,34 +95,36 @@ export default class ReferencesDocument {
});
}
private _appendContext(doc: vscode.TextDocument, line: number, offset: number, down: boolean) {
let from = down ? line : line - offset;
let to = down ? line + offset : line;
while (from < to) {
if (from >= 0 && from < doc.lineCount) {
const text = doc.lineAt(from).text;
this._lines.push(` ${from + 1}` + (text && ` ${text}`));
}
from++;
private _appendLeading(doc: vscode.TextDocument, line: number, previous: vscode.Range): void {
let from = Math.max(0, line - 3, previous && previous.end.line || 0);
while (++from < line) {
const text = doc.lineAt(from).text;
this._lines.push(` ${from + 1}` + (text && ` ${text}`));
}
}
private _appendMatch(doc: vscode.TextDocument, range: vscode.Range) {
let line = range.start.line;
private _appendMatch(doc: vscode.TextDocument, line:number, match: vscode.Range) {
let text = doc.lineAt(line).text;
let preamble = ` ${line + 1}: `;
this._ranges.push(new vscode.Range(this._lines.length, preamble.length + range.start.character, this._lines.length, preamble.length + range.end.character));
this._ranges.push(new vscode.Range(
this._lines.length, preamble.length + match.start.character,
this._lines.length, preamble.length + match.end.character)
);
this._lines.push(preamble + text);
}
private static _compareLocations(a: vscode.Location, b: vscode.Location): number {
if (a.uri.toString() < b.uri.toString()) {
return -1;
} else if (a.uri.toString() > b.uri.toString()) {
return 1;
} else {
return a.range.start.compareTo(b.range.start)
private _appendTrailing(doc: vscode.TextDocument, line: number, next: vscode.Range): void {
let to = Math.min(doc.lineCount, line + 3);
if (next && next.start.line - to <= 2) {
// next is too close
return;
}
while (++line < to) {
const text = doc.lineAt(line).text;
this._lines.push(` ${line + 1}` + (text && ` ${text}`));
}
if (next) {
this._lines.push(` ...`);
}
}
}