From ea73241241a8f9ce6577e02c5b594925016ec25b Mon Sep 17 00:00:00 2001 From: Yevhen Vydolob Date: Wed, 20 Jan 2021 10:49:25 +0200 Subject: [PATCH] Add on type conversion of tab char to spaces Signed-off-by: Yevhen Vydolob Signed-off-by: David Thompson --- .../services/yamlOnTypeFormatting.ts | 10 ++ src/yamlServerInit.ts | 1 + test/yamlOnTypeFormatting.test.ts | 100 ++++++++++-------- 3 files changed, 65 insertions(+), 46 deletions(-) diff --git a/src/languageservice/services/yamlOnTypeFormatting.ts b/src/languageservice/services/yamlOnTypeFormatting.ts index 1d2b1cec9..7bb9e49e3 100644 --- a/src/languageservice/services/yamlOnTypeFormatting.ts +++ b/src/languageservice/services/yamlOnTypeFormatting.ts @@ -50,4 +50,14 @@ export function doDocumentOnTypeFormatting( return [TextEdit.insert(position, ' ')]; } } + + if (params.ch === '\t' && params.options.insertSpaces) { + return [ + TextEdit.replace( + Range.create(position.line, position.character - 1, position.line, position.character), + ' '.repeat(params.options.tabSize) + ), + ]; + } + return; } diff --git a/src/yamlServerInit.ts b/src/yamlServerInit.ts index 77767b182..77bbcd3b1 100644 --- a/src/yamlServerInit.ts +++ b/src/yamlServerInit.ts @@ -128,6 +128,7 @@ export class YAMLServerInit { documentFormattingProvider: !this.yamlSettings.clientDynamicRegisterSupport, documentOnTypeFormattingProvider: { firstTriggerCharacter: '\n', + moreTriggerCharacter: ['\t'], }, documentRangeFormattingProvider: false, definitionProvider: true, diff --git a/test/yamlOnTypeFormatting.test.ts b/test/yamlOnTypeFormatting.test.ts index 6984a481b..cbd81c15c 100644 --- a/test/yamlOnTypeFormatting.test.ts +++ b/test/yamlOnTypeFormatting.test.ts @@ -17,58 +17,66 @@ function createParams(position: Position): DocumentOnTypeFormattingParams { }; } describe('YAML On Type Formatter', () => { - it('should react on "\n" only', () => { - const doc = setupTextDocument('foo:'); - const params = createParams(Position.create(1, 0)); - params.ch = '\t'; - const result = doDocumentOnTypeFormatting(doc, params); - expect(result).is.undefined; - }); + describe('On Enter Formatter', () => { + it('should add indentation for mapping', () => { + const doc = setupTextDocument('foo:\n'); + const params = createParams(Position.create(1, 0)); + const result = doDocumentOnTypeFormatting(doc, params); + expect(result).to.deep.include(TextEdit.insert(Position.create(1, 0), ' ')); + }); - it('should add indentation for mapping', () => { - const doc = setupTextDocument('foo:\n'); - const params = createParams(Position.create(1, 0)); - const result = doDocumentOnTypeFormatting(doc, params); - expect(result).to.deep.include(TextEdit.insert(Position.create(1, 0), ' ')); - }); + it('should add indentation for scalar array items', () => { + const doc = setupTextDocument('foo:\n - some\n '); + const pos = Position.create(2, 2); + const params = createParams(pos); + const result = doDocumentOnTypeFormatting(doc, params); + expect(result[0]).to.eqls(TextEdit.insert(pos, '- ')); + }); - it('should add indentation for scalar array items', () => { - const doc = setupTextDocument('foo:\n - some\n '); - const pos = Position.create(2, 2); - const params = createParams(pos); - const result = doDocumentOnTypeFormatting(doc, params); - expect(result[0]).to.eqls(TextEdit.insert(pos, '- ')); - }); + it('should add indentation for mapping in array', () => { + const doc = setupTextDocument('some:\n - arr:\n '); + const pos = Position.create(2, 2); + const params = createParams(pos); + const result = doDocumentOnTypeFormatting(doc, params); + expect(result).to.deep.include(TextEdit.insert(pos, ' ')); + }); - it('should add indentation for mapping in array', () => { - const doc = setupTextDocument('some:\n - arr:\n '); - const pos = Position.create(2, 2); - const params = createParams(pos); - const result = doDocumentOnTypeFormatting(doc, params); - expect(result).to.deep.include(TextEdit.insert(pos, ' ')); - }); + it('should replace all spaces in newline', () => { + const doc = setupTextDocument('some:\n '); + const pos = Position.create(1, 0); + const params = createParams(pos); + const result = doDocumentOnTypeFormatting(doc, params); + expect(result).to.deep.include.members([ + TextEdit.del(Range.create(pos, Position.create(1, 3))), + TextEdit.insert(pos, ' '), + ]); + }); - it('should replace all spaces in newline', () => { - const doc = setupTextDocument('some:\n '); - const pos = Position.create(1, 0); - const params = createParams(pos); - const result = doDocumentOnTypeFormatting(doc, params); - expect(result).to.deep.include.members([TextEdit.del(Range.create(pos, Position.create(1, 3))), TextEdit.insert(pos, ' ')]); - }); + it('should keep all non white spaces characters in newline', () => { + const doc = setupTextDocument('some:\n foo'); + const pos = Position.create(1, 0); + const params = createParams(pos); + const result = doDocumentOnTypeFormatting(doc, params); + expect(result).is.undefined; + }); - it('should keep all non white spaces characters in newline', () => { - const doc = setupTextDocument('some:\n foo'); - const pos = Position.create(1, 0); - const params = createParams(pos); - const result = doDocumentOnTypeFormatting(doc, params); - expect(result).is.undefined; + it('should add indentation for multiline string', () => { + const doc = setupTextDocument('some: |\n'); + const pos = Position.create(1, 0); + const params = createParams(pos); + const result = doDocumentOnTypeFormatting(doc, params); + expect(result).to.deep.include(TextEdit.insert(pos, ' ')); + }); }); - it('should add indentation for multiline string', () => { - const doc = setupTextDocument('some: |\n'); - const pos = Position.create(1, 0); - const params = createParams(pos); - const result = doDocumentOnTypeFormatting(doc, params); - expect(result).to.deep.include(TextEdit.insert(pos, ' ')); + describe('On Tab Formatter', () => { + it('should replace Tab with spaces', () => { + const doc = setupTextDocument('some:\n\t'); + const pos = Position.create(1, 1); + const params = createParams(pos); + params.ch = '\t'; + const result = doDocumentOnTypeFormatting(doc, params); + expect(result).to.deep.include(TextEdit.replace(Range.create(1, 0, 1, 1), ' ')); + }); }); });