@reqlan/language 1.4.1 → 1.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +24 -0
  2. package/out/generated/ast.d.ts +39 -1
  3. package/out/generated/ast.js +35 -1
  4. package/out/generated/ast.js.map +1 -1
  5. package/out/generated/grammar.js +365 -110
  6. package/out/generated/grammar.js.map +1 -1
  7. package/out/reqlan-definition-provider.js +2 -2
  8. package/out/reqlan-definition-provider.js.map +1 -1
  9. package/out/reqlan-file-link-resolver.js +6 -1
  10. package/out/reqlan-file-link-resolver.js.map +1 -1
  11. package/out/reqlan-import-bindings.d.ts +6 -1
  12. package/out/reqlan-import-bindings.js +18 -1
  13. package/out/reqlan-import-bindings.js.map +1 -1
  14. package/out/reqlan-namespace-import-links.js +4 -3
  15. package/out/reqlan-namespace-import-links.js.map +1 -1
  16. package/out/reqlan-path-resolve.d.ts +1 -0
  17. package/out/reqlan-path-resolve.js +3 -0
  18. package/out/reqlan-path-resolve.js.map +1 -1
  19. package/out/reqlan-references.js +3 -2
  20. package/out/reqlan-references.js.map +1 -1
  21. package/out/reqlan-scope.js +9 -4
  22. package/out/reqlan-scope.js.map +1 -1
  23. package/out/reqlan-semantic-token-provider.js +23 -5
  24. package/out/reqlan-semantic-token-provider.js.map +1 -1
  25. package/out/reqlan-validator.d.ts +7 -0
  26. package/out/reqlan-validator.js +35 -3
  27. package/out/reqlan-validator.js.map +1 -1
  28. package/out/reqlan-workspace-attribute-catalog.js +37 -15
  29. package/out/reqlan-workspace-attribute-catalog.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/generated/ast.ts +53 -2
  32. package/src/generated/grammar.ts +365 -110
  33. package/src/reqlan-definition-provider.ts +2 -1
  34. package/src/reqlan-file-link-resolver.ts +6 -1
  35. package/src/reqlan-import-bindings.ts +26 -1
  36. package/src/reqlan-namespace-import-links.ts +4 -3
  37. package/src/reqlan-path-resolve.ts +4 -0
  38. package/src/reqlan-references.ts +3 -2
  39. package/src/reqlan-scope.ts +9 -5
  40. package/src/reqlan-semantic-token-provider.ts +22 -4
  41. package/src/reqlan-validator.ts +50 -2
  42. package/src/reqlan-workspace-attribute-catalog.ts +50 -15
  43. package/src/reqlan.langium +18 -2
@@ -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
- const path = unquoteReqlanString(importDecl.path);
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":"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"}
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.parts
36
- .map(part => typeof part === 'string' ? part : '')
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.$type === 'ListValue') {
42
- return attribute.value.items.flatMap(item => {
43
- if (item.$type === 'OneLinerListItem') {
44
- return item.body.content
45
- .map(part => typeof part === 'string' ? part : '')
46
- .join('')
47
- .trim();
48
- }
49
- return [];
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":"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"}
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
3
  "description": "Langium language definition for reqlan (.rq) requirement files",
4
- "version": "1.4.1",
4
+ "version": "1.5.3",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
7
7
  "repository": {
@@ -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: {