提交 5bf5fc2a 编写于 作者: J Johannes Rieken

account for bad syntax in static snippets, #3210

上级 62af23b9
......@@ -169,7 +169,10 @@ export type SuggestionType = 'method'
| 'reference'
| 'customcolor';
export type SnippetType = 'internal' | 'textmate';
/**
* @internal
*/
export type SnippetType = 'internal' | 'badtextmate' | 'textmate';
/**
* @internal
......
......@@ -107,7 +107,7 @@ class SnippetsRegistry implements ISnippetsRegistry {
documentation: s.description,
insertText: s.codeSnippet,
noAutoAccept: true,
snippetType: 'textmate',
snippetType: 'badtextmate',
overwriteBefore
});
......
......@@ -29,21 +29,21 @@ export interface ICodeSnippet {
export class CodeSnippet implements ICodeSnippet {
static fromTextmate(template: string): CodeSnippet {
static fromTextmate(template: string, variablesAsPlaceholder: boolean = true): CodeSnippet {
const marker = new SnippetParser(true, false).parse(template);
const snippet = new CodeSnippet();
_fillCodeSnippetFromMarker(snippet, marker);
_fillCodeSnippetFromMarker(snippet, marker, variablesAsPlaceholder);
return snippet;
}
static fromInternal(template: string): CodeSnippet {
const marker = new SnippetParser(false, true).parse(template);
const snippet = new CodeSnippet();
_fillCodeSnippetFromMarker(snippet, marker);
_fillCodeSnippetFromMarker(snippet, marker, true);
return snippet;
}
static plain(template: string): CodeSnippet {
static none(template: string): CodeSnippet {
const snippet = new CodeSnippet();
snippet.lines = template.split(/\r\n|\n|\r/);
return snippet;
......@@ -465,7 +465,7 @@ function _convertExternalSnippet(snippet: string, snippetType: ExternalSnippetTy
return convertedSnippet;
};
function _fillCodeSnippetFromMarker(snippet: CodeSnippet, marker: Marker[]) {
function _fillCodeSnippetFromMarker(snippet: CodeSnippet, marker: Marker[], variablesAsPlaceholder: boolean) {
let placeHolders: { [id: string]: IPlaceHolder } = Object.create(null);
......@@ -480,6 +480,12 @@ function _fillCodeSnippetFromMarker(snippet: CodeSnippet, marker: Marker[]) {
snippet.lines.push(...lines);
} else if (marker instanceof Placeholder) {
if (marker.isVariable && !variablesAsPlaceholder) {
stack.unshift(...marker.value);
continue;
}
// TODO - not every variable is a placeholder
let placeHolder = placeHolders[marker.name];
if (!placeHolder) {
......
......@@ -85,6 +85,23 @@ suite('Editor Contrib - Snippets', () => {
);
});
test('Variables vs Placeholders', () => {
let snippet = CodeSnippet.fromTextmate('${first}-${2}-${second}-${1}', true);
assert.deepEqual(snippet.lines, ['first--second-']);
assert.equal(snippet.placeHolders.length, 4);
assert.equal(snippet.placeHolders[0].id, 'first');
assert.equal(snippet.placeHolders[1].id, 'second');
assert.equal(snippet.placeHolders[2].id, '1');
assert.equal(snippet.placeHolders[3].id, '2');
snippet = CodeSnippet.fromTextmate('${first}-${2}-${second}-${1}', false);
assert.deepEqual(snippet.lines, ['---']);
assert.equal(snippet.placeHolders.length, 2);
assert.equal(snippet.placeHolders[0].id, '1');
assert.equal(snippet.placeHolders[1].id, '2');
});
test('nested placeholder', () => {
let snippet = CodeSnippet.fromTextmate([
'<div${1: id="${2:some_id}"}>',
......
......@@ -77,12 +77,11 @@ export class SuggestController implements IEditorContribution {
}
private static _codeSnippetForSuggestion({suggestion}: ICompletionItem): CodeSnippet {
if (suggestion.snippetType === 'textmate') {
return CodeSnippet.fromTextmate(suggestion.insertText);
} else if (suggestion.snippetType === 'internal') {
return CodeSnippet.fromInternal(suggestion.insertText);
} else {
return CodeSnippet.plain(suggestion.insertText);
switch (suggestion.snippetType) {
case 'badtextmate': return CodeSnippet.fromTextmate(suggestion.insertText);
case 'textmate': return CodeSnippet.fromTextmate(suggestion.insertText, false);
case 'internal': return CodeSnippet.fromInternal(suggestion.insertText);
default: CodeSnippet.none(suggestion.insertText);
}
}
......
......@@ -4334,8 +4334,6 @@ declare module monaco.languages {
provideHover(model: editor.IReadOnlyModel, position: Position, token: CancellationToken): Hover | Thenable<Hover>;
}
export type SnippetType = 'internal' | 'textmate';
/**
* Interface used to quick fix typing errors while accesing member fields.
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册