@gooddata/sdk-maql-language-server 11.65.0-alpha.9 → 11.65.1
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/esm/completions/complete.d.ts.map +1 -1
- package/esm/completions/complete.js +11 -11
- package/esm/completions/descriptions.d.ts.map +1 -1
- package/esm/completions/descriptions.js +1 -2
- package/esm/completions/findContext.d.ts +1 -1
- package/esm/completions/findContext.d.ts.map +1 -1
- package/esm/completions/findContext.js +3 -4
- package/esm/completions/functionDescriptions.d.ts.map +1 -1
- package/esm/completions/functionDescriptions.js +1 -2
- package/esm/diagnostics.d.ts.map +1 -1
- package/esm/diagnostics.js +2 -3
- package/esm/findObjects.d.ts.map +1 -1
- package/esm/findObjects.js +35 -34
- package/esm/format.d.ts.map +1 -1
- package/esm/format.js +101 -113
- package/esm/highlight/semanticsHighlight.d.ts.map +1 -1
- package/esm/highlight/semanticsHighlight.js +22 -18
- package/esm/labelElements.d.ts.map +1 -1
- package/esm/labelElements.js +1 -2
- package/esm/metadata/parameters.d.ts.map +1 -1
- package/esm/metadata/parameters.js +1 -2
- package/esm/parameterConstraints.js +2 -3
- package/esm/parseMaql.d.ts +3 -3
- package/esm/parseMaql.d.ts.map +1 -1
- package/esm/parseMaql.js +2 -3
- package/esm/tokenRanges.d.ts +4 -4
- package/esm/tokenRanges.d.ts.map +1 -1
- package/esm/tokenRanges.js +3 -2
- package/esm/types/signatures.d.ts.map +1 -1
- package/esm/types/signatures.js +1 -2
- package/esm/types/typeChecking.d.ts +1 -3
- package/esm/types/typeChecking.d.ts.map +1 -1
- package/esm/types/typeChecking.js +1 -2
- package/package.json +12 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../src/completions/complete.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import { CodeCompletionCore } from "antlr4-c3";
|
|
2
|
+
import { CodeCompletionCore, } from "antlr4-c3";
|
|
3
|
+
import { Vocabulary } from "antlr4ng";
|
|
3
4
|
import { CompletionItem, CompletionItemKind, CompletionList, MarkupKind, Range, TextEdit, } from "vscode-languageserver";
|
|
4
|
-
import
|
|
5
|
-
const { MaqlLexer, MaqlParser, escapeString } = MaqlPkg;
|
|
5
|
+
import { MaqlLexer, MaqlParser, escapeString } from "@gooddata/maql-antlr4ts";
|
|
6
6
|
import { findLabelContext } from "../labelElements.js";
|
|
7
7
|
import { toMaqlObjectType } from "../maqlObjectTypes.js";
|
|
8
8
|
import { parameterDefaultLabel, parameterTypeLabel } from "../metadata/parameters.js";
|
|
@@ -13,6 +13,8 @@ import { descriptions, ignoredTokens, } from "./descriptions.js";
|
|
|
13
13
|
import { findContext, isFinal } from "./findContext.js";
|
|
14
14
|
import { adjustSortText } from "./sort.js";
|
|
15
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);
|
|
16
18
|
export async function resolve(item, docs) {
|
|
17
19
|
const data = item.data;
|
|
18
20
|
const doc = data?.resolveTag ? await docs(data.resolveTag) : undefined;
|
|
@@ -95,11 +97,11 @@ function completeFromCandidateTokens(tokens, range, allowedTypes) {
|
|
|
95
97
|
return CompletionList.create(items, false);
|
|
96
98
|
}
|
|
97
99
|
function getTokenName(tokenId) {
|
|
98
|
-
const literalName =
|
|
99
|
-
if (literalName !==
|
|
100
|
+
const literalName = vocabulary.getLiteralName(tokenId);
|
|
101
|
+
if (literalName !== null) {
|
|
100
102
|
return literalName.slice(1, literalName.length - 1).toUpperCase();
|
|
101
103
|
}
|
|
102
|
-
return
|
|
104
|
+
return vocabulary.getDisplayName(tokenId) ?? String(tokenId);
|
|
103
105
|
}
|
|
104
106
|
/**
|
|
105
107
|
* Rule completions are necessary when the tokens to be completed are ambiguous
|
|
@@ -239,18 +241,16 @@ function createMetadataCompletionItem(metadataObject, range) {
|
|
|
239
241
|
*/
|
|
240
242
|
function tokenToString(token, offset) {
|
|
241
243
|
if (token.type === MaqlParser.UnterminatedString) {
|
|
242
|
-
return token.text
|
|
243
|
-
?.slice(1, Math.min(token.text.length, offset - token.startIndex))
|
|
244
|
-
.replace(/\\"/g, '"');
|
|
244
|
+
return token.text?.slice(1, Math.min(token.text.length, offset - token.start)).replace(/\\"/g, '"');
|
|
245
245
|
}
|
|
246
246
|
else if (token.type === MaqlParser.String) {
|
|
247
247
|
return token.text
|
|
248
|
-
?.slice(1, Math.min(token.text.length - 1, offset - token.
|
|
248
|
+
?.slice(1, Math.min(token.text.length - 1, offset - token.start))
|
|
249
249
|
.replace(/\\"/g, '"');
|
|
250
250
|
// oxlint-disable-next-line eslint/no-negated-condition
|
|
251
251
|
}
|
|
252
252
|
else if (!isFinal(token)) {
|
|
253
|
-
return token.text?.slice(0, Math.min(token.text.length, offset - token.
|
|
253
|
+
return token.text?.slice(0, Math.min(token.text.length, offset - token.start));
|
|
254
254
|
}
|
|
255
255
|
else {
|
|
256
256
|
return undefined; // final tokens must not be used - their text value is not useful
|
|
@@ -1 +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;
|
|
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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
2
|
import { CompletionItemKind, InsertTextFormat } from "vscode-languageserver";
|
|
3
|
-
import
|
|
4
|
-
const { MaqlParser } = MaqlPkg;
|
|
3
|
+
import { MaqlParser } from "@gooddata/maql-antlr4ts";
|
|
5
4
|
import { errorTokens } from "../diagnostics.js";
|
|
6
5
|
import { getTokenIdFromName } from "../parseMaql.js";
|
|
7
6
|
import { MaqlType } from "../types/hierarchy.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findContext.d.ts","sourceRoot":"","sources":["../../src/completions/findContext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAoB,MAAM,UAAU,CAAC;AAExD,
|
|
1
|
+
{"version":3,"file":"findContext.d.ts","sourceRoot":"","sources":["../../src/completions/findContext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAoB,MAAM,UAAU,CAAC;AAExD,OAAO,EAEH,KAAK,OAAO,EAEZ,KAAK,SAAS,EAIjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAsB,MAAM,uBAAuB,CAAC;AAOrE,MAAM,WAAW,aAAa;IAC1B,qFAAqF;IACrF,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,0EAA0E;IAC1E,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,kDAAkD;IAClD,MAAM,EAAE;QAAE,UAAU,EAAE,KAAK,CAAC;QAAC,cAAc,EAAE,KAAK,CAAC;QAAC,eAAe,EAAE,KAAK,CAAA;KAAE,CAAC;CAChF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAiBvG;AAkKD,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE7C"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// (C) 2022-2026 GoodData Corporation
|
|
2
|
-
import
|
|
3
|
-
const { AbstractAstVisitor, MaqlParser, positionInRange } = MaqlPkg;
|
|
2
|
+
import { AbstractAstVisitor, MaqlParser, positionInRange, } from "@gooddata/maql-antlr4ts";
|
|
4
3
|
import { MaqlType, abstractValueTypes } from "../types/hierarchy.js";
|
|
5
4
|
import { findFunctionDefinitions, } from "../types/signatures.js";
|
|
6
5
|
export function findContext(metric, caretPosition, offset) {
|
|
@@ -125,10 +124,10 @@ function findCaretToken(tokenStream, offset) {
|
|
|
125
124
|
// first find the caret token
|
|
126
125
|
for (let tokenIndex = 0; tokenIndex < tokenStream.size; tokenIndex++) {
|
|
127
126
|
const nextToken = tokenStream.get(tokenIndex);
|
|
128
|
-
if (nextToken.
|
|
127
|
+
if (nextToken.start < offset || (nextToken.start === offset && isFinal(caretToken))) {
|
|
129
128
|
caretToken = nextToken;
|
|
130
129
|
}
|
|
131
|
-
if (nextToken.
|
|
130
|
+
if (nextToken.start >= offset)
|
|
132
131
|
break;
|
|
133
132
|
}
|
|
134
133
|
for (let tokenIndex = caretToken.tokenIndex; tokenIndex < tokenStream.size; tokenIndex++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functionDescriptions.d.ts","sourceRoot":"","sources":["../../src/completions/functionDescriptions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"functionDescriptions.d.ts","sourceRoot":"","sources":["../../src/completions/functionDescriptions.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AA4E/D,eAAO,MAAM,oBAAoB,EAAE,qBAAqB,EAuBvD,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// (C) 2022-2026 GoodData Corporation
|
|
2
2
|
import { CompletionItemKind, InsertTextFormat } from "vscode-languageserver";
|
|
3
|
-
import
|
|
4
|
-
const { MaqlParser, functionDefinitions } = MaqlPkg;
|
|
3
|
+
import { MaqlParser, functionDefinitions, } from "@gooddata/maql-antlr4ts";
|
|
5
4
|
import { getTokenIdFromName } from "../parseMaql.js";
|
|
6
5
|
import { transformFunctionDefinition } from "../types/signatures.js";
|
|
7
6
|
/**
|
package/esm/diagnostics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAA6B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAA6B,MAAM,uBAAuB,CAAC;AAc9E,OAAO,EAAE,UAAU,EAAqB,MAAM,gBAAgB,CAAC;AAI/D,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAGlB,MAAM,qBAAqB,CAAC;AAO7B,UAAU,iBAAiB;IACvB,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEpC,IAAI,EAAE,UAAU,CAAC;CACpB;AAED,eAAO,MAAM,sBAAsB,gCAgDjC,CAAC;AAEH,eAAO,MAAM,WAAW,EAAE,MAAM,EAA8C,CAAC;AAE/E,wBAAsB,QAAQ,CAC1B,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,UAAU,EACvB,iBAAiB,CAAC,EAAE,iBAAiB,GACtC,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBvB"}
|
package/esm/diagnostics.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import { DefaultErrorStrategy, FailedPredicateException, InputMismatchException, NoViableAltException, } from "
|
|
2
|
+
import { DefaultErrorStrategy, FailedPredicateException, InputMismatchException, NoViableAltException, } from "antlr4ng";
|
|
3
3
|
import { groupBy } from "lodash-es";
|
|
4
4
|
import { Diagnostic, DiagnosticSeverity, Range } from "vscode-languageserver";
|
|
5
|
-
import
|
|
6
|
-
const { AbstractAstVisitor, MaqlLexer, SyntaxErrorListener } = MaqlPkg;
|
|
5
|
+
import { AbstractAstVisitor, MaqlLexer, SyntaxErrorListener, } from "@gooddata/maql-antlr4ts";
|
|
7
6
|
import { isUnexpectedResponseError } from "@gooddata/sdk-backend-spi";
|
|
8
7
|
import { areObjRefsEqual, serializeObjRef } from "@gooddata/sdk-model";
|
|
9
8
|
import { ErrorCodes, diagnosticsSource } from "./constants.js";
|
package/esm/findObjects.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findObjects.d.ts","sourceRoot":"","sources":["../src/findObjects.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"findObjects.d.ts","sourceRoot":"","sources":["../src/findObjects.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,WAAW;IAC9C,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,EAAE,CAIlE"}
|
package/esm/findObjects.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import { ParseTreeWalker } from "
|
|
3
|
-
import
|
|
4
|
-
const { AttributeTypeContext, MaqlParser, NumericTypeContext } = MaqlPkg;
|
|
2
|
+
import { ParseTreeWalker } from "antlr4ng";
|
|
3
|
+
import { AttributeTypeContext, MaqlParser, MaqlParserListener, NumericTypeContext, } from "@gooddata/maql-antlr4ts";
|
|
5
4
|
import { isTigerType, tigerIdTypeToObjectType } from "@gooddata/sdk-backend-tiger";
|
|
6
5
|
import { normalizeMaqlObjectType } from "./maqlObjectTypes.js";
|
|
7
6
|
import { MaqlMetric } from "./parseMaql.js";
|
|
@@ -12,61 +11,63 @@ export function findAllObjects(metric) {
|
|
|
12
11
|
return finder.objects;
|
|
13
12
|
}
|
|
14
13
|
// TODO rewrite using AbstractAstVisitor
|
|
15
|
-
class ObjectFinder {
|
|
14
|
+
class ObjectFinder extends MaqlParserListener {
|
|
16
15
|
objects;
|
|
17
|
-
visitTerminal; // to satisfy TS2559 - weak type detection
|
|
18
16
|
constructor(objects = []) {
|
|
17
|
+
super();
|
|
19
18
|
this.objects = objects;
|
|
20
19
|
}
|
|
21
20
|
pushObject(ctx, type) {
|
|
22
|
-
const lbrace = ctx.
|
|
23
|
-
const sep = ctx.
|
|
24
|
-
const id = ctx.
|
|
25
|
-
const rbrace = ctx.
|
|
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
26
|
// check that the object is complete
|
|
27
|
-
if (lbrace ===
|
|
27
|
+
if (lbrace === null ||
|
|
28
28
|
lbrace.symbol.tokenIndex === -1 ||
|
|
29
|
-
sep ===
|
|
29
|
+
sep === null ||
|
|
30
30
|
sep.symbol.tokenIndex === -1 ||
|
|
31
|
-
id ===
|
|
31
|
+
id === null ||
|
|
32
32
|
id.symbol.tokenIndex === -1 ||
|
|
33
|
-
rbrace ===
|
|
33
|
+
rbrace === null ||
|
|
34
34
|
rbrace.symbol.tokenIndex === -1 ||
|
|
35
|
-
type === undefined
|
|
35
|
+
type === undefined ||
|
|
36
|
+
start === null) {
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
|
-
const range = antlrContextRange(
|
|
39
|
+
const range = antlrContextRange(start, ctx.stop);
|
|
39
40
|
// `actualType` keeps the MAQL spelling so diagnostics quote what the author wrote.
|
|
40
41
|
//NOTE: The lexer accepts any casing, so fold it before the type is looked up.
|
|
41
42
|
const tigerType = normalizeMaqlObjectType(type.toLowerCase());
|
|
42
43
|
this.objects.push({
|
|
43
44
|
tigerType: isTigerType(tigerType) ? tigerType : undefined,
|
|
44
45
|
actualType: type,
|
|
45
|
-
id:
|
|
46
|
+
id: id.getText(),
|
|
46
47
|
ref: {
|
|
47
48
|
type: tigerIdTypeToObjectType[tigerType],
|
|
48
|
-
identifier:
|
|
49
|
+
identifier: id.getText(),
|
|
49
50
|
},
|
|
50
51
|
range: range,
|
|
51
52
|
offsets: {
|
|
52
|
-
start: MaqlMetric.rawOffset(
|
|
53
|
-
end: MaqlMetric.rawOffset((ctx.stop?.
|
|
53
|
+
start: MaqlMetric.rawOffset(start.start),
|
|
54
|
+
end: MaqlMetric.rawOffset((ctx.stop?.stop ?? start.stop) + 1),
|
|
54
55
|
},
|
|
55
56
|
});
|
|
56
57
|
}
|
|
57
|
-
exitAttribute(ctx) {
|
|
58
|
-
this.pushObject(ctx, ctx.
|
|
59
|
-
}
|
|
60
|
-
exitNumeric(ctx) {
|
|
61
|
-
this.pushObject(ctx, ctx.
|
|
62
|
-
}
|
|
63
|
-
exitFact(ctx) {
|
|
64
|
-
this.pushObject(ctx, ctx.
|
|
65
|
-
}
|
|
66
|
-
exitPrompt(ctx) {
|
|
67
|
-
this.pushObject(ctx, ctx.
|
|
68
|
-
}
|
|
69
|
-
exitParameter(ctx) {
|
|
70
|
-
this.pushObject(ctx, ctx.
|
|
71
|
-
}
|
|
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
|
+
};
|
|
72
73
|
}
|
package/esm/format.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// (C) 2022-2026 GoodData Corporation
|
|
2
|
-
import { AbstractParseTreeVisitor, } from "antlr4ts/tree/index.js";
|
|
3
2
|
import { TextEdit } from "vscode-languageserver";
|
|
4
|
-
import
|
|
3
|
+
import { ExpressionListContext, MaqlExpressionContext, MaqlParser, MaqlParserVisitor, } from "@gooddata/maql-antlr4ts";
|
|
5
4
|
import { TokenTypes, tokenTypeMap } from "./highlight/semanticsHighlight.js";
|
|
6
5
|
import { MaqlMetric } from "./parseMaql.js";
|
|
7
6
|
import { antlrContextRange, tokenRange } from "./tokenRanges.js";
|
|
@@ -35,11 +34,12 @@ export function formatRange(query, range, options) {
|
|
|
35
34
|
* using the same token, the first rule triggered has precedence.
|
|
36
35
|
* Most important are the whitespace (WS) tokens, which are strings of whitespace characters - spaces, new lines, tabs etc.
|
|
37
36
|
*/
|
|
38
|
-
class MaqlFormatter extends
|
|
37
|
+
class MaqlFormatter extends MaqlParserVisitor {
|
|
39
38
|
options;
|
|
40
39
|
indentationLevel = 0;
|
|
41
40
|
formattedTokens;
|
|
42
41
|
stream;
|
|
42
|
+
range;
|
|
43
43
|
get indentSpaces() {
|
|
44
44
|
return " ".repeat(this.indentationLevel * this.options.tabSize);
|
|
45
45
|
}
|
|
@@ -48,10 +48,7 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
48
48
|
this.options = options;
|
|
49
49
|
this.formattedTokens = new Set();
|
|
50
50
|
this.stream = metric.tokenStream;
|
|
51
|
-
|
|
52
|
-
// if a range is specified do not enter contexts where the intersection with the context range is empty
|
|
53
|
-
this.visit = (tree) => this.visitInRange(tree, range);
|
|
54
|
-
}
|
|
51
|
+
this.range = range;
|
|
55
52
|
}
|
|
56
53
|
defaultResult() {
|
|
57
54
|
return [];
|
|
@@ -59,14 +56,22 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
59
56
|
aggregateResult(aggregate, nextResult) {
|
|
60
57
|
return aggregate.concat(nextResult);
|
|
61
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
|
+
}
|
|
62
66
|
visitInRange(tree, range) {
|
|
63
|
-
const
|
|
67
|
+
const interval = tree.getSourceInterval();
|
|
68
|
+
const treeRange = antlrContextRange(this.stream.get(interval.start), this.stream.get(interval.stop)).toRange();
|
|
64
69
|
if (!this.intersects(treeRange, range)) {
|
|
65
70
|
return this.defaultResult();
|
|
66
71
|
}
|
|
67
|
-
return super.visit(tree).filter((edit) => this.intersects(edit.range, range));
|
|
72
|
+
return (super.visit(tree) ?? []).filter((edit) => this.intersects(edit.range, range));
|
|
68
73
|
}
|
|
69
|
-
visitChildren(node, firstChild = 0, lastChild = node.
|
|
74
|
+
visitChildren(node, firstChild = 0, lastChild = node.getChildCount() - 1) {
|
|
70
75
|
let result = this.defaultResult();
|
|
71
76
|
for (let i = firstChild; i <= lastChild; i++) {
|
|
72
77
|
if (!this.shouldVisitNextChild(node, result)) {
|
|
@@ -129,8 +134,8 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
129
134
|
edits.push(...this.visitChildren(ctx));
|
|
130
135
|
return edits;
|
|
131
136
|
}
|
|
132
|
-
visitFunctionCall = this.visitFunctionCallCommon;
|
|
133
|
-
visitFunctionCallRun(ctx) {
|
|
137
|
+
visitFunctionCall = (ctx) => this.visitFunctionCallCommon(ctx);
|
|
138
|
+
visitFunctionCallRun = (ctx) => {
|
|
134
139
|
const edits = [];
|
|
135
140
|
edits.push(...this.visitFunctionCallCommon(ctx));
|
|
136
141
|
const withinCtx = ctx.within();
|
|
@@ -142,8 +147,8 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
142
147
|
edits.push(...this.visitFunctionCallClause(rollWindowCtx));
|
|
143
148
|
}
|
|
144
149
|
return edits;
|
|
145
|
-
}
|
|
146
|
-
visitFunctionCallRank(ctx) {
|
|
150
|
+
};
|
|
151
|
+
visitFunctionCallRank = (ctx) => {
|
|
147
152
|
const edits = [];
|
|
148
153
|
edits.push(...this.visitFunctionCallCommon(ctx));
|
|
149
154
|
const rankDirCtx = ctx.rankDir();
|
|
@@ -155,8 +160,8 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
155
160
|
edits.push(...this.visitFunctionCallClause(withinCtx));
|
|
156
161
|
}
|
|
157
162
|
return edits;
|
|
158
|
-
}
|
|
159
|
-
visitFunctionCallLastFirstValue(ctx) {
|
|
163
|
+
};
|
|
164
|
+
visitFunctionCallLastFirstValue = (ctx) => {
|
|
160
165
|
const edits = [];
|
|
161
166
|
edits.push(...this.visitFunctionCallCommon(ctx));
|
|
162
167
|
const orderByCtx = ctx.orderby();
|
|
@@ -168,20 +173,26 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
168
173
|
edits.push(...this.visitFunctionCallClause(withinCtx));
|
|
169
174
|
}
|
|
170
175
|
return edits;
|
|
171
|
-
}
|
|
176
|
+
};
|
|
172
177
|
/**
|
|
173
178
|
* Ensure new line before function modifying clauses e.g. WITHIN
|
|
174
179
|
*/
|
|
175
180
|
visitFunctionCallClause(ctx) {
|
|
176
181
|
const edits = [];
|
|
177
|
-
|
|
182
|
+
const start = ctx.start;
|
|
183
|
+
if (start) {
|
|
184
|
+
edits.push(...this.ensureNewline(this.getHiddenToLeft(start), tokenRange(start).start));
|
|
185
|
+
}
|
|
178
186
|
edits.push(...this.visit(ctx));
|
|
179
187
|
return edits;
|
|
180
188
|
}
|
|
181
189
|
visitFunctionCallCommon(ctx) {
|
|
182
190
|
const edits = [];
|
|
183
|
-
|
|
184
|
-
|
|
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;
|
|
185
196
|
if (lparen) {
|
|
186
197
|
edits.push(...this.removeWhitespace(this.getHiddenToLeft(lparen)));
|
|
187
198
|
}
|
|
@@ -189,12 +200,11 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
189
200
|
edits.push(...this.ensureWhitespace(this.getHiddenToRight(lparen), "", undefined, tokenRange(lparen).end));
|
|
190
201
|
}
|
|
191
202
|
this.indent();
|
|
192
|
-
const argsCtx = ctx.
|
|
193
|
-
ctx.tryGetRuleContext(0, Maql.MaqlExpressionContext);
|
|
203
|
+
const argsCtx = ctx.getRuleContext(0, ExpressionListContext) ?? ctx.getRuleContext(0, MaqlExpressionContext);
|
|
194
204
|
if (argsCtx) {
|
|
195
205
|
edits.push(...this.visit(argsCtx));
|
|
196
206
|
}
|
|
197
|
-
const rparen = ctx.
|
|
207
|
+
const rparen = ctx.getToken(MaqlParser.RPAREN, 0)?.symbol;
|
|
198
208
|
if (rparen) {
|
|
199
209
|
edits.push(...this.removeWhitespace(this.getHiddenToLeft(rparen)));
|
|
200
210
|
}
|
|
@@ -204,9 +214,12 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
204
214
|
}
|
|
205
215
|
return edits;
|
|
206
216
|
}
|
|
207
|
-
visitTimeMacro(ctx) {
|
|
217
|
+
visitTimeMacro = (ctx) => {
|
|
208
218
|
const edits = [];
|
|
209
|
-
|
|
219
|
+
const name = ctx.getChild(0);
|
|
220
|
+
if (name) {
|
|
221
|
+
edits.push(...this.visit(name));
|
|
222
|
+
}
|
|
210
223
|
const lparen = ctx.LPAREN().symbol;
|
|
211
224
|
edits.push(...this.removeWhitespace(this.getHiddenToLeft(lparen)));
|
|
212
225
|
edits.push(...this.ensureWhitespace(this.getHiddenToRight(lparen), "", undefined, tokenRange(lparen).end));
|
|
@@ -227,27 +240,19 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
227
240
|
edits.push(...this.visit(amountCtx));
|
|
228
241
|
}
|
|
229
242
|
return edits;
|
|
230
|
-
}
|
|
231
|
-
visitExpressionList(ctx) {
|
|
243
|
+
};
|
|
244
|
+
visitExpressionList = (ctx) => {
|
|
232
245
|
const edits = [];
|
|
233
|
-
const
|
|
234
|
-
const commas = (Array.isArray(commaContext) ? commaContext : [commaContext])
|
|
235
|
-
.map((c) => c?.symbol)
|
|
236
|
-
.filter((c) => c !== undefined);
|
|
237
|
-
for (const comma of commas) {
|
|
246
|
+
for (const comma of ctx.COMMA().map((c) => c.symbol)) {
|
|
238
247
|
edits.push(...this.removeWhitespace(this.getHiddenToLeft(comma)));
|
|
239
248
|
const commaRange = tokenRange(comma);
|
|
240
249
|
edits.push(...this.ensureSpace(this.getHiddenToRight(comma), commaRange.end));
|
|
241
250
|
}
|
|
242
251
|
edits.push(...this.visitChildren(ctx));
|
|
243
252
|
return edits;
|
|
244
|
-
}
|
|
245
|
-
visitDisjunction(ctx)
|
|
246
|
-
|
|
247
|
-
}
|
|
248
|
-
visitConjunction(ctx) {
|
|
249
|
-
return this.visitLogicalOperatorExpression(ctx, () => ctx.AND());
|
|
250
|
-
}
|
|
253
|
+
};
|
|
254
|
+
visitDisjunction = (ctx) => this.visitLogicalOperatorExpression(ctx, () => ctx.OR());
|
|
255
|
+
visitConjunction = (ctx) => this.visitLogicalOperatorExpression(ctx, () => ctx.AND());
|
|
251
256
|
visitLogicalOperatorExpression(ctx, ops) {
|
|
252
257
|
const edits = [];
|
|
253
258
|
for (const opNode of ops()) {
|
|
@@ -259,18 +264,14 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
259
264
|
edits.push(...this.visitChildren(ctx));
|
|
260
265
|
return edits;
|
|
261
266
|
}
|
|
262
|
-
visitAddition(ctx)
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
.multiplicativeOperator()
|
|
271
|
-
.map((it) => it.MUL() ?? it.DIV())
|
|
272
|
-
.filter((it) => !!it));
|
|
273
|
-
}
|
|
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));
|
|
274
275
|
visitArithmeticOperatorExpression(ctx, ops) {
|
|
275
276
|
const edits = [];
|
|
276
277
|
for (const opNode of ops()) {
|
|
@@ -282,7 +283,7 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
282
283
|
edits.push(...this.visitChildren(ctx));
|
|
283
284
|
return edits;
|
|
284
285
|
}
|
|
285
|
-
visitRelationRelop(ctx) {
|
|
286
|
+
visitRelationRelop = (ctx) => {
|
|
286
287
|
const edits = [];
|
|
287
288
|
const relop = ctx.RELOP().symbol;
|
|
288
289
|
const relopRange = tokenRange(relop);
|
|
@@ -290,19 +291,19 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
290
291
|
edits.push(...this.ensureSpace(this.getHiddenToRight(relop), relopRange.end));
|
|
291
292
|
edits.push(...this.visitChildren(ctx));
|
|
292
293
|
return edits;
|
|
293
|
-
}
|
|
294
|
-
visitRelationLike(ctx) {
|
|
294
|
+
};
|
|
295
|
+
visitRelationLike = (ctx) => {
|
|
295
296
|
const edits = [];
|
|
296
297
|
const likeCtx = ctx.like();
|
|
297
|
-
const item = likeCtx.LIKE()
|
|
298
|
+
const item = likeCtx.LIKE() ?? likeCtx.ILIKE();
|
|
298
299
|
const like = item.symbol;
|
|
299
300
|
const likeRange = tokenRange(like);
|
|
300
301
|
edits.push(...this.ensureSpace(this.getHiddenToLeft(like), likeRange.start));
|
|
301
302
|
edits.push(...this.ensureSpace(this.getHiddenToRight(like), likeRange.end));
|
|
302
303
|
edits.push(...this.visit(likeCtx));
|
|
303
304
|
return edits;
|
|
304
|
-
}
|
|
305
|
-
visitRelationBetween(ctx) {
|
|
305
|
+
};
|
|
306
|
+
visitRelationBetween = (ctx) => {
|
|
306
307
|
const edits = [];
|
|
307
308
|
const between = ctx.BETWEEN().symbol;
|
|
308
309
|
const betweenRange = tokenRange(between);
|
|
@@ -314,8 +315,8 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
314
315
|
edits.push(...this.ensureSpace(this.getHiddenToRight(and), andRange.end));
|
|
315
316
|
edits.push(...this.visitChildren(ctx));
|
|
316
317
|
return edits;
|
|
317
|
-
}
|
|
318
|
-
visitRelationNot(ctx) {
|
|
318
|
+
};
|
|
319
|
+
visitRelationNot = (ctx) => {
|
|
319
320
|
const not = ctx.NOT();
|
|
320
321
|
const edits = [];
|
|
321
322
|
if (not) {
|
|
@@ -327,8 +328,8 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
327
328
|
}
|
|
328
329
|
edits.push(...this.visit(ctx.relationNegatable()));
|
|
329
330
|
return edits;
|
|
330
|
-
}
|
|
331
|
-
visitRelationIn(ctx) {
|
|
331
|
+
};
|
|
332
|
+
visitRelationIn = (ctx) => {
|
|
332
333
|
const edits = [];
|
|
333
334
|
const int = ctx.IN().symbol;
|
|
334
335
|
const range = tokenRange(int);
|
|
@@ -337,19 +338,19 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
337
338
|
edits.push(...this.visit(ctx.IN()));
|
|
338
339
|
const lparen = ctx.LPAREN().symbol;
|
|
339
340
|
const lparenRange = tokenRange(lparen);
|
|
340
|
-
if (ctx.listLiteral() ===
|
|
341
|
+
if (ctx.listLiteral() === null) {
|
|
341
342
|
edits.push(...this.removeWhitespace(this.getHiddenToLeft(ctx.RPAREN().symbol)));
|
|
342
343
|
}
|
|
343
344
|
else {
|
|
344
345
|
this.indent();
|
|
345
346
|
edits.push(...this.ensureNewline(this.getHiddenToRight(lparen), lparenRange.end));
|
|
346
|
-
edits.push(...this.visitChildren(ctx, 1, ctx.
|
|
347
|
+
edits.push(...this.visitChildren(ctx, 1, ctx.getChildCount() - 2));
|
|
347
348
|
this.dedent();
|
|
348
349
|
}
|
|
349
350
|
edits.push(...this.visit(ctx.RPAREN()));
|
|
350
351
|
return edits;
|
|
351
|
-
}
|
|
352
|
-
visitSelectExpression(ctx) {
|
|
352
|
+
};
|
|
353
|
+
visitSelectExpression = (ctx) => {
|
|
353
354
|
const edits = [];
|
|
354
355
|
const select = ctx.SELECT().symbol;
|
|
355
356
|
const selectRange = tokenRange(select);
|
|
@@ -360,11 +361,9 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
360
361
|
edits.push(...this.visitChildren(ctx, 1));
|
|
361
362
|
this.dedent();
|
|
362
363
|
return edits;
|
|
363
|
-
}
|
|
364
|
-
visitBy(ctx)
|
|
365
|
-
|
|
366
|
-
}
|
|
367
|
-
visitForEach(ctx) {
|
|
364
|
+
};
|
|
365
|
+
visitBy = (ctx) => this.visitKeywordOfStatement(ctx, () => ctx.BY());
|
|
366
|
+
visitForEach = (ctx) => {
|
|
368
367
|
const edits = [];
|
|
369
368
|
const forEach = ctx.FOR().symbol;
|
|
370
369
|
const forEachRange = tokenRange(forEach);
|
|
@@ -373,25 +372,13 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
373
372
|
edits.push(...this.visitChildren(ctx, 1));
|
|
374
373
|
this.dedent();
|
|
375
374
|
return edits;
|
|
376
|
-
}
|
|
377
|
-
visitForTransformation(ctx)
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
visitHaving(ctx) {
|
|
384
|
-
return this.visitKeywordOfStatement(ctx, () => ctx.HAVING());
|
|
385
|
-
}
|
|
386
|
-
visitUsing(ctx) {
|
|
387
|
-
return this.visitKeywordOfStatement(ctx, () => ctx.USING());
|
|
388
|
-
}
|
|
389
|
-
visitWithPf(ctx) {
|
|
390
|
-
return this.visitKeywordOfStatement(ctx, () => ctx.WITH());
|
|
391
|
-
}
|
|
392
|
-
visitWithoutPf(ctx) {
|
|
393
|
-
return this.visitKeywordOfStatement(ctx, () => ctx.WITHOUT());
|
|
394
|
-
}
|
|
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());
|
|
395
382
|
visitKeywordOfStatement(ctx, keyword) {
|
|
396
383
|
const edits = [];
|
|
397
384
|
const kw = keyword().symbol;
|
|
@@ -402,13 +389,9 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
402
389
|
edits.push(...this.visitChildren(ctx, 1));
|
|
403
390
|
return edits;
|
|
404
391
|
}
|
|
405
|
-
visitAttributeList(ctx)
|
|
406
|
-
return this.visitNewlineSeparatedCommaList(ctx);
|
|
407
|
-
}
|
|
392
|
+
visitAttributeList = (ctx) => this.visitNewlineSeparatedCommaList(ctx);
|
|
408
393
|
// oxlint-disable-next-line sonarjs/no-identical-functions -- distinct ANTLR visitor override with intentionally identical formatting behavior
|
|
409
|
-
visitListLiteral(ctx)
|
|
410
|
-
return this.visitNewlineSeparatedCommaList(ctx);
|
|
411
|
-
}
|
|
394
|
+
visitListLiteral = (ctx) => this.visitNewlineSeparatedCommaList(ctx);
|
|
412
395
|
visitNewlineSeparatedCommaList(ctx) {
|
|
413
396
|
const edits = [];
|
|
414
397
|
for (const comma of ctx.COMMA()) {
|
|
@@ -419,18 +402,18 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
419
402
|
edits.push(...this.visitChildren(ctx));
|
|
420
403
|
return edits;
|
|
421
404
|
}
|
|
422
|
-
visitIf(ctx) {
|
|
405
|
+
visitIf = (ctx) => {
|
|
423
406
|
const edits = [];
|
|
424
407
|
edits.push(...this.visit(ctx.IF()));
|
|
425
408
|
edits.push(...this.visitElse(ctx));
|
|
426
409
|
return edits;
|
|
427
|
-
}
|
|
428
|
-
visitCase(ctx) {
|
|
410
|
+
};
|
|
411
|
+
visitCase = (ctx) => {
|
|
429
412
|
const edits = [];
|
|
430
413
|
edits.push(...this.visit(ctx.CASE()));
|
|
431
414
|
edits.push(...this.visitElse(ctx));
|
|
432
415
|
return edits;
|
|
433
|
-
}
|
|
416
|
+
};
|
|
434
417
|
visitElse(ctx) {
|
|
435
418
|
const edits = [];
|
|
436
419
|
this.indent();
|
|
@@ -439,14 +422,19 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
439
422
|
edits.push(...this.ensureNewline(this.getHiddenToLeft(elseCtx.symbol), tokenRange(elseCtx.symbol).start));
|
|
440
423
|
edits.push(...this.visit(elseCtx));
|
|
441
424
|
}
|
|
442
|
-
|
|
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));
|
|
443
429
|
this.dedent();
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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
|
+
}
|
|
447
435
|
return edits;
|
|
448
436
|
}
|
|
449
|
-
visitCaseConditional(ctx) {
|
|
437
|
+
visitCaseConditional = (ctx) => {
|
|
450
438
|
const edits = this.defaultResult();
|
|
451
439
|
for (const when of ctx.WHEN()) {
|
|
452
440
|
const token = when.symbol;
|
|
@@ -454,10 +442,10 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
454
442
|
}
|
|
455
443
|
edits.push(...this.visitChildren(ctx));
|
|
456
444
|
return edits;
|
|
457
|
-
}
|
|
458
|
-
visitTransFunction(ctx) {
|
|
445
|
+
};
|
|
446
|
+
visitTransFunction = (ctx) => {
|
|
459
447
|
const token = ctx.NEXT() ?? ctx.NEXTPERIOD() ?? ctx.PREVIOUS() ?? ctx.PREVIOUSPERIOD();
|
|
460
|
-
const text = token?.
|
|
448
|
+
const text = token?.getText();
|
|
461
449
|
const edited = text ? formatTransFunction(text) : undefined;
|
|
462
450
|
if (!token || !edited || text === edited)
|
|
463
451
|
return this.defaultResult();
|
|
@@ -465,7 +453,7 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
465
453
|
if (!this.inRange(range))
|
|
466
454
|
return this.defaultResult();
|
|
467
455
|
return [TextEdit.replace(range, edited)];
|
|
468
|
-
}
|
|
456
|
+
};
|
|
469
457
|
/**
|
|
470
458
|
* Shortens whitespace, trims trailing spaces, inserts string at the start of the last line
|
|
471
459
|
* @param whitespace - is assumed to be the token text of a MaqlParser.WS token
|
|
@@ -493,7 +481,7 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
493
481
|
.map((token) => {
|
|
494
482
|
if (!token.text || this.formattedTokens.has(token.tokenIndex))
|
|
495
483
|
return null;
|
|
496
|
-
if (token.type ===
|
|
484
|
+
if (token.type === MaqlParser.WS) {
|
|
497
485
|
const range = tokenRange(token);
|
|
498
486
|
const edited = this.formatWhitespace(token.text, finalInline, finalNewline);
|
|
499
487
|
if (token.text !== edited) {
|
|
@@ -524,7 +512,7 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
524
512
|
if (!token.text || this.formattedTokens.has(token.tokenIndex))
|
|
525
513
|
return;
|
|
526
514
|
this.formattedTokens.add(token.tokenIndex);
|
|
527
|
-
if (token.type ===
|
|
515
|
+
if (token.type === MaqlParser.WS) {
|
|
528
516
|
const range = tokenRange(token);
|
|
529
517
|
const edited = prevIsLineComment
|
|
530
518
|
? "\n" + this.indentSpaces
|
|
@@ -535,7 +523,7 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
535
523
|
edits.push(TextEdit.replace(range, edited));
|
|
536
524
|
}
|
|
537
525
|
}
|
|
538
|
-
prevIsLineComment = token.type ===
|
|
526
|
+
prevIsLineComment = token.type === MaqlParser.Comment;
|
|
539
527
|
});
|
|
540
528
|
return edits;
|
|
541
529
|
}
|
|
@@ -557,12 +545,12 @@ class MaqlFormatter extends AbstractParseTreeVisitor {
|
|
|
557
545
|
getHiddenToLeft(token) {
|
|
558
546
|
if (token.tokenIndex < 0 || token.tokenIndex >= this.stream.size)
|
|
559
547
|
return [];
|
|
560
|
-
return this.stream.getHiddenTokensToLeft(token.tokenIndex, -1);
|
|
548
|
+
return this.stream.getHiddenTokensToLeft(token.tokenIndex, -1) ?? [];
|
|
561
549
|
}
|
|
562
550
|
getHiddenToRight(token) {
|
|
563
551
|
if (token.tokenIndex < 0 || token.tokenIndex >= this.stream.size)
|
|
564
552
|
return [];
|
|
565
|
-
return this.stream.getHiddenTokensToRight(token.tokenIndex, -1);
|
|
553
|
+
return this.stream.getHiddenTokensToRight(token.tokenIndex, -1) ?? [];
|
|
566
554
|
}
|
|
567
555
|
}
|
|
568
556
|
function formatTransFunction(func) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semanticsHighlight.d.ts","sourceRoot":"","sources":["../../src/highlight/semanticsHighlight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"semanticsHighlight.d.ts","sourceRoot":"","sources":["../../src/highlight/semanticsHighlight.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAkB9E;;GAEG;AACH,oBAAY,UAAU;IAClB,IAAI,IAAA;IACJ,OAAO,IAAA;IACP,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,MAAM,IAAA;IACN,OAAO,IAAA;IACP,KAAK,IAAA;IACL,IAAI,IAAA;IACJ,MAAM,KAAA;IACN,OAAO,KAAA;CACV;AAED;;GAEG;AACH,oBAAY,aAAa;IACrB,UAAU,IAAA;CACb;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,UAE1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,UAE7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,oBAGlC,CAAC;AAoKF,eAAO,MAAM,YAAY,qBAA4B,CAAC;AA2CtD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAG7D;AAQD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,EAAE,KAAK,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import { ParseTreeWalker, } from "
|
|
3
|
-
import
|
|
4
|
-
const { AttributeTypeContext, MaqlLexer, NumericTypeContext } = MaqlPkg;
|
|
2
|
+
import { ParseTreeWalker, } from "antlr4ng";
|
|
3
|
+
import { AttributeTypeContext, MaqlLexer, MaqlParserListener, NumericTypeContext, } from "@gooddata/maql-antlr4ts";
|
|
5
4
|
import { LanguageId } from "../constants.js";
|
|
6
5
|
import { MaqlMetric } from "../parseMaql.js";
|
|
7
6
|
import { antlrContextRange } from "../tokenRanges.js";
|
|
@@ -251,11 +250,12 @@ function tokenize(tree, stream) {
|
|
|
251
250
|
* Parse tree listener that assigns semantic tokens to nodes of a MAQL parse tree, usually by directly mapping
|
|
252
251
|
* from a MAQL token, but is able to use more complicated logic in special cases.
|
|
253
252
|
*/
|
|
254
|
-
class SemanticTokenizer {
|
|
253
|
+
class SemanticTokenizer extends MaqlParserListener {
|
|
255
254
|
stream;
|
|
256
255
|
tokens = [];
|
|
257
256
|
skipNodes = false;
|
|
258
257
|
constructor(stream) {
|
|
258
|
+
super();
|
|
259
259
|
this.stream = stream;
|
|
260
260
|
}
|
|
261
261
|
visitTerminal(node) {
|
|
@@ -275,35 +275,37 @@ class SemanticTokenizer {
|
|
|
275
275
|
}
|
|
276
276
|
exitObject(ctx, objectTypeId = -1) {
|
|
277
277
|
this.skipNodes = false;
|
|
278
|
-
|
|
278
|
+
if (ctx.start) {
|
|
279
|
+
this.pushHiddenTokensToLeft(ctx.start.tokenIndex);
|
|
280
|
+
}
|
|
279
281
|
this.pushRule(ctx, objectTypeId);
|
|
280
282
|
}
|
|
281
283
|
enterAttribute = this.enterObject;
|
|
282
|
-
exitAttribute(ctx) {
|
|
283
|
-
const typeCtx = ctx.
|
|
284
|
+
exitAttribute = (ctx) => {
|
|
285
|
+
const typeCtx = ctx.getRuleContext(0, AttributeTypeContext);
|
|
284
286
|
const type = typeCtx?.ATTRIBUTE() ??
|
|
285
287
|
typeCtx?.COMPUTED_ATTRIBUTE_OBJECT() ??
|
|
286
288
|
typeCtx?.LABEL() ??
|
|
287
289
|
typeCtx?.DATASET();
|
|
288
290
|
this.exitObject(ctx, this.getTokenId(type));
|
|
289
|
-
}
|
|
291
|
+
};
|
|
290
292
|
enterNumeric = this.enterObject;
|
|
291
|
-
exitNumeric(ctx) {
|
|
292
|
-
const typeCtx = ctx.
|
|
293
|
+
exitNumeric = (ctx) => {
|
|
294
|
+
const typeCtx = ctx.getRuleContext(0, NumericTypeContext);
|
|
293
295
|
this.exitObject(ctx, this.getTokenId(typeCtx?.FACT() ?? typeCtx?.METRIC_TYPE()));
|
|
294
|
-
}
|
|
295
|
-
exitFact(ctx) {
|
|
296
|
+
};
|
|
297
|
+
exitFact = (ctx) => {
|
|
296
298
|
this.exitObject(ctx, this.getTokenId(ctx.FACT()));
|
|
297
|
-
}
|
|
299
|
+
};
|
|
298
300
|
enterParameter = this.enterObject;
|
|
299
|
-
exitParameter(ctx) {
|
|
301
|
+
exitParameter = (ctx) => {
|
|
300
302
|
this.exitObject(ctx, this.getTokenId(ctx.PARAMETER()));
|
|
301
|
-
}
|
|
303
|
+
};
|
|
302
304
|
getTokenId = (node) => node?.symbol.type;
|
|
303
305
|
pushHiddenTokensToLeft(tokenIndex) {
|
|
304
306
|
if (tokenIndex < 0 || this.stream.size < tokenIndex)
|
|
305
307
|
return;
|
|
306
|
-
this.stream.getHiddenTokensToLeft(tokenIndex, -1).forEach((token) => this.pushToken(token));
|
|
308
|
+
(this.stream.getHiddenTokensToLeft(tokenIndex, -1) ?? []).forEach((token) => this.pushToken(token));
|
|
307
309
|
}
|
|
308
310
|
pushToken(token) {
|
|
309
311
|
if (SKIP_TOKENS.includes(token.type))
|
|
@@ -311,12 +313,14 @@ class SemanticTokenizer {
|
|
|
311
313
|
const tokenType = tokenTypeMap.get(token.type) ?? TokenTypes.Type;
|
|
312
314
|
if (!token.text)
|
|
313
315
|
return;
|
|
314
|
-
this.push(token.text, token.line, token.
|
|
316
|
+
this.push(token.text, token.line, token.column, tokenType);
|
|
315
317
|
}
|
|
316
318
|
pushRule(rule, objectTypeId) {
|
|
319
|
+
if (!rule.start)
|
|
320
|
+
return;
|
|
317
321
|
const tokenType = getObjectTypeTokenType(objectTypeId) ?? TokenTypes.Type;
|
|
318
322
|
const range = antlrContextRange(rule.start, rule.stop);
|
|
319
|
-
this.push(rule.
|
|
323
|
+
this.push(rule.getText(), range.startLine, range.startCharacter, tokenType);
|
|
320
324
|
}
|
|
321
325
|
push(text, antlrLine, antlrCharacter, tokenType, tokenModifiers = []) {
|
|
322
326
|
const lines = text.split("\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labelElements.d.ts","sourceRoot":"","sources":["../src/labelElements.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"labelElements.d.ts","sourceRoot":"","sources":["../src/labelElements.ts"],"names":[],"mappings":"AAEA,OAAO,EAKH,KAAK,SAAS,EAKjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACH,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,QAAQ,EAGhB,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,GAAG,YAAY,CAKtF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAIpF;AAED,qBAAa,YAAY;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,CAAM;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAM;IACrC,QAAQ,CAAC,UAAU,EAAE,cAAc,EAAE,CAAM;IAE3C,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAEzB;IAED,OAAO,IAAI,OAAO,CAEjB;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,CAMvD;IAED,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAuBvF;IAED,YAAY,CAAC,sBAAsB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,CAOjG;IAED,GAAG,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAKrC;IAED,QAAQ,IAAI,MAAM,CAOjB;CACJ"}
|
package/esm/labelElements.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import
|
|
3
|
-
const { AbstractAstVisitor, positionInRange } = MaqlPkg;
|
|
2
|
+
import { AbstractAstVisitor, positionInRange, } from "@gooddata/maql-antlr4ts";
|
|
4
3
|
import { isTigerType, tigerIdTypeToObjectType } from "@gooddata/sdk-backend-tiger";
|
|
5
4
|
import { normalizeMaqlObjectType } from "./maqlObjectTypes.js";
|
|
6
5
|
import { AntlrRange, isMaqlObject, isMaqlString, } from "./tokenRanges.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/metadata/parameters.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,oBAAoB,EAA+B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../src/metadata/parameters.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,oBAAoB,EAA+B,MAAM,qBAAqB,CAAC;AAE7F,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,CAE3E;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,CAE9E;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,IAAI,oBAAoB,CAU9F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,CAI7E"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
|
-
import
|
|
2
|
+
import { escapeString } from "@gooddata/maql-antlr4ts";
|
|
3
3
|
import { isStringParameterDefinition } from "@gooddata/sdk-model";
|
|
4
|
-
const { escapeString } = MaqlPkg;
|
|
5
4
|
export function parameterTypeLabel(definition) {
|
|
6
5
|
return definition.type.toLowerCase();
|
|
7
6
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
2
|
import { groupBy } from "lodash-es";
|
|
3
3
|
import { Diagnostic, DiagnosticSeverity } from "vscode-languageserver";
|
|
4
|
-
import
|
|
5
|
-
const { MaqlLexer } = MaqlPkg;
|
|
4
|
+
import { MaqlLexer, } from "@gooddata/maql-antlr4ts";
|
|
6
5
|
import { isStringParameterDefinition } from "@gooddata/sdk-model";
|
|
7
6
|
import { ErrorCodes, diagnosticsSource } from "./constants.js";
|
|
8
7
|
import { AntlrRange, tokenRange } from "./tokenRanges.js";
|
|
@@ -142,7 +141,7 @@ function keywordRange(caseNode, metric) {
|
|
|
142
141
|
const token = metric.tokenStream
|
|
143
142
|
.getTokens()
|
|
144
143
|
.find((candidate) => candidate.line - 1 === astRange.start.line &&
|
|
145
|
-
candidate.
|
|
144
|
+
candidate.column === astRange.start.character &&
|
|
146
145
|
(candidate.type === MaqlLexer.CASE || candidate.type === MaqlLexer.IF));
|
|
147
146
|
return token ? tokenRange(token) : undefined;
|
|
148
147
|
}
|
package/esm/parseMaql.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ANTLRErrorListener,
|
|
1
|
+
import { type ANTLRErrorListener, CommonTokenStream, type DefaultErrorStrategy, type ParserRuleContext } from "antlr4ng";
|
|
2
2
|
import { type AstNode, type MaqlLexer as MaqlLexerType, type MaqlParser as MaqlParserType } from "@gooddata/maql-antlr4ts";
|
|
3
3
|
/**
|
|
4
4
|
* Class holding different representations of a MAQL query
|
|
@@ -17,9 +17,9 @@ declare class MaqlQuery {
|
|
|
17
17
|
private _tree;
|
|
18
18
|
private _ast;
|
|
19
19
|
constructor(raw: string);
|
|
20
|
-
addErrorListener(listener: ANTLRErrorListener
|
|
20
|
+
addErrorListener(listener: ANTLRErrorListener): this;
|
|
21
21
|
removeErrorListeners(): this;
|
|
22
|
-
setErrorHandler(errorHandler:
|
|
22
|
+
setErrorHandler(errorHandler: DefaultErrorStrategy): this;
|
|
23
23
|
private notifyChangedConfiguration;
|
|
24
24
|
}
|
|
25
25
|
/**
|
package/esm/parseMaql.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseMaql.d.ts","sourceRoot":"","sources":["../src/parseMaql.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,kBAAkB,EACvB,
|
|
1
|
+
{"version":3,"file":"parseMaql.d.ts","sourceRoot":"","sources":["../src/parseMaql.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,kBAAkB,EACvB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACzB,MAAM,UAAU,CAAC;AAElB,OAAO,EACH,KAAK,OAAO,EAIZ,KAAK,SAAS,IAAI,aAAa,EAE/B,KAAK,UAAU,IAAI,cAAc,EACpC,MAAM,yBAAyB,CAAC;AAEjC;;;GAGG;AACH,cAAM,SAAS;IAqCC,QAAQ,CAAC,GAAG,EAAE,MAAM;IApChC,IAAI,KAAK,IAAI,aAAa,CAGzB;IAED,IAAI,WAAW,IAAI,iBAAiB,CAGnC;IAED,IAAI,MAAM,IAAI,cAAc,CAG3B;IAED,IAAI,IAAI,IAAI,iBAAiB,CAK5B;IAED,IAAI,GAAG,IAAI,OAAO,CAMjB;IAED,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,IAAI,CAAsB;IAElC,YAAqB,GAAG,EAAE,MAAM,EAK/B;IAED,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAInD;IAED,oBAAoB,IAAI,IAAI,CAI3B;IAED,eAAe,CAAC,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAIxD;IAED,OAAO,CAAC,0BAA0B;CAIrC;AAED;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAA4B;IAE1D,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpC;IAED,6FAA6F;IAC7F,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7C;IAED,YAAY,GAAG,EAAE,MAAM,EAAE,uBAAuB,UAAQ,EAKvD;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;CACJ;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
package/esm/parseMaql.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// (C) 2022-2026 GoodData Corporation
|
|
2
|
-
import { CommonTokenStream, } from "
|
|
3
|
-
import
|
|
4
|
-
const { CaseInsensitiveCharStream, MaqlAstVisitor, MaqlLexer, MaqlParser } = MaqlPkg;
|
|
2
|
+
import { CommonTokenStream, } from "antlr4ng";
|
|
3
|
+
import { CaseInsensitiveCharStream, MaqlAstVisitor, MaqlLexer, MaqlParser, } from "@gooddata/maql-antlr4ts";
|
|
5
4
|
/**
|
|
6
5
|
* Class holding different representations of a MAQL query
|
|
7
6
|
* Raw string, ANTLR4 classes (Lexer, TokenStream, Parser, parse tree), abstract syntax tree (AST)
|
package/esm/tokenRanges.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { Token } from "antlr4ng";
|
|
2
|
+
import type { Range } from "vscode-languageserver";
|
|
3
|
+
import type { IRange } from "@gooddata/maql-antlr4ts";
|
|
4
4
|
import { type ITigerMetadataObject, type ITigerMetadataObjectStub } from "./metadata/model.js";
|
|
5
5
|
export type MetadataObjectAndRange = ITigerMetadataObject & {
|
|
6
6
|
range: Range;
|
|
@@ -23,7 +23,7 @@ export declare function isMaqlString(obj: IOperand): obj is IMaqlString;
|
|
|
23
23
|
export declare function isMaqlTimeMacro(obj: IOperand): obj is IMaqlTimeMacro;
|
|
24
24
|
export declare function tokenRange(token: Token): Range;
|
|
25
25
|
export declare function defaultRange(line: number, character: number, endLine?: number, endCharacter?: number): Range;
|
|
26
|
-
export declare function antlrContextRange(start: Token, stop?: Token): AntlrRange;
|
|
26
|
+
export declare function antlrContextRange(start: Token, stop?: Token | null): AntlrRange;
|
|
27
27
|
export declare class AntlrRange {
|
|
28
28
|
readonly startLine: number;
|
|
29
29
|
readonly startCharacter: number;
|
package/esm/tokenRanges.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenRanges.d.ts","sourceRoot":"","sources":["../src/tokenRanges.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"tokenRanges.d.ts","sourceRoot":"","sources":["../src/tokenRanges.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/F,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC9B;AACD,MAAM,WAAW,WAAY,SAAQ,QAAQ,EAAE,wBAAwB;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,IAAI,WAAW,CAE9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,IAAI,WAAW,CAE9D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,IAAI,cAAc,CAEpE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAY9C;AAED,wBAAgB,YAAY,CACxB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAa,EACtB,YAAY,GAAE,MAAkB,GACjC,KAAK,CASP;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,KAAK,GAAG,IAAY,GAAG,UAAU,CAGtF;AAED,qBAAa,UAAU;IAEf,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM;IAJjC,YACa,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,MAAkB,EAC3B,YAAY,GAAE,MAAuB,EAC9C;IAEJ,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,cAOnC;IAED,OAAO,IAAI,KAAK,CAEf;CACJ"}
|
package/esm/tokenRanges.js
CHANGED
|
@@ -12,7 +12,7 @@ export function tokenRange(token) {
|
|
|
12
12
|
// subtract one line to change to indexing from zero
|
|
13
13
|
// subtract one more for the added "parse metric" line
|
|
14
14
|
const startLine = token.line - 2;
|
|
15
|
-
const startCharacter = token.
|
|
15
|
+
const startCharacter = token.column;
|
|
16
16
|
const lines = token.text?.split("\n") ?? [""];
|
|
17
17
|
const endLine = startLine + lines.length - 1;
|
|
18
18
|
const endCharacter = lines[lines.length - 1].length + (startLine === endLine ? startCharacter : 0);
|
|
@@ -32,7 +32,8 @@ export function defaultRange(line, character, endLine = line, endCharacter = cha
|
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
export function antlrContextRange(start, stop = start) {
|
|
35
|
-
|
|
35
|
+
const end = stop ?? start;
|
|
36
|
+
return new AntlrRange(start.line, start.column, end.line, end.column + (end.text?.length ?? 1));
|
|
36
37
|
}
|
|
37
38
|
export class AntlrRange {
|
|
38
39
|
startLine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signatures.d.ts","sourceRoot":"","sources":["../../src/types/signatures.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"signatures.d.ts","sourceRoot":"","sources":["../../src/types/signatures.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,kBAAkB,EAK1B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,QAAQ,CAAC;CAClB;AAED,oBAAY,YAAY;IACpB,QAAQ,IAAA;IACR,MAAM,IAAA;IACN,KAAK,IAAA;IACL,OAAO,IAAA;CACV;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAKtB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,EAAE;IACzC,QAAQ,CAAC,QAAQ,EAAE,YAAY;IALnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YACI,IAAI,EAAE,MAAM,EACH,UAAU,EAAE,kBAAkB,EAAE,EAChC,QAAQ,EAAE,YAAY,EAGlC;IAED,QAAQ,IAAI,MAAM,CAcjB;CACJ;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;IAIjD,QAAQ,CAAC,OAAO,EAAE,kBAAkB;IAEpC,QAAQ,CAAC,MAAM,EAAE,OAAO;IAL5B,YACI,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,kBAAkB,EAAE,EACvB,OAAO,EAAE,kBAAkB,EACpC,QAAQ,EAAE,YAAY,EACb,MAAM,EAAE,OAAO,EAG3B;IAED,MAAM,CAAC,MAAM,CACT,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,QAAQ,EACpB,cAAc,EAAE,QAAQ,EAAE,EAC1B,QAAQ,eAAwB,EAChC,MAAM,UAAQ,GACf,kBAAkB,CAQpB;IAEQ,QAAQ,IAAI,MAAM,CAI1B;CACJ;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,EAAE,CASpG;AAED,wBAAgB,2BAA2B,CACvC,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,MAAM,GACb,kBAAkB,CAQpB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB,EAAE,CA2E3E"}
|
package/esm/types/signatures.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import
|
|
3
|
-
const { functionDefinitions, isMaqlFunctionName } = MaqlPkg;
|
|
2
|
+
import { functionDefinitions, isMaqlFunctionName, } from "@gooddata/maql-antlr4ts";
|
|
4
3
|
import { MaqlType } from "./hierarchy.js";
|
|
5
4
|
export var CallNotation;
|
|
6
5
|
(function (CallNotation) {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
declare const AbstractAstVisitor: typeof MaqlPkg.AbstractAstVisitor;
|
|
1
|
+
import { AbstractAstVisitor, type AstNode, type BooleanLiteralNode, type CaseNode, type ConditionalNode, type EmptyNode, type ExpressionNode, type FilterNode, type FunctionNode, type GranularityNode, type IRange, type IdentifierNode, type LastFirstValueFunctionNode, type ListNode, type NullLiteralNode, type NumberLiteralNode, type OperatorNode, type OrderByElementNode, type RankFunctionNode, type RankingFilterNode, type RunningFunctionNode, type SelectNode, type StringLiteralNode } from "@gooddata/maql-antlr4ts";
|
|
3
2
|
import { MaqlType } from "./hierarchy.js";
|
|
4
3
|
import { type TypeModel } from "./typeModel.js";
|
|
5
4
|
export interface ITypeConstraintsViolation {
|
|
@@ -52,5 +51,4 @@ export declare class AstTypeChecker extends AbstractAstVisitor<TypedAstNode> {
|
|
|
52
51
|
private logUnexpectedOperandCount;
|
|
53
52
|
private logViolation;
|
|
54
53
|
}
|
|
55
|
-
export {};
|
|
56
54
|
//# sourceMappingURL=typeChecking.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeChecking.d.ts","sourceRoot":"","sources":["../../src/types/typeChecking.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"typeChecking.d.ts","sourceRoot":"","sources":["../../src/types/typeChecking.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAC/B,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACzB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,EAAE,QAAQ,EAAuD,MAAM,gBAAgB,CAAC;AAQ/F,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,YAAY;IAEjB,QAAQ,CAAC,IAAI,EAAE,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAFjC,YACa,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,OAAO,GAAG,IAAI,EAC7B;CACP;AAED,qBAAa,cAAe,SAAQ,kBAAkB,CAAC,YAAY,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,SAAS;IAArC,YAAqB,KAAK,EAAE,SAAS,EAEpC;IAED,QAAQ,CAAC,yBAAyB,EAAE,yBAAyB,EAAE,CAAM;IAErE,aAAa,IAAI,YAAY,CAE5B;IAED,UAAmB,qBAAqB,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,YAAY,CAMhG;IAEQ,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,CAIrD;IAEQ,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAoBvD;IAEQ,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAE/D;IAEQ,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CA2C3D;IAED,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,OAAO;IAaN,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CAKnD;IAEQ,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAQ3D;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,oBAAoB;IAiCnB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAQzE;IAEQ,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAKnE;IAEQ,+BAA+B,CAAC,IAAI,EAAE,0BAA0B,GAAG,YAAY,CAQvF;IAEQ,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,YAAY,CAGnE;IAEQ,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,CAOrE;IAEQ,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CAInD;IAEQ,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,YAAY,CAKjE;IAEQ,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAO/D;IAEQ,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,YAAY,CAEvE;IAEQ,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,CAGrE;IAEQ,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,CAErE;IAEQ,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,YAAY,CAEjE;IAEQ,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,YAAY,CAQjE;IAEQ,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAGvD;IAED,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,YAAY;CAGvB"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// (C) 2022-2026 GoodData Corporation
|
|
2
|
-
import
|
|
3
|
-
const { AbstractAstVisitor } = MaqlPkg;
|
|
2
|
+
import { AbstractAstVisitor, } from "@gooddata/maql-antlr4ts";
|
|
4
3
|
import { isTigerType } from "@gooddata/sdk-backend-tiger";
|
|
5
4
|
import { normalizeMaqlObjectType } from "../maqlObjectTypes.js";
|
|
6
5
|
import { MaqlType, abstractValueTypes, isSubtype, lowestCommonAncestor } from "./hierarchy.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/sdk-maql-language-server",
|
|
3
|
-
"version": "11.65.
|
|
3
|
+
"version": "11.65.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Stellar",
|
|
@@ -20,18 +20,16 @@
|
|
|
20
20
|
"types": "esm/index.d.ts",
|
|
21
21
|
"exports": "./esm/index.js",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@gooddata/maql-antlr4ts": "0.
|
|
24
|
-
"antlr4-c3": "
|
|
25
|
-
"
|
|
26
|
-
"assert": "2.1.0",
|
|
23
|
+
"@gooddata/maql-antlr4ts": "0.7.2",
|
|
24
|
+
"antlr4-c3": "3.4.4",
|
|
25
|
+
"antlr4ng": "3.0.16",
|
|
27
26
|
"lodash-es": "^4.17.23",
|
|
28
|
-
"util": "0.12.5",
|
|
29
27
|
"vscode-languageserver": "8.1.0",
|
|
30
28
|
"vscode-languageserver-textdocument": "1.0.12",
|
|
31
|
-
"@gooddata/sdk-backend-base": "11.65.
|
|
32
|
-
"@gooddata/sdk-
|
|
33
|
-
"@gooddata/sdk-
|
|
34
|
-
"@gooddata/sdk-backend-tiger": "11.65.
|
|
29
|
+
"@gooddata/sdk-backend-base": "11.65.1",
|
|
30
|
+
"@gooddata/sdk-model": "11.65.1",
|
|
31
|
+
"@gooddata/sdk-backend-spi": "11.65.1",
|
|
32
|
+
"@gooddata/sdk-backend-tiger": "11.65.1"
|
|
35
33
|
},
|
|
36
34
|
"devDependencies": {
|
|
37
35
|
"@microsoft/api-documenter": "7.30.16",
|
|
@@ -57,14 +55,13 @@
|
|
|
57
55
|
"oxlint": "1.83.0",
|
|
58
56
|
"oxlint-plugin-eslint": "1.82.0",
|
|
59
57
|
"oxlint-tsgolint": "7.0.2001",
|
|
60
|
-
"process": "0.11.10",
|
|
61
58
|
"ts-dedent": "2.3.0",
|
|
62
59
|
"typescript": "7.0.2",
|
|
63
60
|
"vitest": "5.0.4",
|
|
64
|
-
"@gooddata/
|
|
65
|
-
"@gooddata/
|
|
66
|
-
"@gooddata/oxlint-config": "11.65.
|
|
67
|
-
"@gooddata/stylelint-config": "11.65.
|
|
61
|
+
"@gooddata/api-client-tiger": "11.65.1",
|
|
62
|
+
"@gooddata/eslint-config": "11.65.1",
|
|
63
|
+
"@gooddata/oxlint-config": "11.65.1",
|
|
64
|
+
"@gooddata/stylelint-config": "11.65.1"
|
|
68
65
|
},
|
|
69
66
|
"scripts": {
|
|
70
67
|
"_phase:build": "npm run build",
|