Skip to content

Commit 4602af7

Browse files
fix for auto completion with escape sequence chars (#1040)
1 parent 11eff5f commit 4602af7

File tree

2 files changed

+52
-8
lines changed

2 files changed

+52
-8
lines changed

src/languageservice/services/yamlCompletion.ts

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -243,12 +243,29 @@ export class YamlCompletion {
243243
}
244244
}
245245

246-
// trim $1 from end of completion
247-
if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
248-
completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
249-
}
250-
if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
251-
completionItem.textEdit = TextEdit.replace(overwriteRange, completionItem.insertText);
246+
if (completionItem.label.toLowerCase() === 'regular expression') {
247+
const docObject = completionItem.documentation as MarkupContent;
248+
const splitValues = docObject.value.split(':');
249+
label =
250+
splitValues.length > 0 ? `${this.getQuote()}\\${JSON.parse(splitValues[1])}${this.getQuote()}` : completionItem.label;
251+
completionItem.insertText = label;
252+
completionItem.textEdit = TextEdit.replace(overwriteRange, label);
253+
} else {
254+
let mdText = completionItem.insertText.replace(/\${[0-9]+[:|](.*)}/g, (s, arg) => arg).replace(/\$([0-9]+)/g, '');
255+
const splitMDText = mdText.split(':');
256+
let value = splitMDText.length > 1 ? splitMDText[1].trim() : mdText;
257+
if (value && /^(['\\"\\])$/.test(value)) {
258+
value = `${this.getQuote()}\\${value}${this.getQuote()}`;
259+
mdText = splitMDText.length > 1 ? splitMDText[0] + ': ' + value : value;
260+
completionItem.insertText = mdText;
261+
}
262+
// trim $1 from end of completion
263+
if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
264+
completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
265+
}
266+
if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
267+
completionItem.textEdit = TextEdit.replace(overwriteRange, completionItem.insertText);
268+
}
252269
}
253270

254271
completionItem.label = label;
@@ -1676,8 +1693,9 @@ export class YamlCompletion {
16761693
let value: string;
16771694
if (typeof param === 'string') {
16781695
//support YAML spec 1.1 boolean values
1679-
const quote = this.isSingleQuote ? `'` : `"`;
1680-
value = ['on', 'off', 'true', 'false', 'yes', 'no'].includes(param.toLowerCase()) ? `${quote}${param}${quote}` : param;
1696+
value = ['on', 'off', 'true', 'false', 'yes', 'no'].includes(param.toLowerCase())
1697+
? `${this.getQuote()}${param}${this.getQuote()}`
1698+
: param;
16811699
} else {
16821700
value = '' + param;
16831701
}
@@ -1723,6 +1741,10 @@ export class YamlCompletion {
17231741
return value;
17241742
}
17251743

1744+
getQuote(): string {
1745+
return this.isSingleQuote ? `'` : `"`;
1746+
}
1747+
17261748
/**
17271749
* simplify `{$1:value}` to `value`
17281750
*/

test/autoCompletionFix.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,4 +1347,26 @@ test1:
13471347
expect(completion.items[0].insertText).to.be.equal('"YES"');
13481348
expect(completion.items[1].insertText).to.be.equal('"NO"');
13491349
});
1350+
it('should suggest quotes with escapeChars', async () => {
1351+
const schema: JSONSchema = {
1352+
type: 'object',
1353+
additionalProperties: false,
1354+
properties: {
1355+
begin: {
1356+
type: 'string',
1357+
default: '\\"',
1358+
},
1359+
},
1360+
};
1361+
schemaProvider.addSchema(SCHEMA_ID, schema);
1362+
let content = 'be';
1363+
let completion = await parseSetup(content, 0, content.length);
1364+
expect(completion.items.length).equal(1);
1365+
expect(completion.items[0].insertText).to.be.equal('begin: "\\""');
1366+
1367+
content = 'begin: ';
1368+
completion = await parseSetup(content, 0, content.length);
1369+
expect(completion.items.length).equal(1);
1370+
expect(completion.items[0].insertText).to.be.equal('"\\""');
1371+
});
13501372
});

0 commit comments

Comments
 (0)