yaml-language-server 1.11.1-dcdfa10.0 → 1.11.1-e8be2e1.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 +14 -0
- package/README.md +9 -0
- package/eslint-result.sarif +4397 -0
- package/lib/esm/languageserver/handlers/languageHandlers.js +4 -1
- package/lib/esm/languageserver/handlers/languageHandlers.js.map +1 -1
- package/lib/esm/languageserver/handlers/schemaSelectionHandlers.js +44 -60
- package/lib/esm/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
- package/lib/esm/languageserver/handlers/settingsHandlers.d.ts +1 -1
- package/lib/esm/languageserver/handlers/settingsHandlers.js +161 -183
- package/lib/esm/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/lib/esm/languageserver/telemetry.d.ts +2 -12
- package/lib/esm/languageserver/telemetry.js +1 -1
- package/lib/esm/languageserver/telemetry.js.map +1 -1
- package/lib/esm/languageservice/jsonSchema.d.ts +1 -0
- package/lib/esm/languageservice/parser/jsonParser07.d.ts +2 -0
- package/lib/esm/languageservice/parser/jsonParser07.js +44 -19
- package/lib/esm/languageservice/parser/jsonParser07.js.map +1 -1
- package/lib/esm/languageservice/parser/yaml-documents.js +6 -5
- package/lib/esm/languageservice/parser/yaml-documents.js.map +1 -1
- package/lib/esm/languageservice/parser/yamlParser07.js +1 -2
- package/lib/esm/languageservice/parser/yamlParser07.js.map +1 -1
- package/lib/esm/languageservice/services/documentSymbols.d.ts +1 -1
- package/lib/esm/languageservice/services/validation/yaml-style.js +2 -3
- package/lib/esm/languageservice/services/validation/yaml-style.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCodeActions.js +2 -3
- package/lib/esm/languageservice/services/yamlCodeActions.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCodeLens.d.ts +1 -1
- package/lib/esm/languageservice/services/yamlCodeLens.js +23 -34
- package/lib/esm/languageservice/services/yamlCodeLens.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCommands.js +3 -12
- package/lib/esm/languageservice/services/yamlCommands.js.map +1 -1
- package/lib/esm/languageservice/services/yamlCompletion.d.ts +3 -2
- package/lib/esm/languageservice/services/yamlCompletion.js +439 -414
- package/lib/esm/languageservice/services/yamlCompletion.js.map +1 -1
- package/lib/esm/languageservice/services/yamlDefinition.d.ts +1 -1
- package/lib/esm/languageservice/services/yamlFolding.js +1 -2
- package/lib/esm/languageservice/services/yamlFolding.js.map +1 -1
- package/lib/esm/languageservice/services/yamlHover.d.ts +1 -1
- package/lib/esm/languageservice/services/yamlLinks.d.ts +1 -1
- package/lib/esm/languageservice/services/yamlOnTypeFormatting.js +0 -1
- package/lib/esm/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
- package/lib/esm/languageservice/services/yamlSchemaService.js +202 -218
- package/lib/esm/languageservice/services/yamlSchemaService.js.map +1 -1
- package/lib/esm/languageservice/services/yamlValidation.d.ts +1 -1
- package/lib/esm/languageservice/services/yamlValidation.js +61 -71
- package/lib/esm/languageservice/services/yamlValidation.js.map +1 -1
- package/lib/esm/languageservice/telemetry.d.ts +16 -0
- package/lib/esm/languageservice/telemetry.js +6 -0
- package/lib/esm/languageservice/telemetry.js.map +1 -0
- package/lib/esm/languageservice/utils/astUtils.js +2 -6
- package/lib/esm/languageservice/utils/astUtils.js.map +1 -1
- package/lib/esm/languageservice/utils/indentationGuesser.js +0 -1
- package/lib/esm/languageservice/utils/indentationGuesser.js.map +1 -1
- package/lib/esm/languageservice/utils/objects.js +1 -2
- 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 +2 -4
- package/lib/esm/languageservice/utils/schemaUrls.js.map +1 -1
- package/lib/esm/languageservice/utils/schemaUtils.d.ts +2 -0
- package/lib/esm/languageservice/utils/schemaUtils.js +9 -6
- package/lib/esm/languageservice/utils/schemaUtils.js.map +1 -1
- package/lib/esm/languageservice/yamlLanguageService.d.ts +2 -3
- package/lib/esm/languageservice/yamlLanguageService.js +0 -1
- package/lib/esm/languageservice/yamlLanguageService.js.map +1 -1
- package/lib/esm/server.js +5 -14
- package/lib/esm/server.js.map +1 -1
- package/lib/esm/webworker/yamlServerMain.js +2 -2
- package/lib/esm/webworker/yamlServerMain.js.map +1 -1
- package/lib/esm/yamlServerInit.d.ts +1 -1
- package/lib/umd/languageserver/handlers/languageHandlers.js +4 -1
- package/lib/umd/languageserver/handlers/languageHandlers.js.map +1 -1
- package/lib/umd/languageserver/handlers/schemaSelectionHandlers.js +44 -60
- package/lib/umd/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
- package/lib/umd/languageserver/handlers/settingsHandlers.d.ts +1 -1
- package/lib/umd/languageserver/handlers/settingsHandlers.js +161 -183
- package/lib/umd/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/lib/umd/languageserver/telemetry.d.ts +2 -12
- package/lib/umd/languageserver/telemetry.js +3 -3
- package/lib/umd/languageserver/telemetry.js.map +1 -1
- package/lib/umd/languageservice/jsonSchema.d.ts +1 -0
- package/lib/umd/languageservice/parser/jsonParser07.d.ts +2 -0
- package/lib/umd/languageservice/parser/jsonParser07.js +45 -20
- package/lib/umd/languageservice/parser/jsonParser07.js.map +1 -1
- package/lib/umd/languageservice/parser/yaml-documents.js +6 -5
- package/lib/umd/languageservice/parser/yaml-documents.js.map +1 -1
- package/lib/umd/languageservice/parser/yamlParser07.js +1 -2
- package/lib/umd/languageservice/parser/yamlParser07.js.map +1 -1
- package/lib/umd/languageservice/services/documentSymbols.d.ts +1 -1
- package/lib/umd/languageservice/services/validation/yaml-style.js +2 -3
- package/lib/umd/languageservice/services/validation/yaml-style.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCodeActions.js +2 -3
- package/lib/umd/languageservice/services/yamlCodeActions.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCodeLens.d.ts +1 -1
- package/lib/umd/languageservice/services/yamlCodeLens.js +23 -34
- package/lib/umd/languageservice/services/yamlCodeLens.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCommands.js +3 -12
- package/lib/umd/languageservice/services/yamlCommands.js.map +1 -1
- package/lib/umd/languageservice/services/yamlCompletion.d.ts +3 -2
- package/lib/umd/languageservice/services/yamlCompletion.js +438 -413
- package/lib/umd/languageservice/services/yamlCompletion.js.map +1 -1
- package/lib/umd/languageservice/services/yamlDefinition.d.ts +1 -1
- package/lib/umd/languageservice/services/yamlFolding.js +1 -2
- package/lib/umd/languageservice/services/yamlFolding.js.map +1 -1
- package/lib/umd/languageservice/services/yamlHover.d.ts +1 -1
- package/lib/umd/languageservice/services/yamlLinks.d.ts +1 -1
- package/lib/umd/languageservice/services/yamlOnTypeFormatting.js +0 -1
- package/lib/umd/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
- package/lib/umd/languageservice/services/yamlSchemaService.js +202 -218
- package/lib/umd/languageservice/services/yamlSchemaService.js.map +1 -1
- package/lib/umd/languageservice/services/yamlValidation.d.ts +1 -1
- package/lib/umd/languageservice/services/yamlValidation.js +61 -71
- package/lib/umd/languageservice/services/yamlValidation.js.map +1 -1
- package/lib/umd/languageservice/telemetry.d.ts +16 -0
- package/lib/umd/languageservice/telemetry.js +17 -0
- package/lib/umd/languageservice/telemetry.js.map +1 -0
- package/lib/umd/languageservice/utils/astUtils.js +2 -6
- package/lib/umd/languageservice/utils/astUtils.js.map +1 -1
- package/lib/umd/languageservice/utils/indentationGuesser.js +0 -1
- package/lib/umd/languageservice/utils/indentationGuesser.js.map +1 -1
- package/lib/umd/languageservice/utils/objects.js +1 -2
- 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 +2 -4
- package/lib/umd/languageservice/utils/schemaUrls.js.map +1 -1
- package/lib/umd/languageservice/utils/schemaUtils.d.ts +2 -0
- package/lib/umd/languageservice/utils/schemaUtils.js +12 -7
- package/lib/umd/languageservice/utils/schemaUtils.js.map +1 -1
- package/lib/umd/languageservice/yamlLanguageService.d.ts +2 -3
- package/lib/umd/languageservice/yamlLanguageService.js +0 -1
- package/lib/umd/languageservice/yamlLanguageService.js.map +1 -1
- package/lib/umd/server.js +4 -13
- package/lib/umd/server.js.map +1 -1
- package/lib/umd/webworker/yamlServerMain.js +1 -1
- package/lib/umd/webworker/yamlServerMain.js.map +1 -1
- package/lib/umd/yamlServerInit.d.ts +1 -1
- package/out/server/src/languageserver/handlers/languageHandlers.js +4 -1
- package/out/server/src/languageserver/handlers/languageHandlers.js.map +1 -1
- package/out/server/src/languageserver/handlers/schemaSelectionHandlers.js +44 -60
- package/out/server/src/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
- package/out/server/src/languageserver/handlers/settingsHandlers.d.ts +1 -1
- package/out/server/src/languageserver/handlers/settingsHandlers.js +161 -183
- package/out/server/src/languageserver/handlers/settingsHandlers.js.map +1 -1
- package/out/server/src/languageserver/telemetry.d.ts +2 -12
- package/out/server/src/languageserver/telemetry.js +3 -3
- package/out/server/src/languageserver/telemetry.js.map +1 -1
- package/out/server/src/languageservice/jsonSchema.d.ts +1 -0
- package/out/server/src/languageservice/parser/jsonParser07.d.ts +2 -0
- package/out/server/src/languageservice/parser/jsonParser07.js +44 -19
- package/out/server/src/languageservice/parser/jsonParser07.js.map +1 -1
- package/out/server/src/languageservice/parser/yaml-documents.js +6 -5
- package/out/server/src/languageservice/parser/yaml-documents.js.map +1 -1
- package/out/server/src/languageservice/parser/yamlParser07.js +1 -2
- package/out/server/src/languageservice/parser/yamlParser07.js.map +1 -1
- package/out/server/src/languageservice/services/documentSymbols.d.ts +1 -1
- package/out/server/src/languageservice/services/validation/yaml-style.js +2 -3
- package/out/server/src/languageservice/services/validation/yaml-style.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCodeActions.js +2 -3
- package/out/server/src/languageservice/services/yamlCodeActions.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCodeLens.d.ts +1 -1
- package/out/server/src/languageservice/services/yamlCodeLens.js +23 -34
- package/out/server/src/languageservice/services/yamlCodeLens.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCommands.js +3 -12
- package/out/server/src/languageservice/services/yamlCommands.js.map +1 -1
- package/out/server/src/languageservice/services/yamlCompletion.d.ts +3 -2
- package/out/server/src/languageservice/services/yamlCompletion.js +438 -413
- package/out/server/src/languageservice/services/yamlCompletion.js.map +1 -1
- package/out/server/src/languageservice/services/yamlDefinition.d.ts +1 -1
- package/out/server/src/languageservice/services/yamlFolding.js +1 -2
- package/out/server/src/languageservice/services/yamlFolding.js.map +1 -1
- package/out/server/src/languageservice/services/yamlHover.d.ts +1 -1
- package/out/server/src/languageservice/services/yamlLinks.d.ts +1 -1
- package/out/server/src/languageservice/services/yamlOnTypeFormatting.js +0 -1
- package/out/server/src/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
- package/out/server/src/languageservice/services/yamlSchemaService.js +202 -218
- package/out/server/src/languageservice/services/yamlSchemaService.js.map +1 -1
- package/out/server/src/languageservice/services/yamlValidation.d.ts +1 -1
- package/out/server/src/languageservice/services/yamlValidation.js +61 -71
- package/out/server/src/languageservice/services/yamlValidation.js.map +1 -1
- package/out/server/src/languageservice/telemetry.d.ts +16 -0
- package/out/server/src/languageservice/telemetry.js +7 -0
- package/out/server/src/languageservice/telemetry.js.map +1 -0
- package/out/server/src/languageservice/utils/astUtils.js +2 -6
- package/out/server/src/languageservice/utils/astUtils.js.map +1 -1
- package/out/server/src/languageservice/utils/indentationGuesser.js +0 -1
- package/out/server/src/languageservice/utils/indentationGuesser.js.map +1 -1
- package/out/server/src/languageservice/utils/objects.js +1 -2
- 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 +2 -4
- package/out/server/src/languageservice/utils/schemaUrls.js.map +1 -1
- package/out/server/src/languageservice/utils/schemaUtils.d.ts +2 -0
- package/out/server/src/languageservice/utils/schemaUtils.js +12 -7
- package/out/server/src/languageservice/utils/schemaUtils.js.map +1 -1
- package/out/server/src/languageservice/yamlLanguageService.d.ts +2 -3
- package/out/server/src/languageservice/yamlLanguageService.js +0 -1
- package/out/server/src/languageservice/yamlLanguageService.js.map +1 -1
- package/out/server/src/server.js +4 -13
- package/out/server/src/server.js.map +1 -1
- package/out/server/src/webworker/yamlServerMain.js +1 -1
- package/out/server/src/webworker/yamlServerMain.js.map +1 -1
- package/out/server/src/yamlServerInit.d.ts +1 -1
- package/out/server/test/autoCompletion.test.js +267 -178
- package/out/server/test/autoCompletion.test.js.map +1 -1
- package/out/server/test/autoCompletionFix.test.js +222 -134
- package/out/server/test/autoCompletionFix.test.js.map +1 -1
- package/out/server/test/code-action-schema.test.js +6 -15
- package/out/server/test/code-action-schema.test.js.map +1 -1
- package/out/server/test/defaultSnippets.test.js +11 -19
- package/out/server/test/defaultSnippets.test.js.map +1 -1
- package/out/server/test/findLinks.test.js +3 -12
- package/out/server/test/findLinks.test.js.map +1 -1
- package/out/server/test/hover.test.js +64 -73
- package/out/server/test/hover.test.js.map +1 -1
- package/out/server/test/integration.test.js +3 -12
- package/out/server/test/integration.test.js.map +1 -1
- package/out/server/test/jsonParser.test.js +15 -26
- package/out/server/test/jsonParser.test.js.map +1 -1
- package/out/server/test/multipleDocuments.test.js +3 -12
- package/out/server/test/multipleDocuments.test.js.map +1 -1
- package/out/server/test/schema.test.js +71 -85
- package/out/server/test/schema.test.js.map +1 -1
- package/out/server/test/schemaRequestHandler.test.js +9 -18
- package/out/server/test/schemaRequestHandler.test.js.map +1 -1
- package/out/server/test/schemaSelectionHandlers.test.js +12 -21
- package/out/server/test/schemaSelectionHandlers.test.js.map +1 -1
- package/out/server/test/schemaValidation.test.js +216 -97
- package/out/server/test/schemaValidation.test.js.map +1 -1
- package/out/server/test/settingsHandlers.test.js +44 -55
- package/out/server/test/settingsHandlers.test.js.map +1 -1
- package/out/server/test/telemetry.test.js +1 -1
- package/out/server/test/telemetry.test.js.map +1 -1
- package/out/server/test/utils/testsTypes.d.ts +3 -2
- package/out/server/test/utils/testsTypes.js +1 -1
- package/out/server/test/utils/testsTypes.js.map +1 -1
- package/out/server/test/utils/verifyError.d.ts +1 -1
- package/out/server/test/utils/verifyError.js +22 -20
- package/out/server/test/utils/verifyError.js.map +1 -1
- package/out/server/test/yamlCodeLens.test.js +25 -34
- package/out/server/test/yamlCodeLens.test.js.map +1 -1
- package/out/server/test/yamlCommands.test.js +6 -15
- package/out/server/test/yamlCommands.test.js.map +1 -1
- package/out/server/test/yamlSchema.test.js +9 -18
- package/out/server/test/yamlSchema.test.js.map +1 -1
- package/out/server/test/yamlSchemaService.test.js +9 -18
- package/out/server/test/yamlSchemaService.test.js.map +1 -1
- package/out/server/test/yamlValidation.test.js +30 -39
- package/out/server/test/yamlValidation.test.js.map +1 -1
- package/package.json +3 -2
|
@@ -3,15 +3,6 @@
|
|
|
3
3
|
* Copyright (c) Red Hat, Inc. All rights reserved.
|
|
4
4
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
5
5
|
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
8
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
9
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
10
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
11
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
12
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
|
-
});
|
|
14
|
-
};
|
|
15
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
7
|
exports.YamlCompletion = void 0;
|
|
17
8
|
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
|
|
@@ -49,409 +40,438 @@ class YamlCompletion {
|
|
|
49
40
|
this.disableDefaultProperties = languageSettings.disableDefaultProperties;
|
|
50
41
|
this.parentSkeletonSelectedFirst = languageSettings.parentSkeletonSelectedFirst;
|
|
51
42
|
}
|
|
52
|
-
doComplete(document, position, isKubernetes = false, doComplete = true) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
else if (node && (0, yaml_1.isScalar)(node) && node.value === 'null') {
|
|
99
|
-
const nodeStartPos = document.positionAt(node.range[0]);
|
|
100
|
-
nodeStartPos.character += 1;
|
|
101
|
-
const nodeEndPos = document.positionAt(node.range[2]);
|
|
102
|
-
nodeEndPos.character += 1;
|
|
103
|
-
overwriteRange = vscode_languageserver_types_1.Range.create(nodeStartPos, nodeEndPos);
|
|
104
|
-
}
|
|
105
|
-
else if (node && (0, yaml_1.isScalar)(node) && node.value) {
|
|
106
|
-
const start = document.positionAt(node.range[0]);
|
|
107
|
-
if (offset > 0 && start.character > 0 && text.charAt(offset - 1) === '-') {
|
|
108
|
-
start.character -= 1;
|
|
43
|
+
async doComplete(document, position, isKubernetes = false, doComplete = true) {
|
|
44
|
+
const result = vscode_languageserver_types_1.CompletionList.create([], false);
|
|
45
|
+
if (!this.completionEnabled) {
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
const doc = this.yamlDocument.getYamlDocument(document, { customTags: this.customTags, yamlVersion: this.yamlVersion }, true);
|
|
49
|
+
const textBuffer = new textBuffer_1.TextBuffer(document);
|
|
50
|
+
if (!this.configuredIndentation) {
|
|
51
|
+
const indent = (0, indentationGuesser_1.guessIndentation)(textBuffer, 2, true);
|
|
52
|
+
this.indentation = indent.insertSpaces ? ' '.repeat(indent.tabSize) : '\t';
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.indentation = this.configuredIndentation;
|
|
56
|
+
}
|
|
57
|
+
(0, isKubernetes_1.setKubernetesParserOption)(doc.documents, isKubernetes);
|
|
58
|
+
// set parser options
|
|
59
|
+
for (const jsonDoc of doc.documents) {
|
|
60
|
+
jsonDoc.uri = document.uri;
|
|
61
|
+
}
|
|
62
|
+
const offset = document.offsetAt(position);
|
|
63
|
+
const text = document.getText();
|
|
64
|
+
if (text.charAt(offset - 1) === ':') {
|
|
65
|
+
return Promise.resolve(result);
|
|
66
|
+
}
|
|
67
|
+
let currentDoc = (0, arrUtils_1.matchOffsetToDocument)(offset, doc);
|
|
68
|
+
if (currentDoc === null) {
|
|
69
|
+
return Promise.resolve(result);
|
|
70
|
+
}
|
|
71
|
+
// as we modify AST for completion, we need to use copy of original document
|
|
72
|
+
currentDoc = currentDoc.clone();
|
|
73
|
+
let [node, foundByClosest] = currentDoc.getNodeFromPosition(offset, textBuffer, this.indentation.length);
|
|
74
|
+
const currentWord = this.getCurrentWord(document, offset);
|
|
75
|
+
let lineContent = textBuffer.getLineContent(position.line);
|
|
76
|
+
const lineAfterPosition = lineContent.substring(position.character);
|
|
77
|
+
const areOnlySpacesAfterPosition = /^[ ]+\n?$/.test(lineAfterPosition);
|
|
78
|
+
this.arrayPrefixIndentation = '';
|
|
79
|
+
let overwriteRange = null;
|
|
80
|
+
if (areOnlySpacesAfterPosition) {
|
|
81
|
+
overwriteRange = vscode_languageserver_types_1.Range.create(position, vscode_languageserver_types_1.Position.create(position.line, lineContent.length));
|
|
82
|
+
const isOnlyWhitespace = lineContent.trim().length === 0;
|
|
83
|
+
const isOnlyDash = lineContent.match(/^\s*(-)\s*$/);
|
|
84
|
+
if (node && (0, yaml_1.isScalar)(node) && !isOnlyWhitespace && !isOnlyDash) {
|
|
85
|
+
// line contains part of a key with trailing spaces, adjust the overwrite range to include only the text
|
|
86
|
+
const matches = lineContent.match(/^([\s-]*)[^:]+[ \t]+\n?$/);
|
|
87
|
+
if (matches?.length) {
|
|
88
|
+
overwriteRange = vscode_languageserver_types_1.Range.create(vscode_languageserver_types_1.Position.create(position.line, matches[1].length), vscode_languageserver_types_1.Position.create(position.line, lineContent.length));
|
|
109
89
|
}
|
|
110
|
-
overwriteRange = vscode_languageserver_types_1.Range.create(start, document.positionAt(node.range[1]));
|
|
111
90
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
91
|
+
}
|
|
92
|
+
else if (node && (0, yaml_1.isScalar)(node) && node.value === 'null') {
|
|
93
|
+
const nodeStartPos = document.positionAt(node.range[0]);
|
|
94
|
+
nodeStartPos.character += 1;
|
|
95
|
+
const nodeEndPos = document.positionAt(node.range[2]);
|
|
96
|
+
nodeEndPos.character += 1;
|
|
97
|
+
overwriteRange = vscode_languageserver_types_1.Range.create(nodeStartPos, nodeEndPos);
|
|
98
|
+
}
|
|
99
|
+
else if (node && (0, yaml_1.isScalar)(node) && node.value) {
|
|
100
|
+
const start = document.positionAt(node.range[0]);
|
|
101
|
+
if (offset > 0 && start.character > 0 && text.charAt(offset - 1) === '-') {
|
|
102
|
+
start.character -= 1;
|
|
115
103
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
104
|
+
overwriteRange = vscode_languageserver_types_1.Range.create(start, document.positionAt(node.range[1]));
|
|
105
|
+
}
|
|
106
|
+
else if (node && (0, yaml_1.isScalar)(node) && node.value === null && currentWord === '-') {
|
|
107
|
+
overwriteRange = vscode_languageserver_types_1.Range.create(position, position);
|
|
108
|
+
this.arrayPrefixIndentation = ' ';
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
let overwriteStart = document.offsetAt(position) - currentWord.length;
|
|
112
|
+
if (overwriteStart > 0 && text[overwriteStart - 1] === '"') {
|
|
113
|
+
overwriteStart--;
|
|
122
114
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
const schema = completionItem.parent.schema;
|
|
135
|
-
const schemaType = (0, schemaUtils_1.getSchemaTypeName)(schema);
|
|
136
|
-
const schemaDescription = schema.markdownDescription || schema.description;
|
|
137
|
-
let parentCompletion = result.items.find((item) => { var _a; return ((_a = item.parent) === null || _a === void 0 ? void 0 : _a.schema) === schema && item.kind === parentCompletionKind; });
|
|
138
|
-
if (parentCompletion && parentCompletion.parent.insertTexts.includes(completionItem.insertText)) {
|
|
139
|
-
// already exists in the parent
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
else if (!parentCompletion) {
|
|
143
|
-
// create a new parent
|
|
144
|
-
parentCompletion = Object.assign(Object.assign({}, completionItem), { label: schemaType, documentation: schemaDescription, sortText: '_' + schemaType, kind: parentCompletionKind });
|
|
145
|
-
parentCompletion.parent.insertTexts = [completionItem.insertText];
|
|
146
|
-
result.items.push(parentCompletion);
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
// add to the existing parent
|
|
150
|
-
parentCompletion.parent.insertTexts.push(completionItem.insertText);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
const isForParentCompletion = !!completionItem.parent;
|
|
154
|
-
let label = completionItem.label;
|
|
155
|
-
if (!label) {
|
|
156
|
-
// we receive not valid CompletionItem as `label` is mandatory field, so just ignore it
|
|
157
|
-
console.warn(`Ignoring CompletionItem without label: ${JSON.stringify(completionItem)}`);
|
|
115
|
+
overwriteRange = vscode_languageserver_types_1.Range.create(document.positionAt(overwriteStart), position);
|
|
116
|
+
}
|
|
117
|
+
const proposed = {};
|
|
118
|
+
const existingProposeItem = '__';
|
|
119
|
+
const collector = {
|
|
120
|
+
add: (completionItem, oneOfSchema) => {
|
|
121
|
+
const addSuggestionForParent = function (completionItem) {
|
|
122
|
+
const existsInYaml = proposed[completionItem.label]?.label === existingProposeItem;
|
|
123
|
+
//don't put to parent suggestion if already in yaml
|
|
124
|
+
if (existsInYaml) {
|
|
158
125
|
return;
|
|
159
126
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
label = shortendedLabel;
|
|
168
|
-
}
|
|
127
|
+
const schema = completionItem.parent.schema;
|
|
128
|
+
const schemaType = (0, schemaUtils_1.getSchemaTypeName)(schema);
|
|
129
|
+
const schemaDescription = schema.markdownDescription || schema.description;
|
|
130
|
+
let parentCompletion = result.items.find((item) => item.parent?.schema === schema && item.kind === parentCompletionKind);
|
|
131
|
+
if (parentCompletion && parentCompletion.parent.insertTexts.includes(completionItem.insertText)) {
|
|
132
|
+
// already exists in the parent
|
|
133
|
+
return;
|
|
169
134
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
135
|
+
else if (!parentCompletion) {
|
|
136
|
+
// create a new parent
|
|
137
|
+
parentCompletion = {
|
|
138
|
+
...completionItem,
|
|
139
|
+
label: schemaType,
|
|
140
|
+
documentation: schemaDescription,
|
|
141
|
+
sortText: '_' + schemaType,
|
|
142
|
+
kind: parentCompletionKind,
|
|
143
|
+
};
|
|
144
|
+
parentCompletion.label = parentCompletion.label || completionItem.label;
|
|
145
|
+
parentCompletion.parent.insertTexts = [completionItem.insertText];
|
|
146
|
+
result.items.push(parentCompletion);
|
|
173
147
|
}
|
|
174
|
-
|
|
175
|
-
|
|
148
|
+
else {
|
|
149
|
+
// add to the existing parent
|
|
150
|
+
parentCompletion.parent.insertTexts.push(completionItem.insertText);
|
|
176
151
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
152
|
+
};
|
|
153
|
+
const isForParentCompletion = !!completionItem.parent;
|
|
154
|
+
let label = completionItem.label;
|
|
155
|
+
if (!label) {
|
|
156
|
+
// we receive not valid CompletionItem as `label` is mandatory field, so just ignore it
|
|
157
|
+
console.warn(`Ignoring CompletionItem without label: ${JSON.stringify(completionItem)}`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (!(0, objects_1.isString)(label)) {
|
|
161
|
+
label = String(label);
|
|
162
|
+
}
|
|
163
|
+
label = label.replace(/[\n]/g, '↵');
|
|
164
|
+
if (label.length > 60) {
|
|
165
|
+
const shortendedLabel = label.substr(0, 57).trim() + '...';
|
|
166
|
+
if (!proposed[shortendedLabel]) {
|
|
167
|
+
label = shortendedLabel;
|
|
181
168
|
}
|
|
182
|
-
|
|
183
|
-
|
|
169
|
+
}
|
|
170
|
+
// trim $1 from end of completion
|
|
171
|
+
if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
|
|
172
|
+
completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
|
|
173
|
+
}
|
|
174
|
+
if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
|
|
175
|
+
completionItem.textEdit = vscode_languageserver_types_1.TextEdit.replace(overwriteRange, completionItem.insertText);
|
|
176
|
+
}
|
|
177
|
+
completionItem.label = label;
|
|
178
|
+
if (isForParentCompletion) {
|
|
179
|
+
addSuggestionForParent(completionItem);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (this.arrayPrefixIndentation) {
|
|
183
|
+
this.updateCompletionText(completionItem, this.arrayPrefixIndentation + completionItem.insertText);
|
|
184
|
+
}
|
|
185
|
+
const existing = proposed[label];
|
|
186
|
+
const isInsertTextDifferent = existing?.label !== existingProposeItem && existing?.insertText !== completionItem.insertText;
|
|
187
|
+
if (!existing) {
|
|
188
|
+
proposed[label] = completionItem;
|
|
189
|
+
result.items.push(completionItem);
|
|
190
|
+
}
|
|
191
|
+
else if (isInsertTextDifferent) {
|
|
192
|
+
// try to merge simple insert values
|
|
193
|
+
const mergedText = this.mergeSimpleInsertTexts(label, existing.insertText, completionItem.insertText, oneOfSchema);
|
|
194
|
+
if (mergedText) {
|
|
195
|
+
this.updateCompletionText(existing, mergedText);
|
|
184
196
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if (!existing) {
|
|
197
|
+
else {
|
|
198
|
+
// add to result when it wasn't able to merge (even if the item is already there but with a different value)
|
|
188
199
|
proposed[label] = completionItem;
|
|
189
200
|
result.items.push(completionItem);
|
|
190
201
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
202
|
+
}
|
|
203
|
+
if (existing && !existing.documentation && completionItem.documentation) {
|
|
204
|
+
existing.documentation = completionItem.documentation;
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
error: (message) => {
|
|
208
|
+
this.telemetry.sendError('yaml.completion.error', { error: (0, objects_1.convertErrorToTelemetryMsg)(message) });
|
|
209
|
+
},
|
|
210
|
+
log: (message) => {
|
|
211
|
+
console.log(message);
|
|
212
|
+
},
|
|
213
|
+
getNumberOfProposals: () => {
|
|
214
|
+
return result.items.length;
|
|
215
|
+
},
|
|
216
|
+
result,
|
|
217
|
+
};
|
|
218
|
+
if (this.customTags.length > 0) {
|
|
219
|
+
this.getCustomTagValueCompletions(collector);
|
|
220
|
+
}
|
|
221
|
+
if (lineContent.endsWith('\n')) {
|
|
222
|
+
lineContent = lineContent.substr(0, lineContent.length - 1);
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
const schema = await this.schemaService.getSchemaForResource(document.uri, currentDoc);
|
|
226
|
+
if (!schema || schema.errors.length) {
|
|
227
|
+
if (position.line === 0 && position.character === 0 && !(0, modelineUtil_1.isModeline)(lineContent)) {
|
|
228
|
+
const inlineSchemaCompletion = {
|
|
229
|
+
kind: vscode_languageserver_types_1.CompletionItemKind.Text,
|
|
230
|
+
label: 'Inline schema',
|
|
231
|
+
insertText: '# yaml-language-server: $schema=',
|
|
232
|
+
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.PlainText,
|
|
233
|
+
};
|
|
234
|
+
result.items.push(inlineSchemaCompletion);
|
|
235
|
+
}
|
|
222
236
|
}
|
|
223
|
-
|
|
224
|
-
const
|
|
225
|
-
if (
|
|
226
|
-
|
|
227
|
-
const
|
|
228
|
-
kind: vscode_languageserver_types_1.CompletionItemKind.
|
|
229
|
-
label:
|
|
230
|
-
|
|
237
|
+
if ((0, modelineUtil_1.isModeline)(lineContent) || (0, astUtils_1.isInComment)(doc.tokens, offset)) {
|
|
238
|
+
const schemaIndex = lineContent.indexOf('$schema=');
|
|
239
|
+
if (schemaIndex !== -1 && schemaIndex + '$schema='.length <= position.character) {
|
|
240
|
+
this.schemaService.getAllSchemas().forEach((schema) => {
|
|
241
|
+
const schemaIdCompletion = {
|
|
242
|
+
kind: vscode_languageserver_types_1.CompletionItemKind.Constant,
|
|
243
|
+
label: schema.name ?? schema.uri,
|
|
244
|
+
detail: schema.description,
|
|
245
|
+
insertText: schema.uri,
|
|
231
246
|
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.PlainText,
|
|
247
|
+
insertTextMode: vscode_languageserver_types_1.InsertTextMode.asIs,
|
|
232
248
|
};
|
|
233
|
-
result.items.push(
|
|
234
|
-
}
|
|
249
|
+
result.items.push(schemaIdCompletion);
|
|
250
|
+
});
|
|
235
251
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
return result;
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
if (!schema || schema.errors.length) {
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
let currentProperty = null;
|
|
258
|
+
if (!node) {
|
|
259
|
+
if (!currentDoc.internalDocument.contents || (0, yaml_1.isScalar)(currentDoc.internalDocument.contents)) {
|
|
260
|
+
const map = currentDoc.internalDocument.createNode({});
|
|
261
|
+
map.range = [offset, offset + 1, offset + 1];
|
|
262
|
+
currentDoc.internalDocument.contents = map;
|
|
263
|
+
// eslint-disable-next-line no-self-assign
|
|
264
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
265
|
+
node = map;
|
|
253
266
|
}
|
|
254
|
-
|
|
255
|
-
|
|
267
|
+
else {
|
|
268
|
+
node = currentDoc.findClosestNode(offset, textBuffer);
|
|
269
|
+
foundByClosest = true;
|
|
256
270
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
currentDoc.internalDocument.contents = map;
|
|
263
|
-
// eslint-disable-next-line no-self-assign
|
|
264
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
265
|
-
node = map;
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
node = currentDoc.findClosestNode(offset, textBuffer);
|
|
269
|
-
foundByClosest = true;
|
|
270
|
-
}
|
|
271
|
+
}
|
|
272
|
+
const originalNode = node;
|
|
273
|
+
if (node) {
|
|
274
|
+
if (lineContent.length === 0) {
|
|
275
|
+
node = currentDoc.internalDocument.contents;
|
|
271
276
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
if (
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
const parentParent = currentDoc.getParent(parent);
|
|
287
|
-
if ((0, yaml_1.isSeq)(currentDoc.internalDocument.contents)) {
|
|
288
|
-
const index = (0, astUtils_1.indexOf)(currentDoc.internalDocument.contents, parent);
|
|
289
|
-
if (typeof index === 'number') {
|
|
290
|
-
currentDoc.internalDocument.set(index, map);
|
|
291
|
-
// eslint-disable-next-line no-self-assign
|
|
292
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
else if (parentParent && ((0, yaml_1.isMap)(parentParent) || (0, yaml_1.isSeq)(parentParent))) {
|
|
296
|
-
parentParent.set(parent.key, map);
|
|
297
|
-
// eslint-disable-next-line no-self-assign
|
|
298
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
currentDoc.internalDocument.set(parent.key, map);
|
|
277
|
+
else {
|
|
278
|
+
const parent = currentDoc.getParent(node);
|
|
279
|
+
if (parent) {
|
|
280
|
+
if ((0, yaml_1.isScalar)(node)) {
|
|
281
|
+
if (node.value) {
|
|
282
|
+
if ((0, yaml_1.isPair)(parent)) {
|
|
283
|
+
if (parent.value === node) {
|
|
284
|
+
if (lineContent.trim().length > 0 && lineContent.indexOf(':') < 0) {
|
|
285
|
+
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
286
|
+
const parentParent = currentDoc.getParent(parent);
|
|
287
|
+
if ((0, yaml_1.isSeq)(currentDoc.internalDocument.contents)) {
|
|
288
|
+
const index = (0, astUtils_1.indexOf)(currentDoc.internalDocument.contents, parent);
|
|
289
|
+
if (typeof index === 'number') {
|
|
290
|
+
currentDoc.internalDocument.set(index, map);
|
|
302
291
|
// eslint-disable-next-line no-self-assign
|
|
303
292
|
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
304
293
|
}
|
|
305
|
-
currentProperty = map.items[0];
|
|
306
|
-
node = map;
|
|
307
294
|
}
|
|
308
|
-
else if (
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
295
|
+
else if (parentParent && ((0, yaml_1.isMap)(parentParent) || (0, yaml_1.isSeq)(parentParent))) {
|
|
296
|
+
parentParent.set(parent.key, map);
|
|
297
|
+
// eslint-disable-next-line no-self-assign
|
|
298
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
currentDoc.internalDocument.set(parent.key, map);
|
|
302
|
+
// eslint-disable-next-line no-self-assign
|
|
303
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
313
304
|
}
|
|
305
|
+
currentProperty = map.items[0];
|
|
306
|
+
node = map;
|
|
314
307
|
}
|
|
315
|
-
else if (
|
|
308
|
+
else if (lineContent.trim().length === 0) {
|
|
316
309
|
const parentParent = currentDoc.getParent(parent);
|
|
317
|
-
currentProperty = parent;
|
|
318
310
|
if (parentParent) {
|
|
319
311
|
node = parentParent;
|
|
320
312
|
}
|
|
321
313
|
}
|
|
322
314
|
}
|
|
323
|
-
else if (
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
// eslint-disable-next-line no-self-assign
|
|
329
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
330
|
-
node = map;
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
node = parent;
|
|
315
|
+
else if (parent.key === node) {
|
|
316
|
+
const parentParent = currentDoc.getParent(parent);
|
|
317
|
+
currentProperty = parent;
|
|
318
|
+
if (parentParent) {
|
|
319
|
+
node = parentParent;
|
|
334
320
|
}
|
|
335
321
|
}
|
|
336
322
|
}
|
|
337
|
-
else if (
|
|
338
|
-
if (
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
323
|
+
else if ((0, yaml_1.isSeq)(parent)) {
|
|
324
|
+
if (lineContent.trim().length > 0) {
|
|
325
|
+
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
326
|
+
parent.delete(node);
|
|
327
|
+
parent.add(map);
|
|
328
|
+
// eslint-disable-next-line no-self-assign
|
|
329
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
330
|
+
node = map;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
node = parent;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else if (node.value === null) {
|
|
338
|
+
if ((0, yaml_1.isPair)(parent)) {
|
|
339
|
+
if (parent.key === node) {
|
|
340
|
+
node = parent;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
if ((0, yaml_1.isNode)(parent.key) && parent.key.range) {
|
|
344
|
+
const parentParent = currentDoc.getParent(parent);
|
|
345
|
+
if (foundByClosest && parentParent && (0, yaml_1.isMap)(parentParent) && (0, astUtils_1.isMapContainsEmptyPair)(parentParent)) {
|
|
346
|
+
node = parentParent;
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
const parentPosition = document.positionAt(parent.key.range[0]);
|
|
350
|
+
//if cursor has bigger indentation that parent key, then we need to complete new empty object
|
|
351
|
+
if (position.character > parentPosition.character && position.line !== parentPosition.line) {
|
|
352
|
+
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
353
|
+
if (parentParent && ((0, yaml_1.isMap)(parentParent) || (0, yaml_1.isSeq)(parentParent))) {
|
|
354
|
+
parentParent.set(parent.key, map);
|
|
355
|
+
// eslint-disable-next-line no-self-assign
|
|
356
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
365
357
|
}
|
|
366
|
-
else
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
358
|
+
else {
|
|
359
|
+
currentDoc.internalDocument.set(parent.key, map);
|
|
360
|
+
// eslint-disable-next-line no-self-assign
|
|
361
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
362
|
+
}
|
|
363
|
+
currentProperty = map.items[0];
|
|
364
|
+
node = map;
|
|
365
|
+
}
|
|
366
|
+
else if (parentPosition.character === position.character) {
|
|
367
|
+
if (parentParent) {
|
|
368
|
+
node = parentParent;
|
|
370
369
|
}
|
|
371
370
|
}
|
|
372
371
|
}
|
|
373
372
|
}
|
|
374
373
|
}
|
|
375
|
-
else if ((0, yaml_1.isSeq)(parent)) {
|
|
376
|
-
if (lineContent.charAt(position.character - 1) !== '-') {
|
|
377
|
-
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
378
|
-
parent.delete(node);
|
|
379
|
-
parent.add(map);
|
|
380
|
-
// eslint-disable-next-line no-self-assign
|
|
381
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
382
|
-
node = map;
|
|
383
|
-
}
|
|
384
|
-
else if (lineContent.charAt(position.character - 1) === '-') {
|
|
385
|
-
const map = this.createTempObjNode('', node, currentDoc);
|
|
386
|
-
parent.delete(node);
|
|
387
|
-
parent.add(map);
|
|
388
|
-
// eslint-disable-next-line no-self-assign
|
|
389
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
390
|
-
node = map;
|
|
391
|
-
}
|
|
392
|
-
else {
|
|
393
|
-
node = parent;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
374
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
375
|
+
else if ((0, yaml_1.isSeq)(parent)) {
|
|
376
|
+
if (lineContent.charAt(position.character - 1) !== '-') {
|
|
377
|
+
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
378
|
+
parent.delete(node);
|
|
379
|
+
parent.add(map);
|
|
380
|
+
// eslint-disable-next-line no-self-assign
|
|
381
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
382
|
+
node = map;
|
|
383
|
+
}
|
|
384
|
+
else if (lineContent.charAt(position.character - 1) === '-') {
|
|
385
|
+
const map = this.createTempObjNode('', node, currentDoc);
|
|
386
|
+
parent.delete(node);
|
|
387
|
+
parent.add(map);
|
|
388
|
+
// eslint-disable-next-line no-self-assign
|
|
389
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
390
|
+
node = map;
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
402
393
|
node = parent;
|
|
403
394
|
}
|
|
404
395
|
}
|
|
405
396
|
}
|
|
406
397
|
}
|
|
407
|
-
else if ((0, yaml_1.
|
|
398
|
+
else if ((0, yaml_1.isMap)(node)) {
|
|
399
|
+
if (!foundByClosest && lineContent.trim().length === 0 && (0, yaml_1.isSeq)(parent)) {
|
|
400
|
+
const nextLine = textBuffer.getLineContent(position.line + 1);
|
|
401
|
+
if (textBuffer.getLineCount() === position.line + 1 || nextLine.trim().length === 0) {
|
|
402
|
+
node = parent;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else if ((0, yaml_1.isScalar)(node)) {
|
|
408
|
+
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
409
|
+
currentDoc.internalDocument.contents = map;
|
|
410
|
+
// eslint-disable-next-line no-self-assign
|
|
411
|
+
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
412
|
+
currentProperty = map.items[0];
|
|
413
|
+
node = map;
|
|
414
|
+
}
|
|
415
|
+
else if ((0, yaml_1.isMap)(node)) {
|
|
416
|
+
for (const pair of node.items) {
|
|
417
|
+
if ((0, yaml_1.isNode)(pair.value) && pair.value.range && pair.value.range[0] === offset + 1) {
|
|
418
|
+
node = pair.value;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
else if ((0, yaml_1.isSeq)(node)) {
|
|
423
|
+
if (lineContent.charAt(position.character - 1) !== '-') {
|
|
408
424
|
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
409
|
-
|
|
425
|
+
map.items = [];
|
|
410
426
|
// eslint-disable-next-line no-self-assign
|
|
411
427
|
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
412
|
-
currentProperty = map.items[0];
|
|
413
|
-
node = map;
|
|
414
|
-
}
|
|
415
|
-
else if ((0, yaml_1.isMap)(node)) {
|
|
416
428
|
for (const pair of node.items) {
|
|
417
|
-
if ((0, yaml_1.
|
|
418
|
-
|
|
429
|
+
if ((0, yaml_1.isMap)(pair)) {
|
|
430
|
+
pair.items.forEach((value) => {
|
|
431
|
+
map.items.push(value);
|
|
432
|
+
});
|
|
419
433
|
}
|
|
420
434
|
}
|
|
435
|
+
node = map;
|
|
421
436
|
}
|
|
422
437
|
}
|
|
423
438
|
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
439
|
+
}
|
|
440
|
+
// completion for object keys
|
|
441
|
+
if (node && (0, yaml_1.isMap)(node)) {
|
|
442
|
+
// don't suggest properties that are already present
|
|
443
|
+
const properties = node.items;
|
|
444
|
+
for (const p of properties) {
|
|
445
|
+
if (!currentProperty || currentProperty !== p) {
|
|
446
|
+
if ((0, yaml_1.isScalar)(p.key)) {
|
|
447
|
+
proposed[p.key.value + ''] = vscode_languageserver_types_1.CompletionItem.create(existingProposeItem);
|
|
433
448
|
}
|
|
434
449
|
}
|
|
435
|
-
this.addPropertyCompletions(schema, currentDoc, node, originalNode, '', collector, textBuffer, overwriteRange, doComplete);
|
|
436
|
-
if (!schema && currentWord.length > 0 && text.charAt(offset - currentWord.length - 1) !== '"') {
|
|
437
|
-
collector.add({
|
|
438
|
-
kind: vscode_languageserver_types_1.CompletionItemKind.Property,
|
|
439
|
-
label: currentWord,
|
|
440
|
-
insertText: this.getInsertTextForProperty(currentWord, null, ''),
|
|
441
|
-
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
442
|
-
});
|
|
443
|
-
}
|
|
444
450
|
}
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
+
this.addPropertyCompletions(schema, currentDoc, node, originalNode, '', collector, textBuffer, overwriteRange, doComplete);
|
|
452
|
+
if (!schema && currentWord.length > 0 && text.charAt(offset - currentWord.length - 1) !== '"') {
|
|
453
|
+
collector.add({
|
|
454
|
+
kind: vscode_languageserver_types_1.CompletionItemKind.Property,
|
|
455
|
+
label: currentWord,
|
|
456
|
+
insertText: this.getInsertTextForProperty(currentWord, null, ''),
|
|
457
|
+
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
451
460
|
}
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
461
|
+
// proposals for values
|
|
462
|
+
const types = {};
|
|
463
|
+
this.getValueCompletions(schema, currentDoc, node, offset, document, collector, types, doComplete);
|
|
464
|
+
}
|
|
465
|
+
catch (err) {
|
|
466
|
+
this.telemetry.sendError('yaml.completion.error', { error: (0, objects_1.convertErrorToTelemetryMsg)(err) });
|
|
467
|
+
}
|
|
468
|
+
this.finalizeParentCompletion(result);
|
|
469
|
+
const uniqueItems = result.items.filter((arr, index, self) => index ===
|
|
470
|
+
self.findIndex((item) => item.label === arr.label && item.insertText === arr.insertText && item.kind === arr.kind));
|
|
471
|
+
if (uniqueItems?.length > 0) {
|
|
472
|
+
result.items = uniqueItems;
|
|
473
|
+
}
|
|
474
|
+
return result;
|
|
455
475
|
}
|
|
456
476
|
updateCompletionText(completionItem, text) {
|
|
457
477
|
completionItem.insertText = text;
|
|
@@ -459,11 +479,22 @@ class YamlCompletion {
|
|
|
459
479
|
completionItem.textEdit.newText = text;
|
|
460
480
|
}
|
|
461
481
|
}
|
|
462
|
-
mergeSimpleInsertTexts(label, existingText, addingText) {
|
|
482
|
+
mergeSimpleInsertTexts(label, existingText, addingText, oneOfSchema) {
|
|
463
483
|
const containsNewLineAfterColon = (value) => {
|
|
464
484
|
return value.includes('\n');
|
|
465
485
|
};
|
|
486
|
+
const startWithNewLine = (value) => {
|
|
487
|
+
return value.startsWith('\n');
|
|
488
|
+
};
|
|
489
|
+
const isNullObject = (value) => {
|
|
490
|
+
const index = value.indexOf('\n');
|
|
491
|
+
return index > 0 && value.substring(index, value.length).trim().length === 0;
|
|
492
|
+
};
|
|
466
493
|
if (containsNewLineAfterColon(existingText) || containsNewLineAfterColon(addingText)) {
|
|
494
|
+
//if the exisiting object null one then replace with the non-null object
|
|
495
|
+
if (oneOfSchema && isNullObject(existingText) && !isNullObject(addingText) && !startWithNewLine(addingText)) {
|
|
496
|
+
return addingText;
|
|
497
|
+
}
|
|
467
498
|
return undefined;
|
|
468
499
|
}
|
|
469
500
|
const existingValues = this.getValuesFromInsertText(existingText);
|
|
@@ -544,7 +575,6 @@ class YamlCompletion {
|
|
|
544
575
|
return map;
|
|
545
576
|
}
|
|
546
577
|
addPropertyCompletions(schema, doc, node, originalNode, separatorAfter, collector, textBuffer, overwriteRange, doComplete) {
|
|
547
|
-
var _a, _b;
|
|
548
578
|
const matchingSchemas = doc.getMatchingSchemas(schema.schema, -1, null, doComplete);
|
|
549
579
|
const existingKey = textBuffer.getText(overwriteRange);
|
|
550
580
|
const lineContent = textBuffer.getLineContent(overwriteRange.start.line);
|
|
@@ -553,8 +583,19 @@ class YamlCompletion {
|
|
|
553
583
|
const isInArray = lineContent.trimLeft().indexOf('-') === 0;
|
|
554
584
|
const nodeParent = doc.getParent(node);
|
|
555
585
|
const matchOriginal = matchingSchemas.find((it) => it.node.internalNode === originalNode && it.schema.properties);
|
|
586
|
+
const oneOfSchema = matchingSchemas.filter((schema) => schema.schema.oneOf).map((oneOfSchema) => oneOfSchema.schema.oneOf)[0];
|
|
587
|
+
let didOneOfSchemaMatches = false;
|
|
588
|
+
if (oneOfSchema?.length < matchingSchemas.length) {
|
|
589
|
+
oneOfSchema?.forEach((property, index) => {
|
|
590
|
+
if (!matchingSchemas[index]?.schema.oneOf && matchingSchemas[index]?.schema.properties === property.properties) {
|
|
591
|
+
didOneOfSchemaMatches = true;
|
|
592
|
+
}
|
|
593
|
+
});
|
|
594
|
+
}
|
|
556
595
|
for (const schema of matchingSchemas) {
|
|
557
|
-
if (((schema.node.internalNode === node && !matchOriginal) ||
|
|
596
|
+
if (((schema.node.internalNode === node && !matchOriginal) ||
|
|
597
|
+
(schema.node.internalNode === originalNode && !hasColon) ||
|
|
598
|
+
(schema.node.parent?.internalNode === originalNode && !hasColon)) &&
|
|
558
599
|
!schema.inverted) {
|
|
559
600
|
this.collectDefaultSnippets(schema.schema, separatorAfter, collector, {
|
|
560
601
|
newLineFirst: false,
|
|
@@ -597,18 +638,10 @@ class YamlCompletion {
|
|
|
597
638
|
textBuffer.getPosition(it.key.range[2]).line === overwriteRange.end.line - 1)) &&
|
|
598
639
|
pair) {
|
|
599
640
|
if (Array.isArray(propertySchema.items)) {
|
|
600
|
-
this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {});
|
|
641
|
+
this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {}, 'property');
|
|
601
642
|
}
|
|
602
643
|
else if (typeof propertySchema.items === 'object' && propertySchema.items.type === 'object') {
|
|
603
|
-
|
|
604
|
-
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${propertySchema.description ? ' (' + propertySchema.description + ')' : ''}`, insertText);
|
|
605
|
-
collector.add({
|
|
606
|
-
kind: this.getSuggestionKind(propertySchema.items.type),
|
|
607
|
-
label: '- (array item)',
|
|
608
|
-
documentation,
|
|
609
|
-
insertText,
|
|
610
|
-
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
611
|
-
});
|
|
644
|
+
this.addArrayItemValueCompletion(propertySchema.items, separatorAfter, collector);
|
|
612
645
|
}
|
|
613
646
|
}
|
|
614
647
|
let insertText = key;
|
|
@@ -617,7 +650,7 @@ class YamlCompletion {
|
|
|
617
650
|
}
|
|
618
651
|
const isNodeNull = ((0, yaml_1.isScalar)(originalNode) && originalNode.value === null) ||
|
|
619
652
|
((0, yaml_1.isMap)(originalNode) && originalNode.items.length === 0);
|
|
620
|
-
const existsParentCompletion =
|
|
653
|
+
const existsParentCompletion = schema.schema.required?.length > 0;
|
|
621
654
|
if (!this.parentSkeletonSelectedFirst || !isNodeNull || !existsParentCompletion) {
|
|
622
655
|
collector.add({
|
|
623
656
|
kind: vscode_languageserver_types_1.CompletionItemKind.Property,
|
|
@@ -625,10 +658,10 @@ class YamlCompletion {
|
|
|
625
658
|
insertText,
|
|
626
659
|
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
627
660
|
documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
|
|
628
|
-
});
|
|
661
|
+
}, didOneOfSchemaMatches);
|
|
629
662
|
}
|
|
630
663
|
// if the prop is required add it also to parent suggestion
|
|
631
|
-
if (
|
|
664
|
+
if (schema.schema.required?.includes(key)) {
|
|
632
665
|
collector.add({
|
|
633
666
|
label: key,
|
|
634
667
|
insertText: this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation),
|
|
@@ -650,8 +683,8 @@ class YamlCompletion {
|
|
|
650
683
|
// test:
|
|
651
684
|
// - item1
|
|
652
685
|
// it will treated as a property key since `:` has been appended
|
|
653
|
-
if (nodeParent && (0, yaml_1.isSeq)(nodeParent) && schema.schema
|
|
654
|
-
this.addSchemaValueCompletions(schema.schema, separatorAfter, collector, {}, Array.isArray(nodeParent.items));
|
|
686
|
+
if (nodeParent && (0, yaml_1.isSeq)(nodeParent) && (0, schemaUtils_1.isPrimitiveType)(schema.schema)) {
|
|
687
|
+
this.addSchemaValueCompletions(schema.schema, separatorAfter, collector, {}, 'property', Array.isArray(nodeParent.items));
|
|
655
688
|
}
|
|
656
689
|
if (schema.schema.propertyNames && schema.schema.additionalProperties && schema.schema.type === 'object') {
|
|
657
690
|
const propertyNameSchema = (0, jsonParser07_1.asSchema)(schema.schema.propertyNames);
|
|
@@ -691,7 +724,7 @@ class YamlCompletion {
|
|
|
691
724
|
node = doc.getParent(node);
|
|
692
725
|
}
|
|
693
726
|
if (!node) {
|
|
694
|
-
this.addSchemaValueCompletions(schema.schema, '', collector, types);
|
|
727
|
+
this.addSchemaValueCompletions(schema.schema, '', collector, types, 'value');
|
|
695
728
|
return;
|
|
696
729
|
}
|
|
697
730
|
if ((0, yaml_1.isPair)(node)) {
|
|
@@ -717,54 +750,26 @@ class YamlCompletion {
|
|
|
717
750
|
if (Array.isArray(s.schema.items)) {
|
|
718
751
|
const index = this.findItemAtOffset(node, document, offset);
|
|
719
752
|
if (index < s.schema.items.length) {
|
|
720
|
-
this.addSchemaValueCompletions(s.schema.items[index], separatorAfter, collector, types);
|
|
753
|
+
this.addSchemaValueCompletions(s.schema.items[index], separatorAfter, collector, types, 'value');
|
|
721
754
|
}
|
|
722
755
|
}
|
|
723
|
-
else if (typeof s.schema.items === 'object' &&
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
collector.add({
|
|
727
|
-
kind: this.getSuggestionKind(s.schema.items.type),
|
|
728
|
-
label: '- (array item)',
|
|
729
|
-
documentation,
|
|
730
|
-
insertText,
|
|
731
|
-
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
732
|
-
});
|
|
733
|
-
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
|
|
734
|
-
}
|
|
735
|
-
else if (typeof s.schema.items === 'object' && s.schema.items.anyOf) {
|
|
736
|
-
s.schema.items.anyOf
|
|
737
|
-
.filter((i) => typeof i === 'object')
|
|
738
|
-
.forEach((i, index) => {
|
|
739
|
-
const schemaType = (0, schemaUtils_1.getSchemaTypeName)(i);
|
|
740
|
-
const insertText = `- ${this.getInsertTextForObject(i, separatorAfter).insertText.trimLeft()}`;
|
|
741
|
-
//append insertText to documentation
|
|
742
|
-
const schemaTypeTitle = schemaType ? ' type `' + schemaType + '`' : '';
|
|
743
|
-
const schemaDescription = s.schema.description ? ' (' + s.schema.description + ')' : '';
|
|
744
|
-
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${schemaTypeTitle}${schemaDescription}`, insertText);
|
|
745
|
-
collector.add({
|
|
746
|
-
kind: this.getSuggestionKind(i.type),
|
|
747
|
-
label: '- (array item) ' + (schemaType || index + 1),
|
|
748
|
-
documentation: documentation,
|
|
749
|
-
insertText: insertText,
|
|
750
|
-
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
751
|
-
});
|
|
752
|
-
});
|
|
753
|
-
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
|
|
756
|
+
else if (typeof s.schema.items === 'object' &&
|
|
757
|
+
(s.schema.items.type === 'object' || (0, schemaUtils_1.isAnyOfAllOfOneOfType)(s.schema.items))) {
|
|
758
|
+
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types, 'value', true);
|
|
754
759
|
}
|
|
755
760
|
else {
|
|
756
|
-
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
|
|
761
|
+
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types, 'value');
|
|
757
762
|
}
|
|
758
763
|
}
|
|
759
764
|
}
|
|
760
765
|
if (s.schema.properties) {
|
|
761
766
|
const propertySchema = s.schema.properties[parentKey];
|
|
762
767
|
if (propertySchema) {
|
|
763
|
-
this.addSchemaValueCompletions(propertySchema, separatorAfter, collector, types);
|
|
768
|
+
this.addSchemaValueCompletions(propertySchema, separatorAfter, collector, types, 'value');
|
|
764
769
|
}
|
|
765
770
|
}
|
|
766
771
|
else if (s.schema.additionalProperties) {
|
|
767
|
-
this.addSchemaValueCompletions(s.schema.additionalProperties, separatorAfter, collector, types);
|
|
772
|
+
this.addSchemaValueCompletions(s.schema.additionalProperties, separatorAfter, collector, types, 'value');
|
|
768
773
|
}
|
|
769
774
|
}
|
|
770
775
|
}
|
|
@@ -777,6 +782,21 @@ class YamlCompletion {
|
|
|
777
782
|
}
|
|
778
783
|
}
|
|
779
784
|
}
|
|
785
|
+
addArrayItemValueCompletion(schema, separatorAfter, collector, index) {
|
|
786
|
+
const schemaType = (0, schemaUtils_1.getSchemaTypeName)(schema);
|
|
787
|
+
const insertText = `- ${this.getInsertTextForObject(schema, separatorAfter).insertText.trimLeft()}`;
|
|
788
|
+
//append insertText to documentation
|
|
789
|
+
const schemaTypeTitle = schemaType ? ' type `' + schemaType + '`' : '';
|
|
790
|
+
const schemaDescription = schema.description ? ' (' + schema.description + ')' : '';
|
|
791
|
+
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${schemaTypeTitle}${schemaDescription}`, insertText);
|
|
792
|
+
collector.add({
|
|
793
|
+
kind: this.getSuggestionKind(schema.type),
|
|
794
|
+
label: '- (array item) ' + (schemaType || index),
|
|
795
|
+
documentation: documentation,
|
|
796
|
+
insertText: insertText,
|
|
797
|
+
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
798
|
+
});
|
|
799
|
+
}
|
|
780
800
|
getInsertTextForProperty(key, propertySchema, separatorAfter, indent = this.indentation) {
|
|
781
801
|
const propertyText = this.getInsertTextForValue(key, '', 'string');
|
|
782
802
|
const resultText = propertyText + ':';
|
|
@@ -947,7 +967,9 @@ class YamlCompletion {
|
|
|
947
967
|
case 'boolean':
|
|
948
968
|
case 'number':
|
|
949
969
|
case 'integer':
|
|
950
|
-
insertText += `${indent}${
|
|
970
|
+
insertText += `${indent}${
|
|
971
|
+
//added quote if key is null
|
|
972
|
+
key === 'null' ? this.getInsertTextForValue(key, '', 'string') : key}: \${${insertIndex++}:${propertySchema.default}}\n`;
|
|
951
973
|
break;
|
|
952
974
|
case 'string':
|
|
953
975
|
insertText += `${indent}${key}: \${${insertIndex++}:${convertToStringValue(propertySchema.default)}}\n`;
|
|
@@ -1076,24 +1098,28 @@ class YamlCompletion {
|
|
|
1076
1098
|
}
|
|
1077
1099
|
return this.getInsertTextForPlainText(value + separatorAfter);
|
|
1078
1100
|
}
|
|
1079
|
-
addSchemaValueCompletions(schema, separatorAfter, collector, types, isArray) {
|
|
1101
|
+
addSchemaValueCompletions(schema, separatorAfter, collector, types, completionType, isArray) {
|
|
1080
1102
|
if (typeof schema === 'object') {
|
|
1081
1103
|
this.addEnumValueCompletions(schema, separatorAfter, collector, isArray);
|
|
1082
1104
|
this.addDefaultValueCompletions(schema, separatorAfter, collector);
|
|
1083
1105
|
this.collectTypes(schema, types);
|
|
1106
|
+
if (isArray && completionType === 'value' && !(0, schemaUtils_1.isAnyOfAllOfOneOfType)(schema)) {
|
|
1107
|
+
// add array only for final types (no anyOf, allOf, oneOf)
|
|
1108
|
+
this.addArrayItemValueCompletion(schema, separatorAfter, collector);
|
|
1109
|
+
}
|
|
1084
1110
|
if (Array.isArray(schema.allOf)) {
|
|
1085
1111
|
schema.allOf.forEach((s) => {
|
|
1086
|
-
return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
|
|
1112
|
+
return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
|
|
1087
1113
|
});
|
|
1088
1114
|
}
|
|
1089
1115
|
if (Array.isArray(schema.anyOf)) {
|
|
1090
1116
|
schema.anyOf.forEach((s) => {
|
|
1091
|
-
return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
|
|
1117
|
+
return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
|
|
1092
1118
|
});
|
|
1093
1119
|
}
|
|
1094
1120
|
if (Array.isArray(schema.oneOf)) {
|
|
1095
1121
|
schema.oneOf.forEach((s) => {
|
|
1096
|
-
return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
|
|
1122
|
+
return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
|
|
1097
1123
|
});
|
|
1098
1124
|
}
|
|
1099
1125
|
}
|
|
@@ -1266,7 +1292,7 @@ class YamlCompletion {
|
|
|
1266
1292
|
}
|
|
1267
1293
|
return value;
|
|
1268
1294
|
};
|
|
1269
|
-
return (0, json_1.stringifyObject)(value, '', replacer,
|
|
1295
|
+
return (0, json_1.stringifyObject)(value, '', replacer, { ...settings, indentation: this.indentation }, depth) + separatorAfter;
|
|
1270
1296
|
}
|
|
1271
1297
|
addBooleanValueCompletion(value, separatorAfter, collector) {
|
|
1272
1298
|
collector.add({
|
|
@@ -1434,8 +1460,7 @@ function convertToStringValue(param) {
|
|
|
1434
1460
|
* simplify `{$1:value}` to `value`
|
|
1435
1461
|
*/
|
|
1436
1462
|
function evaluateTab1Symbol(value) {
|
|
1437
|
-
|
|
1438
|
-
return result;
|
|
1463
|
+
return value.replace(/\$\{1:(.*)\}/, '$1');
|
|
1439
1464
|
}
|
|
1440
1465
|
function isParentCompletionItem(item) {
|
|
1441
1466
|
return 'parent' in item;
|