@gooddata/sdk-maql-language-server 0.0.0-stage → 11.65.0-alpha.3

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 (312) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +118 -2
  3. package/esm/completions/complete.d.ts +12 -0
  4. package/esm/completions/complete.d.ts.map +1 -0
  5. package/esm/completions/complete.js +316 -0
  6. package/esm/completions/descriptions.d.ts +42 -0
  7. package/esm/completions/descriptions.d.ts.map +1 -0
  8. package/esm/completions/descriptions.js +290 -0
  9. package/esm/completions/findContext.d.ts +19 -0
  10. package/esm/completions/findContext.d.ts.map +1 -0
  11. package/esm/completions/findContext.js +172 -0
  12. package/esm/completions/functionDescriptions.d.ts +3 -0
  13. package/esm/completions/functionDescriptions.d.ts.map +1 -0
  14. package/esm/completions/functionDescriptions.js +99 -0
  15. package/esm/completions/sort.d.ts +4 -0
  16. package/esm/completions/sort.d.ts.map +1 -0
  17. package/esm/completions/sort.js +88 -0
  18. package/esm/constants.d.ts +21 -0
  19. package/esm/constants.d.ts.map +1 -0
  20. package/esm/constants.js +22 -0
  21. package/esm/dateElementFormat.d.ts +9 -0
  22. package/esm/dateElementFormat.d.ts.map +1 -0
  23. package/esm/dateElementFormat.js +60 -0
  24. package/esm/decorations.d.ts +39 -0
  25. package/esm/decorations.d.ts.map +1 -0
  26. package/esm/decorations.js +42 -0
  27. package/esm/diagnostics.d.ts +12 -0
  28. package/esm/diagnostics.d.ts.map +1 -0
  29. package/esm/diagnostics.js +260 -0
  30. package/esm/docs/en/docs/create-metrics/maql/aggregation/approximate_count.d.ts +2 -0
  31. package/esm/docs/en/docs/create-metrics/maql/aggregation/approximate_count.d.ts.map +1 -0
  32. package/esm/docs/en/docs/create-metrics/maql/aggregation/approximate_count.js +61 -0
  33. package/esm/docs/en/docs/create-metrics/maql/aggregation/avg.d.ts +2 -0
  34. package/esm/docs/en/docs/create-metrics/maql/aggregation/avg.d.ts.map +1 -0
  35. package/esm/docs/en/docs/create-metrics/maql/aggregation/avg.js +19 -0
  36. package/esm/docs/en/docs/create-metrics/maql/aggregation/count.d.ts +2 -0
  37. package/esm/docs/en/docs/create-metrics/maql/aggregation/count.d.ts.map +1 -0
  38. package/esm/docs/en/docs/create-metrics/maql/aggregation/count.js +72 -0
  39. package/esm/docs/en/docs/create-metrics/maql/aggregation/first.d.ts +2 -0
  40. package/esm/docs/en/docs/create-metrics/maql/aggregation/first.d.ts.map +1 -0
  41. package/esm/docs/en/docs/create-metrics/maql/aggregation/first.js +41 -0
  42. package/esm/docs/en/docs/create-metrics/maql/aggregation/last.d.ts +2 -0
  43. package/esm/docs/en/docs/create-metrics/maql/aggregation/last.d.ts.map +1 -0
  44. package/esm/docs/en/docs/create-metrics/maql/aggregation/last.js +69 -0
  45. package/esm/docs/en/docs/create-metrics/maql/aggregation/max.d.ts +2 -0
  46. package/esm/docs/en/docs/create-metrics/maql/aggregation/max.d.ts.map +1 -0
  47. package/esm/docs/en/docs/create-metrics/maql/aggregation/max.js +61 -0
  48. package/esm/docs/en/docs/create-metrics/maql/aggregation/median.d.ts +2 -0
  49. package/esm/docs/en/docs/create-metrics/maql/aggregation/median.d.ts.map +1 -0
  50. package/esm/docs/en/docs/create-metrics/maql/aggregation/median.js +25 -0
  51. package/esm/docs/en/docs/create-metrics/maql/aggregation/min.d.ts +2 -0
  52. package/esm/docs/en/docs/create-metrics/maql/aggregation/min.d.ts.map +1 -0
  53. package/esm/docs/en/docs/create-metrics/maql/aggregation/min.js +63 -0
  54. package/esm/docs/en/docs/create-metrics/maql/aggregation/sum.d.ts +2 -0
  55. package/esm/docs/en/docs/create-metrics/maql/aggregation/sum.d.ts.map +1 -0
  56. package/esm/docs/en/docs/create-metrics/maql/aggregation/sum.js +20 -0
  57. package/esm/docs/en/docs/create-metrics/maql/conditionals/case.d.ts +2 -0
  58. package/esm/docs/en/docs/create-metrics/maql/conditionals/case.d.ts.map +1 -0
  59. package/esm/docs/en/docs/create-metrics/maql/conditionals/case.js +73 -0
  60. package/esm/docs/en/docs/create-metrics/maql/conditionals/if-then-else.d.ts +2 -0
  61. package/esm/docs/en/docs/create-metrics/maql/conditionals/if-then-else.d.ts.map +1 -0
  62. package/esm/docs/en/docs/create-metrics/maql/conditionals/if-then-else.js +29 -0
  63. package/esm/docs/en/docs/create-metrics/maql/conditionals/ifnull.d.ts +2 -0
  64. package/esm/docs/en/docs/create-metrics/maql/conditionals/ifnull.d.ts.map +1 -0
  65. package/esm/docs/en/docs/create-metrics/maql/conditionals/ifnull.js +96 -0
  66. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-ranking-filters.d.ts +2 -0
  67. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-ranking-filters.d.ts.map +1 -0
  68. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-ranking-filters.js +71 -0
  69. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-having-clause.d.ts +2 -0
  70. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-having-clause.d.ts.map +1 -0
  71. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-having-clause.js +65 -0
  72. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-like-clause.d.ts +2 -0
  73. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-like-clause.d.ts.map +1 -0
  74. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-like-clause.js +36 -0
  75. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-where-clause.d.ts +2 -0
  76. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-where-clause.d.ts.map +1 -0
  77. package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-where-clause.js +36 -0
  78. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions-except-for-attribute.d.ts +2 -0
  79. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions-except-for-attribute.d.ts.map +1 -0
  80. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions-except-for-attribute.js +21 -0
  81. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions.d.ts +2 -0
  82. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions.d.ts.map +1 -0
  83. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions.js +27 -0
  84. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all.d.ts +2 -0
  85. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all.d.ts.map +1 -0
  86. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all.js +64 -0
  87. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-attribute-all-in-all-other-dimensions.d.ts +2 -0
  88. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-attribute-all-in-all-other-dimensions.d.ts.map +1 -0
  89. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-attribute-all-in-all-other-dimensions.js +22 -0
  90. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by.d.ts +2 -0
  91. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by.d.ts.map +1 -0
  92. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by.js +85 -0
  93. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-except.d.ts +2 -0
  94. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-except.d.ts.map +1 -0
  95. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-except.js +37 -0
  96. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-filter.d.ts +2 -0
  97. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-filter.d.ts.map +1 -0
  98. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-filter.js +42 -0
  99. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-except.d.ts +2 -0
  100. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-except.d.ts.map +1 -0
  101. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-except.js +94 -0
  102. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-filter.d.ts +2 -0
  103. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-filter.d.ts.map +1 -0
  104. package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-filter.js +33 -0
  105. package/esm/docs/en/docs/create-metrics/maql/for-each.d.ts +2 -0
  106. package/esm/docs/en/docs/create-metrics/maql/for-each.d.ts.map +1 -0
  107. package/esm/docs/en/docs/create-metrics/maql/for-each.js +17 -0
  108. package/esm/docs/en/docs/create-metrics/maql/logical-operators/and.d.ts +2 -0
  109. package/esm/docs/en/docs/create-metrics/maql/logical-operators/and.d.ts.map +1 -0
  110. package/esm/docs/en/docs/create-metrics/maql/logical-operators/and.js +37 -0
  111. package/esm/docs/en/docs/create-metrics/maql/logical-operators/not.d.ts +2 -0
  112. package/esm/docs/en/docs/create-metrics/maql/logical-operators/not.d.ts.map +1 -0
  113. package/esm/docs/en/docs/create-metrics/maql/logical-operators/not.js +12 -0
  114. package/esm/docs/en/docs/create-metrics/maql/logical-operators/or.d.ts +2 -0
  115. package/esm/docs/en/docs/create-metrics/maql/logical-operators/or.d.ts.map +1 -0
  116. package/esm/docs/en/docs/create-metrics/maql/logical-operators/or.js +22 -0
  117. package/esm/docs/en/docs/create-metrics/maql/maql-and-multidimensionality.d.ts +2 -0
  118. package/esm/docs/en/docs/create-metrics/maql/maql-and-multidimensionality.d.ts.map +1 -0
  119. package/esm/docs/en/docs/create-metrics/maql/maql-and-multidimensionality.js +59 -0
  120. package/esm/docs/en/docs/create-metrics/maql/math/abs.d.ts +2 -0
  121. package/esm/docs/en/docs/create-metrics/maql/math/abs.d.ts.map +1 -0
  122. package/esm/docs/en/docs/create-metrics/maql/math/abs.js +23 -0
  123. package/esm/docs/en/docs/create-metrics/maql/math/arithmetic-operations.d.ts +2 -0
  124. package/esm/docs/en/docs/create-metrics/maql/math/arithmetic-operations.d.ts.map +1 -0
  125. package/esm/docs/en/docs/create-metrics/maql/math/arithmetic-operations.js +29 -0
  126. package/esm/docs/en/docs/create-metrics/maql/math/ceiling.d.ts +2 -0
  127. package/esm/docs/en/docs/create-metrics/maql/math/ceiling.d.ts.map +1 -0
  128. package/esm/docs/en/docs/create-metrics/maql/math/ceiling.js +21 -0
  129. package/esm/docs/en/docs/create-metrics/maql/math/exp.d.ts +2 -0
  130. package/esm/docs/en/docs/create-metrics/maql/math/exp.d.ts.map +1 -0
  131. package/esm/docs/en/docs/create-metrics/maql/math/exp.js +27 -0
  132. package/esm/docs/en/docs/create-metrics/maql/math/floor.d.ts +2 -0
  133. package/esm/docs/en/docs/create-metrics/maql/math/floor.d.ts.map +1 -0
  134. package/esm/docs/en/docs/create-metrics/maql/math/floor.js +21 -0
  135. package/esm/docs/en/docs/create-metrics/maql/math/greatest.d.ts +2 -0
  136. package/esm/docs/en/docs/create-metrics/maql/math/greatest.d.ts.map +1 -0
  137. package/esm/docs/en/docs/create-metrics/maql/math/greatest.js +13 -0
  138. package/esm/docs/en/docs/create-metrics/maql/math/least.d.ts +2 -0
  139. package/esm/docs/en/docs/create-metrics/maql/math/least.d.ts.map +1 -0
  140. package/esm/docs/en/docs/create-metrics/maql/math/least.js +13 -0
  141. package/esm/docs/en/docs/create-metrics/maql/math/ln.d.ts +2 -0
  142. package/esm/docs/en/docs/create-metrics/maql/math/ln.d.ts.map +1 -0
  143. package/esm/docs/en/docs/create-metrics/maql/math/ln.js +33 -0
  144. package/esm/docs/en/docs/create-metrics/maql/math/log.d.ts +2 -0
  145. package/esm/docs/en/docs/create-metrics/maql/math/log.d.ts.map +1 -0
  146. package/esm/docs/en/docs/create-metrics/maql/math/log.js +29 -0
  147. package/esm/docs/en/docs/create-metrics/maql/math/power.d.ts +2 -0
  148. package/esm/docs/en/docs/create-metrics/maql/math/power.d.ts.map +1 -0
  149. package/esm/docs/en/docs/create-metrics/maql/math/power.js +33 -0
  150. package/esm/docs/en/docs/create-metrics/maql/math/round.d.ts +2 -0
  151. package/esm/docs/en/docs/create-metrics/maql/math/round.d.ts.map +1 -0
  152. package/esm/docs/en/docs/create-metrics/maql/math/round.js +34 -0
  153. package/esm/docs/en/docs/create-metrics/maql/math/sign.d.ts +2 -0
  154. package/esm/docs/en/docs/create-metrics/maql/math/sign.d.ts.map +1 -0
  155. package/esm/docs/en/docs/create-metrics/maql/math/sign.js +30 -0
  156. package/esm/docs/en/docs/create-metrics/maql/math/sqrt.d.ts +2 -0
  157. package/esm/docs/en/docs/create-metrics/maql/math/sqrt.d.ts.map +1 -0
  158. package/esm/docs/en/docs/create-metrics/maql/math/sqrt.js +32 -0
  159. package/esm/docs/en/docs/create-metrics/maql/math/trunc.d.ts +2 -0
  160. package/esm/docs/en/docs/create-metrics/maql/math/trunc.d.ts.map +1 -0
  161. package/esm/docs/en/docs/create-metrics/maql/math/trunc.js +36 -0
  162. package/esm/docs/en/docs/create-metrics/maql/ranking/percentile.d.ts +2 -0
  163. package/esm/docs/en/docs/create-metrics/maql/ranking/percentile.d.ts.map +1 -0
  164. package/esm/docs/en/docs/create-metrics/maql/ranking/percentile.js +57 -0
  165. package/esm/docs/en/docs/create-metrics/maql/ranking/rank-variations.d.ts +2 -0
  166. package/esm/docs/en/docs/create-metrics/maql/ranking/rank-variations.d.ts.map +1 -0
  167. package/esm/docs/en/docs/create-metrics/maql/ranking/rank-variations.js +90 -0
  168. package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-in.d.ts +2 -0
  169. package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-in.d.ts.map +1 -0
  170. package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-in.js +53 -0
  171. package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-of.d.ts +2 -0
  172. package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-of.d.ts.map +1 -0
  173. package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-of.js +29 -0
  174. package/esm/docs/en/docs/create-metrics/maql/ranking/within-clause.d.ts +2 -0
  175. package/esm/docs/en/docs/create-metrics/maql/ranking/within-clause.d.ts.map +1 -0
  176. package/esm/docs/en/docs/create-metrics/maql/ranking/within-clause.js +101 -0
  177. package/esm/docs/en/docs/create-metrics/maql/relational-operators.d.ts +2 -0
  178. package/esm/docs/en/docs/create-metrics/maql/relational-operators.d.ts.map +1 -0
  179. package/esm/docs/en/docs/create-metrics/maql/relational-operators.js +50 -0
  180. package/esm/docs/en/docs/create-metrics/maql/runing-totals/rolling-window.d.ts +2 -0
  181. package/esm/docs/en/docs/create-metrics/maql/runing-totals/rolling-window.d.ts.map +1 -0
  182. package/esm/docs/en/docs/create-metrics/maql/runing-totals/rolling-window.js +71 -0
  183. package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-total-statistical-functions.d.ts +2 -0
  184. package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-total-statistical-functions.d.ts.map +1 -0
  185. package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-total-statistical-functions.js +54 -0
  186. package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-totals-for-core-functions.d.ts +2 -0
  187. package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-totals-for-core-functions.d.ts.map +1 -0
  188. package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-totals-for-core-functions.js +37 -0
  189. package/esm/docs/en/docs/create-metrics/maql/statistic/correl.d.ts +2 -0
  190. package/esm/docs/en/docs/create-metrics/maql/statistic/correl.d.ts.map +1 -0
  191. package/esm/docs/en/docs/create-metrics/maql/statistic/correl.js +47 -0
  192. package/esm/docs/en/docs/create-metrics/maql/statistic/covariance-functions.d.ts +2 -0
  193. package/esm/docs/en/docs/create-metrics/maql/statistic/covariance-functions.d.ts.map +1 -0
  194. package/esm/docs/en/docs/create-metrics/maql/statistic/covariance-functions.js +46 -0
  195. package/esm/docs/en/docs/create-metrics/maql/statistic/forecast.d.ts +2 -0
  196. package/esm/docs/en/docs/create-metrics/maql/statistic/forecast.d.ts.map +1 -0
  197. package/esm/docs/en/docs/create-metrics/maql/statistic/forecast.js +74 -0
  198. package/esm/docs/en/docs/create-metrics/maql/statistic/least-squares-functions.d.ts +2 -0
  199. package/esm/docs/en/docs/create-metrics/maql/statistic/least-squares-functions.d.ts.map +1 -0
  200. package/esm/docs/en/docs/create-metrics/maql/statistic/least-squares-functions.js +44 -0
  201. package/esm/docs/en/docs/create-metrics/maql/statistic/standard-deviation-functions.d.ts +2 -0
  202. package/esm/docs/en/docs/create-metrics/maql/statistic/standard-deviation-functions.d.ts.map +1 -0
  203. package/esm/docs/en/docs/create-metrics/maql/statistic/standard-deviation-functions.js +88 -0
  204. package/esm/docs/en/docs/create-metrics/maql/statistic/variance-functions.d.ts +2 -0
  205. package/esm/docs/en/docs/create-metrics/maql/statistic/variance-functions.d.ts.map +1 -0
  206. package/esm/docs/en/docs/create-metrics/maql/statistic/variance-functions.js +54 -0
  207. package/esm/docs/en/docs/create-metrics/maql/time/for-each.d.ts +2 -0
  208. package/esm/docs/en/docs/create-metrics/maql/time/for-each.d.ts.map +1 -0
  209. package/esm/docs/en/docs/create-metrics/maql/time/for-each.js +96 -0
  210. package/esm/docs/en/docs/create-metrics/maql/time/for-next-period.d.ts +2 -0
  211. package/esm/docs/en/docs/create-metrics/maql/time/for-next-period.d.ts.map +1 -0
  212. package/esm/docs/en/docs/create-metrics/maql/time/for-next-period.js +38 -0
  213. package/esm/docs/en/docs/create-metrics/maql/time/for-next.d.ts +2 -0
  214. package/esm/docs/en/docs/create-metrics/maql/time/for-next.d.ts.map +1 -0
  215. package/esm/docs/en/docs/create-metrics/maql/time/for-next.js +27 -0
  216. package/esm/docs/en/docs/create-metrics/maql/time/for-previous-period.d.ts +2 -0
  217. package/esm/docs/en/docs/create-metrics/maql/time/for-previous-period.d.ts.map +1 -0
  218. package/esm/docs/en/docs/create-metrics/maql/time/for-previous-period.js +26 -0
  219. package/esm/docs/en/docs/create-metrics/maql/time/for-previous.d.ts +2 -0
  220. package/esm/docs/en/docs/create-metrics/maql/time/for-previous.d.ts.map +1 -0
  221. package/esm/docs/en/docs/create-metrics/maql/time/for-previous.js +30 -0
  222. package/esm/docs/en/docs/create-metrics/maql/time/functions-for-referring-to-past-time-periods.d.ts +2 -0
  223. package/esm/docs/en/docs/create-metrics/maql/time/functions-for-referring-to-past-time-periods.d.ts.map +1 -0
  224. package/esm/docs/en/docs/create-metrics/maql/time/functions-for-referring-to-past-time-periods.js +36 -0
  225. package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-add.d.ts +2 -0
  226. package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-add.d.ts.map +1 -0
  227. package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-add.js +53 -0
  228. package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-diff.d.ts +2 -0
  229. package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-diff.d.ts.map +1 -0
  230. package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-diff.js +55 -0
  231. package/esm/docs/en/docs/create-metrics/maql/time-macros.d.ts +2 -0
  232. package/esm/docs/en/docs/create-metrics/maql/time-macros.d.ts.map +1 -0
  233. package/esm/docs/en/docs/create-metrics/maql/time-macros.js +79 -0
  234. package/esm/docs/index.d.ts +77 -0
  235. package/esm/docs/index.d.ts.map +1 -0
  236. package/esm/docs/index.js +141 -0
  237. package/esm/findObjects.d.ts +13 -0
  238. package/esm/findObjects.d.ts.map +1 -0
  239. package/esm/findObjects.js +72 -0
  240. package/esm/format.d.ts +4 -0
  241. package/esm/format.d.ts.map +1 -0
  242. package/esm/format.js +581 -0
  243. package/esm/highlight/convert.d.ts +3 -0
  244. package/esm/highlight/convert.d.ts.map +1 -0
  245. package/esm/highlight/convert.js +12 -0
  246. package/esm/highlight/semanticsHighlight.d.ts +29 -0
  247. package/esm/highlight/semanticsHighlight.d.ts.map +1 -0
  248. package/esm/highlight/semanticsHighlight.js +326 -0
  249. package/esm/highlight/utils.d.ts +3 -0
  250. package/esm/highlight/utils.d.ts.map +1 -0
  251. package/esm/highlight/utils.js +14 -0
  252. package/esm/hover.d.ts +17 -0
  253. package/esm/hover.d.ts.map +1 -0
  254. package/esm/hover.js +60 -0
  255. package/esm/index.d.ts +9 -0
  256. package/esm/index.d.ts.map +1 -0
  257. package/esm/index.js +7 -0
  258. package/esm/labelElements.d.ts +22 -0
  259. package/esm/labelElements.d.ts.map +1 -0
  260. package/esm/labelElements.js +225 -0
  261. package/esm/maqlLanguageService.d.ts +51 -0
  262. package/esm/maqlLanguageService.d.ts.map +1 -0
  263. package/esm/maqlLanguageService.js +102 -0
  264. package/esm/maqlObjectTypes.d.ts +15 -0
  265. package/esm/maqlObjectTypes.d.ts.map +1 -0
  266. package/esm/maqlObjectTypes.js +28 -0
  267. package/esm/maqlServer.d.ts +4 -0
  268. package/esm/maqlServer.d.ts.map +1 -0
  269. package/esm/maqlServer.js +78 -0
  270. package/esm/metadata/model.d.ts +116 -0
  271. package/esm/metadata/model.d.ts.map +1 -0
  272. package/esm/metadata/model.js +137 -0
  273. package/esm/metadata/parameters.d.ts +16 -0
  274. package/esm/metadata/parameters.d.ts.map +1 -0
  275. package/esm/metadata/parameters.js +38 -0
  276. package/esm/metadata/types.d.ts +14 -0
  277. package/esm/metadata/types.d.ts.map +1 -0
  278. package/esm/metadata/types.js +2 -0
  279. package/esm/metadataService.d.ts +50 -0
  280. package/esm/metadataService.d.ts.map +1 -0
  281. package/esm/metadataService.js +156 -0
  282. package/esm/node/main.d.ts +2 -0
  283. package/esm/node/main.d.ts.map +1 -0
  284. package/esm/node/main.js +18 -0
  285. package/esm/parameterConstraints.d.ts +5 -0
  286. package/esm/parameterConstraints.d.ts.map +1 -0
  287. package/esm/parameterConstraints.js +198 -0
  288. package/esm/parseMaql.d.ts +43 -0
  289. package/esm/parseMaql.d.ts.map +1 -0
  290. package/esm/parseMaql.js +97 -0
  291. package/esm/renderParameters.d.ts +33 -0
  292. package/esm/renderParameters.d.ts.map +1 -0
  293. package/esm/renderParameters.js +72 -0
  294. package/esm/tests/metadata.test.helpers.d.ts +8 -0
  295. package/esm/tests/metadata.test.helpers.d.ts.map +1 -0
  296. package/esm/tests/metadata.test.helpers.js +468 -0
  297. package/esm/tokenRanges.d.ts +36 -0
  298. package/esm/tokenRanges.d.ts.map +1 -0
  299. package/esm/tokenRanges.js +54 -0
  300. package/esm/types/hierarchy.d.ts +37 -0
  301. package/esm/types/hierarchy.d.ts.map +1 -0
  302. package/esm/types/hierarchy.js +165 -0
  303. package/esm/types/signatures.d.ts +40 -0
  304. package/esm/types/signatures.d.ts.map +1 -0
  305. package/esm/types/signatures.js +142 -0
  306. package/esm/types/typeChecking.d.ts +56 -0
  307. package/esm/types/typeChecking.d.ts.map +1 -0
  308. package/esm/types/typeChecking.js +296 -0
  309. package/esm/types/typeModel.d.ts +18 -0
  310. package/esm/types/typeModel.d.ts.map +1 -0
  311. package/esm/types/typeModel.js +84 -0
  312. package/package.json +89 -3
package/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright (c) 2020-2022 GoodData Corporation
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,119 @@
1
- # Temporary Holding Version
1
+ # MAQL language server
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ TS/JS implementation of Language Server that utilizes LSP.
4
+
5
+ The project is part of the Rush-managed monorepo. Follow the main repository guidelines.
6
+
7
+ ## Browser consumers
8
+
9
+ `antlr4ts` is written for Node: it requires the Node built-ins `assert` and `util` and does not
10
+ declare them. Browser bundlers such as Vite and webpack 5 do not provide Node built-ins, so this
11
+ package declares their browser ports, `assert` and `util`, as dependencies. A package manager that
12
+ hoists them (npm, pnpm by default) puts them where `antlr4ts` resolves them. Without them, the
13
+ bundle crashes when it loads `antlr4ts` (`assert is not a function`, or `Cannot read properties of
14
+ undefined (reading 'custom')` from `util.inspect.custom`).
15
+
16
+ ## Build
17
+
18
+ To build the MAQL language server run
19
+
20
+ ```shell
21
+ rushx build
22
+ ```
23
+
24
+ ## Testing MAQL grammar changes
25
+
26
+ To get the latest grammar, upgrade `@gooddata/maql-antlr4ts` dependency, located in gdc-nas repository.
27
+ The npm package is not built automatically, it needs to be built by triggering the corresponding workflow
28
+ in gdc-nas. See https://github.com/gooddata/gdc-nas/blob/master/libraries/calq/maql-antlr4ts/README.md#publishing for details.
29
+
30
+ The MAQL lexer and parser are retrieved as a dependency from NPM, after build in gdc-nas
31
+ repository.
32
+
33
+ You may want to test out how changes to MAQL grammar affect the MAQL language server
34
+ before such changes are pushed to the repository.
35
+
36
+ For this purpose you may want to link the folder with the @gooddata/maql-antlr4ts source codes directly.
37
+
38
+ First move into the folder containing package.json for the dependency. This may be something like
39
+ `gdc-nas/libraries/calq/maql-parser/npm-lib`
40
+
41
+ #### WARNING:
42
+
43
+ Do not use `yarn link` to link `@gooddata/maql-antlr4ts`. The cause is not exactly clear, possibly library conflicts, but after
44
+ linking, antlr4 tokens in token streams have all indices set to -1.
45
+
46
+ This means that the `antlr4-c3` library will give incorrect results and completions tests will fail. There is no known
47
+ fix so far, other than using a different linking method such as [yalc](https://github.com/wclr/yalc) or rsync.
48
+
49
+ ---
50
+
51
+ ## MAQL changes checklist
52
+
53
+ After you update to a newer version of `@gooddata/maql-antlr4ts ` this checklist serves to verify that the changes
54
+ are reflected in the language server. The checklist tries to be as exhaustive as possible while not being
55
+ overwhelming. This also means that it can quickly become outdated, so please update any inaccuracies whenever
56
+ you encounter them. Also, most changes to MAQL will not require all the steps here mentioned. As an extra step,
57
+ please add test cases for new changes when possible.
58
+
59
+ #### 1. Fix tests (`rushx test`)
60
+
61
+ Tests may fail if any MAQL grammar rules were changed. But adding new rules will most likely not cause
62
+ any test failures. This may also be the last step in many cases.
63
+
64
+ #### 2. Add semantic highlighting to new tokens - [semantics.ts](./src/semantics.ts) - [semantics.test.ts](./test/semantics.test.ts)
65
+
66
+ Any new tokens need to have semantic highlighting manually added. Choose appropriate category.
67
+ If the highlighting depends on context (this is the case for example for curly brace tokens `{`, `}`
68
+ in labels and facts), you need to extend the SemanticTokenizer class for those cases. If you need to
69
+ add a new category (not recommended), you will also need to update the clients with the name and colour
70
+ of the new category - for example in [useMaqlTheme.ts](../web-app/src/MaqlEditor/maql/hooks/useMaqlTheme.ts).
71
+
72
+ #### 3. Add completions - [completions](./src/completions) - [completions.test.ts](./test/completions.test.ts)
73
+
74
+ You should add new completions if you added a rule or a token to MAQL Grammar.
75
+
76
+ To provide MAQL completions, we are using the [antlr4-c3](https://github.com/mike-lischke/antlr4-c3) library
77
+ which takes the grammar and gives us a list of tokens that continue the already written query.
78
+ However that is not enough for us as we want to be smarter.
79
+
80
+ ##### 3.1 Add completion descriptions - [descriptions.ts](./src/completions/descriptions.ts)
81
+
82
+ Each completion item is based on a description in the file. Most things can be copied from the examples already
83
+ there, but pay special attention to properties `triggerTokenId` and `ruleId`. Only one of those can be set for
84
+ each description, and it signifies when the completion should be shown. If `triggerTokenId` is set, then it will
85
+ be shown any time that token is suggested. This is good in most cases but some tokens can have multiple conflicting
86
+ meanings. In that case you can use `ruleId` which will on encountering the grammar rule with that id ignore all
87
+ tokens and only suggest completions that use the same `ruleId`.
88
+
89
+ ##### 3.2 Add special cases - [complete.ts](./src/completions/complete.ts)
90
+
91
+ For most cases, adding the description is enough. If something more special is required
92
+ (like label elements completions), you must delve into the `complete.ts` file and add that case manually.
93
+
94
+ #### 4. Add diagnostics - [diagnostics.ts](./src/diagnostics.ts) - [diagnostics.test.ts](./test/diagnostics.test.ts)
95
+
96
+ Diagnostics from grammar are generated automatically. Change `diagnostics.ts` only if you need a special case
97
+ or if you added an error token to MAQL Lexer.
98
+
99
+ #### 5. Add auto-format rule - [format.ts](./src/format.ts) - [format.test.ts](./test/format.test.ts)
100
+
101
+ Automatic formatting is quite tightly coupled to the MAQL grammar, so there is a chance it is broken after a change.
102
+ Try adding a test case to `format.test.ts` to see what happens.
103
+
104
+ ## Scripts
105
+
106
+ ### Documentation update
107
+
108
+ ```
109
+ rushx update-docs <path/to/docs/directory/content>
110
+ ```
111
+
112
+ This script, stored at `src/scripts/docsParser.ts`, will take `.md` files in `<path/to/docs/directory/content>`
113
+ and transform them into `.ts` files in `src/docs/`, along with an `index.ts` file to easily access the documentation
114
+ from inside the server.
115
+
116
+ The path to docs should point to the directory where different language versions are stored. For
117
+ example `docs-repository/docs/content`, where content has `en`, `es`, `fr` etc. folders.
118
+
119
+ The script should be run only if there are changes to the documentation in the documentation directory.
@@ -0,0 +1,12 @@
1
+ import { CompletionItem, CompletionList } from "vscode-languageserver";
2
+ import { type LabelElementsFunc, type LdmObjects } from "../metadata/model.js";
3
+ export declare function resolve(item: CompletionItem, docs: (resolveTag: string) => Promise<string | undefined>): Promise<CompletionItem>;
4
+ /**
5
+ * Find completions using the antlr4-c3 module.
6
+ * @param query - The MAQL query to be completed
7
+ * @param offset - The offset of the caret in the text
8
+ * @param ldmObjects - LDM objects to be offered, if undefined snippets are offered instead
9
+ * @param labelElementsFunc - Function to get possible label elements (strings) for a given label and filter text
10
+ */
11
+ export declare function complete(query: string, offset?: number, ldmObjects?: LdmObjects, labelElementsFunc?: LabelElementsFunc): Promise<CompletionList>;
12
+ //# sourceMappingURL=complete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../src/completions/complete.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,cAAc,EAEd,cAAc,EAIjB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAGH,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAClB,MAAM,sBAAsB,CAAC;AAiB9B,wBAAsB,OAAO,CACzB,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAC1D,OAAO,CAAC,cAAc,CAAC,CAUzB;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAqB,EAC7B,UAAU,CAAC,EAAE,UAAU,EACvB,iBAAiB,CAAC,EAAE,iBAAiB,GACtC,OAAO,CAAC,cAAc,CAAC,CA8CzB"}
@@ -0,0 +1,316 @@
1
+ // (C) 2021-2026 GoodData Corporation
2
+ import { CodeCompletionCore } from "antlr4-c3";
3
+ import { CompletionItem, CompletionItemKind, CompletionList, MarkupKind, Range, TextEdit, } from "vscode-languageserver";
4
+ import MaqlPkg from "@gooddata/maql-antlr4ts";
5
+ const { MaqlLexer, MaqlParser, escapeString } = MaqlPkg;
6
+ import { findLabelContext } from "../labelElements.js";
7
+ import { toMaqlObjectType } from "../maqlObjectTypes.js";
8
+ import { parameterDefaultLabel, parameterTypeLabel } from "../metadata/parameters.js";
9
+ import { MaqlMetric } from "../parseMaql.js";
10
+ import { tokenRange } from "../tokenRanges.js";
11
+ import { MaqlType, isSubtype } from "../types/hierarchy.js";
12
+ import { descriptions, ignoredTokens, } from "./descriptions.js";
13
+ import { findContext, isFinal } from "./findContext.js";
14
+ import { adjustSortText } from "./sort.js";
15
+ const [tokenCompletions, ruleCompletions] = getTokenAndRuleCompletions(descriptions);
16
+ export async function resolve(item, docs) {
17
+ const data = item.data;
18
+ const doc = data?.resolveTag ? await docs(data.resolveTag) : undefined;
19
+ if (doc) {
20
+ item.documentation = {
21
+ kind: MarkupKind.Markdown,
22
+ value: doc,
23
+ };
24
+ }
25
+ return item;
26
+ }
27
+ /**
28
+ * Find completions using the antlr4-c3 module.
29
+ * @param query - The MAQL query to be completed
30
+ * @param offset - The offset of the caret in the text
31
+ * @param ldmObjects - LDM objects to be offered, if undefined snippets are offered instead
32
+ * @param labelElementsFunc - Function to get possible label elements (strings) for a given label and filter text
33
+ */
34
+ export async function complete(query, offset = query.length, ldmObjects, labelElementsFunc) {
35
+ const metric = new MaqlMetric(query);
36
+ const adjustedOffset = MaqlMetric.offset(offset);
37
+ const lines = query.slice(0, offset).split("\n");
38
+ const position = {
39
+ line: lines.length,
40
+ character: lines[lines.length - 1].length,
41
+ };
42
+ const caretContext = findContext(metric, position, adjustedOffset);
43
+ const { leftFinalToken, caretToken, rightFinalToken } = caretContext.tokens;
44
+ // we do not wish to offer completions inside line comments
45
+ if (caretToken.type === MaqlParser.Comment) {
46
+ return CompletionList.create();
47
+ }
48
+ const candidates = collectCandidates(metric, caretToken.tokenIndex);
49
+ // "safe replacement range", which can be replaced by anything
50
+ const range = textEditRange(leftFinalToken, caretToken, rightFinalToken);
51
+ // get label elements completions if one of the candidates is a STRING token
52
+ let context = null; // findLabelContext function is expensive for larger queries, so we lazy-initialize context
53
+ const getContext = () => context ?? (context = findLabelContext(metric, position));
54
+ const labelElementsList = labelElementsFunc && candidates.tokens.get(MaqlParser.String)
55
+ ? await completeLabelElements(labelElementsFunc, range, tokenToString(caretToken, adjustedOffset), getContext())
56
+ : CompletionList.create();
57
+ // skip non-string completions if caret is inside string
58
+ const stringTokens = [MaqlParser.String, MaqlParser.UnterminatedString];
59
+ if (stringTokens.includes(caretToken.type)) {
60
+ return labelElementsList;
61
+ }
62
+ // static completion items from descriptions
63
+ const expectedTypes = caretContext.expectedTypes;
64
+ const staticCompletionList = completeFromCandidateTokens(candidates.tokens, range, expectedTypes);
65
+ // completions from preferred rules (to disambiguate tokens)
66
+ const ruleCompletionList = completeFromRules(candidates.rules, range, ldmObjects, expectedTypes);
67
+ const completionList = [labelElementsList, staticCompletionList, ruleCompletionList].reduce((accuList, currList) => ({
68
+ items: accuList.items.concat(currList.items),
69
+ isIncomplete: accuList.isIncomplete || currList.isIncomplete,
70
+ }));
71
+ return adjustSortText(completionList, caretContext);
72
+ }
73
+ async function completeLabelElements(labelElementsFunc, range, typedText, context) {
74
+ const labelElementResult = await labelElementsFunc(context.labels, context.strings.map((str) => str.string), { filter: typedText });
75
+ return CompletionList.create(labelElementResult.list.elements
76
+ .map((element) => element.title === null ? null : createStringCompletionItem(element.title, undefined, range))
77
+ .filter((item) => item !== null), labelElementResult.list.isIncomplete);
78
+ }
79
+ function completeFromCandidateTokens(tokens, range, allowedTypes) {
80
+ const items = [];
81
+ tokens.forEach((_, tokenId) => {
82
+ const staticCompletions = tokenCompletions.get(tokenId) ?? [];
83
+ if (staticCompletions.length === 0 && !ignoredTokens.has(tokenId)) {
84
+ // completions for tokens that do not have a description - useful when testing MAQL changes
85
+ staticCompletions.push(CompletionItem.create(getTokenName(tokenId)));
86
+ }
87
+ const typedStaticCompletions = staticCompletions.filter((item) => {
88
+ const itemType = item.maqlType;
89
+ return itemType === undefined || allowedTypes.some((type) => isSubtype(itemType, type));
90
+ });
91
+ typedStaticCompletions.forEach((item) => withTextEdit(item, range));
92
+ // filter-out descriptions with inapplicable types when known
93
+ items.push(...typedStaticCompletions);
94
+ });
95
+ return CompletionList.create(items, false);
96
+ }
97
+ function getTokenName(tokenId) {
98
+ const literalName = MaqlParser.VOCABULARY.getLiteralName(tokenId);
99
+ if (literalName !== undefined) {
100
+ return literalName.slice(1, literalName.length - 1).toUpperCase();
101
+ }
102
+ return MaqlParser.VOCABULARY.getDisplayName(tokenId);
103
+ }
104
+ /**
105
+ * Rule completions are necessary when the tokens to be completed are ambiguous
106
+ * An example in MAQL would be NEXT used after FOR and the NEXT time macro
107
+ * `... WHERE {label/date.day} = NEXT(DAY)` vs. `... FOR NEXT({label/date.day})`
108
+ * They are also used for logical data model objects (labels, facts, metrics),
109
+ * because using the parser rules is more explicit than checking for type tokens.
110
+ */
111
+ function completeFromRules(rules, range, ldmObjects, allowedTypes) {
112
+ const items = [];
113
+ rules.forEach((_, ruleId) => {
114
+ if (ruleId === MaqlParser.RULE_attribute && ldmObjects && ldmObjects?.size >= 0) {
115
+ const attributeItems = completeAttribute(ldmObjects, range, allowedTypes);
116
+ items.push(...attributeItems);
117
+ }
118
+ else if ((ruleId === MaqlParser.RULE_numeric || ruleId === MaqlParser.RULE_fact) &&
119
+ ldmObjects &&
120
+ ldmObjects?.size >= 0) {
121
+ const numericItems = completeNumeric(ldmObjects, range, allowedTypes);
122
+ items.push(...numericItems);
123
+ }
124
+ else if (ruleId === MaqlParser.RULE_parameter && ldmObjects) {
125
+ const parameterItems = completeParameter(ldmObjects, range, allowedTypes);
126
+ items.push(...parameterItems);
127
+ }
128
+ else {
129
+ const ruleItems = ruleCompletions.get(ruleId) ?? [];
130
+ const typedRuleItems = ruleItems.filter((item) => {
131
+ const compType = item.maqlType;
132
+ return compType === undefined || allowedTypes.some((type) => isSubtype(compType, type));
133
+ });
134
+ typedRuleItems.forEach((item) => withTextEdit(item, range));
135
+ items.push(...typedRuleItems);
136
+ }
137
+ });
138
+ return CompletionList.create(items, false);
139
+ }
140
+ function completeAttribute(ldmObjects, range, allowedTypes) {
141
+ const items = [];
142
+ if (allowedTypes.some((type) => isSubtype(MaqlType.DATE, type))) {
143
+ items.push(...ldmObjects.get("label", "date").map((obj) => createMetadataCompletionItem(obj, range)));
144
+ }
145
+ if (allowedTypes.some((type) => isSubtype(MaqlType.STRING, type))) {
146
+ items.push(...ldmObjects.get("label", "regular").map((obj) => createMetadataCompletionItem(obj, range)));
147
+ // A computed attribute buckets rows into string values, so it completes wherever a regular
148
+ // label does - both in a metric and in another computed attribute's expression.
149
+ items.push(...ldmObjects.get("computedAttribute").map((obj) => createMetadataCompletionItem(obj, range)));
150
+ }
151
+ if (allowedTypes.some((type) => isSubtype(MaqlType.DATASET, type))) {
152
+ items.push(...ldmObjects.get("dataset").map((obj) => createMetadataCompletionItem(obj, range)));
153
+ }
154
+ return items;
155
+ }
156
+ function completeNumeric(ldmObjects, range, allowedTypes) {
157
+ const items = [];
158
+ if (allowedTypes.some((type) => isSubtype(MaqlType.NUMERIC, type))) {
159
+ items.push(...ldmObjects.get("fact").map((obj) => createMetadataCompletionItem(obj, range)));
160
+ }
161
+ items.push(...ldmObjects.get("metric").map((obj) => createMetadataCompletionItem(obj, range)));
162
+ return items;
163
+ }
164
+ function completeParameter(ldmObjects, range, allowedTypes) {
165
+ return ldmObjects
166
+ .get("parameter")
167
+ .filter((parameter) => allowedTypes.some((type) => isSubtype(parameterMaqlType(parameter.definition), type)))
168
+ .map((obj) => createParameterCompletionItem(obj, range));
169
+ }
170
+ function parameterMaqlType(definition) {
171
+ switch (definition.type) {
172
+ case "NUMBER":
173
+ return MaqlType.NUMERIC;
174
+ case "STRING":
175
+ return MaqlType.STRING;
176
+ }
177
+ }
178
+ function createParameterCompletionItem(parameter, range) {
179
+ const item = createMetadataCompletionItem(parameter, range);
180
+ return {
181
+ ...item,
182
+ labelDetails: { description: parameterTypeLabel(parameter.definition) },
183
+ detail: `${item.detail}, Default: ${parameterDefaultLabel(parameter.definition)}`,
184
+ };
185
+ }
186
+ // preferredRules specify rules where token ids alone are insufficient, because they are ambiguous
187
+ const preferredRules = new Set([
188
+ MaqlParser.RULE_attribute,
189
+ MaqlParser.RULE_numeric,
190
+ ...ruleCompletions.keys(),
191
+ ]);
192
+ function collectCandidates(metric, caretTokenIndex) {
193
+ const core = new CodeCompletionCore(metric.parser);
194
+ core.translateRulesTopDown = true;
195
+ core.preferredRules = preferredRules;
196
+ return core.collectCandidates(caretTokenIndex);
197
+ }
198
+ const irreplaceableTokens = new Set([MaqlLexer.WS, MaqlLexer.LPAREN, MaqlLexer.RPAREN, MaqlLexer.COMMA]);
199
+ function textEditRange(lastValidToken, caretToken, nextValidToken) {
200
+ if (caretToken.channel !== MaqlLexer.DEFAULT_TOKEN_CHANNEL ||
201
+ lastValidToken.tokenIndex > nextValidToken.tokenIndex ||
202
+ irreplaceableTokens.has(caretToken.type)) {
203
+ return undefined;
204
+ }
205
+ if (lastValidToken === nextValidToken) {
206
+ return tokenRange(lastValidToken);
207
+ }
208
+ const lastRange = tokenRange(lastValidToken);
209
+ const nextRange = tokenRange(nextValidToken);
210
+ return Range.create(lastRange.end.line, lastRange.end.character, nextRange.start.line, nextRange.start.character);
211
+ }
212
+ function withTextEdit(item, range) {
213
+ item.textEdit = range ? TextEdit.replace(range, item.insertText ?? item.label) : undefined;
214
+ return item;
215
+ }
216
+ function createMetadataCompletionItem(metadataObject, range) {
217
+ // The completion is inserted into MAQL text, so it has to use the MAQL spelling of the type
218
+ // (`computed_attribute`), not the Tiger one (`computedAttribute`) the catalog object carries.
219
+ const maqlType = toMaqlObjectType(metadataObject.tigerType);
220
+ const identifier = `${maqlType}/${metadataObject.id}`;
221
+ const insertText = `{${identifier}}`;
222
+ const kind = getCompletionItemKind(metadataObject);
223
+ return {
224
+ label: metadataObject.title ?? identifier,
225
+ kind: kind,
226
+ insertText: insertText,
227
+ filterText: `{ ${maqlType} / ${metadataObject.id} } ${metadataObject.title}`,
228
+ // Sort by the bare id (no MAQL type prefix) so that object types sharing a completion kind
229
+ // (labels and computed attributes) interleave instead of clustering by MAQL type.
230
+ sortText: metadataObject.id,
231
+ detail: `ID: '${identifier}', Description: '${metadataObject.description}'`,
232
+ textEdit: range ? TextEdit.replace(range, insertText) : undefined,
233
+ };
234
+ }
235
+ /**
236
+ * A function to get text value of a token for the purposes of filtering completions
237
+ * @param token - MAQL token from Antlr4 generated parser
238
+ * @param offset - caret offset in the entire query
239
+ */
240
+ function tokenToString(token, offset) {
241
+ if (token.type === MaqlParser.UnterminatedString) {
242
+ return token.text
243
+ ?.slice(1, Math.min(token.text.length, offset - token.startIndex))
244
+ .replace(/\\"/g, '"');
245
+ }
246
+ else if (token.type === MaqlParser.String) {
247
+ return token.text
248
+ ?.slice(1, Math.min(token.text.length - 1, offset - token.startIndex))
249
+ .replace(/\\"/g, '"');
250
+ // oxlint-disable-next-line eslint/no-negated-condition
251
+ }
252
+ else if (!isFinal(token)) {
253
+ return token.text?.slice(0, Math.min(token.text.length, offset - token.startIndex));
254
+ }
255
+ else {
256
+ return undefined; // final tokens must not be used - their text value is not useful
257
+ }
258
+ }
259
+ function createStringCompletionItem(label, detail, range) {
260
+ const insertText = escapeString(label, '"');
261
+ return {
262
+ label: label,
263
+ kind: CompletionItemKind.Text,
264
+ insertText: insertText,
265
+ sortText: label,
266
+ filterText: `" ${label} "`,
267
+ detail: detail,
268
+ textEdit: range ? TextEdit.replace(range, insertText) : undefined,
269
+ };
270
+ }
271
+ function getCompletionItemKind(metadataObject) {
272
+ switch (metadataObject.tigerType) {
273
+ case "fact":
274
+ return CompletionItemKind.Field;
275
+ case "metric":
276
+ return CompletionItemKind.Variable;
277
+ case "dataset":
278
+ return CompletionItemKind.Constant;
279
+ case "parameter":
280
+ return CompletionItemKind.Value;
281
+ case "label":
282
+ case "attribute":
283
+ case "computedAttribute":
284
+ return CompletionItemKind.Enum;
285
+ default:
286
+ return CompletionItemKind.Variable;
287
+ }
288
+ }
289
+ /**
290
+ * @returns [Map\<token id, CompletionDescription[]\>, Map\<rule id, CompletionDescription[]\>]
291
+ */
292
+ function getTokenAndRuleCompletions(descriptions) {
293
+ const tokenDescriptions = new Map();
294
+ const ruleDescriptions = new Map();
295
+ descriptions.forEach((desc) => {
296
+ if (desc.ruleId) {
297
+ const list = ruleDescriptions.get(desc.ruleId) ?? [];
298
+ list.push(desc);
299
+ ruleDescriptions.set(desc.ruleId, list);
300
+ }
301
+ else if (desc.triggerTokenId) {
302
+ const list = tokenDescriptions.get(desc.triggerTokenId) ?? [];
303
+ list.push(desc);
304
+ tokenDescriptions.set(desc.triggerTokenId, list);
305
+ }
306
+ else {
307
+ throw new Error(`completion description for '${desc.label}' has neither triggerTokenId nor ruleId!`);
308
+ }
309
+ desc.data = {
310
+ resolveTag: desc.resolveTag,
311
+ ruleId: desc.ruleId,
312
+ triggerTokenId: desc.triggerTokenId,
313
+ }; // store additional info tag in 'data' property for retrieval on completion resolve
314
+ });
315
+ return [tokenDescriptions, ruleDescriptions];
316
+ }
@@ -0,0 +1,42 @@
1
+ import { type CompletionItem } from "vscode-languageserver";
2
+ import { type ResolveTag } from "../docs/index.js";
3
+ import { MaqlType } from "../types/hierarchy.js";
4
+ /**
5
+ * Maps concepts from MAQL to completionItemKind values
6
+ */
7
+ export declare const Kind: {
8
+ Attribute: 13;
9
+ Label: 13;
10
+ Metric: 6;
11
+ Parameter: 12;
12
+ Fact: 5;
13
+ Dataset: 21;
14
+ LabelElement: 1;
15
+ Function: 3;
16
+ Keyword: 14;
17
+ Operator: 24;
18
+ Boolean: 12;
19
+ Granularity: 20;
20
+ Snippet: 15;
21
+ };
22
+ /**
23
+ * CompletionDescription - CompletionItem with additional information so that it can be offered appropriately
24
+ */
25
+ export type CompletionDescription = CompletionItem & ICompletionMaqlData;
26
+ /**
27
+ * Data that links a completion item to documentation and MAQL parser objects
28
+ * Either triggerTokenId or ruleId must be set
29
+ */
30
+ export interface ICompletionMaqlData {
31
+ resolveTag?: ResolveTag;
32
+ triggerTokenId?: number;
33
+ ruleId?: number;
34
+ maqlType?: MaqlType;
35
+ }
36
+ /**
37
+ * Tokens that will not generate any completion items
38
+ * Note that this can be overwritten by creating a CompletionDescription that triggers on that token
39
+ */
40
+ export declare const ignoredTokens: Set<number>;
41
+ export declare const descriptions: CompletionDescription[];
42
+ //# sourceMappingURL=descriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptions.d.ts","sourceRoot":"","sources":["../../src/completions/descriptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAwC,MAAM,uBAAuB,CAAC;AAMlG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIjD;;GAEG;AACH,eAAO,MAAM,IAAI;IACb,SAAS;IACT,KAAK;IACL,MAAM;IACN,SAAS;IACT,IAAI;IACJ,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,WAAW;IACX,OAAO;CACV,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEzE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,aAmDxB,CAAC;AAEH,eAAO,MAAM,YAAY,EAAE,qBAAqB,EAqO/C,CAAC"}