yaml-language-server 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +10 -1
- package/lib/esm/languageserver/handlers/settingsHandlers.js +4 -2
- package/lib/esm/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/lib/esm/languageservice/parser/ast-converter.js +9 -1
- package/lib/esm/languageservice/parser/ast-converter.js.map +1 -1
- package/lib/esm/languageservice/parser/jsonParser07.d.ts +2 -2
- package/lib/esm/languageservice/parser/jsonParser07.js +74 -25
- package/lib/esm/languageservice/parser/jsonParser07.js.map +1 -1
- package/lib/esm/languageservice/parser/yaml-documents.d.ts +0 -1
- package/lib/esm/languageservice/parser/yaml-documents.js +11 -11
- package/lib/esm/languageservice/parser/yaml-documents.js.map +1 -1
- package/lib/esm/languageservice/services/documentSymbols.js +3 -2
- package/lib/esm/languageservice/services/documentSymbols.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCodeActions.d.ts +1 -0
- package/lib/esm/languageservice/services/yamlCodeActions.js +14 -0
- package/lib/esm/languageservice/services/yamlCodeActions.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCodeLens.js +2 -1
- package/lib/esm/languageservice/services/yamlCodeLens.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCompletion.d.ts +2 -0
- package/lib/esm/languageservice/services/yamlCompletion.js +183 -40
- package/lib/esm/languageservice/services/yamlCompletion.js.map +1 -1
- package/lib/esm/languageservice/services/yamlDefinition.d.ts +6 -1
- package/lib/esm/languageservice/services/yamlDefinition.js +23 -17
- package/lib/esm/languageservice/services/yamlDefinition.js.map +1 -1
- package/lib/esm/languageservice/services/yamlHover.js +2 -1
- package/lib/esm/languageservice/services/yamlHover.js.map +1 -1
- package/lib/esm/languageservice/services/yamlLinks.js +2 -1
- package/lib/esm/languageservice/services/yamlLinks.js.map +1 -1
- package/lib/esm/languageservice/services/yamlSchemaService.js +12 -0
- package/lib/esm/languageservice/services/yamlSchemaService.js.map +1 -1
- package/lib/esm/languageservice/services/yamlValidation.js +2 -1
- package/lib/esm/languageservice/services/yamlValidation.js.map +1 -1
- package/lib/esm/languageservice/utils/objects.d.ts +5 -0
- package/lib/esm/languageservice/utils/objects.js +13 -0
- package/lib/esm/languageservice/utils/objects.js.map +1 -1
- package/lib/esm/languageservice/utils/schemaUrls.d.ts +1 -1
- package/lib/esm/languageservice/utils/schemaUrls.js +1 -1
- package/lib/esm/languageservice/yamlLanguageService.d.ts +4 -0
- package/lib/esm/languageservice/yamlLanguageService.js +3 -2
- package/lib/esm/languageservice/yamlLanguageService.js.map +1 -1
- package/lib/esm/server.js +5 -0
- package/lib/esm/server.js.map +1 -1
- package/lib/esm/yamlSettings.d.ts +2 -0
- package/lib/esm/yamlSettings.js +1 -0
- package/lib/esm/yamlSettings.js.map +1 -1
- package/lib/umd/languageserver/handlers/settingsHandlers.js +5 -3
- package/lib/umd/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/lib/umd/languageservice/parser/ast-converter.js +9 -1
- package/lib/umd/languageservice/parser/ast-converter.js.map +1 -1
- package/lib/umd/languageservice/parser/jsonParser07.d.ts +2 -2
- package/lib/umd/languageservice/parser/jsonParser07.js +77 -28
- package/lib/umd/languageservice/parser/jsonParser07.js.map +1 -1
- package/lib/umd/languageservice/parser/yaml-documents.d.ts +0 -1
- package/lib/umd/languageservice/parser/yaml-documents.js +10 -10
- package/lib/umd/languageservice/parser/yaml-documents.js.map +1 -1
- package/lib/umd/languageservice/services/documentSymbols.js +4 -3
- package/lib/umd/languageservice/services/documentSymbols.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCodeActions.d.ts +1 -0
- package/lib/umd/languageservice/services/yamlCodeActions.js +14 -0
- package/lib/umd/languageservice/services/yamlCodeActions.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCodeLens.js +3 -2
- package/lib/umd/languageservice/services/yamlCodeLens.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCompletion.d.ts +2 -0
- package/lib/umd/languageservice/services/yamlCompletion.js +182 -39
- package/lib/umd/languageservice/services/yamlCompletion.js.map +1 -1
- package/lib/umd/languageservice/services/yamlDefinition.d.ts +6 -1
- package/lib/umd/languageservice/services/yamlDefinition.js +26 -20
- package/lib/umd/languageservice/services/yamlDefinition.js.map +1 -1
- package/lib/umd/languageservice/services/yamlHover.js +3 -2
- package/lib/umd/languageservice/services/yamlHover.js.map +1 -1
- package/lib/umd/languageservice/services/yamlLinks.js +3 -2
- package/lib/umd/languageservice/services/yamlLinks.js.map +1 -1
- package/lib/umd/languageservice/services/yamlSchemaService.js +12 -0
- package/lib/umd/languageservice/services/yamlSchemaService.js.map +1 -1
- package/lib/umd/languageservice/services/yamlValidation.js +3 -2
- package/lib/umd/languageservice/services/yamlValidation.js.map +1 -1
- package/lib/umd/languageservice/utils/objects.d.ts +5 -0
- package/lib/umd/languageservice/utils/objects.js +15 -1
- package/lib/umd/languageservice/utils/objects.js.map +1 -1
- package/lib/umd/languageservice/utils/schemaUrls.d.ts +1 -1
- package/lib/umd/languageservice/utils/schemaUrls.js +1 -1
- package/lib/umd/languageservice/yamlLanguageService.d.ts +4 -0
- package/lib/umd/languageservice/yamlLanguageService.js +2 -1
- package/lib/umd/languageservice/yamlLanguageService.js.map +1 -1
- package/lib/umd/server.js +6 -1
- package/lib/umd/server.js.map +1 -1
- package/lib/umd/yamlSettings.d.ts +2 -0
- package/lib/umd/yamlSettings.js +1 -0
- package/lib/umd/yamlSettings.js.map +1 -1
- package/out/server/src/languageserver/handlers/settingsHandlers.js +4 -2
- package/out/server/src/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/out/server/src/languageservice/parser/ast-converter.js +9 -1
- package/out/server/src/languageservice/parser/ast-converter.js.map +1 -1
- package/out/server/src/languageservice/parser/jsonParser07.d.ts +2 -2
- package/out/server/src/languageservice/parser/jsonParser07.js +76 -27
- package/out/server/src/languageservice/parser/jsonParser07.js.map +1 -1
- package/out/server/src/languageservice/parser/yaml-documents.d.ts +0 -1
- package/out/server/src/languageservice/parser/yaml-documents.js +10 -10
- package/out/server/src/languageservice/parser/yaml-documents.js.map +1 -1
- package/out/server/src/languageservice/services/documentSymbols.js +3 -2
- package/out/server/src/languageservice/services/documentSymbols.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCodeActions.d.ts +1 -0
- package/out/server/src/languageservice/services/yamlCodeActions.js +14 -0
- package/out/server/src/languageservice/services/yamlCodeActions.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCodeLens.js +2 -1
- package/out/server/src/languageservice/services/yamlCodeLens.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCompletion.d.ts +2 -0
- package/out/server/src/languageservice/services/yamlCompletion.js +181 -38
- package/out/server/src/languageservice/services/yamlCompletion.js.map +1 -1
- package/out/server/src/languageservice/services/yamlDefinition.d.ts +6 -1
- package/out/server/src/languageservice/services/yamlDefinition.js +25 -19
- package/out/server/src/languageservice/services/yamlDefinition.js.map +1 -1
- package/out/server/src/languageservice/services/yamlHover.js +2 -1
- package/out/server/src/languageservice/services/yamlHover.js.map +1 -1
- package/out/server/src/languageservice/services/yamlLinks.js +2 -1
- package/out/server/src/languageservice/services/yamlLinks.js.map +1 -1
- package/out/server/src/languageservice/services/yamlSchemaService.js +12 -0
- package/out/server/src/languageservice/services/yamlSchemaService.js.map +1 -1
- package/out/server/src/languageservice/services/yamlValidation.js +2 -1
- package/out/server/src/languageservice/services/yamlValidation.js.map +1 -1
- package/out/server/src/languageservice/utils/objects.d.ts +5 -0
- package/out/server/src/languageservice/utils/objects.js +15 -1
- package/out/server/src/languageservice/utils/objects.js.map +1 -1
- package/out/server/src/languageservice/utils/schemaUrls.d.ts +1 -1
- package/out/server/src/languageservice/utils/schemaUrls.js +1 -1
- package/out/server/src/languageservice/yamlLanguageService.d.ts +4 -0
- package/out/server/src/languageservice/yamlLanguageService.js +2 -1
- package/out/server/src/languageservice/yamlLanguageService.js.map +1 -1
- package/out/server/src/server.js +5 -0
- package/out/server/src/server.js.map +1 -1
- package/out/server/src/yamlSettings.d.ts +2 -0
- package/out/server/src/yamlSettings.js +1 -0
- package/out/server/src/yamlSettings.js.map +1 -1
- package/out/server/test/autoCompletion.test.js +410 -74
- package/out/server/test/autoCompletion.test.js.map +1 -1
- package/out/server/test/autoCompletionFix.test.js +219 -3
- package/out/server/test/autoCompletionFix.test.js.map +1 -1
- package/out/server/test/code-action-schema.test.d.ts +1 -0
- package/out/server/test/code-action-schema.test.js +99 -0
- package/out/server/test/code-action-schema.test.js.map +1 -0
- package/out/server/test/defaultSnippets.test.js +3 -3
- package/out/server/test/defaultSnippets.test.js.map +1 -1
- package/out/server/test/hover.test.js +70 -0
- package/out/server/test/hover.test.js.map +1 -1
- package/out/server/test/integration.test.js +1 -1
- package/out/server/test/jsonParser.test.js +23 -13
- package/out/server/test/jsonParser.test.js.map +1 -1
- package/out/server/test/objects.test.js +16 -0
- package/out/server/test/objects.test.js.map +1 -1
- package/out/server/test/schema.test.js +18 -0
- package/out/server/test/schema.test.js.map +1 -1
- package/out/server/test/yamlDefinition.test.js +8 -2
- package/out/server/test/yamlDefinition.test.js.map +1 -1
- package/out/server/test/yamlParser.test.js +10 -0
- package/out/server/test/yamlParser.test.js.map +1 -1
- package/out/server/test/yamlSchemaService.test.js +21 -0
- package/out/server/test/yamlSchemaService.test.js.map +1 -1
- package/package.json +8 -6
|
@@ -17,7 +17,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
17
17
|
if (v !== undefined) module.exports = v;
|
|
18
18
|
}
|
|
19
19
|
else if (typeof define === "function" && define.amd) {
|
|
20
|
-
define(["require", "exports", "vscode-languageserver/node", "yaml", "../utils/arrUtils", "../utils/indentationGuesser", "../utils/textBuffer", "../utils/json", "../utils/objects", "vscode-nls", "../parser/isKubernetes", "../utils/astUtils", "../utils/astUtils", "./modelineUtil"], factory);
|
|
20
|
+
define(["require", "exports", "vscode-languageserver/node", "yaml", "../utils/arrUtils", "../utils/indentationGuesser", "../utils/textBuffer", "../utils/json", "../utils/objects", "vscode-nls", "../parser/isKubernetes", "../utils/astUtils", "../utils/astUtils", "./modelineUtil", "../utils/schemaUtils"], factory);
|
|
21
21
|
}
|
|
22
22
|
})(function (require, exports) {
|
|
23
23
|
"use strict";
|
|
@@ -35,8 +35,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
35
35
|
const astUtils_1 = require("../utils/astUtils");
|
|
36
36
|
const astUtils_2 = require("../utils/astUtils");
|
|
37
37
|
const modelineUtil_1 = require("./modelineUtil");
|
|
38
|
+
const schemaUtils_1 = require("../utils/schemaUtils");
|
|
38
39
|
const localize = nls.loadMessageBundle();
|
|
39
40
|
const doubleQuotesEscapeRegExp = /[\\]+"/g;
|
|
41
|
+
const parentCompletionKind = node_1.CompletionItemKind.Class;
|
|
40
42
|
class YamlCompletion {
|
|
41
43
|
constructor(schemaService, clientCapabilities = {}, yamlDocument, telemetry) {
|
|
42
44
|
this.schemaService = schemaService;
|
|
@@ -52,6 +54,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
52
54
|
this.customTags = languageSettings.customTags;
|
|
53
55
|
this.yamlVersion = languageSettings.yamlVersion;
|
|
54
56
|
this.configuredIndentation = languageSettings.indentation;
|
|
57
|
+
this.disableDefaultProperties = languageSettings.disableDefaultProperties;
|
|
55
58
|
}
|
|
56
59
|
doComplete(document, position, isKubernetes = false) {
|
|
57
60
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -102,8 +105,34 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
102
105
|
overwriteRange = node_1.Range.create(document.positionAt(overwriteStart), position);
|
|
103
106
|
}
|
|
104
107
|
const proposed = {};
|
|
108
|
+
const existingProposeItem = '__';
|
|
105
109
|
const collector = {
|
|
106
110
|
add: (completionItem) => {
|
|
111
|
+
const addSuggestionForParent = function (completionItem) {
|
|
112
|
+
var _a;
|
|
113
|
+
const existsInYaml = ((_a = proposed[completionItem.label]) === null || _a === void 0 ? void 0 : _a.label) === existingProposeItem;
|
|
114
|
+
//don't put to parent suggestion if already in yaml
|
|
115
|
+
if (existsInYaml) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const schemaType = completionItem.parent.schemaType;
|
|
119
|
+
let parentCompletion = result.items.find((item) => item.label === schemaType && item.kind === parentCompletionKind);
|
|
120
|
+
if (parentCompletion && parentCompletion.parent.insertTexts.includes(completionItem.insertText)) {
|
|
121
|
+
// already exists in the parent
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
else if (!parentCompletion) {
|
|
125
|
+
// create a new parent
|
|
126
|
+
parentCompletion = Object.assign(Object.assign({}, completionItem), { label: schemaType, sortText: '_' + schemaType, kind: parentCompletionKind });
|
|
127
|
+
parentCompletion.parent.insertTexts = [completionItem.insertText];
|
|
128
|
+
result.items.push(parentCompletion);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// add to the existing parent
|
|
132
|
+
parentCompletion.parent.insertTexts.push(completionItem.insertText);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const isForParentCompletion = !!completionItem.parent;
|
|
107
136
|
let label = completionItem.label;
|
|
108
137
|
if (!label) {
|
|
109
138
|
// we receive not valid CompletionItem as `label` is mandatory field, so just ignore it
|
|
@@ -114,7 +143,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
114
143
|
label = String(label);
|
|
115
144
|
}
|
|
116
145
|
const existing = proposed[label];
|
|
117
|
-
if (!existing) {
|
|
146
|
+
if (!existing || isForParentCompletion) {
|
|
118
147
|
label = label.replace(/[\n]/g, '↵');
|
|
119
148
|
if (label.length > 60) {
|
|
120
149
|
const shortendedLabel = label.substr(0, 57).trim() + '...';
|
|
@@ -122,17 +151,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
122
151
|
label = shortendedLabel;
|
|
123
152
|
}
|
|
124
153
|
}
|
|
154
|
+
// trim $1 from end of completion
|
|
155
|
+
if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
|
|
156
|
+
completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
|
|
157
|
+
}
|
|
125
158
|
if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
|
|
126
159
|
completionItem.textEdit = node_1.TextEdit.replace(overwriteRange, completionItem.insertText);
|
|
127
160
|
}
|
|
128
161
|
completionItem.label = label;
|
|
129
|
-
|
|
130
|
-
|
|
162
|
+
if (isForParentCompletion) {
|
|
163
|
+
addSuggestionForParent(completionItem);
|
|
164
|
+
}
|
|
165
|
+
if (!existing) {
|
|
166
|
+
proposed[label] = completionItem;
|
|
167
|
+
result.items.push(completionItem);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else if (!existing.documentation && completionItem.documentation) {
|
|
171
|
+
existing.documentation = completionItem.documentation;
|
|
131
172
|
}
|
|
132
173
|
},
|
|
133
174
|
error: (message) => {
|
|
134
|
-
|
|
135
|
-
this.telemetry.sendError('yaml.completion.error', { error: message });
|
|
175
|
+
this.telemetry.sendError('yaml.completion.error', { error: objects_1.convertErrorToTelemetryMsg(message) });
|
|
136
176
|
},
|
|
137
177
|
log: (message) => {
|
|
138
178
|
console.log(message);
|
|
@@ -197,6 +237,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
197
237
|
foundByClosest = true;
|
|
198
238
|
}
|
|
199
239
|
}
|
|
240
|
+
const originalNode = node;
|
|
200
241
|
if (node) {
|
|
201
242
|
if (lineContent.length === 0) {
|
|
202
243
|
node = currentDoc.internalDocument.contents;
|
|
@@ -341,11 +382,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
341
382
|
for (const p of properties) {
|
|
342
383
|
if (!currentProperty || currentProperty !== p) {
|
|
343
384
|
if (yaml_1.isScalar(p.key)) {
|
|
344
|
-
proposed[p.key.value.toString()] = node_1.CompletionItem.create(
|
|
385
|
+
proposed[p.key.value.toString()] = node_1.CompletionItem.create(existingProposeItem);
|
|
345
386
|
}
|
|
346
387
|
}
|
|
347
388
|
}
|
|
348
|
-
this.addPropertyCompletions(schema, currentDoc, node, '', collector, textBuffer, overwriteRange);
|
|
389
|
+
this.addPropertyCompletions(schema, currentDoc, node, originalNode, '', collector, textBuffer, overwriteRange);
|
|
349
390
|
if (!schema && currentWord.length > 0 && document.getText().charAt(offset - currentWord.length - 1) !== '"') {
|
|
350
391
|
collector.add({
|
|
351
392
|
kind: node_1.CompletionItemKind.Property,
|
|
@@ -360,15 +401,54 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
360
401
|
this.getValueCompletions(schema, currentDoc, node, offset, document, collector, types);
|
|
361
402
|
}
|
|
362
403
|
catch (err) {
|
|
363
|
-
|
|
364
|
-
|
|
404
|
+
this.telemetry.sendError('yaml.completion.error', { error: objects_1.convertErrorToTelemetryMsg(err) });
|
|
405
|
+
}
|
|
406
|
+
this.finalizeParentCompletion(result);
|
|
407
|
+
return result;
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
finalizeParentCompletion(result) {
|
|
411
|
+
const reindexText = (insertTexts) => {
|
|
412
|
+
//modify added props to have unique $x
|
|
413
|
+
let max$index = 0;
|
|
414
|
+
return insertTexts.map((text) => {
|
|
415
|
+
const match = text.match(/\$([0-9]+)|\${[0-9]+:/g);
|
|
416
|
+
if (!match) {
|
|
417
|
+
return text;
|
|
365
418
|
}
|
|
366
|
-
|
|
367
|
-
|
|
419
|
+
const max$indexLocal = match
|
|
420
|
+
.map((m) => +m.replace(/\${([0-9]+)[:|]/g, '$1').replace('$', '')) // get numbers form $1 or ${1:...}
|
|
421
|
+
.reduce((p, n) => (n > p ? n : p), 0); // find the max one
|
|
422
|
+
const reindexedStr = text
|
|
423
|
+
.replace(/\$([0-9]+)/g, (s, args) => '$' + (+args + max$index)) // increment each by max$index
|
|
424
|
+
.replace(/\${([0-9]+)[:|]/g, (s, args) => '${' + (+args + max$index) + ':'); // increment each by max$index
|
|
425
|
+
max$index += max$indexLocal;
|
|
426
|
+
return reindexedStr;
|
|
427
|
+
});
|
|
428
|
+
};
|
|
429
|
+
result.items.forEach((completionItem) => {
|
|
430
|
+
if (isParentCompletionItem(completionItem)) {
|
|
431
|
+
const indent = completionItem.parent.indent || '';
|
|
432
|
+
const reindexedTexts = reindexText(completionItem.parent.insertTexts);
|
|
433
|
+
// add indent to each object property and join completion item texts
|
|
434
|
+
let insertText = reindexedTexts.join(`\n${indent}`);
|
|
435
|
+
// trim $1 from end of completion
|
|
436
|
+
if (insertText.endsWith('$1')) {
|
|
437
|
+
insertText = insertText.substring(0, insertText.length - 2);
|
|
438
|
+
}
|
|
439
|
+
completionItem.insertText = insertText;
|
|
440
|
+
if (completionItem.textEdit) {
|
|
441
|
+
completionItem.textEdit.newText = insertText;
|
|
368
442
|
}
|
|
369
|
-
|
|
443
|
+
// remove $x or use {$x:value} in documentation
|
|
444
|
+
const mdText = insertText.replace(/\${[0-9]+[:|](.*)}/g, (s, arg) => arg).replace(/\$([0-9]+)/g, '');
|
|
445
|
+
const originalDocumentation = completionItem.documentation ? [completionItem.documentation, '', '----', ''] : [];
|
|
446
|
+
completionItem.documentation = {
|
|
447
|
+
kind: node_1.MarkupKind.Markdown,
|
|
448
|
+
value: [...originalDocumentation, '```yaml', indent + mdText, '```'].join('\n'),
|
|
449
|
+
};
|
|
450
|
+
delete completionItem.parent;
|
|
370
451
|
}
|
|
371
|
-
return result;
|
|
372
452
|
});
|
|
373
453
|
}
|
|
374
454
|
createTempObjNode(currentWord, node, currentDoc) {
|
|
@@ -380,13 +460,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
380
460
|
map.items[0].value.range = node.range;
|
|
381
461
|
return map;
|
|
382
462
|
}
|
|
383
|
-
addPropertyCompletions(schema, doc, node, separatorAfter, collector, textBuffer, overwriteRange) {
|
|
463
|
+
addPropertyCompletions(schema, doc, node, originalNode, separatorAfter, collector, textBuffer, overwriteRange) {
|
|
464
|
+
var _a;
|
|
384
465
|
const matchingSchemas = doc.getMatchingSchemas(schema.schema);
|
|
385
466
|
const existingKey = textBuffer.getText(overwriteRange);
|
|
386
|
-
const
|
|
467
|
+
const lineContent = textBuffer.getLineContent(overwriteRange.start.line);
|
|
468
|
+
const hasOnlyWhitespace = lineContent.trim().length === 0;
|
|
469
|
+
const hasColon = lineContent.indexOf(':') !== -1;
|
|
387
470
|
const nodeParent = doc.getParent(node);
|
|
471
|
+
const matchOriginal = matchingSchemas.find((it) => it.node.internalNode === originalNode && it.schema.properties);
|
|
388
472
|
for (const schema of matchingSchemas) {
|
|
389
|
-
if (schema.node.internalNode === node && !schema.
|
|
473
|
+
if (((schema.node.internalNode === node && !matchOriginal) || schema.node.internalNode === originalNode) &&
|
|
474
|
+
!schema.inverted) {
|
|
390
475
|
this.collectDefaultSnippets(schema.schema, separatorAfter, collector, {
|
|
391
476
|
newLineFirst: false,
|
|
392
477
|
indentFirstObject: false,
|
|
@@ -398,13 +483,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
398
483
|
if (maxProperties === undefined ||
|
|
399
484
|
node.items === undefined ||
|
|
400
485
|
node.items.length < maxProperties ||
|
|
401
|
-
|
|
486
|
+
(node.items.length === maxProperties && !hasOnlyWhitespace)) {
|
|
402
487
|
for (const key in schemaProperties) {
|
|
403
488
|
if (Object.prototype.hasOwnProperty.call(schemaProperties, key)) {
|
|
404
489
|
const propertySchema = schemaProperties[key];
|
|
405
490
|
if (typeof propertySchema === 'object' && !propertySchema.deprecationMessage && !propertySchema['doNotSuggest']) {
|
|
406
491
|
let identCompensation = '';
|
|
407
|
-
if (nodeParent && yaml_1.isSeq(nodeParent) && node.items.length <= 1) {
|
|
492
|
+
if (nodeParent && yaml_1.isSeq(nodeParent) && node.items.length <= 1 && !hasOnlyWhitespace) {
|
|
408
493
|
// because there is a slash '-' to prevent the properties generated to have the correct
|
|
409
494
|
// indent
|
|
410
495
|
const sourceText = textBuffer.getText();
|
|
@@ -429,17 +514,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
429
514
|
this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {});
|
|
430
515
|
}
|
|
431
516
|
else if (typeof propertySchema.items === 'object' && propertySchema.items.type === 'object') {
|
|
517
|
+
const insertText = `- ${this.getInsertTextForObject(propertySchema.items, separatorAfter, ' ').insertText.trimLeft()}`;
|
|
518
|
+
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${propertySchema.description ? ' (' + propertySchema.description + ')' : ''}`, insertText);
|
|
432
519
|
collector.add({
|
|
433
520
|
kind: this.getSuggestionKind(propertySchema.items.type),
|
|
434
521
|
label: '- (array item)',
|
|
435
|
-
documentation
|
|
436
|
-
insertText
|
|
522
|
+
documentation,
|
|
523
|
+
insertText,
|
|
437
524
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
438
525
|
});
|
|
439
526
|
}
|
|
440
527
|
}
|
|
441
528
|
let insertText = key;
|
|
442
|
-
if (!key.startsWith(existingKey) ||
|
|
529
|
+
if (!key.startsWith(existingKey) || !hasColon) {
|
|
443
530
|
insertText = this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation);
|
|
444
531
|
}
|
|
445
532
|
collector.add({
|
|
@@ -449,6 +536,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
449
536
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
450
537
|
documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
|
|
451
538
|
});
|
|
539
|
+
// if the prop is required add it also to parent suggestion
|
|
540
|
+
if ((_a = schema.schema.required) === null || _a === void 0 ? void 0 : _a.includes(key)) {
|
|
541
|
+
const schemaType = schemaUtils_1.getSchemaTypeName(schema.schema);
|
|
542
|
+
collector.add({
|
|
543
|
+
label: key,
|
|
544
|
+
insertText: this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation),
|
|
545
|
+
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
546
|
+
documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
|
|
547
|
+
parent: {
|
|
548
|
+
schemaType,
|
|
549
|
+
indent: identCompensation,
|
|
550
|
+
},
|
|
551
|
+
});
|
|
552
|
+
}
|
|
452
553
|
}
|
|
453
554
|
}
|
|
454
555
|
}
|
|
@@ -519,11 +620,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
519
620
|
}
|
|
520
621
|
}
|
|
521
622
|
else if (typeof s.schema.items === 'object' && s.schema.items.type === 'object') {
|
|
623
|
+
const insertText = `- ${this.getInsertTextForObject(s.schema.items, separatorAfter, ' ').insertText.trimLeft()}`;
|
|
624
|
+
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${s.schema.description ? ' (' + s.schema.description + ')' : ''}`, insertText);
|
|
522
625
|
collector.add({
|
|
523
626
|
kind: this.getSuggestionKind(s.schema.items.type),
|
|
524
627
|
label: '- (array item)',
|
|
525
|
-
documentation
|
|
526
|
-
insertText
|
|
628
|
+
documentation,
|
|
629
|
+
insertText,
|
|
527
630
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
528
631
|
});
|
|
529
632
|
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
|
|
@@ -532,12 +635,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
532
635
|
s.schema.items.anyOf
|
|
533
636
|
.filter((i) => typeof i === 'object')
|
|
534
637
|
.forEach((i, index) => {
|
|
638
|
+
const schemaType = schemaUtils_1.getSchemaTypeName(i);
|
|
535
639
|
const insertText = `- ${this.getInsertTextForObject(i, separatorAfter).insertText.trimLeft()}`;
|
|
536
640
|
//append insertText to documentation
|
|
537
|
-
const
|
|
641
|
+
const schemaTypeTitle = schemaType ? ' type `' + schemaType + '`' : '';
|
|
642
|
+
const schemaDescription = s.schema.description ? ' (' + s.schema.description + ')' : '';
|
|
643
|
+
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${schemaTypeTitle}${schemaDescription}`, insertText);
|
|
538
644
|
collector.add({
|
|
539
645
|
kind: this.getSuggestionKind(i.type),
|
|
540
|
-
label: '- (array item) ' + (index + 1),
|
|
646
|
+
label: '- (array item) ' + (schemaType || index + 1),
|
|
541
647
|
documentation: documentation,
|
|
542
648
|
insertText: insertText,
|
|
543
649
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
@@ -567,7 +673,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
567
673
|
}
|
|
568
674
|
}
|
|
569
675
|
}
|
|
570
|
-
getInsertTextForProperty(key, propertySchema, separatorAfter,
|
|
676
|
+
getInsertTextForProperty(key, propertySchema, separatorAfter, indent = this.indentation) {
|
|
571
677
|
const propertyText = this.getInsertTextForValue(key, '', 'string');
|
|
572
678
|
const resultText = propertyText + ':';
|
|
573
679
|
let value;
|
|
@@ -581,6 +687,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
581
687
|
else if (propertySchema.items) {
|
|
582
688
|
type = 'array';
|
|
583
689
|
}
|
|
690
|
+
else if (propertySchema.anyOf) {
|
|
691
|
+
type = 'anyOf';
|
|
692
|
+
}
|
|
584
693
|
}
|
|
585
694
|
if (Array.isArray(propertySchema.defaultSnippets)) {
|
|
586
695
|
if (propertySchema.defaultSnippets.length === 1) {
|
|
@@ -605,6 +714,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
605
714
|
}
|
|
606
715
|
nValueProposals += propertySchema.enum.length;
|
|
607
716
|
}
|
|
717
|
+
if (propertySchema.const) {
|
|
718
|
+
if (!value) {
|
|
719
|
+
value = this.getInsertTextForGuessedValue(propertySchema.const, '', type);
|
|
720
|
+
value = evaluateTab1Symbol(value); // prevent const being selected after snippet insert
|
|
721
|
+
value = ' ' + value;
|
|
722
|
+
}
|
|
723
|
+
nValueProposals++;
|
|
724
|
+
}
|
|
608
725
|
if (objects_1.isDefined(propertySchema.default)) {
|
|
609
726
|
if (!value) {
|
|
610
727
|
value = ' ' + this.getInsertTextForGuessedValue(propertySchema.default, '', type);
|
|
@@ -618,10 +735,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
618
735
|
nValueProposals += propertySchema.examples.length;
|
|
619
736
|
}
|
|
620
737
|
if (propertySchema.properties) {
|
|
621
|
-
return `${resultText}\n${this.getInsertTextForObject(propertySchema, separatorAfter,
|
|
738
|
+
return `${resultText}\n${this.getInsertTextForObject(propertySchema, separatorAfter, indent).insertText}`;
|
|
622
739
|
}
|
|
623
740
|
else if (propertySchema.items) {
|
|
624
|
-
return `${resultText}\n${
|
|
741
|
+
return `${resultText}\n${indent}- ${this.getInsertTextForArray(propertySchema.items, separatorAfter, 1, indent).insertText}`;
|
|
625
742
|
}
|
|
626
743
|
if (nValueProposals === 0) {
|
|
627
744
|
switch (type) {
|
|
@@ -632,10 +749,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
632
749
|
value = ' $1';
|
|
633
750
|
break;
|
|
634
751
|
case 'object':
|
|
635
|
-
value = `\n${
|
|
752
|
+
value = `\n${indent}`;
|
|
636
753
|
break;
|
|
637
754
|
case 'array':
|
|
638
|
-
value = `\n${
|
|
755
|
+
value = `\n${indent}- `;
|
|
639
756
|
break;
|
|
640
757
|
case 'number':
|
|
641
758
|
case 'integer':
|
|
@@ -644,6 +761,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
644
761
|
case 'null':
|
|
645
762
|
value = ' ${1:null}';
|
|
646
763
|
break;
|
|
764
|
+
case 'anyOf':
|
|
765
|
+
value = ' $1';
|
|
766
|
+
break;
|
|
647
767
|
default:
|
|
648
768
|
return propertyText;
|
|
649
769
|
}
|
|
@@ -664,6 +784,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
664
784
|
const propertySchema = schema.properties[key];
|
|
665
785
|
let type = Array.isArray(propertySchema.type) ? propertySchema.type[0] : propertySchema.type;
|
|
666
786
|
if (!type) {
|
|
787
|
+
if (propertySchema.anyOf) {
|
|
788
|
+
type = 'anyOf';
|
|
789
|
+
}
|
|
667
790
|
if (propertySchema.properties) {
|
|
668
791
|
type = 'object';
|
|
669
792
|
}
|
|
@@ -677,11 +800,22 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
677
800
|
case 'string':
|
|
678
801
|
case 'number':
|
|
679
802
|
case 'integer':
|
|
680
|
-
|
|
803
|
+
case 'anyOf': {
|
|
804
|
+
let value = propertySchema.default || propertySchema.const;
|
|
805
|
+
if (value) {
|
|
806
|
+
if (type === 'string') {
|
|
807
|
+
value = convertToStringValue(value);
|
|
808
|
+
}
|
|
809
|
+
insertText += `${indent}${key}: \${${insertIndex++}:${value}}\n`;
|
|
810
|
+
}
|
|
811
|
+
else {
|
|
812
|
+
insertText += `${indent}${key}: $${insertIndex++}\n`;
|
|
813
|
+
}
|
|
681
814
|
break;
|
|
815
|
+
}
|
|
682
816
|
case 'array':
|
|
683
817
|
{
|
|
684
|
-
const arrayInsertResult = this.getInsertTextForArray(propertySchema.items, separatorAfter, insertIndex
|
|
818
|
+
const arrayInsertResult = this.getInsertTextForArray(propertySchema.items, separatorAfter, insertIndex++, indent);
|
|
685
819
|
const arrayInsertLines = arrayInsertResult.insertText.split('\n');
|
|
686
820
|
let arrayTemplate = arrayInsertResult.insertText;
|
|
687
821
|
if (arrayInsertLines.length > 1) {
|
|
@@ -704,7 +838,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
704
838
|
break;
|
|
705
839
|
}
|
|
706
840
|
}
|
|
707
|
-
else if (propertySchema.default !== undefined) {
|
|
841
|
+
else if (!this.disableDefaultProperties && propertySchema.default !== undefined) {
|
|
708
842
|
switch (type) {
|
|
709
843
|
case 'boolean':
|
|
710
844
|
case 'number':
|
|
@@ -728,7 +862,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
728
862
|
return { insertText, insertIndex };
|
|
729
863
|
}
|
|
730
864
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
731
|
-
getInsertTextForArray(schema, separatorAfter, insertIndex = 1) {
|
|
865
|
+
getInsertTextForArray(schema, separatorAfter, insertIndex = 1, indent = this.indentation) {
|
|
732
866
|
let insertText = '';
|
|
733
867
|
if (!schema) {
|
|
734
868
|
insertText = `$${insertIndex++}`;
|
|
@@ -756,7 +890,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
756
890
|
break;
|
|
757
891
|
case 'object':
|
|
758
892
|
{
|
|
759
|
-
const objectInsertResult = this.getInsertTextForObject(schema, separatorAfter, `${
|
|
893
|
+
const objectInsertResult = this.getInsertTextForObject(schema, separatorAfter, `${indent} `, insertIndex++);
|
|
760
894
|
insertText = objectInsertResult.insertText.trimLeft();
|
|
761
895
|
insertIndex = objectInsertResult.insertIndex;
|
|
762
896
|
}
|
|
@@ -927,7 +1061,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
927
1061
|
collector.add({
|
|
928
1062
|
kind: this.getSuggestionKind(schema.type),
|
|
929
1063
|
label: this.getLabelForValue(schema.const),
|
|
930
|
-
insertText: this.getInsertTextForValue(schema.const, separatorAfter,
|
|
1064
|
+
insertText: this.getInsertTextForValue(schema.const, separatorAfter, schema.type),
|
|
931
1065
|
insertTextFormat: node_1.InsertTextFormat.Snippet,
|
|
932
1066
|
documentation: this.fromMarkup(schema.markdownDescription) || schema.description,
|
|
933
1067
|
});
|
|
@@ -1153,8 +1287,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
1153
1287
|
if (value === 'true' || value === 'false' || value === 'null' || isNumberExp.test(value)) {
|
|
1154
1288
|
return `"${value}"`;
|
|
1155
1289
|
}
|
|
1156
|
-
|
|
1157
|
-
if (value.indexOf('\"') !== -1) {
|
|
1290
|
+
if (value.indexOf('"') !== -1) {
|
|
1158
1291
|
value = value.replace(doubleQuotesEscapeRegExp, '"');
|
|
1159
1292
|
}
|
|
1160
1293
|
let doQuote = value.charAt(0) === '@';
|
|
@@ -1182,5 +1315,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
1182
1315
|
}
|
|
1183
1316
|
return value;
|
|
1184
1317
|
}
|
|
1318
|
+
/**
|
|
1319
|
+
* simplify `{$1:value}` to `value`
|
|
1320
|
+
*/
|
|
1321
|
+
function evaluateTab1Symbol(value) {
|
|
1322
|
+
const result = value.replace(/\$\{1:(.*)\}/, '$1');
|
|
1323
|
+
return result;
|
|
1324
|
+
}
|
|
1325
|
+
function isParentCompletionItem(item) {
|
|
1326
|
+
return 'parent' in item;
|
|
1327
|
+
}
|
|
1185
1328
|
});
|
|
1186
1329
|
//# sourceMappingURL=yamlCompletion.js.map
|