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

💄

上级 ec819e0b
......@@ -66,6 +66,20 @@ export function findFirst<T>(array: T[], p: (x: T) => boolean): number {
return low;
}
export function groupBy<T>(data: T[], compare: (a: T, b: T) => number): T[][] {
const result: T[][] = [];
let currentGroup: T[];
for (const element of data.slice(0).sort(compare)) {
if (!currentGroup || compare(currentGroup[0], element) !== 0) {
currentGroup = [element];
result.push(currentGroup);
} else {
currentGroup.push(element);
}
}
return result;
}
/**
* Takes two *sorted* arrays and computes their delta (removed, added elements).
* Finishes in `Math.min(before.length, after.length)` steps.
......
......@@ -12,6 +12,7 @@ import { TextmateSnippet, Placeholder, SnippetParser } from '../common/snippetPa
import { Selection } from 'vs/editor/common/core/selection';
import { Range } from 'vs/editor/common/core/range';
import { IPosition } from 'vs/editor/common/core/position';
import { groupBy } from 'vs/base/common/arrays';
import { dispose } from 'vs/base/common/lifecycle';
import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/common/snippetVariables";
......@@ -36,17 +37,19 @@ export class OneSnippet {
this._editor = editor;
this._snippet = snippet;
this._offset = offset;
this._placeholderGroups = groupBy(snippet.placeholders, Placeholder.compareByIndex);
this._placeholderGroupsIdx = -1;
}
dispose(): void {
if (!this._placeholderDecorations) {
return;
if (this._placeholderDecorations) {
this._editor.changeDecorations(accessor => this._placeholderDecorations.forEach(handle => accessor.removeDecoration(handle)));
}
this._editor.changeDecorations(accessor => this._placeholderDecorations.forEach(handle => accessor.removeDecoration(handle)));
this._placeholderGroups.length = 0;
}
private _init(): void {
private _initDecorations(): void {
if (this._placeholderDecorations) {
// already initialized
......@@ -57,7 +60,6 @@ export class OneSnippet {
const model = this._editor.getModel();
this._editor.changeDecorations(accessor => {
// create a decoration for each placeholder
for (const placeholder of this._snippet.placeholders) {
const placeholderOffset = this._snippet.offset(placeholder);
......@@ -71,23 +73,11 @@ export class OneSnippet {
this._placeholderDecorations.set(placeholder, handle);
}
});
this._placeholderGroupsIdx = -1;
this._placeholderGroups = [];
let lastBucket: Placeholder[];
this._snippet.placeholders.slice(0).sort(Placeholder.compareByIndex).forEach(a => {
if (!lastBucket || lastBucket[0].index !== a.index) {
lastBucket = [a];
this._placeholderGroups.push(lastBucket);
} else {
lastBucket.push(a);
}
});
}
move(fwd: boolean): Selection[] {
this._init();
this._initDecorations();
if (fwd && this._placeholderGroupsIdx < this._placeholderGroups.length - 1) {
this._placeholderGroupsIdx += 1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册