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

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 (314) 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 +289 -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 +171 -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 +98 -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 +46 -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 +259 -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 +82 -0
  235. package/esm/docs/index.d.ts.map +1 -0
  236. package/esm/docs/index.js +143 -0
  237. package/esm/findObjects.d.ts +13 -0
  238. package/esm/findObjects.d.ts.map +1 -0
  239. package/esm/findObjects.js +73 -0
  240. package/esm/format.d.ts +4 -0
  241. package/esm/format.d.ts.map +1 -0
  242. package/esm/format.js +569 -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 +47 -0
  247. package/esm/highlight/semanticsHighlight.d.ts.map +1 -0
  248. package/esm/highlight/semanticsHighlight.js +345 -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 +23 -0
  253. package/esm/hover.d.ts.map +1 -0
  254. package/esm/hover.js +60 -0
  255. package/esm/index.d.ts +11 -0
  256. package/esm/index.d.ts.map +1 -0
  257. package/esm/index.js +9 -0
  258. package/esm/labelElements.d.ts +22 -0
  259. package/esm/labelElements.d.ts.map +1 -0
  260. package/esm/labelElements.js +224 -0
  261. package/esm/maqlLanguageService.d.ts +56 -0
  262. package/esm/maqlLanguageService.d.ts.map +1 -0
  263. package/esm/maqlLanguageService.js +104 -0
  264. package/esm/maqlObjectTypes.d.ts +17 -0
  265. package/esm/maqlObjectTypes.d.ts.map +1 -0
  266. package/esm/maqlObjectTypes.js +30 -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 +162 -0
  271. package/esm/metadata/model.d.ts.map +1 -0
  272. package/esm/metadata/model.js +143 -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 +37 -0
  276. package/esm/metadata/types.d.ts +16 -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 +56 -0
  280. package/esm/metadataService.d.ts.map +1 -0
  281. package/esm/metadataService.js +159 -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 +197 -0
  288. package/esm/parseMaql.d.ts +43 -0
  289. package/esm/parseMaql.d.ts.map +1 -0
  290. package/esm/parseMaql.js +96 -0
  291. package/esm/renderParameters.d.ts +41 -0
  292. package/esm/renderParameters.d.ts.map +1 -0
  293. package/esm/renderParameters.js +76 -0
  294. package/esm/sdk-maql-language-server.d.ts +496 -0
  295. package/esm/tests/metadata.test.helpers.d.ts +8 -0
  296. package/esm/tests/metadata.test.helpers.d.ts.map +1 -0
  297. package/esm/tests/metadata.test.helpers.js +468 -0
  298. package/esm/tokenRanges.d.ts +36 -0
  299. package/esm/tokenRanges.d.ts.map +1 -0
  300. package/esm/tokenRanges.js +55 -0
  301. package/esm/tsdoc-metadata.json +11 -0
  302. package/esm/types/hierarchy.d.ts +37 -0
  303. package/esm/types/hierarchy.d.ts.map +1 -0
  304. package/esm/types/hierarchy.js +165 -0
  305. package/esm/types/signatures.d.ts +40 -0
  306. package/esm/types/signatures.d.ts.map +1 -0
  307. package/esm/types/signatures.js +141 -0
  308. package/esm/types/typeChecking.d.ts +54 -0
  309. package/esm/types/typeChecking.d.ts.map +1 -0
  310. package/esm/types/typeChecking.js +295 -0
  311. package/esm/types/typeModel.d.ts +18 -0
  312. package/esm/types/typeModel.d.ts.map +1 -0
  313. package/esm/types/typeModel.js +84 -0
  314. package/package.json +83 -3
@@ -0,0 +1,73 @@
1
+ // (C) 2021-2026 GoodData Corporation
2
+ import { ParseTreeWalker } from "antlr4ng";
3
+ import { AttributeTypeContext, MaqlParser, MaqlParserListener, NumericTypeContext, } from "@gooddata/maql-antlr4ts";
4
+ import { isTigerType, tigerIdTypeToObjectType } from "@gooddata/sdk-backend-tiger";
5
+ import { normalizeMaqlObjectType } from "./maqlObjectTypes.js";
6
+ import { MaqlMetric } from "./parseMaql.js";
7
+ import { antlrContextRange } from "./tokenRanges.js";
8
+ export function findAllObjects(metric) {
9
+ const finder = new ObjectFinder();
10
+ ParseTreeWalker.DEFAULT.walk(finder, metric.tree);
11
+ return finder.objects;
12
+ }
13
+ // TODO rewrite using AbstractAstVisitor
14
+ class ObjectFinder extends MaqlParserListener {
15
+ objects;
16
+ constructor(objects = []) {
17
+ super();
18
+ this.objects = objects;
19
+ }
20
+ pushObject(ctx, type) {
21
+ const lbrace = ctx.getToken(MaqlParser.LBRACE, 0);
22
+ const sep = ctx.getToken(MaqlParser.SEP, 0);
23
+ const id = ctx.getToken(MaqlParser.ID, 0);
24
+ const rbrace = ctx.getToken(MaqlParser.RBRACE, 0);
25
+ const start = ctx.start;
26
+ // check that the object is complete
27
+ if (lbrace === null ||
28
+ lbrace.symbol.tokenIndex === -1 ||
29
+ sep === null ||
30
+ sep.symbol.tokenIndex === -1 ||
31
+ id === null ||
32
+ id.symbol.tokenIndex === -1 ||
33
+ rbrace === null ||
34
+ rbrace.symbol.tokenIndex === -1 ||
35
+ type === undefined ||
36
+ start === null) {
37
+ return;
38
+ }
39
+ const range = antlrContextRange(start, ctx.stop);
40
+ // `actualType` keeps the MAQL spelling so diagnostics quote what the author wrote.
41
+ //NOTE: The lexer accepts any casing, so fold it before the type is looked up.
42
+ const tigerType = normalizeMaqlObjectType(type.toLowerCase());
43
+ this.objects.push({
44
+ tigerType: isTigerType(tigerType) ? tigerType : undefined,
45
+ actualType: type,
46
+ id: id.getText(),
47
+ ref: {
48
+ type: tigerIdTypeToObjectType[tigerType],
49
+ identifier: id.getText(),
50
+ },
51
+ range: range,
52
+ offsets: {
53
+ start: MaqlMetric.rawOffset(start.start),
54
+ end: MaqlMetric.rawOffset((ctx.stop?.stop ?? start.stop) + 1),
55
+ },
56
+ });
57
+ }
58
+ exitAttribute = (ctx) => {
59
+ this.pushObject(ctx, ctx.getRuleContext(0, AttributeTypeContext)?.getText());
60
+ };
61
+ exitNumeric = (ctx) => {
62
+ this.pushObject(ctx, ctx.getRuleContext(0, NumericTypeContext)?.getText());
63
+ };
64
+ exitFact = (ctx) => {
65
+ this.pushObject(ctx, ctx.getToken(MaqlParser.FACT, 0)?.getText());
66
+ };
67
+ exitPrompt = (ctx) => {
68
+ this.pushObject(ctx, ctx.getToken(MaqlParser.PROMPT, 0)?.getText());
69
+ };
70
+ exitParameter = (ctx) => {
71
+ this.pushObject(ctx, ctx.getToken(MaqlParser.PARAMETER, 0)?.getText());
72
+ };
73
+ }
@@ -0,0 +1,4 @@
1
+ import { type FormattingOptions, type Range, TextEdit } from "vscode-languageserver";
2
+ export declare function format(query: string, options: FormattingOptions): TextEdit[];
3
+ export declare function formatRange(query: string, range: Range, options: FormattingOptions): TextEdit[];
4
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,iBAAiB,EAAiB,KAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AA6CpG,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,QAAQ,EAAE,CAI5E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,GAAG,QAAQ,EAAE,CAI/F"}
package/esm/format.js ADDED
@@ -0,0 +1,569 @@
1
+ // (C) 2022-2026 GoodData Corporation
2
+ import { TextEdit } from "vscode-languageserver";
3
+ import { ExpressionListContext, MaqlExpressionContext, MaqlParser, MaqlParserVisitor, } from "@gooddata/maql-antlr4ts";
4
+ import { TokenTypes, tokenTypeMap } from "./highlight/semanticsHighlight.js";
5
+ import { MaqlMetric } from "./parseMaql.js";
6
+ import { antlrContextRange, tokenRange } from "./tokenRanges.js";
7
+ export function format(query, options) {
8
+ const metric = new MaqlMetric(query);
9
+ const formatter = new MaqlFormatter(options, metric);
10
+ return formatter.visit(metric.tree);
11
+ }
12
+ export function formatRange(query, range, options) {
13
+ const metric = new MaqlMetric(query);
14
+ const formatter = new MaqlFormatter(options, metric, range);
15
+ return formatter.visit(metric.tree);
16
+ }
17
+ /**
18
+ * Automatic formatting for MAQL metrics
19
+ * MaqlFormatter class is a parse tree visitor that analyzes a MAQL metric and finds necessary text edits
20
+ * to transform the metric into the preferred formatting.
21
+ * The found text edits are not sorted. However, they are guaranteed to not be overlapping.
22
+ *
23
+ * The basic principle is to apply a text edit on each token only once. Take this query as an example
24
+ * ```
25
+ * SELECT AVG({fact/budget})
26
+ * WHERE {label/country.code}="US"
27
+ * ```
28
+ * the tokens here would be
29
+ * ```
30
+ * SELECT WS AVG LPAREN <fact tokens> RPAREN WS WHERE WS <label tokens> RELOP STRING
31
+ * ```
32
+ * From the tokens and the MAQL grammar a parse tree is constructed.
33
+ * When traversing the parse tree, edits are added based on the defined rules. If multiple rules should be applied
34
+ * using the same token, the first rule triggered has precedence.
35
+ * Most important are the whitespace (WS) tokens, which are strings of whitespace characters - spaces, new lines, tabs etc.
36
+ */
37
+ class MaqlFormatter extends MaqlParserVisitor {
38
+ options;
39
+ indentationLevel = 0;
40
+ formattedTokens;
41
+ stream;
42
+ range;
43
+ get indentSpaces() {
44
+ return " ".repeat(this.indentationLevel * this.options.tabSize);
45
+ }
46
+ constructor(options, metric, range) {
47
+ super();
48
+ this.options = options;
49
+ this.formattedTokens = new Set();
50
+ this.stream = metric.tokenStream;
51
+ this.range = range;
52
+ }
53
+ defaultResult() {
54
+ return [];
55
+ }
56
+ aggregateResult(aggregate, nextResult) {
57
+ return aggregate.concat(nextResult);
58
+ }
59
+ visit(tree) {
60
+ // if a range is specified do not enter contexts where the intersection with the context range is empty
61
+ if (this.range) {
62
+ return this.visitInRange(tree, this.range);
63
+ }
64
+ return super.visit(tree) ?? this.defaultResult();
65
+ }
66
+ visitInRange(tree, range) {
67
+ const interval = tree.getSourceInterval();
68
+ const treeRange = antlrContextRange(this.stream.get(interval.start), this.stream.get(interval.stop)).toRange();
69
+ if (!this.intersects(treeRange, range)) {
70
+ return this.defaultResult();
71
+ }
72
+ return (super.visit(tree) ?? []).filter((edit) => this.intersects(edit.range, range));
73
+ }
74
+ visitChildren(node, firstChild = 0, lastChild = node.getChildCount() - 1) {
75
+ let result = this.defaultResult();
76
+ for (let i = firstChild; i <= lastChild; i++) {
77
+ if (!this.shouldVisitNextChild(node, result)) {
78
+ break;
79
+ }
80
+ const child = node.getChild(i);
81
+ if (!child)
82
+ continue;
83
+ const childResult = this.visit(child);
84
+ result = this.aggregateResult(result, childResult);
85
+ }
86
+ return result;
87
+ }
88
+ visitTerminal(node) {
89
+ const token = node.symbol;
90
+ const wsEdits = this.ensureWhitespace(this.getHiddenToLeft(token), undefined, this.indentSpaces);
91
+ const edits = this.formatToken(token);
92
+ return wsEdits.concat(edits);
93
+ }
94
+ visitErrorNode(node) {
95
+ if (node.symbol.tokenIndex === -1)
96
+ return this.defaultResult(); // conjured up symbol -> skip
97
+ return this.visitTerminal(node); // format error nodes anyway if possible
98
+ }
99
+ formatToken(token) {
100
+ if (this.formattedTokens.has(token.tokenIndex))
101
+ return this.defaultResult();
102
+ this.formattedTokens.add(token.tokenIndex);
103
+ const semanticType = tokenTypeMap.get(token.type);
104
+ const edits = [];
105
+ const range = tokenRange(token);
106
+ if (!this.inRange(range) || !token.text)
107
+ return this.defaultResult();
108
+ if (semanticType === TokenTypes.Keyword || semanticType === TokenTypes.Function) {
109
+ const edited = token.text.toUpperCase();
110
+ if (token.text !== edited) {
111
+ edits.push(TextEdit.replace(range, edited));
112
+ }
113
+ }
114
+ return edits;
115
+ }
116
+ visitMaqlMeasure = this.visitMaqlQuery;
117
+ visitMaqlComputedAttribute = this.visitMaqlQuery;
118
+ visitMaqlFilter = this.visitMaqlQuery;
119
+ visitMaqlQuery(ctx) {
120
+ const edits = [];
121
+ const eof = ctx.EOF().symbol;
122
+ const eofPosition = tokenRange(eof).start;
123
+ const hidden = this.getHiddenToLeft(eof);
124
+ if (this.options.trimFinalNewlines) {
125
+ const final = this.options.insertFinalNewline ? "\n" : "";
126
+ edits.push(...this.removeWhitespace(hidden, " ", final));
127
+ }
128
+ else if (this.options.insertFinalNewline) {
129
+ edits.push(...this.ensureNewline(hidden, eofPosition));
130
+ }
131
+ else {
132
+ edits.push(...this.ensureWhitespace(hidden, "", "", eofPosition));
133
+ }
134
+ edits.push(...this.visitChildren(ctx));
135
+ return edits;
136
+ }
137
+ visitFunctionCall = (ctx) => this.visitFunctionCallCommon(ctx);
138
+ visitFunctionCallRun = (ctx) => {
139
+ const edits = [];
140
+ edits.push(...this.visitFunctionCallCommon(ctx));
141
+ const withinCtx = ctx.within();
142
+ if (withinCtx) {
143
+ edits.push(...this.visitFunctionCallClause(withinCtx));
144
+ }
145
+ const rollWindowCtx = ctx.rollWindow();
146
+ if (rollWindowCtx) {
147
+ edits.push(...this.visitFunctionCallClause(rollWindowCtx));
148
+ }
149
+ return edits;
150
+ };
151
+ visitFunctionCallRank = (ctx) => {
152
+ const edits = [];
153
+ edits.push(...this.visitFunctionCallCommon(ctx));
154
+ const rankDirCtx = ctx.rankDir();
155
+ if (rankDirCtx) {
156
+ edits.push(...this.visitFunctionCallClause(rankDirCtx));
157
+ }
158
+ const withinCtx = ctx.within();
159
+ if (withinCtx) {
160
+ edits.push(...this.visitFunctionCallClause(withinCtx));
161
+ }
162
+ return edits;
163
+ };
164
+ visitFunctionCallLastFirstValue = (ctx) => {
165
+ const edits = [];
166
+ edits.push(...this.visitFunctionCallCommon(ctx));
167
+ const orderByCtx = ctx.orderby();
168
+ if (orderByCtx) {
169
+ edits.push(...this.visitFunctionCallClause(orderByCtx));
170
+ }
171
+ const withinCtx = ctx.within();
172
+ if (withinCtx) {
173
+ edits.push(...this.visitFunctionCallClause(withinCtx));
174
+ }
175
+ return edits;
176
+ };
177
+ /**
178
+ * Ensure new line before function modifying clauses e.g. WITHIN
179
+ */
180
+ visitFunctionCallClause(ctx) {
181
+ const edits = [];
182
+ const start = ctx.start;
183
+ if (start) {
184
+ edits.push(...this.ensureNewline(this.getHiddenToLeft(start), tokenRange(start).start));
185
+ }
186
+ edits.push(...this.visit(ctx));
187
+ return edits;
188
+ }
189
+ visitFunctionCallCommon(ctx) {
190
+ const edits = [];
191
+ const name = ctx.getChild(0);
192
+ if (name) {
193
+ edits.push(...this.visit(name));
194
+ }
195
+ const lparen = ctx.getToken(MaqlParser.LPAREN, 0)?.symbol;
196
+ if (lparen) {
197
+ edits.push(...this.removeWhitespace(this.getHiddenToLeft(lparen)));
198
+ }
199
+ if (lparen) {
200
+ edits.push(...this.ensureWhitespace(this.getHiddenToRight(lparen), "", undefined, tokenRange(lparen).end));
201
+ }
202
+ this.indent();
203
+ const argsCtx = ctx.getRuleContext(0, ExpressionListContext) ?? ctx.getRuleContext(0, MaqlExpressionContext);
204
+ if (argsCtx) {
205
+ edits.push(...this.visit(argsCtx));
206
+ }
207
+ const rparen = ctx.getToken(MaqlParser.RPAREN, 0)?.symbol;
208
+ if (rparen) {
209
+ edits.push(...this.removeWhitespace(this.getHiddenToLeft(rparen)));
210
+ }
211
+ this.dedent();
212
+ if (rparen) {
213
+ edits.push(...this.visit(ctx.RPAREN()));
214
+ }
215
+ return edits;
216
+ }
217
+ visitTimeMacro = (ctx) => {
218
+ const edits = [];
219
+ const name = ctx.getChild(0);
220
+ if (name) {
221
+ edits.push(...this.visit(name));
222
+ }
223
+ const lparen = ctx.LPAREN().symbol;
224
+ edits.push(...this.removeWhitespace(this.getHiddenToLeft(lparen)));
225
+ edits.push(...this.ensureWhitespace(this.getHiddenToRight(lparen), "", undefined, tokenRange(lparen).end));
226
+ this.indent();
227
+ const rparen = ctx.RPAREN().symbol;
228
+ edits.push(...this.removeWhitespace(this.getHiddenToLeft(rparen)));
229
+ this.dedent();
230
+ edits.push(...this.visit(ctx.RPAREN()));
231
+ const comma = ctx.COMMA()?.symbol;
232
+ if (comma) {
233
+ edits.push(...this.removeWhitespace(this.getHiddenToLeft(comma)));
234
+ const commaRange = tokenRange(comma);
235
+ edits.push(...this.ensureSpace(this.getHiddenToRight(comma), commaRange.end));
236
+ }
237
+ edits.push(...this.visit(ctx.granularity()));
238
+ const amountCtx = ctx.integer();
239
+ if (amountCtx) {
240
+ edits.push(...this.visit(amountCtx));
241
+ }
242
+ return edits;
243
+ };
244
+ visitExpressionList = (ctx) => {
245
+ const edits = [];
246
+ for (const comma of ctx.COMMA().map((c) => c.symbol)) {
247
+ edits.push(...this.removeWhitespace(this.getHiddenToLeft(comma)));
248
+ const commaRange = tokenRange(comma);
249
+ edits.push(...this.ensureSpace(this.getHiddenToRight(comma), commaRange.end));
250
+ }
251
+ edits.push(...this.visitChildren(ctx));
252
+ return edits;
253
+ };
254
+ visitDisjunction = (ctx) => this.visitLogicalOperatorExpression(ctx, () => ctx.OR());
255
+ visitConjunction = (ctx) => this.visitLogicalOperatorExpression(ctx, () => ctx.AND());
256
+ visitLogicalOperatorExpression(ctx, ops) {
257
+ const edits = [];
258
+ for (const opNode of ops()) {
259
+ const op = opNode.symbol;
260
+ const opRange = tokenRange(op);
261
+ edits.push(...this.ensureNewline(this.getHiddenToLeft(op), opRange.start));
262
+ edits.push(...this.removeWhitespace(this.getHiddenToRight(op), " ", " ", opRange.end));
263
+ }
264
+ edits.push(...this.visitChildren(ctx));
265
+ return edits;
266
+ }
267
+ visitAddition = (ctx) => this.visitArithmeticOperatorExpression(ctx, () => ctx
268
+ .additiveOperator()
269
+ .map((it) => it.PLUS() ?? it.MINUS())
270
+ .filter((it) => !!it));
271
+ visitMultiplication = (ctx) => this.visitArithmeticOperatorExpression(ctx, () => ctx
272
+ .multiplicativeOperator()
273
+ .map((it) => it.MUL() ?? it.DIV())
274
+ .filter((it) => !!it));
275
+ visitArithmeticOperatorExpression(ctx, ops) {
276
+ const edits = [];
277
+ for (const opNode of ops()) {
278
+ const op = opNode.symbol;
279
+ const opRange = tokenRange(op);
280
+ edits.push(...this.ensureSpace(this.getHiddenToLeft(op), opRange.start));
281
+ edits.push(...this.ensureSpace(this.getHiddenToRight(op), opRange.end));
282
+ }
283
+ edits.push(...this.visitChildren(ctx));
284
+ return edits;
285
+ }
286
+ visitRelationRelop = (ctx) => {
287
+ const edits = [];
288
+ const relop = ctx.RELOP().symbol;
289
+ const relopRange = tokenRange(relop);
290
+ edits.push(...this.ensureSpace(this.getHiddenToLeft(relop), relopRange.start));
291
+ edits.push(...this.ensureSpace(this.getHiddenToRight(relop), relopRange.end));
292
+ edits.push(...this.visitChildren(ctx));
293
+ return edits;
294
+ };
295
+ visitRelationLike = (ctx) => {
296
+ const edits = [];
297
+ const likeCtx = ctx.like();
298
+ const item = likeCtx.LIKE() ?? likeCtx.ILIKE();
299
+ const like = item.symbol;
300
+ const likeRange = tokenRange(like);
301
+ edits.push(...this.ensureSpace(this.getHiddenToLeft(like), likeRange.start));
302
+ edits.push(...this.ensureSpace(this.getHiddenToRight(like), likeRange.end));
303
+ edits.push(...this.visit(likeCtx));
304
+ return edits;
305
+ };
306
+ visitRelationBetween = (ctx) => {
307
+ const edits = [];
308
+ const between = ctx.BETWEEN().symbol;
309
+ const betweenRange = tokenRange(between);
310
+ edits.push(...this.ensureSpace(this.getHiddenToLeft(between), betweenRange.start));
311
+ edits.push(...this.ensureSpace(this.getHiddenToRight(between), betweenRange.end));
312
+ const and = ctx.AND().symbol;
313
+ const andRange = tokenRange(and);
314
+ edits.push(...this.ensureSpace(this.getHiddenToLeft(and), andRange.start));
315
+ edits.push(...this.ensureSpace(this.getHiddenToRight(and), andRange.end));
316
+ edits.push(...this.visitChildren(ctx));
317
+ return edits;
318
+ };
319
+ visitRelationNot = (ctx) => {
320
+ const not = ctx.NOT();
321
+ const edits = [];
322
+ if (not) {
323
+ const token = not.symbol;
324
+ const range = tokenRange(token);
325
+ edits.push(...this.ensureSpace(this.getHiddenToLeft(token), range.start));
326
+ edits.push(...this.ensureSpace(this.getHiddenToRight(token), range.end));
327
+ edits.push(...this.visit(not));
328
+ }
329
+ edits.push(...this.visit(ctx.relationNegatable()));
330
+ return edits;
331
+ };
332
+ visitRelationIn = (ctx) => {
333
+ const edits = [];
334
+ const int = ctx.IN().symbol;
335
+ const range = tokenRange(int);
336
+ edits.push(...this.ensureSpace(this.getHiddenToLeft(int), range.start));
337
+ edits.push(...this.ensureSpace(this.getHiddenToRight(int), range.end));
338
+ edits.push(...this.visit(ctx.IN()));
339
+ const lparen = ctx.LPAREN().symbol;
340
+ const lparenRange = tokenRange(lparen);
341
+ if (ctx.listLiteral() === null) {
342
+ edits.push(...this.removeWhitespace(this.getHiddenToLeft(ctx.RPAREN().symbol)));
343
+ }
344
+ else {
345
+ this.indent();
346
+ edits.push(...this.ensureNewline(this.getHiddenToRight(lparen), lparenRange.end));
347
+ edits.push(...this.visitChildren(ctx, 1, ctx.getChildCount() - 2));
348
+ this.dedent();
349
+ }
350
+ edits.push(...this.visit(ctx.RPAREN()));
351
+ return edits;
352
+ };
353
+ visitSelectExpression = (ctx) => {
354
+ const edits = [];
355
+ const select = ctx.SELECT().symbol;
356
+ const selectRange = tokenRange(select);
357
+ edits.push(...this.ensureNewline(this.getHiddenToLeft(select), selectRange.start));
358
+ edits.push(...this.visit(ctx.SELECT()));
359
+ this.indent();
360
+ edits.push(...this.ensureSpace(this.getHiddenToRight(select), selectRange.end));
361
+ edits.push(...this.visitChildren(ctx, 1));
362
+ this.dedent();
363
+ return edits;
364
+ };
365
+ visitBy = (ctx) => this.visitKeywordOfStatement(ctx, () => ctx.BY());
366
+ visitForEach = (ctx) => {
367
+ const edits = [];
368
+ const forEach = ctx.FOR().symbol;
369
+ const forEachRange = tokenRange(forEach);
370
+ edits.push(...this.ensureNewline(this.getHiddenToLeft(forEach), forEachRange.start));
371
+ this.indent();
372
+ edits.push(...this.visitChildren(ctx, 1));
373
+ this.dedent();
374
+ return edits;
375
+ };
376
+ visitForTransformation = (ctx) => this.visitKeywordOfStatement(ctx, () => ctx.FOR());
377
+ visitWhere = (ctx) => this.visitKeywordOfStatement(ctx, () => ctx.WHERE());
378
+ visitHaving = (ctx) => this.visitKeywordOfStatement(ctx, () => ctx.HAVING());
379
+ visitUsing = (ctx) => this.visitKeywordOfStatement(ctx, () => ctx.USING());
380
+ visitWithPf = (ctx) => this.visitKeywordOfStatement(ctx, () => ctx.WITH());
381
+ visitWithoutPf = (ctx) => this.visitKeywordOfStatement(ctx, () => ctx.WITHOUT());
382
+ visitKeywordOfStatement(ctx, keyword) {
383
+ const edits = [];
384
+ const kw = keyword().symbol;
385
+ const kwRange = tokenRange(kw);
386
+ edits.push(...this.ensureNewline(this.getHiddenToLeft(kw), kwRange.start));
387
+ edits.push(...this.ensureSpace(this.getHiddenToRight(kw), kwRange.end));
388
+ edits.push(...this.visit(keyword()));
389
+ edits.push(...this.visitChildren(ctx, 1));
390
+ return edits;
391
+ }
392
+ visitAttributeList = (ctx) => this.visitNewlineSeparatedCommaList(ctx);
393
+ // oxlint-disable-next-line sonarjs/no-identical-functions -- distinct ANTLR visitor override with intentionally identical formatting behavior
394
+ visitListLiteral = (ctx) => this.visitNewlineSeparatedCommaList(ctx);
395
+ visitNewlineSeparatedCommaList(ctx) {
396
+ const edits = [];
397
+ for (const comma of ctx.COMMA()) {
398
+ const token = comma.symbol;
399
+ edits.push(...this.removeWhitespace(this.getHiddenToLeft(token)));
400
+ edits.push(...this.ensureNewline(this.getHiddenToRight(token), tokenRange(token).end));
401
+ }
402
+ edits.push(...this.visitChildren(ctx));
403
+ return edits;
404
+ }
405
+ visitIf = (ctx) => {
406
+ const edits = [];
407
+ edits.push(...this.visit(ctx.IF()));
408
+ edits.push(...this.visitElse(ctx));
409
+ return edits;
410
+ };
411
+ visitCase = (ctx) => {
412
+ const edits = [];
413
+ edits.push(...this.visit(ctx.CASE()));
414
+ edits.push(...this.visitElse(ctx));
415
+ return edits;
416
+ };
417
+ visitElse(ctx) {
418
+ const edits = [];
419
+ this.indent();
420
+ const elseCtx = ctx.ELSE();
421
+ if (elseCtx) {
422
+ edits.push(...this.ensureNewline(this.getHiddenToLeft(elseCtx.symbol), tokenRange(elseCtx.symbol).start));
423
+ edits.push(...this.visit(elseCtx));
424
+ }
425
+ // error recovery may leave an IF/CASE without its END token; the generated END() then returns null
426
+ const endNode = ctx.getToken(MaqlParser.END, 0);
427
+ const lastChild = endNode ? ctx.getChildCount() - 2 : ctx.getChildCount() - 1;
428
+ edits.push(...this.visitChildren(ctx, 1, lastChild));
429
+ this.dedent();
430
+ if (endNode) {
431
+ const end = endNode.symbol;
432
+ edits.push(...this.ensureNewline(this.getHiddenToLeft(end), tokenRange(end).start));
433
+ edits.push(...this.visit(endNode));
434
+ }
435
+ return edits;
436
+ }
437
+ visitCaseConditional = (ctx) => {
438
+ const edits = this.defaultResult();
439
+ for (const when of ctx.WHEN()) {
440
+ const token = when.symbol;
441
+ edits.push(...this.ensureNewline(this.getHiddenToLeft(token), tokenRange(token).start));
442
+ }
443
+ edits.push(...this.visitChildren(ctx));
444
+ return edits;
445
+ };
446
+ visitTransFunction = (ctx) => {
447
+ const token = ctx.NEXT() ?? ctx.NEXTPERIOD() ?? ctx.PREVIOUS() ?? ctx.PREVIOUSPERIOD();
448
+ const text = token?.getText();
449
+ const edited = text ? formatTransFunction(text) : undefined;
450
+ if (!token || !edited || text === edited)
451
+ return this.defaultResult();
452
+ const range = tokenRange(token.symbol);
453
+ if (!this.inRange(range))
454
+ return this.defaultResult();
455
+ return [TextEdit.replace(range, edited)];
456
+ };
457
+ /**
458
+ * Shortens whitespace, trims trailing spaces, inserts string at the start of the last line
459
+ * @param whitespace - is assumed to be the token text of a MaqlParser.WS token
460
+ * @param finalInline - is the value to be used if there are no line breaks in the whitespace
461
+ * if undefined then by default trim the whitespace to at most one space
462
+ * @param finalNewline - is the value to be after the last line break
463
+ */
464
+ formatWhitespace(whitespace, finalInline, finalNewline) {
465
+ const lines = whitespace.split("\n");
466
+ if (lines.length === 1)
467
+ return finalInline === undefined ? (whitespace.length > 0 ? " " : "") : finalInline;
468
+ if (this.options.trimTrailingWhitespace) {
469
+ lines.slice(0, -1).forEach((_, idx) => (lines[idx] = ""));
470
+ }
471
+ if (finalNewline !== undefined) {
472
+ lines[lines.length - 1] = finalNewline;
473
+ }
474
+ return lines.join("\n");
475
+ }
476
+ ensureWhitespace(tokens, finalInline, finalNewline, position) {
477
+ if (tokens.length === 0 && finalInline) {
478
+ return [TextEdit.insert(position, finalInline)];
479
+ }
480
+ return tokens
481
+ .map((token) => {
482
+ if (!token.text || this.formattedTokens.has(token.tokenIndex))
483
+ return null;
484
+ if (token.type === MaqlParser.WS) {
485
+ const range = tokenRange(token);
486
+ const edited = this.formatWhitespace(token.text, finalInline, finalNewline);
487
+ if (token.text !== edited) {
488
+ this.formattedTokens.add(token.tokenIndex);
489
+ return TextEdit.replace(range, edited);
490
+ }
491
+ }
492
+ return null;
493
+ })
494
+ .filter((edit) => !!edit);
495
+ }
496
+ ensureSpace(tokens, position) {
497
+ return this.ensureWhitespace(tokens, " ", this.indentSpaces, position);
498
+ }
499
+ ensureNewline(tokens, position) {
500
+ return this.ensureWhitespace(tokens, "\n" + this.indentSpaces, this.indentSpaces, position);
501
+ }
502
+ /**
503
+ * Removes all whitespace if there are no preceding line comments
504
+ */
505
+ removeWhitespace(tokens, separator = " ", final = "", position) {
506
+ if (tokens.length === 0 && position && final !== "") {
507
+ return [TextEdit.insert(position, final)];
508
+ }
509
+ let prevIsLineComment = false;
510
+ const edits = this.defaultResult();
511
+ tokens.forEach((token, idx) => {
512
+ if (!token.text || this.formattedTokens.has(token.tokenIndex))
513
+ return;
514
+ this.formattedTokens.add(token.tokenIndex);
515
+ if (token.type === MaqlParser.WS) {
516
+ const range = tokenRange(token);
517
+ const edited = prevIsLineComment
518
+ ? "\n" + this.indentSpaces
519
+ : idx < tokens.length - 1
520
+ ? separator
521
+ : final;
522
+ if (token.text !== edited) {
523
+ edits.push(TextEdit.replace(range, edited));
524
+ }
525
+ }
526
+ prevIsLineComment = token.type === MaqlParser.Comment;
527
+ });
528
+ return edits;
529
+ }
530
+ indent() {
531
+ this.indentationLevel += 1;
532
+ }
533
+ dedent() {
534
+ this.indentationLevel -= 1;
535
+ }
536
+ inRange(range) {
537
+ return range.start.line >= 0; // skip "PARSE METRIC\n"
538
+ }
539
+ intersects(a, b) {
540
+ const { start: startA, end: endA } = a;
541
+ const { start: startB, end: endB } = b;
542
+ return ((endA.line > startB.line || (endA.line === startB.line && endA.character > startB.character)) &&
543
+ (startA.line < endB.line || (startA.line === endB.line && startA.character < endB.character)));
544
+ }
545
+ getHiddenToLeft(token) {
546
+ if (token.tokenIndex < 0 || token.tokenIndex >= this.stream.size)
547
+ return [];
548
+ return this.stream.getHiddenTokensToLeft(token.tokenIndex, -1) ?? [];
549
+ }
550
+ getHiddenToRight(token) {
551
+ if (token.tokenIndex < 0 || token.tokenIndex >= this.stream.size)
552
+ return [];
553
+ return this.stream.getHiddenTokensToRight(token.tokenIndex, -1) ?? [];
554
+ }
555
+ }
556
+ function formatTransFunction(func) {
557
+ switch (func.toUpperCase()) {
558
+ case "NEXT":
559
+ return "Next";
560
+ case "NEXTPERIOD":
561
+ return "NextPeriod";
562
+ case "PREVIOUS":
563
+ return "Previous";
564
+ case "PREVIOUSPERIOD":
565
+ return "PreviousPeriod";
566
+ default:
567
+ return func.charAt(0).toUpperCase() + func.slice(1);
568
+ }
569
+ }
@@ -0,0 +1,3 @@
1
+ import { type HighlightToken } from "./semanticsHighlight.js";
2
+ export declare function convertToSemanticTokens(tokens: HighlightToken[]): import("vscode-languageserver").SemanticTokens;
3
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/highlight/convert.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,yBAAyB,CAAC;AAGpF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,kDAa/D"}
@@ -0,0 +1,12 @@
1
+ // (C) 2023-2026 GoodData Corporation
2
+ import { SemanticTokensBuilder } from "vscode-languageserver";
3
+ import { semanticTokensLegend } from "./semanticsHighlight.js";
4
+ import { getModifiers, getType } from "./utils.js";
5
+ export function convertToSemanticTokens(tokens) {
6
+ const builder = new SemanticTokensBuilder();
7
+ tokens.forEach(({ position, type, modifiers }) => {
8
+ const length = position.end.character - position.start.character;
9
+ builder.push(position.start.line, position.start.character, length, getType(semanticTokensLegend.tokenTypes, type), getModifiers(semanticTokensLegend.tokenModifiers, modifiers));
10
+ });
11
+ return builder.build();
12
+ }