@gooddata/sdk-maql-language-server 0.0.0-stage → 11.65.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/README.md +118 -2
- package/esm/completions/complete.d.ts +12 -0
- package/esm/completions/complete.d.ts.map +1 -0
- package/esm/completions/complete.js +316 -0
- package/esm/completions/descriptions.d.ts +42 -0
- package/esm/completions/descriptions.d.ts.map +1 -0
- package/esm/completions/descriptions.js +289 -0
- package/esm/completions/findContext.d.ts +19 -0
- package/esm/completions/findContext.d.ts.map +1 -0
- package/esm/completions/findContext.js +171 -0
- package/esm/completions/functionDescriptions.d.ts +3 -0
- package/esm/completions/functionDescriptions.d.ts.map +1 -0
- package/esm/completions/functionDescriptions.js +98 -0
- package/esm/completions/sort.d.ts +4 -0
- package/esm/completions/sort.d.ts.map +1 -0
- package/esm/completions/sort.js +88 -0
- package/esm/constants.d.ts +21 -0
- package/esm/constants.d.ts.map +1 -0
- package/esm/constants.js +22 -0
- package/esm/dateElementFormat.d.ts +9 -0
- package/esm/dateElementFormat.d.ts.map +1 -0
- package/esm/dateElementFormat.js +60 -0
- package/esm/decorations.d.ts +46 -0
- package/esm/decorations.d.ts.map +1 -0
- package/esm/decorations.js +42 -0
- package/esm/diagnostics.d.ts +12 -0
- package/esm/diagnostics.d.ts.map +1 -0
- package/esm/diagnostics.js +259 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/approximate_count.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/approximate_count.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/approximate_count.js +61 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/avg.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/avg.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/avg.js +19 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/count.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/count.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/count.js +72 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/first.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/first.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/first.js +41 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/last.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/last.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/last.js +69 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/max.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/max.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/max.js +61 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/median.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/median.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/median.js +25 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/min.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/min.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/min.js +63 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/sum.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/sum.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/aggregation/sum.js +20 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/case.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/case.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/case.js +73 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/if-then-else.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/if-then-else.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/if-then-else.js +29 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/ifnull.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/ifnull.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/conditionals/ifnull.js +96 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-ranking-filters.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-ranking-filters.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-ranking-filters.js +71 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-having-clause.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-having-clause.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-having-clause.js +65 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-like-clause.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-like-clause.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-like-clause.js +36 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-where-clause.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-where-clause.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/filtering-with-the-where-clause.js +36 -0
- 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
- 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
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions-except-for-attribute.js +21 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all-in-all-other-dimensions.js +27 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-all.js +64 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-attribute-all-in-all-other-dimensions.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-attribute-all-in-all-other-dimensions.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by-attribute-all-in-all-other-dimensions.js +22 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-attribute-filters/by.js +85 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-except.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-except.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-except.js +37 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-filter.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-filter.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/with-parent-filter.js +42 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-except.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-except.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-except.js +94 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-filter.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-filter.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/filters/overriding-parent/without-parent-filter.js +33 -0
- package/esm/docs/en/docs/create-metrics/maql/for-each.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/for-each.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/for-each.js +17 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/and.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/and.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/and.js +37 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/not.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/not.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/not.js +12 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/or.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/or.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/logical-operators/or.js +22 -0
- package/esm/docs/en/docs/create-metrics/maql/maql-and-multidimensionality.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/maql-and-multidimensionality.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/maql-and-multidimensionality.js +59 -0
- package/esm/docs/en/docs/create-metrics/maql/math/abs.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/abs.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/abs.js +23 -0
- package/esm/docs/en/docs/create-metrics/maql/math/arithmetic-operations.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/arithmetic-operations.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/arithmetic-operations.js +29 -0
- package/esm/docs/en/docs/create-metrics/maql/math/ceiling.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/ceiling.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/ceiling.js +21 -0
- package/esm/docs/en/docs/create-metrics/maql/math/exp.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/exp.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/exp.js +27 -0
- package/esm/docs/en/docs/create-metrics/maql/math/floor.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/floor.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/floor.js +21 -0
- package/esm/docs/en/docs/create-metrics/maql/math/greatest.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/greatest.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/greatest.js +13 -0
- package/esm/docs/en/docs/create-metrics/maql/math/least.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/least.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/least.js +13 -0
- package/esm/docs/en/docs/create-metrics/maql/math/ln.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/ln.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/ln.js +33 -0
- package/esm/docs/en/docs/create-metrics/maql/math/log.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/log.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/log.js +29 -0
- package/esm/docs/en/docs/create-metrics/maql/math/power.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/power.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/power.js +33 -0
- package/esm/docs/en/docs/create-metrics/maql/math/round.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/round.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/round.js +34 -0
- package/esm/docs/en/docs/create-metrics/maql/math/sign.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/sign.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/sign.js +30 -0
- package/esm/docs/en/docs/create-metrics/maql/math/sqrt.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/sqrt.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/sqrt.js +32 -0
- package/esm/docs/en/docs/create-metrics/maql/math/trunc.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/math/trunc.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/math/trunc.js +36 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/percentile.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/percentile.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/percentile.js +57 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/rank-variations.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/rank-variations.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/rank-variations.js +90 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-in.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-in.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-in.js +53 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-of.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-of.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/where-top-or-bottom-of.js +29 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/within-clause.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/within-clause.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/ranking/within-clause.js +101 -0
- package/esm/docs/en/docs/create-metrics/maql/relational-operators.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/relational-operators.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/relational-operators.js +50 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/rolling-window.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/rolling-window.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/rolling-window.js +71 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-total-statistical-functions.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-total-statistical-functions.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-total-statistical-functions.js +54 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-totals-for-core-functions.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-totals-for-core-functions.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/runing-totals/running-totals-for-core-functions.js +37 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/correl.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/correl.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/correl.js +47 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/covariance-functions.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/covariance-functions.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/covariance-functions.js +46 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/forecast.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/forecast.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/forecast.js +74 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/least-squares-functions.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/least-squares-functions.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/least-squares-functions.js +44 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/standard-deviation-functions.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/standard-deviation-functions.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/standard-deviation-functions.js +88 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/variance-functions.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/variance-functions.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/statistic/variance-functions.js +54 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-each.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-each.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-each.js +96 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-next-period.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-next-period.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-next-period.js +38 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-next.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-next.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-next.js +27 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-previous-period.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-previous-period.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-previous-period.js +26 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-previous.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-previous.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time/for-previous.js +30 -0
- package/esm/docs/en/docs/create-metrics/maql/time/functions-for-referring-to-past-time-periods.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time/functions-for-referring-to-past-time-periods.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time/functions-for-referring-to-past-time-periods.js +36 -0
- package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-add.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-add.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-add.js +53 -0
- package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-diff.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-diff.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time-arithmetics/datetime-diff.js +55 -0
- package/esm/docs/en/docs/create-metrics/maql/time-macros.d.ts +2 -0
- package/esm/docs/en/docs/create-metrics/maql/time-macros.d.ts.map +1 -0
- package/esm/docs/en/docs/create-metrics/maql/time-macros.js +79 -0
- package/esm/docs/index.d.ts +82 -0
- package/esm/docs/index.d.ts.map +1 -0
- package/esm/docs/index.js +143 -0
- package/esm/findObjects.d.ts +13 -0
- package/esm/findObjects.d.ts.map +1 -0
- package/esm/findObjects.js +73 -0
- package/esm/format.d.ts +4 -0
- package/esm/format.d.ts.map +1 -0
- package/esm/format.js +569 -0
- package/esm/highlight/convert.d.ts +3 -0
- package/esm/highlight/convert.d.ts.map +1 -0
- package/esm/highlight/convert.js +12 -0
- package/esm/highlight/semanticsHighlight.d.ts +47 -0
- package/esm/highlight/semanticsHighlight.d.ts.map +1 -0
- package/esm/highlight/semanticsHighlight.js +345 -0
- package/esm/highlight/utils.d.ts +3 -0
- package/esm/highlight/utils.d.ts.map +1 -0
- package/esm/highlight/utils.js +14 -0
- package/esm/hover.d.ts +23 -0
- package/esm/hover.d.ts.map +1 -0
- package/esm/hover.js +60 -0
- package/esm/index.d.ts +11 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +9 -0
- package/esm/labelElements.d.ts +22 -0
- package/esm/labelElements.d.ts.map +1 -0
- package/esm/labelElements.js +224 -0
- package/esm/maqlLanguageService.d.ts +56 -0
- package/esm/maqlLanguageService.d.ts.map +1 -0
- package/esm/maqlLanguageService.js +104 -0
- package/esm/maqlObjectTypes.d.ts +17 -0
- package/esm/maqlObjectTypes.d.ts.map +1 -0
- package/esm/maqlObjectTypes.js +30 -0
- package/esm/maqlServer.d.ts +4 -0
- package/esm/maqlServer.d.ts.map +1 -0
- package/esm/maqlServer.js +78 -0
- package/esm/metadata/model.d.ts +162 -0
- package/esm/metadata/model.d.ts.map +1 -0
- package/esm/metadata/model.js +143 -0
- package/esm/metadata/parameters.d.ts +16 -0
- package/esm/metadata/parameters.d.ts.map +1 -0
- package/esm/metadata/parameters.js +37 -0
- package/esm/metadata/types.d.ts +16 -0
- package/esm/metadata/types.d.ts.map +1 -0
- package/esm/metadata/types.js +2 -0
- package/esm/metadataService.d.ts +56 -0
- package/esm/metadataService.d.ts.map +1 -0
- package/esm/metadataService.js +159 -0
- package/esm/node/main.d.ts +2 -0
- package/esm/node/main.d.ts.map +1 -0
- package/esm/node/main.js +18 -0
- package/esm/parameterConstraints.d.ts +5 -0
- package/esm/parameterConstraints.d.ts.map +1 -0
- package/esm/parameterConstraints.js +197 -0
- package/esm/parseMaql.d.ts +43 -0
- package/esm/parseMaql.d.ts.map +1 -0
- package/esm/parseMaql.js +96 -0
- package/esm/renderParameters.d.ts +41 -0
- package/esm/renderParameters.d.ts.map +1 -0
- package/esm/renderParameters.js +76 -0
- package/esm/sdk-maql-language-server.d.ts +496 -0
- package/esm/tests/metadata.test.helpers.d.ts +8 -0
- package/esm/tests/metadata.test.helpers.d.ts.map +1 -0
- package/esm/tests/metadata.test.helpers.js +468 -0
- package/esm/tokenRanges.d.ts +36 -0
- package/esm/tokenRanges.d.ts.map +1 -0
- package/esm/tokenRanges.js +55 -0
- package/esm/tsdoc-metadata.json +11 -0
- package/esm/types/hierarchy.d.ts +37 -0
- package/esm/types/hierarchy.d.ts.map +1 -0
- package/esm/types/hierarchy.js +165 -0
- package/esm/types/signatures.d.ts +40 -0
- package/esm/types/signatures.d.ts.map +1 -0
- package/esm/types/signatures.js +141 -0
- package/esm/types/typeChecking.d.ts +54 -0
- package/esm/types/typeChecking.d.ts.map +1 -0
- package/esm/types/typeChecking.js +295 -0
- package/esm/types/typeModel.d.ts +18 -0
- package/esm/types/typeModel.d.ts.map +1 -0
- package/esm/types/typeModel.js +84 -0
- package/package.json +83 -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
|
-
#
|
|
1
|
+
# MAQL language server
|
|
2
2
|
|
|
3
|
-
|
|
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":"AASA,OAAO,EACH,cAAc,EAEd,cAAc,EAIjB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAGH,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAClB,MAAM,sBAAsB,CAAC;AAoB9B,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 { Vocabulary } from "antlr4ng";
|
|
4
|
+
import { CompletionItem, CompletionItemKind, CompletionList, MarkupKind, Range, TextEdit, } from "vscode-languageserver";
|
|
5
|
+
import { MaqlLexer, MaqlParser, escapeString } from "@gooddata/maql-antlr4ts";
|
|
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
|
+
// antlr4ng exposes the vocabulary only on parser instances, so build one from the static name tables
|
|
17
|
+
const vocabulary = new Vocabulary(MaqlParser.literalNames, MaqlParser.symbolicNames);
|
|
18
|
+
export async function resolve(item, docs) {
|
|
19
|
+
const data = item.data;
|
|
20
|
+
const doc = data?.resolveTag ? await docs(data.resolveTag) : undefined;
|
|
21
|
+
if (doc) {
|
|
22
|
+
item.documentation = {
|
|
23
|
+
kind: MarkupKind.Markdown,
|
|
24
|
+
value: doc,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return item;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Find completions using the antlr4-c3 module.
|
|
31
|
+
* @param query - The MAQL query to be completed
|
|
32
|
+
* @param offset - The offset of the caret in the text
|
|
33
|
+
* @param ldmObjects - LDM objects to be offered, if undefined snippets are offered instead
|
|
34
|
+
* @param labelElementsFunc - Function to get possible label elements (strings) for a given label and filter text
|
|
35
|
+
*/
|
|
36
|
+
export async function complete(query, offset = query.length, ldmObjects, labelElementsFunc) {
|
|
37
|
+
const metric = new MaqlMetric(query);
|
|
38
|
+
const adjustedOffset = MaqlMetric.offset(offset);
|
|
39
|
+
const lines = query.slice(0, offset).split("\n");
|
|
40
|
+
const position = {
|
|
41
|
+
line: lines.length,
|
|
42
|
+
character: lines[lines.length - 1].length,
|
|
43
|
+
};
|
|
44
|
+
const caretContext = findContext(metric, position, adjustedOffset);
|
|
45
|
+
const { leftFinalToken, caretToken, rightFinalToken } = caretContext.tokens;
|
|
46
|
+
// we do not wish to offer completions inside line comments
|
|
47
|
+
if (caretToken.type === MaqlParser.Comment) {
|
|
48
|
+
return CompletionList.create();
|
|
49
|
+
}
|
|
50
|
+
const candidates = collectCandidates(metric, caretToken.tokenIndex);
|
|
51
|
+
// "safe replacement range", which can be replaced by anything
|
|
52
|
+
const range = textEditRange(leftFinalToken, caretToken, rightFinalToken);
|
|
53
|
+
// get label elements completions if one of the candidates is a STRING token
|
|
54
|
+
let context = null; // findLabelContext function is expensive for larger queries, so we lazy-initialize context
|
|
55
|
+
const getContext = () => context ?? (context = findLabelContext(metric, position));
|
|
56
|
+
const labelElementsList = labelElementsFunc && candidates.tokens.get(MaqlParser.String)
|
|
57
|
+
? await completeLabelElements(labelElementsFunc, range, tokenToString(caretToken, adjustedOffset), getContext())
|
|
58
|
+
: CompletionList.create();
|
|
59
|
+
// skip non-string completions if caret is inside string
|
|
60
|
+
const stringTokens = [MaqlParser.String, MaqlParser.UnterminatedString];
|
|
61
|
+
if (stringTokens.includes(caretToken.type)) {
|
|
62
|
+
return labelElementsList;
|
|
63
|
+
}
|
|
64
|
+
// static completion items from descriptions
|
|
65
|
+
const expectedTypes = caretContext.expectedTypes;
|
|
66
|
+
const staticCompletionList = completeFromCandidateTokens(candidates.tokens, range, expectedTypes);
|
|
67
|
+
// completions from preferred rules (to disambiguate tokens)
|
|
68
|
+
const ruleCompletionList = completeFromRules(candidates.rules, range, ldmObjects, expectedTypes);
|
|
69
|
+
const completionList = [labelElementsList, staticCompletionList, ruleCompletionList].reduce((accuList, currList) => ({
|
|
70
|
+
items: accuList.items.concat(currList.items),
|
|
71
|
+
isIncomplete: accuList.isIncomplete || currList.isIncomplete,
|
|
72
|
+
}));
|
|
73
|
+
return adjustSortText(completionList, caretContext);
|
|
74
|
+
}
|
|
75
|
+
async function completeLabelElements(labelElementsFunc, range, typedText, context) {
|
|
76
|
+
const labelElementResult = await labelElementsFunc(context.labels, context.strings.map((str) => str.string), { filter: typedText });
|
|
77
|
+
return CompletionList.create(labelElementResult.list.elements
|
|
78
|
+
.map((element) => element.title === null ? null : createStringCompletionItem(element.title, undefined, range))
|
|
79
|
+
.filter((item) => item !== null), labelElementResult.list.isIncomplete);
|
|
80
|
+
}
|
|
81
|
+
function completeFromCandidateTokens(tokens, range, allowedTypes) {
|
|
82
|
+
const items = [];
|
|
83
|
+
tokens.forEach((_, tokenId) => {
|
|
84
|
+
const staticCompletions = tokenCompletions.get(tokenId) ?? [];
|
|
85
|
+
if (staticCompletions.length === 0 && !ignoredTokens.has(tokenId)) {
|
|
86
|
+
// completions for tokens that do not have a description - useful when testing MAQL changes
|
|
87
|
+
staticCompletions.push(CompletionItem.create(getTokenName(tokenId)));
|
|
88
|
+
}
|
|
89
|
+
const typedStaticCompletions = staticCompletions.filter((item) => {
|
|
90
|
+
const itemType = item.maqlType;
|
|
91
|
+
return itemType === undefined || allowedTypes.some((type) => isSubtype(itemType, type));
|
|
92
|
+
});
|
|
93
|
+
typedStaticCompletions.forEach((item) => withTextEdit(item, range));
|
|
94
|
+
// filter-out descriptions with inapplicable types when known
|
|
95
|
+
items.push(...typedStaticCompletions);
|
|
96
|
+
});
|
|
97
|
+
return CompletionList.create(items, false);
|
|
98
|
+
}
|
|
99
|
+
function getTokenName(tokenId) {
|
|
100
|
+
const literalName = vocabulary.getLiteralName(tokenId);
|
|
101
|
+
if (literalName !== null) {
|
|
102
|
+
return literalName.slice(1, literalName.length - 1).toUpperCase();
|
|
103
|
+
}
|
|
104
|
+
return vocabulary.getDisplayName(tokenId) ?? String(tokenId);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Rule completions are necessary when the tokens to be completed are ambiguous
|
|
108
|
+
* An example in MAQL would be NEXT used after FOR and the NEXT time macro
|
|
109
|
+
* `... WHERE {label/date.day} = NEXT(DAY)` vs. `... FOR NEXT({label/date.day})`
|
|
110
|
+
* They are also used for logical data model objects (labels, facts, metrics),
|
|
111
|
+
* because using the parser rules is more explicit than checking for type tokens.
|
|
112
|
+
*/
|
|
113
|
+
function completeFromRules(rules, range, ldmObjects, allowedTypes) {
|
|
114
|
+
const items = [];
|
|
115
|
+
rules.forEach((_, ruleId) => {
|
|
116
|
+
if (ruleId === MaqlParser.RULE_attribute && ldmObjects && ldmObjects?.size >= 0) {
|
|
117
|
+
const attributeItems = completeAttribute(ldmObjects, range, allowedTypes);
|
|
118
|
+
items.push(...attributeItems);
|
|
119
|
+
}
|
|
120
|
+
else if ((ruleId === MaqlParser.RULE_numeric || ruleId === MaqlParser.RULE_fact) &&
|
|
121
|
+
ldmObjects &&
|
|
122
|
+
ldmObjects?.size >= 0) {
|
|
123
|
+
const numericItems = completeNumeric(ldmObjects, range, allowedTypes);
|
|
124
|
+
items.push(...numericItems);
|
|
125
|
+
}
|
|
126
|
+
else if (ruleId === MaqlParser.RULE_parameter && ldmObjects) {
|
|
127
|
+
const parameterItems = completeParameter(ldmObjects, range, allowedTypes);
|
|
128
|
+
items.push(...parameterItems);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
const ruleItems = ruleCompletions.get(ruleId) ?? [];
|
|
132
|
+
const typedRuleItems = ruleItems.filter((item) => {
|
|
133
|
+
const compType = item.maqlType;
|
|
134
|
+
return compType === undefined || allowedTypes.some((type) => isSubtype(compType, type));
|
|
135
|
+
});
|
|
136
|
+
typedRuleItems.forEach((item) => withTextEdit(item, range));
|
|
137
|
+
items.push(...typedRuleItems);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return CompletionList.create(items, false);
|
|
141
|
+
}
|
|
142
|
+
function completeAttribute(ldmObjects, range, allowedTypes) {
|
|
143
|
+
const items = [];
|
|
144
|
+
if (allowedTypes.some((type) => isSubtype(MaqlType.DATE, type))) {
|
|
145
|
+
items.push(...ldmObjects.get("label", "date").map((obj) => createMetadataCompletionItem(obj, range)));
|
|
146
|
+
}
|
|
147
|
+
if (allowedTypes.some((type) => isSubtype(MaqlType.STRING, type))) {
|
|
148
|
+
items.push(...ldmObjects.get("label", "regular").map((obj) => createMetadataCompletionItem(obj, range)));
|
|
149
|
+
// A computed attribute buckets rows into string values, so it completes wherever a regular
|
|
150
|
+
// label does - both in a metric and in another computed attribute's expression.
|
|
151
|
+
items.push(...ldmObjects.get("computedAttribute").map((obj) => createMetadataCompletionItem(obj, range)));
|
|
152
|
+
}
|
|
153
|
+
if (allowedTypes.some((type) => isSubtype(MaqlType.DATASET, type))) {
|
|
154
|
+
items.push(...ldmObjects.get("dataset").map((obj) => createMetadataCompletionItem(obj, range)));
|
|
155
|
+
}
|
|
156
|
+
return items;
|
|
157
|
+
}
|
|
158
|
+
function completeNumeric(ldmObjects, range, allowedTypes) {
|
|
159
|
+
const items = [];
|
|
160
|
+
if (allowedTypes.some((type) => isSubtype(MaqlType.NUMERIC, type))) {
|
|
161
|
+
items.push(...ldmObjects.get("fact").map((obj) => createMetadataCompletionItem(obj, range)));
|
|
162
|
+
}
|
|
163
|
+
items.push(...ldmObjects.get("metric").map((obj) => createMetadataCompletionItem(obj, range)));
|
|
164
|
+
return items;
|
|
165
|
+
}
|
|
166
|
+
function completeParameter(ldmObjects, range, allowedTypes) {
|
|
167
|
+
return ldmObjects
|
|
168
|
+
.get("parameter")
|
|
169
|
+
.filter((parameter) => allowedTypes.some((type) => isSubtype(parameterMaqlType(parameter.definition), type)))
|
|
170
|
+
.map((obj) => createParameterCompletionItem(obj, range));
|
|
171
|
+
}
|
|
172
|
+
function parameterMaqlType(definition) {
|
|
173
|
+
switch (definition.type) {
|
|
174
|
+
case "NUMBER":
|
|
175
|
+
return MaqlType.NUMERIC;
|
|
176
|
+
case "STRING":
|
|
177
|
+
return MaqlType.STRING;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function createParameterCompletionItem(parameter, range) {
|
|
181
|
+
const item = createMetadataCompletionItem(parameter, range);
|
|
182
|
+
return {
|
|
183
|
+
...item,
|
|
184
|
+
labelDetails: { description: parameterTypeLabel(parameter.definition) },
|
|
185
|
+
detail: `${item.detail}, Default: ${parameterDefaultLabel(parameter.definition)}`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// preferredRules specify rules where token ids alone are insufficient, because they are ambiguous
|
|
189
|
+
const preferredRules = new Set([
|
|
190
|
+
MaqlParser.RULE_attribute,
|
|
191
|
+
MaqlParser.RULE_numeric,
|
|
192
|
+
...ruleCompletions.keys(),
|
|
193
|
+
]);
|
|
194
|
+
function collectCandidates(metric, caretTokenIndex) {
|
|
195
|
+
const core = new CodeCompletionCore(metric.parser);
|
|
196
|
+
core.translateRulesTopDown = true;
|
|
197
|
+
core.preferredRules = preferredRules;
|
|
198
|
+
return core.collectCandidates(caretTokenIndex);
|
|
199
|
+
}
|
|
200
|
+
const irreplaceableTokens = new Set([MaqlLexer.WS, MaqlLexer.LPAREN, MaqlLexer.RPAREN, MaqlLexer.COMMA]);
|
|
201
|
+
function textEditRange(lastValidToken, caretToken, nextValidToken) {
|
|
202
|
+
if (caretToken.channel !== MaqlLexer.DEFAULT_TOKEN_CHANNEL ||
|
|
203
|
+
lastValidToken.tokenIndex > nextValidToken.tokenIndex ||
|
|
204
|
+
irreplaceableTokens.has(caretToken.type)) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
if (lastValidToken === nextValidToken) {
|
|
208
|
+
return tokenRange(lastValidToken);
|
|
209
|
+
}
|
|
210
|
+
const lastRange = tokenRange(lastValidToken);
|
|
211
|
+
const nextRange = tokenRange(nextValidToken);
|
|
212
|
+
return Range.create(lastRange.end.line, lastRange.end.character, nextRange.start.line, nextRange.start.character);
|
|
213
|
+
}
|
|
214
|
+
function withTextEdit(item, range) {
|
|
215
|
+
item.textEdit = range ? TextEdit.replace(range, item.insertText ?? item.label) : undefined;
|
|
216
|
+
return item;
|
|
217
|
+
}
|
|
218
|
+
function createMetadataCompletionItem(metadataObject, range) {
|
|
219
|
+
// The completion is inserted into MAQL text, so it has to use the MAQL spelling of the type
|
|
220
|
+
// (`computed_attribute`), not the Tiger one (`computedAttribute`) the catalog object carries.
|
|
221
|
+
const maqlType = toMaqlObjectType(metadataObject.tigerType);
|
|
222
|
+
const identifier = `${maqlType}/${metadataObject.id}`;
|
|
223
|
+
const insertText = `{${identifier}}`;
|
|
224
|
+
const kind = getCompletionItemKind(metadataObject);
|
|
225
|
+
return {
|
|
226
|
+
label: metadataObject.title ?? identifier,
|
|
227
|
+
kind: kind,
|
|
228
|
+
insertText: insertText,
|
|
229
|
+
filterText: `{ ${maqlType} / ${metadataObject.id} } ${metadataObject.title}`,
|
|
230
|
+
// Sort by the bare id (no MAQL type prefix) so that object types sharing a completion kind
|
|
231
|
+
// (labels and computed attributes) interleave instead of clustering by MAQL type.
|
|
232
|
+
sortText: metadataObject.id,
|
|
233
|
+
detail: `ID: '${identifier}', Description: '${metadataObject.description}'`,
|
|
234
|
+
textEdit: range ? TextEdit.replace(range, insertText) : undefined,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* A function to get text value of a token for the purposes of filtering completions
|
|
239
|
+
* @param token - MAQL token from Antlr4 generated parser
|
|
240
|
+
* @param offset - caret offset in the entire query
|
|
241
|
+
*/
|
|
242
|
+
function tokenToString(token, offset) {
|
|
243
|
+
if (token.type === MaqlParser.UnterminatedString) {
|
|
244
|
+
return token.text?.slice(1, Math.min(token.text.length, offset - token.start)).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.start))
|
|
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.start));
|
|
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;AAKlG,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"}
|