make Placeholder#index a number, fixes #28185
This commit is contained in:
parent
61a1d9abdc
commit
0117f311aa
4 changed files with 20 additions and 12 deletions
|
@ -187,12 +187,12 @@ export class Placeholder extends Marker {
|
|||
}
|
||||
}
|
||||
|
||||
constructor(public index: string = '', children: Marker[]) {
|
||||
constructor(public index: number, children: Marker[]) {
|
||||
super();
|
||||
this.children = children;
|
||||
}
|
||||
get isFinalTabstop() {
|
||||
return this.index === '0';
|
||||
return this.index === 0;
|
||||
}
|
||||
toString() {
|
||||
return Marker.toString(this.children);
|
||||
|
@ -356,7 +356,7 @@ export class SnippetParser {
|
|||
|
||||
// * fill in default for empty placeHolders
|
||||
// * compact sibling Text markers
|
||||
function walk(marker: Marker[], placeholderDefaultValues: Map<string, Marker[]>) {
|
||||
function walk(marker: Marker[], placeholderDefaultValues: Map<number, Marker[]>) {
|
||||
|
||||
for (let i = 0; i < marker.length; i++) {
|
||||
const thisMarker = marker[i];
|
||||
|
@ -385,16 +385,16 @@ export class SnippetParser {
|
|||
}
|
||||
}
|
||||
|
||||
const placeholderDefaultValues = new Map<string, Marker[]>();
|
||||
const placeholderDefaultValues = new Map<number, Marker[]>();
|
||||
walk(marker, placeholderDefaultValues);
|
||||
|
||||
if (
|
||||
!placeholderDefaultValues.has('0') && // there is no final tabstop
|
||||
!placeholderDefaultValues.has(0) && // there is no final tabstop
|
||||
(insertFinalTabstop && placeholderDefaultValues.size > 0 || enforceFinalTabstop)
|
||||
) {
|
||||
// the snippet uses placeholders but has no
|
||||
// final tabstop defined -> insert at the end
|
||||
marker.push(new Placeholder('0', []));
|
||||
marker.push(new Placeholder(0, []));
|
||||
}
|
||||
|
||||
return marker;
|
||||
|
@ -433,7 +433,7 @@ export class SnippetParser {
|
|||
if (this._accept(TokenType.VariableName) || this._accept(TokenType.Int)) {
|
||||
// $FOO, $123
|
||||
const idOrName = this._scanner.tokenText(this._prevToken);
|
||||
marker.push(/^\d+$/.test(idOrName) ? new Placeholder(idOrName, []) : new Variable(idOrName, []));
|
||||
marker.push(/^\d+$/.test(idOrName) ? new Placeholder(Number(idOrName), []) : new Variable(idOrName, []));
|
||||
return true;
|
||||
|
||||
} else if (this._accept(TokenType.CurlyOpen)) {
|
||||
|
@ -451,7 +451,7 @@ export class SnippetParser {
|
|||
|
||||
if (this._accept(TokenType.CurlyClose)) {
|
||||
const idOrName = Marker.toString(name);
|
||||
marker.push(/^\d+$/.test(idOrName) ? new Placeholder(idOrName, children) : new Variable(idOrName, children));
|
||||
marker.push(/^\d+$/.test(idOrName) ? new Placeholder(Number(idOrName), children) : new Variable(idOrName, children));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -173,9 +173,9 @@ export class OneSnippet {
|
|||
// through the placeholders in the correct order
|
||||
for (const nestedPlaceholder of nested._snippet.placeholders) {
|
||||
if (nestedPlaceholder.isFinalTabstop) {
|
||||
nestedPlaceholder.index = `${placeholder.index}.${nested._snippet.placeholders.length}`;
|
||||
nestedPlaceholder.index = placeholder.index + (nested._snippet.placeholders.length / 10);
|
||||
} else {
|
||||
nestedPlaceholder.index = `${placeholder.index}.${nestedPlaceholder.index}`;
|
||||
nestedPlaceholder.index = placeholder.index + (nestedPlaceholder.index / 10);
|
||||
}
|
||||
}
|
||||
this._snippet.replace(placeholder, nested._snippet.children);
|
||||
|
|
|
@ -381,4 +381,12 @@ suite('SnippetParser', () => {
|
|||
assert.equal(snippet.text, 'aaabbbdddeee');
|
||||
assert.equal(snippet.placeholders.length, 3);
|
||||
});
|
||||
|
||||
test('Snippet order for placeholders, #28185', function () {
|
||||
|
||||
const _10 = new Placeholder(10, []);
|
||||
const _2 = new Placeholder(2, []);
|
||||
|
||||
assert.equal(Placeholder.compareByIndex(_10, _2), 1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -120,7 +120,7 @@ export class EditorAccessor implements emmet.Editor {
|
|||
// find highest placeholder index
|
||||
walk(marker, candidate => {
|
||||
if (candidate instanceof Placeholder) {
|
||||
let index = Number(candidate.index);
|
||||
let index = candidate.index;
|
||||
if (index > maxIndex) {
|
||||
maxIndex = index;
|
||||
}
|
||||
|
@ -132,7 +132,7 @@ export class EditorAccessor implements emmet.Editor {
|
|||
walk(marker, candidate => {
|
||||
if (candidate instanceof Placeholder) {
|
||||
if (candidate.isFinalTabstop) {
|
||||
candidate.index = String(++maxIndex);
|
||||
candidate.index = ++maxIndex;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
|
Loading…
Reference in a new issue