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

cache & freeze snippet placeholders

上级 6bbff65c
......@@ -67,7 +67,7 @@ class OneSnippet {
this._snippetDecoration = accessor.addDecoration(range, OneSnippet._decor.snippet);
// create a decoration for each placeholder
for (const placeholder of this._snippet.getPlaceholders()) {
for (const placeholder of this._snippet.placeholders) {
const placeholderOffset = this._snippet.offset(placeholder);
const placeholderLen = this._snippet.len(placeholder);
const range = Range.fromPositions(
......@@ -83,7 +83,7 @@ class OneSnippet {
this._placeholderGroupsIdx = -1;
this._placeholderGroups = [];
let lastBucket: Placeholder[];
this._snippet.getPlaceholders().sort(Placeholder.compareByIndex).forEach(a => {
this._snippet.placeholders.slice(0).sort(Placeholder.compareByIndex).forEach(a => {
if (!lastBucket || lastBucket[0].index !== a.index) {
lastBucket = [a];
this._placeholderGroups.push(lastBucket);
......@@ -147,7 +147,7 @@ class OneSnippet {
}
get hasPlaceholder() {
return this._snippet.getPlaceholders().length > 0;
return this._snippet.placeholders.length > 0;
}
get range() {
......
......@@ -222,9 +222,22 @@ export function walk(marker: Marker[], visitor: (marker: Marker) => boolean): vo
export class TextmateSnippet {
readonly marker: Marker[];
readonly placeholders: Placeholder[];
constructor(marker: Marker[]) {
this.marker = marker;
this.placeholders = [];
// fill in placeholders
walk(marker, candidate => {
if (candidate instanceof Placeholder) {
this.placeholders.push(candidate);
}
return true;
});
Object.freeze(this.marker);
Object.freeze(this.placeholders);
}
offset(marker: Marker): number {
......@@ -254,17 +267,6 @@ export class TextmateSnippet {
return ret;
}
getPlaceholders(): Placeholder[] {
const ret: Placeholder[] = [];
walk(this.marker, candidate => {
if (candidate instanceof Placeholder) {
ret.push(candidate);
}
return true;
});
return ret;
}
get text() {
return Marker.toString(this.marker);
}
......
......@@ -343,20 +343,20 @@ suite('SnippetParser', () => {
test('TextmateSnippet#placeholder', () => {
let snippet = SnippetParser.parse('te$1xt');
let placeholders = snippet.getPlaceholders();
let placeholders = snippet.placeholders;
assert.equal(placeholders.length, 1);
snippet = SnippetParser.parse('te$1xt$1');
placeholders = snippet.getPlaceholders();
placeholders = snippet.placeholders;
assert.equal(placeholders.length, 2);
snippet = SnippetParser.parse('te$1xt$2');
placeholders = snippet.getPlaceholders();
placeholders = snippet.placeholders;
assert.equal(placeholders.length, 2);
snippet = SnippetParser.parse('${1:bar${2:foo}bar}');
placeholders = snippet.getPlaceholders();
placeholders = snippet.placeholders;
assert.equal(placeholders.length, 2);
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册