提交 c6d4e038 编写于 作者: A Alex Dima

Fixes #8690: Do not attempt to sort already sorted lines

上级 151d2368
......@@ -111,6 +111,10 @@ class SortLinesAction extends EditorAction {
public run():TPromise<boolean> {
if (!SortLinesCommand.canRun(this.editor.getModel(), this.editor.getSelection(), this.descending)) {
return TPromise.as(false);
}
var command = new SortLinesCommand(this.editor.getSelection(), this.descending);
this.editor.executeCommands(this.id, [command]);
......
......@@ -32,12 +32,25 @@ export class SortLinesCommand implements editorCommon.ICommand {
public computeCursorState(model:editorCommon.ITokenizedModel, helper: editorCommon.ICursorStateComputerData):Selection {
return helper.getTrackedSelection(this.selectionId);
}
public static canRun(model:editorCommon.ITextModel, selection:Selection, descending:boolean): boolean {
let data = getSortData(model, selection, descending);
if (!data) {
return false;
}
for (let i = 0, len = data.before.length; i < len; i++) {
if (data.before[i] !== data.after[i]) {
return true;
}
}
return false;
}
}
/**
* Generate commands for sorting lines on a model.
*/
export function sortLines(model:editorCommon.ITextModel, selection:Selection, descending:boolean): editorCommon.IIdentifiedSingleEditOperation {
function getSortData(model:editorCommon.ITextModel, selection:Selection, descending:boolean) {
let startLineNumber = selection.startLineNumber;
let endLineNumber = selection.endLineNumber;
......@@ -57,7 +70,8 @@ export function sortLines(model:editorCommon.ITextModel, selection:Selection, de
linesToSort.push(model.getLineContent(lineNumber));
}
let sorted = linesToSort.sort((a, b) => {
let sorted = linesToSort.slice(0);
sorted.sort((a, b) => {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
......@@ -66,8 +80,26 @@ export function sortLines(model:editorCommon.ITextModel, selection:Selection, de
sorted = sorted.reverse();
}
return {
startLineNumber: startLineNumber,
endLineNumber: endLineNumber,
before: linesToSort,
after: sorted
};
}
/**
* Generate commands for sorting lines on a model.
*/
function sortLines(model:editorCommon.ITextModel, selection:Selection, descending:boolean): editorCommon.IIdentifiedSingleEditOperation {
let data = getSortData(model, selection, descending);
if (!data) {
return null;
}
return EditOperation.replace(
new Range(startLineNumber, 1, endLineNumber, model.getLineMaxColumn(endLineNumber)),
sorted.join('\n')
new Range(data.startLineNumber, 1, data.endLineNumber, model.getLineMaxColumn(data.endLineNumber)),
data.after.join('\n')
);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册