From ef251206faec5fc5ddd630204de805445f0e2e7d Mon Sep 17 00:00:00 2001 From: Petr Spacek Date: Tue, 5 Apr 2022 09:54:08 +0200 Subject: [PATCH] fix: completion between colon and null value --- .../services/yamlCompletion.ts | 16 +++++++++++++++- test/autoCompletionFix.test.ts | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/languageservice/services/yamlCompletion.ts b/src/languageservice/services/yamlCompletion.ts index 50d0b742..19ba7411 100644 --- a/src/languageservice/services/yamlCompletion.ts +++ b/src/languageservice/services/yamlCompletion.ts @@ -126,7 +126,7 @@ export class YamlCompletion { const currentWord = this.getCurrentWord(document, offset); - let overwriteRange = null; + let overwriteRange: Range = null; if (node && isScalar(node) && node.value === 'null') { const nodeStartPos = document.positionAt(node.range[0]); nodeStartPos.character += 1; @@ -315,6 +315,20 @@ export class YamlCompletion { const originalNode = node; if (node) { + // when the value is null but the cursor is between prop name and null value (cursor is not at the end of the line) + if (isMap(node) && node.items.length && isPair(node.items[0])) { + const pairNode = node.items[0]; + if ( + isScalar(pairNode.value) && + isScalar(pairNode.key) && + pairNode.value.value === null && // value is null + pairNode.key.range[2] < offset && // cursor is after colon + pairNode.value.range[0] > offset // cursor is before null + ) { + node = pairNode.value; + overwriteRange.end.character += pairNode.value.range[2] - offset; // extend range to the end of the null element + } + } if (lineContent.length === 0) { node = currentDoc.internalDocument.contents as Node; } else { diff --git a/test/autoCompletionFix.test.ts b/test/autoCompletionFix.test.ts index c9da8a9a..c38d2cc5 100644 --- a/test/autoCompletionFix.test.ts +++ b/test/autoCompletionFix.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CompletionList, Position } from 'vscode-languageserver/node'; +import { CompletionList, Position, Range } from 'vscode-languageserver/node'; import { LanguageHandlers } from '../src/languageserver/handlers/languageHandlers'; import { LanguageService } from '../src/languageservice/yamlLanguageService'; import { SettingsState, TextDocumentTestManager } from '../src/yamlSettings'; @@ -470,5 +470,22 @@ objB: expect(completion.items[1].label).to.be.equal('obj1'); expect(completion.items[1].insertText).to.be.equal('obj1:\n prop2: ${1:value}'); }); + + it('should suggest when cursor is not on the end of the line', async () => { + const schema: JSONSchema = { + properties: { + prop: { + const: 'const', + }, + }, + }; + languageService.addSchema(SCHEMA_ID, schema); + const content = 'prop: '; + const completion = await parseSetup(content, 0, 6); + + expect(completion.items.length).equal(1); + expect(completion.items[0].label).to.be.equal('const'); + expect(completion.items[0].textEdit).to.be.deep.equal({ newText: 'const', range: Range.create(0, 6, 0, content.length) }); + }); }); });