@reqlan/language 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -24
- package/README.template.md +32 -0
- package/out/generated/ast.d.ts +39 -1
- package/out/generated/ast.js +35 -1
- package/out/generated/ast.js.map +1 -1
- package/out/generated/grammar.js +365 -110
- package/out/generated/grammar.js.map +1 -1
- package/out/reqlan-definition-provider.js +2 -2
- package/out/reqlan-definition-provider.js.map +1 -1
- package/out/reqlan-file-link-resolver.js +6 -1
- package/out/reqlan-file-link-resolver.js.map +1 -1
- package/out/reqlan-import-bindings.d.ts +6 -1
- package/out/reqlan-import-bindings.js +18 -1
- package/out/reqlan-import-bindings.js.map +1 -1
- package/out/reqlan-namespace-import-links.js +4 -3
- package/out/reqlan-namespace-import-links.js.map +1 -1
- package/out/reqlan-path-resolve.d.ts +1 -0
- package/out/reqlan-path-resolve.js +3 -0
- package/out/reqlan-path-resolve.js.map +1 -1
- package/out/reqlan-references.js +3 -2
- package/out/reqlan-references.js.map +1 -1
- package/out/reqlan-scope.js +9 -4
- package/out/reqlan-scope.js.map +1 -1
- package/out/reqlan-semantic-token-provider.js +23 -5
- package/out/reqlan-semantic-token-provider.js.map +1 -1
- package/out/reqlan-validator.d.ts +7 -0
- package/out/reqlan-validator.js +35 -3
- package/out/reqlan-validator.js.map +1 -1
- package/out/reqlan-workspace-attribute-catalog.js +37 -15
- package/out/reqlan-workspace-attribute-catalog.js.map +1 -1
- package/package.json +2 -2
- package/src/generated/ast.ts +53 -2
- package/src/generated/grammar.ts +365 -110
- package/src/reqlan-definition-provider.ts +2 -1
- package/src/reqlan-file-link-resolver.ts +6 -1
- package/src/reqlan-import-bindings.ts +26 -1
- package/src/reqlan-namespace-import-links.ts +4 -3
- package/src/reqlan-path-resolve.ts +4 -0
- package/src/reqlan-references.ts +3 -2
- package/src/reqlan-scope.ts +9 -5
- package/src/reqlan-semantic-token-provider.ts +22 -4
- package/src/reqlan-validator.ts +50 -2
- package/src/reqlan-workspace-attribute-catalog.ts +50 -15
- package/src/reqlan.langium +18 -2
- package/out/src/file-path-rewrite.d.ts +0 -25
- package/out/src/file-path-rewrite.js +0 -56
- package/out/src/file-path-rewrite.js.map +0 -1
- package/out/src/generated/ast.d.ts +0 -1173
- package/out/src/generated/ast.js +0 -994
- package/out/src/generated/ast.js.map +0 -1
- package/out/src/generated/grammar.d.ts +0 -7
- package/out/src/generated/grammar.js +0 -3045
- package/out/src/generated/grammar.js.map +0 -1
- package/out/src/generated/module.d.ts +0 -20
- package/out/src/generated/module.js +0 -32
- package/out/src/generated/module.js.map +0 -1
- package/out/src/index.d.ts +0 -29
- package/out/src/index.js +0 -30
- package/out/src/index.js.map +0 -1
- package/out/src/reqlan-attribute-catalog.d.ts +0 -19
- package/out/src/reqlan-attribute-catalog.js +0 -87
- package/out/src/reqlan-attribute-catalog.js.map +0 -1
- package/out/src/reqlan-code-action-provider.d.ts +0 -34
- package/out/src/reqlan-code-action-provider.js +0 -206
- package/out/src/reqlan-code-action-provider.js.map +0 -1
- package/out/src/reqlan-comment-resolver.d.ts +0 -35
- package/out/src/reqlan-comment-resolver.js +0 -308
- package/out/src/reqlan-comment-resolver.js.map +0 -1
- package/out/src/reqlan-completion-context.d.ts +0 -46
- package/out/src/reqlan-completion-context.js +0 -244
- package/out/src/reqlan-completion-context.js.map +0 -1
- package/out/src/reqlan-completion-provider.d.ts +0 -41
- package/out/src/reqlan-completion-provider.js +0 -320
- package/out/src/reqlan-completion-provider.js.map +0 -1
- package/out/src/reqlan-definition-provider.d.ts +0 -31
- package/out/src/reqlan-definition-provider.js +0 -240
- package/out/src/reqlan-definition-provider.js.map +0 -1
- package/out/src/reqlan-document-highlight-provider.d.ts +0 -10
- package/out/src/reqlan-document-highlight-provider.js +0 -11
- package/out/src/reqlan-document-highlight-provider.js.map +0 -1
- package/out/src/reqlan-document-link-provider.d.ts +0 -14
- package/out/src/reqlan-document-link-provider.js +0 -24
- package/out/src/reqlan-document-link-provider.js.map +0 -1
- package/out/src/reqlan-embedded-file-references.d.ts +0 -11
- package/out/src/reqlan-embedded-file-references.js +0 -50
- package/out/src/reqlan-embedded-file-references.js.map +0 -1
- package/out/src/reqlan-file-link-resolver.d.ts +0 -44
- package/out/src/reqlan-file-link-resolver.js +0 -347
- package/out/src/reqlan-file-link-resolver.js.map +0 -1
- package/out/src/reqlan-file-references.d.ts +0 -15
- package/out/src/reqlan-file-references.js +0 -72
- package/out/src/reqlan-file-references.js.map +0 -1
- package/out/src/reqlan-grammar-config.d.ts +0 -5
- package/out/src/reqlan-grammar-config.js +0 -9
- package/out/src/reqlan-grammar-config.js.map +0 -1
- package/out/src/reqlan-idea-summary.d.ts +0 -6
- package/out/src/reqlan-idea-summary.js +0 -78
- package/out/src/reqlan-idea-summary.js.map +0 -1
- package/out/src/reqlan-ignore-error.d.ts +0 -10
- package/out/src/reqlan-ignore-error.js +0 -42
- package/out/src/reqlan-ignore-error.js.map +0 -1
- package/out/src/reqlan-import-bindings.d.ts +0 -12
- package/out/src/reqlan-import-bindings.js +0 -65
- package/out/src/reqlan-import-bindings.js.map +0 -1
- package/out/src/reqlan-import-edits.d.ts +0 -17
- package/out/src/reqlan-import-edits.js +0 -96
- package/out/src/reqlan-import-edits.js.map +0 -1
- package/out/src/reqlan-imports.d.ts +0 -22
- package/out/src/reqlan-imports.js +0 -61
- package/out/src/reqlan-imports.js.map +0 -1
- package/out/src/reqlan-inbound-reference-inlay-label.d.ts +0 -23
- package/out/src/reqlan-inbound-reference-inlay-label.js +0 -128
- package/out/src/reqlan-inbound-reference-inlay-label.js.map +0 -1
- package/out/src/reqlan-inlay-hint-provider.d.ts +0 -15
- package/out/src/reqlan-inlay-hint-provider.js +0 -54
- package/out/src/reqlan-inlay-hint-provider.js.map +0 -1
- package/out/src/reqlan-inlay-hint-settings.d.ts +0 -10
- package/out/src/reqlan-inlay-hint-settings.js +0 -10
- package/out/src/reqlan-inlay-hint-settings.js.map +0 -1
- package/out/src/reqlan-linker.d.ts +0 -26
- package/out/src/reqlan-linker.js +0 -86
- package/out/src/reqlan-linker.js.map +0 -1
- package/out/src/reqlan-markdown-links.d.ts +0 -28
- package/out/src/reqlan-markdown-links.js +0 -113
- package/out/src/reqlan-markdown-links.js.map +0 -1
- package/out/src/reqlan-module.d.ts +0 -41
- package/out/src/reqlan-module.js +0 -76
- package/out/src/reqlan-module.js.map +0 -1
- package/out/src/reqlan-name-catalog.d.ts +0 -23
- package/out/src/reqlan-name-catalog.js +0 -63
- package/out/src/reqlan-name-catalog.js.map +0 -1
- package/out/src/reqlan-name-provider.d.ts +0 -10
- package/out/src/reqlan-name-provider.js +0 -38
- package/out/src/reqlan-name-provider.js.map +0 -1
- package/out/src/reqlan-namespace-import-links.d.ts +0 -10
- package/out/src/reqlan-namespace-import-links.js +0 -81
- package/out/src/reqlan-namespace-import-links.js.map +0 -1
- package/out/src/reqlan-path-completion.d.ts +0 -50
- package/out/src/reqlan-path-completion.js +0 -304
- package/out/src/reqlan-path-completion.js.map +0 -1
- package/out/src/reqlan-path-references.d.ts +0 -5
- package/out/src/reqlan-path-references.js +0 -124
- package/out/src/reqlan-path-references.js.map +0 -1
- package/out/src/reqlan-path-resolve.d.ts +0 -59
- package/out/src/reqlan-path-resolve.js +0 -173
- package/out/src/reqlan-path-resolve.js.map +0 -1
- package/out/src/reqlan-quoted-strings.d.ts +0 -9
- package/out/src/reqlan-quoted-strings.js +0 -26
- package/out/src/reqlan-quoted-strings.js.map +0 -1
- package/out/src/reqlan-reference-at-position.d.ts +0 -20
- package/out/src/reqlan-reference-at-position.js +0 -89
- package/out/src/reqlan-reference-at-position.js.map +0 -1
- package/out/src/reqlan-references.d.ts +0 -16
- package/out/src/reqlan-references.js +0 -51
- package/out/src/reqlan-references.js.map +0 -1
- package/out/src/reqlan-scope.d.ts +0 -25
- package/out/src/reqlan-scope.js +0 -266
- package/out/src/reqlan-scope.js.map +0 -1
- package/out/src/reqlan-semantic-token-provider.d.ts +0 -8
- package/out/src/reqlan-semantic-token-provider.js +0 -97
- package/out/src/reqlan-semantic-token-provider.js.map +0 -1
- package/out/src/reqlan-token-builder.d.ts +0 -12
- package/out/src/reqlan-token-builder.js +0 -459
- package/out/src/reqlan-token-builder.js.map +0 -1
- package/out/src/reqlan-validator.d.ts +0 -25
- package/out/src/reqlan-validator.js +0 -119
- package/out/src/reqlan-validator.js.map +0 -1
- package/out/src/reqlan-workspace-attribute-catalog.d.ts +0 -6
- package/out/src/reqlan-workspace-attribute-catalog.js +0 -54
- package/out/src/reqlan-workspace-attribute-catalog.js.map +0 -1
- package/out/test/code-actions.test.d.ts +0 -1
- package/out/test/code-actions.test.js +0 -126
- package/out/test/code-actions.test.js.map +0 -1
- package/out/test/comment-in-string.test.d.ts +0 -1
- package/out/test/comment-in-string.test.js +0 -100
- package/out/test/comment-in-string.test.js.map +0 -1
- package/out/test/completion.test.d.ts +0 -1
- package/out/test/completion.test.js +0 -467
- package/out/test/completion.test.js.map +0 -1
- package/out/test/file-path-rewrite.test.d.ts +0 -1
- package/out/test/file-path-rewrite.test.js +0 -64
- package/out/test/file-path-rewrite.test.js.map +0 -1
- package/out/test/ignore-error.test.d.ts +0 -1
- package/out/test/ignore-error.test.js +0 -87
- package/out/test/ignore-error.test.js.map +0 -1
- package/out/test/implicit-import-extension.test.d.ts +0 -1
- package/out/test/implicit-import-extension.test.js +0 -203
- package/out/test/implicit-import-extension.test.js.map +0 -1
- package/out/test/import-edits.test.d.ts +0 -1
- package/out/test/import-edits.test.js +0 -20
- package/out/test/import-edits.test.js.map +0 -1
- package/out/test/inlay-hints.test.d.ts +0 -1
- package/out/test/inlay-hints.test.js +0 -238
- package/out/test/inlay-hints.test.js.map +0 -1
- package/out/test/linking.test.d.ts +0 -1
- package/out/test/linking.test.js +0 -754
- package/out/test/linking.test.js.map +0 -1
- package/out/test/naked-strings.test.d.ts +0 -1
- package/out/test/naked-strings.test.js +0 -50
- package/out/test/naked-strings.test.js.map +0 -1
- package/out/test/parsing.test.d.ts +0 -1
- package/out/test/parsing.test.js +0 -773
- package/out/test/parsing.test.js.map +0 -1
- package/out/test/path-resolve.test.d.ts +0 -1
- package/out/test/path-resolve.test.js +0 -88
- package/out/test/path-resolve.test.js.map +0 -1
- package/out/test/references.test.d.ts +0 -1
- package/out/test/references.test.js +0 -168
- package/out/test/references.test.js.map +0 -1
- package/out/test/rqconfig.test.d.ts +0 -1
- package/out/test/rqconfig.test.js +0 -275
- package/out/test/rqconfig.test.js.map +0 -1
- package/out/test/test-requirement-refs.d.ts +0 -8
- package/out/test/test-requirement-refs.js +0 -35
- package/out/test/test-requirement-refs.js.map +0 -1
- package/out/test/testing.test.d.ts +0 -1
- package/out/test/testing.test.js +0 -23
- package/out/test/testing.test.js.map +0 -1
- package/out/test/validating.test.d.ts +0 -1
- package/out/test/validating.test.js +0 -117
- package/out/test/validating.test.js.map +0 -1
- package/out/tsconfig.tsbuildinfo +0 -1
package/out/reqlan-validator.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { AstUtils } from 'langium';
|
|
2
|
-
import { isIdea, isOneLinerIdea } from './generated/ast.js';
|
|
2
|
+
import { isFromImport, isIdea, isInvalidFromImport, isOneLinerIdea } from './generated/ast.js';
|
|
3
3
|
import { collectFileLinks, fileLinkTargetIssueMessage } from './reqlan-file-link-resolver.js';
|
|
4
|
-
import { importBindings, importedIdeaNames } from './reqlan-import-bindings.js';
|
|
4
|
+
import { importBindings, importPathOf, importedIdeaNames, isWellFormedFromImport } from './reqlan-import-bindings.js';
|
|
5
5
|
import { isResolvableImportPath } from './reqlan-imports.js';
|
|
6
6
|
import { pathResolveContextFromServices } from './reqlan-path-resolve.js';
|
|
7
7
|
import { unquoteReqlanString } from './reqlan-quoted-strings.js';
|
|
8
8
|
/**
|
|
9
9
|
* Registers validation hooks for the requirement graph AST.
|
|
10
10
|
* rq:["../../../reqlan rq/extension/language-support/features-imports.rq".import_does_not_exist_error]
|
|
11
|
+
* rq:["../../../reqlan rq/language/imports.rq".import_error_recovery]
|
|
11
12
|
*/
|
|
12
13
|
export function registerValidationChecks(services) {
|
|
13
14
|
const registry = services.validation.ValidationRegistry;
|
|
@@ -20,6 +21,7 @@ export function registerValidationChecks(services) {
|
|
|
20
21
|
/**
|
|
21
22
|
* Custom validations for Reqlan documents.
|
|
22
23
|
* rq:["../../../reqlan rq/extension/language-support/features-imports.rq".import_does_not_exist_error]
|
|
24
|
+
* rq:["../../../reqlan rq/language/imports.rq".import_error_recovery]
|
|
23
25
|
*/
|
|
24
26
|
export class ReqlanValidator {
|
|
25
27
|
constructor(services) {
|
|
@@ -28,9 +30,32 @@ export class ReqlanValidator {
|
|
|
28
30
|
checkModelDuplicates(model, accept) {
|
|
29
31
|
this.checkDuplicateImportBindings(model, accept);
|
|
30
32
|
this.checkDuplicateIdeaNames(model, accept);
|
|
33
|
+
this.checkImportSyntax(model, accept);
|
|
31
34
|
this.checkImportTargets(model, accept);
|
|
32
35
|
this.checkFileReferenceTargets(model, accept);
|
|
33
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Local diagnostics for recoverable but invalid import shapes.
|
|
39
|
+
* Keeps the rest of the file parseable — see import_error_recovery.
|
|
40
|
+
*/
|
|
41
|
+
checkImportSyntax(model, accept) {
|
|
42
|
+
for (const importDecl of model.imports) {
|
|
43
|
+
if (isInvalidFromImport(importDecl)) {
|
|
44
|
+
accept('error', 'Invalid from-import: expected a quoted path, then `import <idea>`.', {
|
|
45
|
+
node: importDecl
|
|
46
|
+
});
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (!isFromImport(importDecl) || isWellFormedFromImport(importDecl)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (importDecl.alias) {
|
|
53
|
+
accept('error', `Invalid syntax: use \`import "${unquoteReqlanString(importDecl.path)}" as ${importDecl.alias}\` for a namespace import, or \`from "${unquoteReqlanString(importDecl.path)}" import <idea>\`.`, { node: importDecl });
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
accept('error', `Invalid from-import: expected \`from "${unquoteReqlanString(importDecl.path)}" import <idea>\`.`, { node: importDecl });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
34
59
|
checkDuplicateImportBindings(model, accept) {
|
|
35
60
|
const seen = new Map();
|
|
36
61
|
for (const importDecl of model.imports) {
|
|
@@ -86,7 +111,14 @@ export class ReqlanValidator {
|
|
|
86
111
|
const { shared } = this.services;
|
|
87
112
|
const pathContext = pathResolveContextFromServices(this.services);
|
|
88
113
|
for (const importDecl of model.imports) {
|
|
89
|
-
|
|
114
|
+
if (isInvalidFromImport(importDecl)) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (isFromImport(importDecl) && !isWellFormedFromImport(importDecl)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const rawPath = importPathOf(importDecl);
|
|
121
|
+
const path = rawPath ? unquoteReqlanString(rawPath) : undefined;
|
|
90
122
|
if (!path || isRemoteImportPath(path)) {
|
|
91
123
|
continue;
|
|
92
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqlan-validator.js","sourceRoot":"","sources":["../src/reqlan-validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EACH,MAAM,EACN,cAAc,EAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,
|
|
1
|
+
{"version":3,"file":"reqlan-validator.js","sourceRoot":"","sources":["../src/reqlan-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AstUtils } from 'langium';
|
|
2
|
-
import { isAttribute, isModel, isScalarValue } from './generated/ast.js';
|
|
2
|
+
import { isAttribute, isBlockValue, isListValue, isModel, isScalarValue } from './generated/ast.js';
|
|
3
3
|
export function collectWorkspaceAttributeCatalog(documents) {
|
|
4
4
|
const keys = new Set();
|
|
5
5
|
const valuesByKey = new Map();
|
|
@@ -32,23 +32,45 @@ function valuesForAttribute(attribute) {
|
|
|
32
32
|
return [];
|
|
33
33
|
}
|
|
34
34
|
if (isScalarValue(attribute.value)) {
|
|
35
|
-
const text = attribute.value
|
|
36
|
-
.
|
|
37
|
-
.join('')
|
|
38
|
-
.trim();
|
|
35
|
+
const text = normalizeCatalogText(attribute.value.$cstNode?.text)
|
|
36
|
+
|| inlineCatalogParts(attribute.value.parts);
|
|
39
37
|
return text ? [text] : [];
|
|
40
38
|
}
|
|
41
|
-
if (attribute.value
|
|
42
|
-
return attribute.value.items
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}).filter(Boolean);
|
|
39
|
+
if (isListValue(attribute.value)) {
|
|
40
|
+
return attribute.value.items
|
|
41
|
+
.map(item => normalizeCatalogText(item.$cstNode?.text))
|
|
42
|
+
.filter(Boolean);
|
|
43
|
+
}
|
|
44
|
+
if (isBlockValue(attribute.value)) {
|
|
45
|
+
const raw = attribute.value.$cstNode?.text ?? '';
|
|
46
|
+
const inner = raw.replace(/^\{\s*/, '').replace(/\s*\}$/, '').trim();
|
|
47
|
+
return inner ? [inner.replace(/\s+/g, ' ')] : [];
|
|
51
48
|
}
|
|
52
49
|
return [];
|
|
53
50
|
}
|
|
51
|
+
function normalizeCatalogText(text) {
|
|
52
|
+
return text?.replace(/\s+/g, ' ').trim() ?? '';
|
|
53
|
+
}
|
|
54
|
+
function inlineCatalogParts(parts) {
|
|
55
|
+
return parts
|
|
56
|
+
.map(part => {
|
|
57
|
+
if (typeof part === 'string') {
|
|
58
|
+
return part;
|
|
59
|
+
}
|
|
60
|
+
if (!part || typeof part !== 'object') {
|
|
61
|
+
return '';
|
|
62
|
+
}
|
|
63
|
+
const node = part;
|
|
64
|
+
if (typeof node.text === 'string' && node.text.length > 0) {
|
|
65
|
+
return node.text;
|
|
66
|
+
}
|
|
67
|
+
if (typeof node.inlineCode === 'string' && node.inlineCode.length > 0) {
|
|
68
|
+
return node.inlineCode;
|
|
69
|
+
}
|
|
70
|
+
return node.$cstNode?.text ?? '';
|
|
71
|
+
})
|
|
72
|
+
.join('')
|
|
73
|
+
.replace(/\s+/g, ' ')
|
|
74
|
+
.trim();
|
|
75
|
+
}
|
|
54
76
|
//# sourceMappingURL=reqlan-workspace-attribute-catalog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqlan-workspace-attribute-catalog.js","sourceRoot":"","sources":["../src/reqlan-workspace-attribute-catalog.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"reqlan-workspace-attribute-catalog.js","sourceRoot":"","sources":["../src/reqlan-workspace-attribute-catalog.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reqlan/language",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "1.
|
|
3
|
+
"description": "Langium language definition for reqlan (.rq) requirement files",
|
|
4
|
+
"version": "1.5.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
7
7
|
"repository": {
|
package/src/generated/ast.ts
CHANGED
|
@@ -72,6 +72,7 @@ export namespace Reqlan {
|
|
|
72
72
|
IdeaSet: IdeaSet
|
|
73
73
|
Import: Import
|
|
74
74
|
InlineTextPart: InlineTextPart
|
|
75
|
+
InvalidFromImport: InvalidFromImport
|
|
75
76
|
ListItem: ListItem
|
|
76
77
|
ListItemBody: ListItemBody
|
|
77
78
|
ListValue: ListValue
|
|
@@ -377,12 +378,14 @@ export function isFileSymbolReference(item: unknown): item is FileSymbolReferenc
|
|
|
377
378
|
export interface FromImport extends langium.AstNode {
|
|
378
379
|
readonly $container: Model;
|
|
379
380
|
readonly $type: 'FromImport';
|
|
381
|
+
alias?: string;
|
|
380
382
|
path: string;
|
|
381
383
|
specifiers: Array<FromImportSpecifier>;
|
|
382
384
|
}
|
|
383
385
|
|
|
384
386
|
export const FromImport = {
|
|
385
387
|
$type: 'FromImport',
|
|
388
|
+
alias: 'alias',
|
|
386
389
|
path: 'path',
|
|
387
390
|
specifiers: 'specifiers'
|
|
388
391
|
} as const;
|
|
@@ -464,7 +467,7 @@ export function isIdeaSet(item: unknown): item is IdeaSet {
|
|
|
464
467
|
return reflection.isInstance(item, IdeaSet.$type);
|
|
465
468
|
}
|
|
466
469
|
|
|
467
|
-
export type Import = FromImport | NamespaceImport | QualifiedImport;
|
|
470
|
+
export type Import = FromImport | InvalidFromImport | NamespaceImport | QualifiedImport;
|
|
468
471
|
|
|
469
472
|
export const Import = {
|
|
470
473
|
$type: 'Import'
|
|
@@ -491,6 +494,35 @@ export function isInlineTextPart(item: unknown): item is InlineTextPart {
|
|
|
491
494
|
return reflection.isInstance(item, InlineTextPart.$type);
|
|
492
495
|
}
|
|
493
496
|
|
|
497
|
+
export interface InvalidFromImport extends langium.AstNode {
|
|
498
|
+
readonly $container: Model;
|
|
499
|
+
readonly $type: 'InvalidFromImport';
|
|
500
|
+
head: InvalidImportHeadToken;
|
|
501
|
+
tokens: Array<InvalidImportToken>;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
export const InvalidFromImport = {
|
|
505
|
+
$type: 'InvalidFromImport',
|
|
506
|
+
head: 'head',
|
|
507
|
+
tokens: 'tokens'
|
|
508
|
+
} as const;
|
|
509
|
+
|
|
510
|
+
export function isInvalidFromImport(item: unknown): item is InvalidFromImport {
|
|
511
|
+
return reflection.isInstance(item, InvalidFromImport.$type);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
export type InvalidImportHeadToken = '(' | ')' | '[' | ']' | '`' | 'as' | 'from' | 'import' | '|' | PlainPunctuation | string;
|
|
515
|
+
|
|
516
|
+
export function isInvalidImportHeadToken(item: unknown): item is InvalidImportHeadToken {
|
|
517
|
+
return isPlainPunctuation(item) || item === '(' || item === ')' || item === '|' || item === 'as' || item === 'import' || item === 'from' || item === '`' || item === '[' || item === ']' || (typeof item === 'string' && (/[_a-zA-Z][\w-]*/.test(item) || /[A-Za-z_][\w']*/.test(item) || /\d+/.test(item) || /[^\s\w\[\]()`]/.test(item)));
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
export type InvalidImportToken = '(' | ')' | '[' | ']' | '`' | 'as' | 'from' | 'import' | '|' | PlainPunctuation | string;
|
|
521
|
+
|
|
522
|
+
export function isInvalidImportToken(item: unknown): item is InvalidImportToken {
|
|
523
|
+
return isPlainPunctuation(item) || item === '(' || item === ')' || item === '|' || item === 'as' || item === 'import' || item === 'from' || item === '`' || item === '[' || item === ']' || (typeof item === 'string' && (/[_a-zA-Z][\w-]*/.test(item) || /"(\\.|[^"\\\r\n])*"|'(\\.|[^'\\\r\n])*'/.test(item) || /[A-Za-z_][\w']*/.test(item) || /\d+/.test(item) || /[^\s\w\[\]()`]/.test(item)));
|
|
524
|
+
}
|
|
525
|
+
|
|
494
526
|
export type ListItem = AnonymousBlock | NamedBlockListItem | NestedList | OneLinerListItem;
|
|
495
527
|
|
|
496
528
|
export const ListItem = {
|
|
@@ -1084,12 +1116,17 @@ export class ReqlanAstReflection extends langium.AbstractAstReflection {
|
|
|
1084
1116
|
FromImport: {
|
|
1085
1117
|
name: FromImport.$type,
|
|
1086
1118
|
properties: {
|
|
1119
|
+
alias: {
|
|
1120
|
+
name: FromImport.alias,
|
|
1121
|
+
optional: true
|
|
1122
|
+
},
|
|
1087
1123
|
path: {
|
|
1088
1124
|
name: FromImport.path
|
|
1089
1125
|
},
|
|
1090
1126
|
specifiers: {
|
|
1091
1127
|
name: FromImport.specifiers,
|
|
1092
|
-
defaultValue: []
|
|
1128
|
+
defaultValue: [],
|
|
1129
|
+
optional: true
|
|
1093
1130
|
}
|
|
1094
1131
|
},
|
|
1095
1132
|
superTypes: [Import.$type]
|
|
@@ -1162,6 +1199,20 @@ export class ReqlanAstReflection extends langium.AbstractAstReflection {
|
|
|
1162
1199
|
},
|
|
1163
1200
|
superTypes: []
|
|
1164
1201
|
},
|
|
1202
|
+
InvalidFromImport: {
|
|
1203
|
+
name: InvalidFromImport.$type,
|
|
1204
|
+
properties: {
|
|
1205
|
+
head: {
|
|
1206
|
+
name: InvalidFromImport.head
|
|
1207
|
+
},
|
|
1208
|
+
tokens: {
|
|
1209
|
+
name: InvalidFromImport.tokens,
|
|
1210
|
+
defaultValue: [],
|
|
1211
|
+
optional: true
|
|
1212
|
+
}
|
|
1213
|
+
},
|
|
1214
|
+
superTypes: [Import.$type]
|
|
1215
|
+
},
|
|
1165
1216
|
ListItem: {
|
|
1166
1217
|
name: ListItem.$type,
|
|
1167
1218
|
properties: {
|