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.
Files changed (248) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +9 -0
  3. package/eslint-result.sarif +4397 -0
  4. package/lib/esm/languageserver/handlers/languageHandlers.js +4 -1
  5. package/lib/esm/languageserver/handlers/languageHandlers.js.map +1 -1
  6. package/lib/esm/languageserver/handlers/schemaSelectionHandlers.js +44 -60
  7. package/lib/esm/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
  8. package/lib/esm/languageserver/handlers/settingsHandlers.d.ts +1 -1
  9. package/lib/esm/languageserver/handlers/settingsHandlers.js +161 -183
  10. package/lib/esm/languageserver/handlers/settingsHandlers.js.map +1 -1
  11. package/lib/esm/languageserver/telemetry.d.ts +2 -12
  12. package/lib/esm/languageserver/telemetry.js +1 -1
  13. package/lib/esm/languageserver/telemetry.js.map +1 -1
  14. package/lib/esm/languageservice/jsonSchema.d.ts +1 -0
  15. package/lib/esm/languageservice/parser/jsonParser07.d.ts +2 -0
  16. package/lib/esm/languageservice/parser/jsonParser07.js +44 -19
  17. package/lib/esm/languageservice/parser/jsonParser07.js.map +1 -1
  18. package/lib/esm/languageservice/parser/yaml-documents.js +6 -5
  19. package/lib/esm/languageservice/parser/yaml-documents.js.map +1 -1
  20. package/lib/esm/languageservice/parser/yamlParser07.js +1 -2
  21. package/lib/esm/languageservice/parser/yamlParser07.js.map +1 -1
  22. package/lib/esm/languageservice/services/documentSymbols.d.ts +1 -1
  23. package/lib/esm/languageservice/services/validation/yaml-style.js +2 -3
  24. package/lib/esm/languageservice/services/validation/yaml-style.js.map +1 -1
  25. package/lib/esm/languageservice/services/yamlCodeActions.js +2 -3
  26. package/lib/esm/languageservice/services/yamlCodeActions.js.map +1 -1
  27. package/lib/esm/languageservice/services/yamlCodeLens.d.ts +1 -1
  28. package/lib/esm/languageservice/services/yamlCodeLens.js +23 -34
  29. package/lib/esm/languageservice/services/yamlCodeLens.js.map +1 -1
  30. package/lib/esm/languageservice/services/yamlCommands.js +3 -12
  31. package/lib/esm/languageservice/services/yamlCommands.js.map +1 -1
  32. package/lib/esm/languageservice/services/yamlCompletion.d.ts +3 -2
  33. package/lib/esm/languageservice/services/yamlCompletion.js +439 -414
  34. package/lib/esm/languageservice/services/yamlCompletion.js.map +1 -1
  35. package/lib/esm/languageservice/services/yamlDefinition.d.ts +1 -1
  36. package/lib/esm/languageservice/services/yamlFolding.js +1 -2
  37. package/lib/esm/languageservice/services/yamlFolding.js.map +1 -1
  38. package/lib/esm/languageservice/services/yamlHover.d.ts +1 -1
  39. package/lib/esm/languageservice/services/yamlLinks.d.ts +1 -1
  40. package/lib/esm/languageservice/services/yamlOnTypeFormatting.js +0 -1
  41. package/lib/esm/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
  42. package/lib/esm/languageservice/services/yamlSchemaService.js +202 -218
  43. package/lib/esm/languageservice/services/yamlSchemaService.js.map +1 -1
  44. package/lib/esm/languageservice/services/yamlValidation.d.ts +1 -1
  45. package/lib/esm/languageservice/services/yamlValidation.js +61 -71
  46. package/lib/esm/languageservice/services/yamlValidation.js.map +1 -1
  47. package/lib/esm/languageservice/telemetry.d.ts +16 -0
  48. package/lib/esm/languageservice/telemetry.js +6 -0
  49. package/lib/esm/languageservice/telemetry.js.map +1 -0
  50. package/lib/esm/languageservice/utils/astUtils.js +2 -6
  51. package/lib/esm/languageservice/utils/astUtils.js.map +1 -1
  52. package/lib/esm/languageservice/utils/indentationGuesser.js +0 -1
  53. package/lib/esm/languageservice/utils/indentationGuesser.js.map +1 -1
  54. package/lib/esm/languageservice/utils/objects.js +1 -2
  55. package/lib/esm/languageservice/utils/objects.js.map +1 -1
  56. package/lib/esm/languageservice/utils/schemaUrls.d.ts +1 -1
  57. package/lib/esm/languageservice/utils/schemaUrls.js +2 -4
  58. package/lib/esm/languageservice/utils/schemaUrls.js.map +1 -1
  59. package/lib/esm/languageservice/utils/schemaUtils.d.ts +2 -0
  60. package/lib/esm/languageservice/utils/schemaUtils.js +9 -6
  61. package/lib/esm/languageservice/utils/schemaUtils.js.map +1 -1
  62. package/lib/esm/languageservice/yamlLanguageService.d.ts +2 -3
  63. package/lib/esm/languageservice/yamlLanguageService.js +0 -1
  64. package/lib/esm/languageservice/yamlLanguageService.js.map +1 -1
  65. package/lib/esm/server.js +5 -14
  66. package/lib/esm/server.js.map +1 -1
  67. package/lib/esm/webworker/yamlServerMain.js +2 -2
  68. package/lib/esm/webworker/yamlServerMain.js.map +1 -1
  69. package/lib/esm/yamlServerInit.d.ts +1 -1
  70. package/lib/umd/languageserver/handlers/languageHandlers.js +4 -1
  71. package/lib/umd/languageserver/handlers/languageHandlers.js.map +1 -1
  72. package/lib/umd/languageserver/handlers/schemaSelectionHandlers.js +44 -60
  73. package/lib/umd/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
  74. package/lib/umd/languageserver/handlers/settingsHandlers.d.ts +1 -1
  75. package/lib/umd/languageserver/handlers/settingsHandlers.js +161 -183
  76. package/lib/umd/languageserver/handlers/settingsHandlers.js.map +1 -1
  77. package/lib/umd/languageserver/telemetry.d.ts +2 -12
  78. package/lib/umd/languageserver/telemetry.js +3 -3
  79. package/lib/umd/languageserver/telemetry.js.map +1 -1
  80. package/lib/umd/languageservice/jsonSchema.d.ts +1 -0
  81. package/lib/umd/languageservice/parser/jsonParser07.d.ts +2 -0
  82. package/lib/umd/languageservice/parser/jsonParser07.js +45 -20
  83. package/lib/umd/languageservice/parser/jsonParser07.js.map +1 -1
  84. package/lib/umd/languageservice/parser/yaml-documents.js +6 -5
  85. package/lib/umd/languageservice/parser/yaml-documents.js.map +1 -1
  86. package/lib/umd/languageservice/parser/yamlParser07.js +1 -2
  87. package/lib/umd/languageservice/parser/yamlParser07.js.map +1 -1
  88. package/lib/umd/languageservice/services/documentSymbols.d.ts +1 -1
  89. package/lib/umd/languageservice/services/validation/yaml-style.js +2 -3
  90. package/lib/umd/languageservice/services/validation/yaml-style.js.map +1 -1
  91. package/lib/umd/languageservice/services/yamlCodeActions.js +2 -3
  92. package/lib/umd/languageservice/services/yamlCodeActions.js.map +1 -1
  93. package/lib/umd/languageservice/services/yamlCodeLens.d.ts +1 -1
  94. package/lib/umd/languageservice/services/yamlCodeLens.js +23 -34
  95. package/lib/umd/languageservice/services/yamlCodeLens.js.map +1 -1
  96. package/lib/umd/languageservice/services/yamlCommands.js +3 -12
  97. package/lib/umd/languageservice/services/yamlCommands.js.map +1 -1
  98. package/lib/umd/languageservice/services/yamlCompletion.d.ts +3 -2
  99. package/lib/umd/languageservice/services/yamlCompletion.js +438 -413
  100. package/lib/umd/languageservice/services/yamlCompletion.js.map +1 -1
  101. package/lib/umd/languageservice/services/yamlDefinition.d.ts +1 -1
  102. package/lib/umd/languageservice/services/yamlFolding.js +1 -2
  103. package/lib/umd/languageservice/services/yamlFolding.js.map +1 -1
  104. package/lib/umd/languageservice/services/yamlHover.d.ts +1 -1
  105. package/lib/umd/languageservice/services/yamlLinks.d.ts +1 -1
  106. package/lib/umd/languageservice/services/yamlOnTypeFormatting.js +0 -1
  107. package/lib/umd/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
  108. package/lib/umd/languageservice/services/yamlSchemaService.js +202 -218
  109. package/lib/umd/languageservice/services/yamlSchemaService.js.map +1 -1
  110. package/lib/umd/languageservice/services/yamlValidation.d.ts +1 -1
  111. package/lib/umd/languageservice/services/yamlValidation.js +61 -71
  112. package/lib/umd/languageservice/services/yamlValidation.js.map +1 -1
  113. package/lib/umd/languageservice/telemetry.d.ts +16 -0
  114. package/lib/umd/languageservice/telemetry.js +17 -0
  115. package/lib/umd/languageservice/telemetry.js.map +1 -0
  116. package/lib/umd/languageservice/utils/astUtils.js +2 -6
  117. package/lib/umd/languageservice/utils/astUtils.js.map +1 -1
  118. package/lib/umd/languageservice/utils/indentationGuesser.js +0 -1
  119. package/lib/umd/languageservice/utils/indentationGuesser.js.map +1 -1
  120. package/lib/umd/languageservice/utils/objects.js +1 -2
  121. package/lib/umd/languageservice/utils/objects.js.map +1 -1
  122. package/lib/umd/languageservice/utils/schemaUrls.d.ts +1 -1
  123. package/lib/umd/languageservice/utils/schemaUrls.js +2 -4
  124. package/lib/umd/languageservice/utils/schemaUrls.js.map +1 -1
  125. package/lib/umd/languageservice/utils/schemaUtils.d.ts +2 -0
  126. package/lib/umd/languageservice/utils/schemaUtils.js +12 -7
  127. package/lib/umd/languageservice/utils/schemaUtils.js.map +1 -1
  128. package/lib/umd/languageservice/yamlLanguageService.d.ts +2 -3
  129. package/lib/umd/languageservice/yamlLanguageService.js +0 -1
  130. package/lib/umd/languageservice/yamlLanguageService.js.map +1 -1
  131. package/lib/umd/server.js +4 -13
  132. package/lib/umd/server.js.map +1 -1
  133. package/lib/umd/webworker/yamlServerMain.js +1 -1
  134. package/lib/umd/webworker/yamlServerMain.js.map +1 -1
  135. package/lib/umd/yamlServerInit.d.ts +1 -1
  136. package/out/server/src/languageserver/handlers/languageHandlers.js +4 -1
  137. package/out/server/src/languageserver/handlers/languageHandlers.js.map +1 -1
  138. package/out/server/src/languageserver/handlers/schemaSelectionHandlers.js +44 -60
  139. package/out/server/src/languageserver/handlers/schemaSelectionHandlers.js.map +1 -1
  140. package/out/server/src/languageserver/handlers/settingsHandlers.d.ts +1 -1
  141. package/out/server/src/languageserver/handlers/settingsHandlers.js +161 -183
  142. package/out/server/src/languageserver/handlers/settingsHandlers.js.map +1 -1
  143. package/out/server/src/languageserver/telemetry.d.ts +2 -12
  144. package/out/server/src/languageserver/telemetry.js +3 -3
  145. package/out/server/src/languageserver/telemetry.js.map +1 -1
  146. package/out/server/src/languageservice/jsonSchema.d.ts +1 -0
  147. package/out/server/src/languageservice/parser/jsonParser07.d.ts +2 -0
  148. package/out/server/src/languageservice/parser/jsonParser07.js +44 -19
  149. package/out/server/src/languageservice/parser/jsonParser07.js.map +1 -1
  150. package/out/server/src/languageservice/parser/yaml-documents.js +6 -5
  151. package/out/server/src/languageservice/parser/yaml-documents.js.map +1 -1
  152. package/out/server/src/languageservice/parser/yamlParser07.js +1 -2
  153. package/out/server/src/languageservice/parser/yamlParser07.js.map +1 -1
  154. package/out/server/src/languageservice/services/documentSymbols.d.ts +1 -1
  155. package/out/server/src/languageservice/services/validation/yaml-style.js +2 -3
  156. package/out/server/src/languageservice/services/validation/yaml-style.js.map +1 -1
  157. package/out/server/src/languageservice/services/yamlCodeActions.js +2 -3
  158. package/out/server/src/languageservice/services/yamlCodeActions.js.map +1 -1
  159. package/out/server/src/languageservice/services/yamlCodeLens.d.ts +1 -1
  160. package/out/server/src/languageservice/services/yamlCodeLens.js +23 -34
  161. package/out/server/src/languageservice/services/yamlCodeLens.js.map +1 -1
  162. package/out/server/src/languageservice/services/yamlCommands.js +3 -12
  163. package/out/server/src/languageservice/services/yamlCommands.js.map +1 -1
  164. package/out/server/src/languageservice/services/yamlCompletion.d.ts +3 -2
  165. package/out/server/src/languageservice/services/yamlCompletion.js +438 -413
  166. package/out/server/src/languageservice/services/yamlCompletion.js.map +1 -1
  167. package/out/server/src/languageservice/services/yamlDefinition.d.ts +1 -1
  168. package/out/server/src/languageservice/services/yamlFolding.js +1 -2
  169. package/out/server/src/languageservice/services/yamlFolding.js.map +1 -1
  170. package/out/server/src/languageservice/services/yamlHover.d.ts +1 -1
  171. package/out/server/src/languageservice/services/yamlLinks.d.ts +1 -1
  172. package/out/server/src/languageservice/services/yamlOnTypeFormatting.js +0 -1
  173. package/out/server/src/languageservice/services/yamlOnTypeFormatting.js.map +1 -1
  174. package/out/server/src/languageservice/services/yamlSchemaService.js +202 -218
  175. package/out/server/src/languageservice/services/yamlSchemaService.js.map +1 -1
  176. package/out/server/src/languageservice/services/yamlValidation.d.ts +1 -1
  177. package/out/server/src/languageservice/services/yamlValidation.js +61 -71
  178. package/out/server/src/languageservice/services/yamlValidation.js.map +1 -1
  179. package/out/server/src/languageservice/telemetry.d.ts +16 -0
  180. package/out/server/src/languageservice/telemetry.js +7 -0
  181. package/out/server/src/languageservice/telemetry.js.map +1 -0
  182. package/out/server/src/languageservice/utils/astUtils.js +2 -6
  183. package/out/server/src/languageservice/utils/astUtils.js.map +1 -1
  184. package/out/server/src/languageservice/utils/indentationGuesser.js +0 -1
  185. package/out/server/src/languageservice/utils/indentationGuesser.js.map +1 -1
  186. package/out/server/src/languageservice/utils/objects.js +1 -2
  187. package/out/server/src/languageservice/utils/objects.js.map +1 -1
  188. package/out/server/src/languageservice/utils/schemaUrls.d.ts +1 -1
  189. package/out/server/src/languageservice/utils/schemaUrls.js +2 -4
  190. package/out/server/src/languageservice/utils/schemaUrls.js.map +1 -1
  191. package/out/server/src/languageservice/utils/schemaUtils.d.ts +2 -0
  192. package/out/server/src/languageservice/utils/schemaUtils.js +12 -7
  193. package/out/server/src/languageservice/utils/schemaUtils.js.map +1 -1
  194. package/out/server/src/languageservice/yamlLanguageService.d.ts +2 -3
  195. package/out/server/src/languageservice/yamlLanguageService.js +0 -1
  196. package/out/server/src/languageservice/yamlLanguageService.js.map +1 -1
  197. package/out/server/src/server.js +4 -13
  198. package/out/server/src/server.js.map +1 -1
  199. package/out/server/src/webworker/yamlServerMain.js +1 -1
  200. package/out/server/src/webworker/yamlServerMain.js.map +1 -1
  201. package/out/server/src/yamlServerInit.d.ts +1 -1
  202. package/out/server/test/autoCompletion.test.js +267 -178
  203. package/out/server/test/autoCompletion.test.js.map +1 -1
  204. package/out/server/test/autoCompletionFix.test.js +222 -134
  205. package/out/server/test/autoCompletionFix.test.js.map +1 -1
  206. package/out/server/test/code-action-schema.test.js +6 -15
  207. package/out/server/test/code-action-schema.test.js.map +1 -1
  208. package/out/server/test/defaultSnippets.test.js +11 -19
  209. package/out/server/test/defaultSnippets.test.js.map +1 -1
  210. package/out/server/test/findLinks.test.js +3 -12
  211. package/out/server/test/findLinks.test.js.map +1 -1
  212. package/out/server/test/hover.test.js +64 -73
  213. package/out/server/test/hover.test.js.map +1 -1
  214. package/out/server/test/integration.test.js +3 -12
  215. package/out/server/test/integration.test.js.map +1 -1
  216. package/out/server/test/jsonParser.test.js +15 -26
  217. package/out/server/test/jsonParser.test.js.map +1 -1
  218. package/out/server/test/multipleDocuments.test.js +3 -12
  219. package/out/server/test/multipleDocuments.test.js.map +1 -1
  220. package/out/server/test/schema.test.js +71 -85
  221. package/out/server/test/schema.test.js.map +1 -1
  222. package/out/server/test/schemaRequestHandler.test.js +9 -18
  223. package/out/server/test/schemaRequestHandler.test.js.map +1 -1
  224. package/out/server/test/schemaSelectionHandlers.test.js +12 -21
  225. package/out/server/test/schemaSelectionHandlers.test.js.map +1 -1
  226. package/out/server/test/schemaValidation.test.js +216 -97
  227. package/out/server/test/schemaValidation.test.js.map +1 -1
  228. package/out/server/test/settingsHandlers.test.js +44 -55
  229. package/out/server/test/settingsHandlers.test.js.map +1 -1
  230. package/out/server/test/telemetry.test.js +1 -1
  231. package/out/server/test/telemetry.test.js.map +1 -1
  232. package/out/server/test/utils/testsTypes.d.ts +3 -2
  233. package/out/server/test/utils/testsTypes.js +1 -1
  234. package/out/server/test/utils/testsTypes.js.map +1 -1
  235. package/out/server/test/utils/verifyError.d.ts +1 -1
  236. package/out/server/test/utils/verifyError.js +22 -20
  237. package/out/server/test/utils/verifyError.js.map +1 -1
  238. package/out/server/test/yamlCodeLens.test.js +25 -34
  239. package/out/server/test/yamlCodeLens.test.js.map +1 -1
  240. package/out/server/test/yamlCommands.test.js +6 -15
  241. package/out/server/test/yamlCommands.test.js.map +1 -1
  242. package/out/server/test/yamlSchema.test.js +9 -18
  243. package/out/server/test/yamlSchema.test.js.map +1 -1
  244. package/out/server/test/yamlSchemaService.test.js +9 -18
  245. package/out/server/test/yamlSchemaService.test.js.map +1 -1
  246. package/out/server/test/yamlValidation.test.js +30 -39
  247. package/out/server/test/yamlValidation.test.js.map +1 -1
  248. 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
- return __awaiter(this, void 0, void 0, function* () {
54
- const result = vscode_languageserver_types_1.CompletionList.create([], false);
55
- if (!this.completionEnabled) {
56
- return result;
57
- }
58
- const doc = this.yamlDocument.getYamlDocument(document, { customTags: this.customTags, yamlVersion: this.yamlVersion }, true);
59
- const textBuffer = new textBuffer_1.TextBuffer(document);
60
- if (!this.configuredIndentation) {
61
- const indent = (0, indentationGuesser_1.guessIndentation)(textBuffer, 2, true);
62
- this.indentation = indent.insertSpaces ? ' '.repeat(indent.tabSize) : '\t';
63
- }
64
- else {
65
- this.indentation = this.configuredIndentation;
66
- }
67
- (0, isKubernetes_1.setKubernetesParserOption)(doc.documents, isKubernetes);
68
- const offset = document.offsetAt(position);
69
- const text = document.getText();
70
- if (text.charAt(offset - 1) === ':') {
71
- return Promise.resolve(result);
72
- }
73
- let currentDoc = (0, arrUtils_1.matchOffsetToDocument)(offset, doc);
74
- if (currentDoc === null) {
75
- return Promise.resolve(result);
76
- }
77
- // as we modify AST for completion, we need to use copy of original document
78
- currentDoc = currentDoc.clone();
79
- let [node, foundByClosest] = currentDoc.getNodeFromPosition(offset, textBuffer, this.indentation.length);
80
- const currentWord = this.getCurrentWord(document, offset);
81
- let lineContent = textBuffer.getLineContent(position.line);
82
- const lineAfterPosition = lineContent.substring(position.character);
83
- const areOnlySpacesAfterPosition = /^[ ]+\n?$/.test(lineAfterPosition);
84
- this.arrayPrefixIndentation = '';
85
- let overwriteRange = null;
86
- if (areOnlySpacesAfterPosition) {
87
- overwriteRange = vscode_languageserver_types_1.Range.create(position, vscode_languageserver_types_1.Position.create(position.line, lineContent.length));
88
- const isOnlyWhitespace = lineContent.trim().length === 0;
89
- const isOnlyDash = lineContent.match(/^\s*(-)\s*$/);
90
- if (node && (0, yaml_1.isScalar)(node) && !isOnlyWhitespace && !isOnlyDash) {
91
- // line contains part of a key with trailing spaces, adjust the overwrite range to include only the text
92
- const matches = lineContent.match(/^([\s-]*)[^:]+[ \t]+\n?$/);
93
- if (matches === null || matches === void 0 ? void 0 : matches.length) {
94
- 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));
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
- else if (node && (0, yaml_1.isScalar)(node) && node.value === null && currentWord === '-') {
113
- overwriteRange = vscode_languageserver_types_1.Range.create(position, position);
114
- this.arrayPrefixIndentation = ' ';
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
- else {
117
- let overwriteStart = document.offsetAt(position) - currentWord.length;
118
- if (overwriteStart > 0 && text[overwriteStart - 1] === '"') {
119
- overwriteStart--;
120
- }
121
- overwriteRange = vscode_languageserver_types_1.Range.create(document.positionAt(overwriteStart), position);
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
- const proposed = {};
124
- const existingProposeItem = '__';
125
- const collector = {
126
- add: (completionItem) => {
127
- const addSuggestionForParent = function (completionItem) {
128
- var _a;
129
- const existsInYaml = ((_a = proposed[completionItem.label]) === null || _a === void 0 ? void 0 : _a.label) === existingProposeItem;
130
- //don't put to parent suggestion if already in yaml
131
- if (existsInYaml) {
132
- return;
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
- 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;
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
- // trim $1 from end of completion
171
- if (completionItem.insertText.endsWith('$1') && !isForParentCompletion) {
172
- completionItem.insertText = completionItem.insertText.substr(0, completionItem.insertText.length - 2);
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
- if (overwriteRange && overwriteRange.start.line === overwriteRange.end.line) {
175
- completionItem.textEdit = vscode_languageserver_types_1.TextEdit.replace(overwriteRange, completionItem.insertText);
148
+ else {
149
+ // add to the existing parent
150
+ parentCompletion.parent.insertTexts.push(completionItem.insertText);
176
151
  }
177
- completionItem.label = label;
178
- if (isForParentCompletion) {
179
- addSuggestionForParent(completionItem);
180
- return;
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
- if (this.arrayPrefixIndentation) {
183
- this.updateCompletionText(completionItem, this.arrayPrefixIndentation + completionItem.insertText);
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
- const existing = proposed[label];
186
- const isInsertTextDifferent = (existing === null || existing === void 0 ? void 0 : existing.label) !== existingProposeItem && (existing === null || existing === void 0 ? void 0 : existing.insertText) !== completionItem.insertText;
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
- else if (isInsertTextDifferent) {
192
- // try to merge simple insert values
193
- const mergedText = this.mergeSimpleInsertTexts(label, existing.insertText, completionItem.insertText);
194
- if (mergedText) {
195
- this.updateCompletionText(existing, mergedText);
196
- }
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)
199
- proposed[label] = completionItem;
200
- result.items.push(completionItem);
201
- }
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
- };
217
- if (this.customTags.length > 0) {
218
- this.getCustomTagValueCompletions(collector);
219
- }
220
- if (lineContent.endsWith('\n')) {
221
- lineContent = lineContent.substr(0, lineContent.length - 1);
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
- try {
224
- const schema = yield this.schemaService.getSchemaForResource(document.uri, currentDoc);
225
- if (!schema || schema.errors.length) {
226
- if (position.line === 0 && position.character === 0 && !(0, modelineUtil_1.isModeline)(lineContent)) {
227
- const inlineSchemaCompletion = {
228
- kind: vscode_languageserver_types_1.CompletionItemKind.Text,
229
- label: 'Inline schema',
230
- insertText: '# yaml-language-server: $schema=',
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(inlineSchemaCompletion);
234
- }
249
+ result.items.push(schemaIdCompletion);
250
+ });
235
251
  }
236
- if ((0, modelineUtil_1.isModeline)(lineContent) || (0, astUtils_1.isInComment)(doc.tokens, offset)) {
237
- const schemaIndex = lineContent.indexOf('$schema=');
238
- if (schemaIndex !== -1 && schemaIndex + '$schema='.length <= position.character) {
239
- this.schemaService.getAllSchemas().forEach((schema) => {
240
- var _a;
241
- const schemaIdCompletion = {
242
- kind: vscode_languageserver_types_1.CompletionItemKind.Constant,
243
- label: (_a = schema.name) !== null && _a !== void 0 ? _a : schema.uri,
244
- detail: schema.description,
245
- insertText: schema.uri,
246
- insertTextFormat: vscode_languageserver_types_1.InsertTextFormat.PlainText,
247
- insertTextMode: vscode_languageserver_types_1.InsertTextMode.asIs,
248
- };
249
- result.items.push(schemaIdCompletion);
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
- if (!schema || schema.errors.length) {
255
- return result;
267
+ else {
268
+ node = currentDoc.findClosestNode(offset, textBuffer);
269
+ foundByClosest = true;
256
270
  }
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;
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
- const originalNode = node;
273
- if (node) {
274
- if (lineContent.length === 0) {
275
- node = currentDoc.internalDocument.contents;
276
- }
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);
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 (lineContent.trim().length === 0) {
309
- const parentParent = currentDoc.getParent(parent);
310
- if (parentParent) {
311
- node = parentParent;
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 (parent.key === node) {
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 ((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;
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 (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;
357
- }
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;
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 if (parentPosition.character === position.character) {
367
- if (parentParent) {
368
- node = parentParent;
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
- 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) {
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.isScalar)(node)) {
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
- currentDoc.internalDocument.contents = map;
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.isNode)(pair.value) && pair.value.range && pair.value.range[0] === offset + 1) {
418
- node = pair.value;
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
- // completion for object keys
425
- if (node && (0, yaml_1.isMap)(node)) {
426
- // don't suggest properties that are already present
427
- const properties = node.items;
428
- for (const p of properties) {
429
- if (!currentProperty || currentProperty !== p) {
430
- if ((0, yaml_1.isScalar)(p.key)) {
431
- proposed[p.key.value + ''] = vscode_languageserver_types_1.CompletionItem.create(existingProposeItem);
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
- // proposals for values
446
- const types = {};
447
- this.getValueCompletions(schema, currentDoc, node, offset, document, collector, types, doComplete);
448
- }
449
- catch (err) {
450
- this.telemetry.sendError('yaml.completion.error', { error: (0, objects_1.convertErrorToTelemetryMsg)(err) });
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
- this.finalizeParentCompletion(result);
453
- return result;
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) || (schema.node.internalNode === originalNode && !hasColon)) &&
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
- const insertText = `- ${this.getInsertTextForObject(propertySchema.items, separatorAfter, ' ').insertText.trimLeft()}`;
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 = ((_a = schema.schema.required) === null || _a === void 0 ? void 0 : _a.length) > 0;
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 ((_b = schema.schema.required) === null || _b === void 0 ? void 0 : _b.includes(key)) {
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.type !== 'object') {
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' && s.schema.items.type === 'object') {
724
- const insertText = `- ${this.getInsertTextForObject(s.schema.items, separatorAfter, ' ').insertText.trimLeft()}`;
725
- const documentation = this.getDocumentationWithMarkdownText(`Create an item of an array${s.schema.description ? ' (' + s.schema.description + ')' : ''}`, insertText);
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}${key}: \${${insertIndex++}:${propertySchema.default}}\n`;
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, Object.assign(Object.assign({}, settings), { indentation: this.indentation }), depth) + separatorAfter;
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
- const result = value.replace(/\$\{1:(.*)\}/, '$1');
1438
- return result;
1463
+ return value.replace(/\$\{1:(.*)\}/, '$1');
1439
1464
  }
1440
1465
  function isParentCompletionItem(item) {
1441
1466
  return 'parent' in item;