From 9c2bbd455160ed4a38b5f18c13ee2a54f2136a62 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 28 Oct 2019 11:56:30 +0100 Subject: [PATCH] fix #83239 --- .../editor/contrib/snippet/snippetSession.ts | 28 ++++++++++++------- .../snippet/test/snippetSession.test.ts | 2 +- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index c479ffa78b3..8af3c14063b 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -333,7 +333,7 @@ const _defaultOptions: ISnippetSessionInsertOptions = { export class SnippetSession { - static adjustWhitespace(model: ITextModel, position: IPosition, snippet: TextmateSnippet): void { + static adjustWhitespace(model: ITextModel, position: IPosition, snippet: TextmateSnippet, adjustIndentation: boolean, adjustNewlines: boolean): void { const line = model.getLineContent(position.lineNumber); const lineLeadingWhitespace = getLeadingWhitespace(line, 0, position.column - 1); @@ -342,13 +342,19 @@ export class SnippetSession { // adjust indentation of text markers, except for choise elements // which get adjusted when being selected const lines = marker.value.split(/\r\n|\r|\n/); - for (let i = 1; i < lines.length; i++) { - let templateLeadingWhitespace = getLeadingWhitespace(lines[i]); - lines[i] = model.normalizeIndentation(lineLeadingWhitespace + templateLeadingWhitespace) + lines[i].substr(templateLeadingWhitespace.length); + + if (adjustIndentation) { + for (let i = 1; i < lines.length; i++) { + let templateLeadingWhitespace = getLeadingWhitespace(lines[i]); + lines[i] = model.normalizeIndentation(lineLeadingWhitespace + templateLeadingWhitespace) + lines[i].substr(templateLeadingWhitespace.length); + } } - const newValue = lines.join(model.getEOL()); - if (newValue !== marker.value) { - marker.parent.replace(marker, [new Text(newValue)]); + + if (adjustNewlines) { + const newValue = lines.join(model.getEOL()); + if (newValue !== marker.value) { + marker.parent.replace(marker, [new Text(newValue)]); + } } } return true; @@ -439,9 +445,11 @@ export class SnippetSession { // happens when being asked for (default) or when this is a secondary // cursor and the leading whitespace is different const start = snippetSelection.getStartPosition(); - if (adjustWhitespace || (idx > 0 && firstLineFirstNonWhitespace !== model.getLineFirstNonWhitespaceColumn(selection.positionLineNumber))) { - SnippetSession.adjustWhitespace(model, start, snippet); - } + SnippetSession.adjustWhitespace( + model, start, snippet, + adjustWhitespace || (idx > 0 && firstLineFirstNonWhitespace !== model.getLineFirstNonWhitespaceColumn(selection.positionLineNumber)), + true + ); snippet.resolveVariables(new CompositeSnippetVariableResolver([ modelBasedVariableResolver, diff --git a/src/vs/editor/contrib/snippet/test/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/snippetSession.test.ts index 23122b2b836..d4ae07a4a49 100644 --- a/src/vs/editor/contrib/snippet/test/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetSession.test.ts @@ -41,7 +41,7 @@ suite('SnippetSession', function () { function assertNormalized(position: IPosition, input: string, expected: string): void { const snippet = new SnippetParser().parse(input); - SnippetSession.adjustWhitespace(model, position, snippet); + SnippetSession.adjustWhitespace(model, position, snippet, true, true); assert.equal(snippet.toTextmateString(), expected); }