@reqlan/language 1.4.1 → 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 +6 -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 +1 -1
- 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/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
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: {
|