yaml-language-server 1.10.1-e564235.0 → 1.11.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 +24 -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 +17 -1
- package/lib/esm/languageservice/parser/jsonParser07.js +66 -24
- 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 +4 -3
- package/lib/esm/languageservice/services/yamlCompletion.js +444 -418
- 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/yamlHover.js +40 -0
- package/lib/esm/languageservice/services/yamlHover.js.map +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 +10 -7
- 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 -4
- 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 +17 -1
- package/lib/umd/languageservice/parser/jsonParser07.js +67 -25
- 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 +4 -3
- package/lib/umd/languageservice/services/yamlCompletion.js +443 -417
- 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/yamlHover.js +40 -0
- package/lib/umd/languageservice/services/yamlHover.js.map +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 +13 -8
- 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 -3
- 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 +17 -1
- package/out/server/src/languageservice/parser/jsonParser07.js +66 -24
- 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 +4 -3
- package/out/server/src/languageservice/services/yamlCompletion.js +443 -417
- 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/yamlHover.js +40 -0
- package/out/server/src/languageservice/services/yamlHover.js.map +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 +13 -8
- 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 -3
- 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 +380 -119
- 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 +138 -68
- 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 +247 -94
- 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 +34 -31
- 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 +10 -9
|
@@ -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,408 +40,438 @@ class YamlCompletion {
|
|
|
49
40
|
this.disableDefaultProperties = languageSettings.disableDefaultProperties;
|
|
50
41
|
this.parentSkeletonSelectedFirst = languageSettings.parentSkeletonSelectedFirst;
|
|
51
42
|
}
|
|
52
|
-
doComplete(document, position, isKubernetes = false) {
|
|
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
|
-
const nodeStartPos = document.positionAt(node.range[0]);
|
|
99
|
-
nodeStartPos.character += 1;
|
|
100
|
-
const nodeEndPos = document.positionAt(node.range[2]);
|
|
101
|
-
nodeEndPos.character += 1;
|
|
102
|
-
overwriteRange = vscode_languageserver_types_1.Range.create(nodeStartPos, nodeEndPos);
|
|
103
|
-
}
|
|
104
|
-
else if (node && (0, yaml_1.isScalar)(node) && node.value) {
|
|
105
|
-
const start = document.positionAt(node.range[0]);
|
|
106
|
-
if (offset > 0 && start.character > 0 && text.charAt(offset - 1) === '-') {
|
|
107
|
-
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));
|
|
108
89
|
}
|
|
109
|
-
overwriteRange = vscode_languageserver_types_1.Range.create(start, document.positionAt(node.range[1]));
|
|
110
90
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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;
|
|
114
103
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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--;
|
|
121
114
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
const schema = completionItem.parent.schema;
|
|
134
|
-
const schemaType = (0, schemaUtils_1.getSchemaTypeName)(schema);
|
|
135
|
-
const schemaDescription = schema.markdownDescription || schema.description;
|
|
136
|
-
let parentCompletion = result.items.find((item) => { var _a; return ((_a = item.parent) === null || _a === void 0 ? void 0 : _a.schema) === schema && item.kind === parentCompletionKind; });
|
|
137
|
-
if (parentCompletion && parentCompletion.parent.insertTexts.includes(completionItem.insertText)) {
|
|
138
|
-
// already exists in the parent
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
else if (!parentCompletion) {
|
|
142
|
-
// create a new parent
|
|
143
|
-
parentCompletion = Object.assign(Object.assign({}, completionItem), { label: schemaType, documentation: schemaDescription, sortText: '_' + schemaType, kind: parentCompletionKind });
|
|
144
|
-
parentCompletion.parent.insertTexts = [completionItem.insertText];
|
|
145
|
-
result.items.push(parentCompletion);
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
// add to the existing parent
|
|
149
|
-
parentCompletion.parent.insertTexts.push(completionItem.insertText);
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
const isForParentCompletion = !!completionItem.parent;
|
|
153
|
-
let label = completionItem.label;
|
|
154
|
-
if (!label) {
|
|
155
|
-
// we receive not valid CompletionItem as `label` is mandatory field, so just ignore it
|
|
156
|
-
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) {
|
|
157
125
|
return;
|
|
158
126
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
label = shortendedLabel;
|
|
167
|
-
}
|
|
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;
|
|
168
134
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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);
|
|
172
147
|
}
|
|
173
|
-
|
|
174
|
-
|
|
148
|
+
else {
|
|
149
|
+
// add to the existing parent
|
|
150
|
+
parentCompletion.parent.insertTexts.push(completionItem.insertText);
|
|
175
151
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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;
|
|
180
168
|
}
|
|
181
|
-
|
|
182
|
-
|
|
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);
|
|
183
196
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
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)
|
|
187
199
|
proposed[label] = completionItem;
|
|
188
200
|
result.items.push(completionItem);
|
|
189
201
|
}
|
|
190
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
221
236
|
}
|
|
222
|
-
|
|
223
|
-
const
|
|
224
|
-
if (
|
|
225
|
-
|
|
226
|
-
const
|
|
227
|
-
kind: vscode_languageserver_types_1.CompletionItemKind.
|
|
228
|
-
label:
|
|
229
|
-
|
|
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,
|
|
230
246
|
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.PlainText,
|
|
247
|
+
insertTextMode: vscode_languageserver_types_1.InsertTextMode.asIs,
|
|
231
248
|
};
|
|
232
|
-
result.items.push(
|
|
233
|
-
}
|
|
249
|
+
result.items.push(schemaIdCompletion);
|
|
250
|
+
});
|
|
234
251
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
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;
|
|
252
266
|
}
|
|
253
|
-
|
|
254
|
-
|
|
267
|
+
else {
|
|
268
|
+
node = currentDoc.findClosestNode(offset, textBuffer);
|
|
269
|
+
foundByClosest = true;
|
|
255
270
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
currentDoc.internalDocument.contents = map;
|
|
262
|
-
// eslint-disable-next-line no-self-assign
|
|
263
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
264
|
-
node = map;
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
node = currentDoc.findClosestNode(offset, textBuffer);
|
|
268
|
-
foundByClosest = true;
|
|
269
|
-
}
|
|
271
|
+
}
|
|
272
|
+
const originalNode = node;
|
|
273
|
+
if (node) {
|
|
274
|
+
if (lineContent.length === 0) {
|
|
275
|
+
node = currentDoc.internalDocument.contents;
|
|
270
276
|
}
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
if (
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
const parentParent = currentDoc.getParent(parent);
|
|
286
|
-
if ((0, yaml_1.isSeq)(currentDoc.internalDocument.contents)) {
|
|
287
|
-
const index = (0, astUtils_1.indexOf)(currentDoc.internalDocument.contents, parent);
|
|
288
|
-
if (typeof index === 'number') {
|
|
289
|
-
currentDoc.internalDocument.set(index, map);
|
|
290
|
-
// eslint-disable-next-line no-self-assign
|
|
291
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
else if (parentParent && ((0, yaml_1.isMap)(parentParent) || (0, yaml_1.isSeq)(parentParent))) {
|
|
295
|
-
parentParent.set(parent.key, map);
|
|
296
|
-
// eslint-disable-next-line no-self-assign
|
|
297
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
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);
|
|
301
291
|
// eslint-disable-next-line no-self-assign
|
|
302
292
|
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
303
293
|
}
|
|
304
|
-
currentProperty = map.items[0];
|
|
305
|
-
node = map;
|
|
306
294
|
}
|
|
307
|
-
else if (
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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;
|
|
312
304
|
}
|
|
305
|
+
currentProperty = map.items[0];
|
|
306
|
+
node = map;
|
|
313
307
|
}
|
|
314
|
-
else if (
|
|
308
|
+
else if (lineContent.trim().length === 0) {
|
|
315
309
|
const parentParent = currentDoc.getParent(parent);
|
|
316
|
-
currentProperty = parent;
|
|
317
310
|
if (parentParent) {
|
|
318
311
|
node = parentParent;
|
|
319
312
|
}
|
|
320
313
|
}
|
|
321
314
|
}
|
|
322
|
-
else if (
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
// eslint-disable-next-line no-self-assign
|
|
328
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
329
|
-
node = map;
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
node = parent;
|
|
315
|
+
else if (parent.key === node) {
|
|
316
|
+
const parentParent = currentDoc.getParent(parent);
|
|
317
|
+
currentProperty = parent;
|
|
318
|
+
if (parentParent) {
|
|
319
|
+
node = parentParent;
|
|
333
320
|
}
|
|
334
321
|
}
|
|
335
322
|
}
|
|
336
|
-
else if (
|
|
337
|
-
if (
|
|
338
|
-
|
|
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
|
-
|
|
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;
|
|
364
357
|
}
|
|
365
|
-
else
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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;
|
|
369
369
|
}
|
|
370
370
|
}
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
373
|
}
|
|
374
|
-
else if ((0, yaml_1.isSeq)(parent)) {
|
|
375
|
-
if (lineContent.charAt(position.character - 1) !== '-') {
|
|
376
|
-
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
377
|
-
parent.delete(node);
|
|
378
|
-
parent.add(map);
|
|
379
|
-
// eslint-disable-next-line no-self-assign
|
|
380
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
381
|
-
node = map;
|
|
382
|
-
}
|
|
383
|
-
else if (lineContent.charAt(position.character - 1) === '-') {
|
|
384
|
-
const map = this.createTempObjNode('', node, currentDoc);
|
|
385
|
-
parent.delete(node);
|
|
386
|
-
parent.add(map);
|
|
387
|
-
// eslint-disable-next-line no-self-assign
|
|
388
|
-
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
389
|
-
node = map;
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
node = parent;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
374
|
}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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 {
|
|
401
393
|
node = parent;
|
|
402
394
|
}
|
|
403
395
|
}
|
|
404
396
|
}
|
|
405
397
|
}
|
|
406
|
-
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) !== '-') {
|
|
407
424
|
const map = this.createTempObjNode(currentWord, node, currentDoc);
|
|
408
|
-
|
|
425
|
+
map.items = [];
|
|
409
426
|
// eslint-disable-next-line no-self-assign
|
|
410
427
|
currentDoc.internalDocument = currentDoc.internalDocument;
|
|
411
|
-
currentProperty = map.items[0];
|
|
412
|
-
node = map;
|
|
413
|
-
}
|
|
414
|
-
else if ((0, yaml_1.isMap)(node)) {
|
|
415
428
|
for (const pair of node.items) {
|
|
416
|
-
if ((0, yaml_1.
|
|
417
|
-
|
|
429
|
+
if ((0, yaml_1.isMap)(pair)) {
|
|
430
|
+
pair.items.forEach((value) => {
|
|
431
|
+
map.items.push(value);
|
|
432
|
+
});
|
|
418
433
|
}
|
|
419
434
|
}
|
|
435
|
+
node = map;
|
|
420
436
|
}
|
|
421
437
|
}
|
|
422
438
|
}
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
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);
|
|
432
448
|
}
|
|
433
449
|
}
|
|
434
|
-
this.addPropertyCompletions(schema, currentDoc, node, originalNode, '', collector, textBuffer, overwriteRange);
|
|
435
|
-
if (!schema && currentWord.length > 0 && text.charAt(offset - currentWord.length - 1) !== '"') {
|
|
436
|
-
collector.add({
|
|
437
|
-
kind: vscode_languageserver_types_1.CompletionItemKind.Property,
|
|
438
|
-
label: currentWord,
|
|
439
|
-
insertText: this.getInsertTextForProperty(currentWord, null, ''),
|
|
440
|
-
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
450
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
+
}
|
|
450
460
|
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
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;
|
|
454
475
|
}
|
|
455
476
|
updateCompletionText(completionItem, text) {
|
|
456
477
|
completionItem.insertText = text;
|
|
@@ -458,11 +479,22 @@ class YamlCompletion {
|
|
|
458
479
|
completionItem.textEdit.newText = text;
|
|
459
480
|
}
|
|
460
481
|
}
|
|
461
|
-
mergeSimpleInsertTexts(label, existingText, addingText) {
|
|
482
|
+
mergeSimpleInsertTexts(label, existingText, addingText, oneOfSchema) {
|
|
462
483
|
const containsNewLineAfterColon = (value) => {
|
|
463
484
|
return value.includes('\n');
|
|
464
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
|
+
};
|
|
465
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
|
+
}
|
|
466
498
|
return undefined;
|
|
467
499
|
}
|
|
468
500
|
const existingValues = this.getValuesFromInsertText(existingText);
|
|
@@ -542,9 +574,8 @@ class YamlCompletion {
|
|
|
542
574
|
map.items[0].value.range = node.range;
|
|
543
575
|
return map;
|
|
544
576
|
}
|
|
545
|
-
addPropertyCompletions(schema, doc, node, originalNode, separatorAfter, collector, textBuffer, overwriteRange) {
|
|
546
|
-
|
|
547
|
-
const matchingSchemas = doc.getMatchingSchemas(schema.schema);
|
|
577
|
+
addPropertyCompletions(schema, doc, node, originalNode, separatorAfter, collector, textBuffer, overwriteRange, doComplete) {
|
|
578
|
+
const matchingSchemas = doc.getMatchingSchemas(schema.schema, -1, null, doComplete);
|
|
548
579
|
const existingKey = textBuffer.getText(overwriteRange);
|
|
549
580
|
const lineContent = textBuffer.getLineContent(overwriteRange.start.line);
|
|
550
581
|
const hasOnlyWhitespace = lineContent.trim().length === 0;
|
|
@@ -552,8 +583,19 @@ class YamlCompletion {
|
|
|
552
583
|
const isInArray = lineContent.trimLeft().indexOf('-') === 0;
|
|
553
584
|
const nodeParent = doc.getParent(node);
|
|
554
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
|
+
}
|
|
555
595
|
for (const schema of matchingSchemas) {
|
|
556
|
-
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)) &&
|
|
557
599
|
!schema.inverted) {
|
|
558
600
|
this.collectDefaultSnippets(schema.schema, separatorAfter, collector, {
|
|
559
601
|
newLineFirst: false,
|
|
@@ -596,18 +638,10 @@ class YamlCompletion {
|
|
|
596
638
|
textBuffer.getPosition(it.key.range[2]).line === overwriteRange.end.line - 1)) &&
|
|
597
639
|
pair) {
|
|
598
640
|
if (Array.isArray(propertySchema.items)) {
|
|
599
|
-
this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {});
|
|
641
|
+
this.addSchemaValueCompletions(propertySchema.items[0], separatorAfter, collector, {}, 'property');
|
|
600
642
|
}
|
|
601
643
|
else if (typeof propertySchema.items === 'object' && propertySchema.items.type === 'object') {
|
|
602
|
-
|
|
603
|
-
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${propertySchema.description ? ' (' + propertySchema.description + ')' : ''}`, insertText);
|
|
604
|
-
collector.add({
|
|
605
|
-
kind: this.getSuggestionKind(propertySchema.items.type),
|
|
606
|
-
label: '- (array item)',
|
|
607
|
-
documentation,
|
|
608
|
-
insertText,
|
|
609
|
-
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
610
|
-
});
|
|
644
|
+
this.addArrayItemValueCompletion(propertySchema.items, separatorAfter, collector);
|
|
611
645
|
}
|
|
612
646
|
}
|
|
613
647
|
let insertText = key;
|
|
@@ -616,7 +650,7 @@ class YamlCompletion {
|
|
|
616
650
|
}
|
|
617
651
|
const isNodeNull = ((0, yaml_1.isScalar)(originalNode) && originalNode.value === null) ||
|
|
618
652
|
((0, yaml_1.isMap)(originalNode) && originalNode.items.length === 0);
|
|
619
|
-
const existsParentCompletion =
|
|
653
|
+
const existsParentCompletion = schema.schema.required?.length > 0;
|
|
620
654
|
if (!this.parentSkeletonSelectedFirst || !isNodeNull || !existsParentCompletion) {
|
|
621
655
|
collector.add({
|
|
622
656
|
kind: vscode_languageserver_types_1.CompletionItemKind.Property,
|
|
@@ -624,10 +658,10 @@ class YamlCompletion {
|
|
|
624
658
|
insertText,
|
|
625
659
|
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
626
660
|
documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
|
|
627
|
-
});
|
|
661
|
+
}, didOneOfSchemaMatches);
|
|
628
662
|
}
|
|
629
663
|
// if the prop is required add it also to parent suggestion
|
|
630
|
-
if (
|
|
664
|
+
if (schema.schema.required?.includes(key)) {
|
|
631
665
|
collector.add({
|
|
632
666
|
label: key,
|
|
633
667
|
insertText: this.getInsertTextForProperty(key, propertySchema, separatorAfter, identCompensation + this.indentation),
|
|
@@ -649,8 +683,8 @@ class YamlCompletion {
|
|
|
649
683
|
// test:
|
|
650
684
|
// - item1
|
|
651
685
|
// it will treated as a property key since `:` has been appended
|
|
652
|
-
if (nodeParent && (0, yaml_1.isSeq)(nodeParent) && schema.schema
|
|
653
|
-
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));
|
|
654
688
|
}
|
|
655
689
|
if (schema.schema.propertyNames && schema.schema.additionalProperties && schema.schema.type === 'object') {
|
|
656
690
|
const propertyNameSchema = (0, jsonParser07_1.asSchema)(schema.schema.propertyNames);
|
|
@@ -684,13 +718,13 @@ class YamlCompletion {
|
|
|
684
718
|
}
|
|
685
719
|
}
|
|
686
720
|
}
|
|
687
|
-
getValueCompletions(schema, doc, node, offset, document, collector, types) {
|
|
721
|
+
getValueCompletions(schema, doc, node, offset, document, collector, types, doComplete) {
|
|
688
722
|
let parentKey = null;
|
|
689
723
|
if (node && (0, yaml_1.isScalar)(node)) {
|
|
690
724
|
node = doc.getParent(node);
|
|
691
725
|
}
|
|
692
726
|
if (!node) {
|
|
693
|
-
this.addSchemaValueCompletions(schema.schema, '', collector, types);
|
|
727
|
+
this.addSchemaValueCompletions(schema.schema, '', collector, types, 'value');
|
|
694
728
|
return;
|
|
695
729
|
}
|
|
696
730
|
if ((0, yaml_1.isPair)(node)) {
|
|
@@ -703,7 +737,7 @@ class YamlCompletion {
|
|
|
703
737
|
}
|
|
704
738
|
if (node && (parentKey !== null || (0, yaml_1.isSeq)(node))) {
|
|
705
739
|
const separatorAfter = '';
|
|
706
|
-
const matchingSchemas = doc.getMatchingSchemas(schema.schema);
|
|
740
|
+
const matchingSchemas = doc.getMatchingSchemas(schema.schema, -1, null, doComplete);
|
|
707
741
|
for (const s of matchingSchemas) {
|
|
708
742
|
if (s.node.internalNode === node && !s.inverted && s.schema) {
|
|
709
743
|
if (s.schema.items) {
|
|
@@ -716,54 +750,26 @@ class YamlCompletion {
|
|
|
716
750
|
if (Array.isArray(s.schema.items)) {
|
|
717
751
|
const index = this.findItemAtOffset(node, document, offset);
|
|
718
752
|
if (index < s.schema.items.length) {
|
|
719
|
-
this.addSchemaValueCompletions(s.schema.items[index], separatorAfter, collector, types);
|
|
753
|
+
this.addSchemaValueCompletions(s.schema.items[index], separatorAfter, collector, types, 'value');
|
|
720
754
|
}
|
|
721
755
|
}
|
|
722
|
-
else if (typeof s.schema.items === 'object' &&
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
collector.add({
|
|
726
|
-
kind: this.getSuggestionKind(s.schema.items.type),
|
|
727
|
-
label: '- (array item)',
|
|
728
|
-
documentation,
|
|
729
|
-
insertText,
|
|
730
|
-
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
731
|
-
});
|
|
732
|
-
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
|
|
733
|
-
}
|
|
734
|
-
else if (typeof s.schema.items === 'object' && s.schema.items.anyOf) {
|
|
735
|
-
s.schema.items.anyOf
|
|
736
|
-
.filter((i) => typeof i === 'object')
|
|
737
|
-
.forEach((i, index) => {
|
|
738
|
-
const schemaType = (0, schemaUtils_1.getSchemaTypeName)(i);
|
|
739
|
-
const insertText = `- ${this.getInsertTextForObject(i, separatorAfter).insertText.trimLeft()}`;
|
|
740
|
-
//append insertText to documentation
|
|
741
|
-
const schemaTypeTitle = schemaType ? ' type `' + schemaType + '`' : '';
|
|
742
|
-
const schemaDescription = s.schema.description ? ' (' + s.schema.description + ')' : '';
|
|
743
|
-
const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${schemaTypeTitle}${schemaDescription}`, insertText);
|
|
744
|
-
collector.add({
|
|
745
|
-
kind: this.getSuggestionKind(i.type),
|
|
746
|
-
label: '- (array item) ' + (schemaType || index + 1),
|
|
747
|
-
documentation: documentation,
|
|
748
|
-
insertText: insertText,
|
|
749
|
-
insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.Snippet,
|
|
750
|
-
});
|
|
751
|
-
});
|
|
752
|
-
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);
|
|
753
759
|
}
|
|
754
760
|
else {
|
|
755
|
-
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types);
|
|
761
|
+
this.addSchemaValueCompletions(s.schema.items, separatorAfter, collector, types, 'value');
|
|
756
762
|
}
|
|
757
763
|
}
|
|
758
764
|
}
|
|
759
765
|
if (s.schema.properties) {
|
|
760
766
|
const propertySchema = s.schema.properties[parentKey];
|
|
761
767
|
if (propertySchema) {
|
|
762
|
-
this.addSchemaValueCompletions(propertySchema, separatorAfter, collector, types);
|
|
768
|
+
this.addSchemaValueCompletions(propertySchema, separatorAfter, collector, types, 'value');
|
|
763
769
|
}
|
|
764
770
|
}
|
|
765
771
|
else if (s.schema.additionalProperties) {
|
|
766
|
-
this.addSchemaValueCompletions(s.schema.additionalProperties, separatorAfter, collector, types);
|
|
772
|
+
this.addSchemaValueCompletions(s.schema.additionalProperties, separatorAfter, collector, types, 'value');
|
|
767
773
|
}
|
|
768
774
|
}
|
|
769
775
|
}
|
|
@@ -776,6 +782,21 @@ class YamlCompletion {
|
|
|
776
782
|
}
|
|
777
783
|
}
|
|
778
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
|
+
}
|
|
779
800
|
getInsertTextForProperty(key, propertySchema, separatorAfter, indent = this.indentation) {
|
|
780
801
|
const propertyText = this.getInsertTextForValue(key, '', 'string');
|
|
781
802
|
const resultText = propertyText + ':';
|
|
@@ -924,7 +945,7 @@ class YamlCompletion {
|
|
|
924
945
|
if (arrayInsertLines.length > 1) {
|
|
925
946
|
for (let index = 1; index < arrayInsertLines.length; index++) {
|
|
926
947
|
const element = arrayInsertLines[index];
|
|
927
|
-
arrayInsertLines[index] =
|
|
948
|
+
arrayInsertLines[index] = ` ${element}`;
|
|
928
949
|
}
|
|
929
950
|
arrayTemplate = arrayInsertLines.join('\n');
|
|
930
951
|
}
|
|
@@ -946,7 +967,9 @@ class YamlCompletion {
|
|
|
946
967
|
case 'boolean':
|
|
947
968
|
case 'number':
|
|
948
969
|
case 'integer':
|
|
949
|
-
insertText += `${indent}${
|
|
970
|
+
insertText += `${indent}${
|
|
971
|
+
//added quote if key is null
|
|
972
|
+
key === 'null' ? this.getInsertTextForValue(key, '', 'string') : key}: \${${insertIndex++}:${propertySchema.default}}\n`;
|
|
950
973
|
break;
|
|
951
974
|
case 'string':
|
|
952
975
|
insertText += `${indent}${key}: \${${insertIndex++}:${convertToStringValue(propertySchema.default)}}\n`;
|
|
@@ -1075,24 +1098,28 @@ class YamlCompletion {
|
|
|
1075
1098
|
}
|
|
1076
1099
|
return this.getInsertTextForPlainText(value + separatorAfter);
|
|
1077
1100
|
}
|
|
1078
|
-
addSchemaValueCompletions(schema, separatorAfter, collector, types, isArray) {
|
|
1101
|
+
addSchemaValueCompletions(schema, separatorAfter, collector, types, completionType, isArray) {
|
|
1079
1102
|
if (typeof schema === 'object') {
|
|
1080
1103
|
this.addEnumValueCompletions(schema, separatorAfter, collector, isArray);
|
|
1081
1104
|
this.addDefaultValueCompletions(schema, separatorAfter, collector);
|
|
1082
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
|
+
}
|
|
1083
1110
|
if (Array.isArray(schema.allOf)) {
|
|
1084
1111
|
schema.allOf.forEach((s) => {
|
|
1085
|
-
return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
|
|
1112
|
+
return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
|
|
1086
1113
|
});
|
|
1087
1114
|
}
|
|
1088
1115
|
if (Array.isArray(schema.anyOf)) {
|
|
1089
1116
|
schema.anyOf.forEach((s) => {
|
|
1090
|
-
return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
|
|
1117
|
+
return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
|
|
1091
1118
|
});
|
|
1092
1119
|
}
|
|
1093
1120
|
if (Array.isArray(schema.oneOf)) {
|
|
1094
1121
|
schema.oneOf.forEach((s) => {
|
|
1095
|
-
return this.addSchemaValueCompletions(s, separatorAfter, collector, types);
|
|
1122
|
+
return this.addSchemaValueCompletions(s, separatorAfter, collector, types, completionType, isArray);
|
|
1096
1123
|
});
|
|
1097
1124
|
}
|
|
1098
1125
|
}
|
|
@@ -1265,7 +1292,7 @@ class YamlCompletion {
|
|
|
1265
1292
|
}
|
|
1266
1293
|
return value;
|
|
1267
1294
|
};
|
|
1268
|
-
return (0, json_1.stringifyObject)(value, '', replacer,
|
|
1295
|
+
return (0, json_1.stringifyObject)(value, '', replacer, { ...settings, indentation: this.indentation }, depth) + separatorAfter;
|
|
1269
1296
|
}
|
|
1270
1297
|
addBooleanValueCompletion(value, separatorAfter, collector) {
|
|
1271
1298
|
collector.add({
|
|
@@ -1433,8 +1460,7 @@ function convertToStringValue(param) {
|
|
|
1433
1460
|
* simplify `{$1:value}` to `value`
|
|
1434
1461
|
*/
|
|
1435
1462
|
function evaluateTab1Symbol(value) {
|
|
1436
|
-
|
|
1437
|
-
return result;
|
|
1463
|
+
return value.replace(/\$\{1:(.*)\}/, '$1');
|
|
1438
1464
|
}
|
|
1439
1465
|
function isParentCompletionItem(item) {
|
|
1440
1466
|
return 'parent' in item;
|