@reqlan/language 1.4.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.
Files changed (371) hide show
  1. package/README.md +24 -0
  2. package/out/file-path-rewrite.d.ts +25 -0
  3. package/out/file-path-rewrite.js +56 -0
  4. package/out/file-path-rewrite.js.map +1 -0
  5. package/out/generated/ast.d.ts +1157 -0
  6. package/out/generated/ast.js +980 -0
  7. package/out/generated/ast.js.map +1 -0
  8. package/out/generated/grammar.d.ts +7 -0
  9. package/out/generated/grammar.js +3071 -0
  10. package/out/generated/grammar.js.map +1 -0
  11. package/out/generated/module.d.ts +20 -0
  12. package/out/generated/module.js +32 -0
  13. package/out/generated/module.js.map +1 -0
  14. package/out/index.d.ts +34 -0
  15. package/out/index.js +35 -0
  16. package/out/index.js.map +1 -0
  17. package/out/reqlan-attribute-catalog.d.ts +19 -0
  18. package/out/reqlan-attribute-catalog.js +87 -0
  19. package/out/reqlan-attribute-catalog.js.map +1 -0
  20. package/out/reqlan-code-action-provider.d.ts +55 -0
  21. package/out/reqlan-code-action-provider.js +269 -0
  22. package/out/reqlan-code-action-provider.js.map +1 -0
  23. package/out/reqlan-code-lens-provider.d.ts +13 -0
  24. package/out/reqlan-code-lens-provider.js +27 -0
  25. package/out/reqlan-code-lens-provider.js.map +1 -0
  26. package/out/reqlan-code-lens-settings.d.ts +34 -0
  27. package/out/reqlan-code-lens-settings.js +12 -0
  28. package/out/reqlan-code-lens-settings.js.map +1 -0
  29. package/out/reqlan-comment-resolver.d.ts +35 -0
  30. package/out/reqlan-comment-resolver.js +308 -0
  31. package/out/reqlan-comment-resolver.js.map +1 -0
  32. package/out/reqlan-completion-context.d.ts +46 -0
  33. package/out/reqlan-completion-context.js +244 -0
  34. package/out/reqlan-completion-context.js.map +1 -0
  35. package/out/reqlan-completion-provider.d.ts +41 -0
  36. package/out/reqlan-completion-provider.js +317 -0
  37. package/out/reqlan-completion-provider.js.map +1 -0
  38. package/out/reqlan-definition-provider.d.ts +31 -0
  39. package/out/reqlan-definition-provider.js +240 -0
  40. package/out/reqlan-definition-provider.js.map +1 -0
  41. package/out/reqlan-document-highlight-provider.d.ts +10 -0
  42. package/out/reqlan-document-highlight-provider.js +11 -0
  43. package/out/reqlan-document-highlight-provider.js.map +1 -0
  44. package/out/reqlan-document-link-provider.d.ts +14 -0
  45. package/out/reqlan-document-link-provider.js +24 -0
  46. package/out/reqlan-document-link-provider.js.map +1 -0
  47. package/out/reqlan-embedded-file-references.d.ts +11 -0
  48. package/out/reqlan-embedded-file-references.js +50 -0
  49. package/out/reqlan-embedded-file-references.js.map +1 -0
  50. package/out/reqlan-file-link-resolver.d.ts +44 -0
  51. package/out/reqlan-file-link-resolver.js +347 -0
  52. package/out/reqlan-file-link-resolver.js.map +1 -0
  53. package/out/reqlan-file-references.d.ts +15 -0
  54. package/out/reqlan-file-references.js +72 -0
  55. package/out/reqlan-file-references.js.map +1 -0
  56. package/out/reqlan-grammar-config.d.ts +5 -0
  57. package/out/reqlan-grammar-config.js +9 -0
  58. package/out/reqlan-grammar-config.js.map +1 -0
  59. package/out/reqlan-idea-reference-site.d.ts +14 -0
  60. package/out/reqlan-idea-reference-site.js +47 -0
  61. package/out/reqlan-idea-reference-site.js.map +1 -0
  62. package/out/reqlan-idea-summary.d.ts +6 -0
  63. package/out/reqlan-idea-summary.js +134 -0
  64. package/out/reqlan-idea-summary.js.map +1 -0
  65. package/out/reqlan-ignore-error.d.ts +10 -0
  66. package/out/reqlan-ignore-error.js +42 -0
  67. package/out/reqlan-ignore-error.js.map +1 -0
  68. package/out/reqlan-import-bindings.d.ts +12 -0
  69. package/out/reqlan-import-bindings.js +65 -0
  70. package/out/reqlan-import-bindings.js.map +1 -0
  71. package/out/reqlan-import-edits.d.ts +17 -0
  72. package/out/reqlan-import-edits.js +96 -0
  73. package/out/reqlan-import-edits.js.map +1 -0
  74. package/out/reqlan-imports.d.ts +22 -0
  75. package/out/reqlan-imports.js +61 -0
  76. package/out/reqlan-imports.js.map +1 -0
  77. package/out/reqlan-inbound-reference-inlay-label.d.ts +27 -0
  78. package/out/reqlan-inbound-reference-inlay-label.js +142 -0
  79. package/out/reqlan-inbound-reference-inlay-label.js.map +1 -0
  80. package/out/reqlan-inlay-hint-provider.d.ts +15 -0
  81. package/out/reqlan-inlay-hint-provider.js +54 -0
  82. package/out/reqlan-inlay-hint-provider.js.map +1 -0
  83. package/out/reqlan-inlay-hint-settings.d.ts +10 -0
  84. package/out/reqlan-inlay-hint-settings.js +10 -0
  85. package/out/reqlan-inlay-hint-settings.js.map +1 -0
  86. package/out/reqlan-linker.d.ts +26 -0
  87. package/out/reqlan-linker.js +83 -0
  88. package/out/reqlan-linker.js.map +1 -0
  89. package/out/reqlan-markdown-links.d.ts +28 -0
  90. package/out/reqlan-markdown-links.js +113 -0
  91. package/out/reqlan-markdown-links.js.map +1 -0
  92. package/out/reqlan-module.d.ts +41 -0
  93. package/out/reqlan-module.js +78 -0
  94. package/out/reqlan-module.js.map +1 -0
  95. package/out/reqlan-name-catalog.d.ts +23 -0
  96. package/out/reqlan-name-catalog.js +63 -0
  97. package/out/reqlan-name-catalog.js.map +1 -0
  98. package/out/reqlan-name-provider.d.ts +10 -0
  99. package/out/reqlan-name-provider.js +38 -0
  100. package/out/reqlan-name-provider.js.map +1 -0
  101. package/out/reqlan-namespace-import-links.d.ts +10 -0
  102. package/out/reqlan-namespace-import-links.js +69 -0
  103. package/out/reqlan-namespace-import-links.js.map +1 -0
  104. package/out/reqlan-path-completion.d.ts +50 -0
  105. package/out/reqlan-path-completion.js +304 -0
  106. package/out/reqlan-path-completion.js.map +1 -0
  107. package/out/reqlan-path-references.d.ts +5 -0
  108. package/out/reqlan-path-references.js +124 -0
  109. package/out/reqlan-path-references.js.map +1 -0
  110. package/out/reqlan-path-resolve.d.ts +81 -0
  111. package/out/reqlan-path-resolve.js +245 -0
  112. package/out/reqlan-path-resolve.js.map +1 -0
  113. package/out/reqlan-quoted-strings.d.ts +9 -0
  114. package/out/reqlan-quoted-strings.js +26 -0
  115. package/out/reqlan-quoted-strings.js.map +1 -0
  116. package/out/reqlan-reference-at-position.d.ts +20 -0
  117. package/out/reqlan-reference-at-position.js +89 -0
  118. package/out/reqlan-reference-at-position.js.map +1 -0
  119. package/out/reqlan-reference-code-lens.d.ts +32 -0
  120. package/out/reqlan-reference-code-lens.js +240 -0
  121. package/out/reqlan-reference-code-lens.js.map +1 -0
  122. package/out/reqlan-reference-search-site.d.ts +34 -0
  123. package/out/reqlan-reference-search-site.js +136 -0
  124. package/out/reqlan-reference-search-site.js.map +1 -0
  125. package/out/reqlan-references.d.ts +16 -0
  126. package/out/reqlan-references.js +51 -0
  127. package/out/reqlan-references.js.map +1 -0
  128. package/out/reqlan-scope.d.ts +25 -0
  129. package/out/reqlan-scope.js +259 -0
  130. package/out/reqlan-scope.js.map +1 -0
  131. package/out/reqlan-semantic-token-provider.d.ts +8 -0
  132. package/out/reqlan-semantic-token-provider.js +91 -0
  133. package/out/reqlan-semantic-token-provider.js.map +1 -0
  134. package/out/reqlan-token-builder.d.ts +12 -0
  135. package/out/reqlan-token-builder.js +459 -0
  136. package/out/reqlan-token-builder.js.map +1 -0
  137. package/out/reqlan-validator.d.ts +25 -0
  138. package/out/reqlan-validator.js +119 -0
  139. package/out/reqlan-validator.js.map +1 -0
  140. package/out/reqlan-workspace-attribute-catalog.d.ts +6 -0
  141. package/out/reqlan-workspace-attribute-catalog.js +54 -0
  142. package/out/reqlan-workspace-attribute-catalog.js.map +1 -0
  143. package/out/src/file-path-rewrite.d.ts +25 -0
  144. package/out/src/file-path-rewrite.js +56 -0
  145. package/out/src/file-path-rewrite.js.map +1 -0
  146. package/out/src/generated/ast.d.ts +1173 -0
  147. package/out/src/generated/ast.js +994 -0
  148. package/out/src/generated/ast.js.map +1 -0
  149. package/out/src/generated/grammar.d.ts +7 -0
  150. package/out/src/generated/grammar.js +3045 -0
  151. package/out/src/generated/grammar.js.map +1 -0
  152. package/out/src/generated/module.d.ts +20 -0
  153. package/out/src/generated/module.js +32 -0
  154. package/out/src/generated/module.js.map +1 -0
  155. package/out/src/index.d.ts +29 -0
  156. package/out/src/index.js +30 -0
  157. package/out/src/index.js.map +1 -0
  158. package/out/src/reqlan-attribute-catalog.d.ts +19 -0
  159. package/out/src/reqlan-attribute-catalog.js +87 -0
  160. package/out/src/reqlan-attribute-catalog.js.map +1 -0
  161. package/out/src/reqlan-code-action-provider.d.ts +34 -0
  162. package/out/src/reqlan-code-action-provider.js +206 -0
  163. package/out/src/reqlan-code-action-provider.js.map +1 -0
  164. package/out/src/reqlan-comment-resolver.d.ts +35 -0
  165. package/out/src/reqlan-comment-resolver.js +308 -0
  166. package/out/src/reqlan-comment-resolver.js.map +1 -0
  167. package/out/src/reqlan-completion-context.d.ts +46 -0
  168. package/out/src/reqlan-completion-context.js +244 -0
  169. package/out/src/reqlan-completion-context.js.map +1 -0
  170. package/out/src/reqlan-completion-provider.d.ts +41 -0
  171. package/out/src/reqlan-completion-provider.js +320 -0
  172. package/out/src/reqlan-completion-provider.js.map +1 -0
  173. package/out/src/reqlan-definition-provider.d.ts +31 -0
  174. package/out/src/reqlan-definition-provider.js +240 -0
  175. package/out/src/reqlan-definition-provider.js.map +1 -0
  176. package/out/src/reqlan-document-highlight-provider.d.ts +10 -0
  177. package/out/src/reqlan-document-highlight-provider.js +11 -0
  178. package/out/src/reqlan-document-highlight-provider.js.map +1 -0
  179. package/out/src/reqlan-document-link-provider.d.ts +14 -0
  180. package/out/src/reqlan-document-link-provider.js +24 -0
  181. package/out/src/reqlan-document-link-provider.js.map +1 -0
  182. package/out/src/reqlan-embedded-file-references.d.ts +11 -0
  183. package/out/src/reqlan-embedded-file-references.js +50 -0
  184. package/out/src/reqlan-embedded-file-references.js.map +1 -0
  185. package/out/src/reqlan-file-link-resolver.d.ts +44 -0
  186. package/out/src/reqlan-file-link-resolver.js +347 -0
  187. package/out/src/reqlan-file-link-resolver.js.map +1 -0
  188. package/out/src/reqlan-file-references.d.ts +15 -0
  189. package/out/src/reqlan-file-references.js +72 -0
  190. package/out/src/reqlan-file-references.js.map +1 -0
  191. package/out/src/reqlan-grammar-config.d.ts +5 -0
  192. package/out/src/reqlan-grammar-config.js +9 -0
  193. package/out/src/reqlan-grammar-config.js.map +1 -0
  194. package/out/src/reqlan-idea-summary.d.ts +6 -0
  195. package/out/src/reqlan-idea-summary.js +78 -0
  196. package/out/src/reqlan-idea-summary.js.map +1 -0
  197. package/out/src/reqlan-ignore-error.d.ts +10 -0
  198. package/out/src/reqlan-ignore-error.js +42 -0
  199. package/out/src/reqlan-ignore-error.js.map +1 -0
  200. package/out/src/reqlan-import-bindings.d.ts +12 -0
  201. package/out/src/reqlan-import-bindings.js +65 -0
  202. package/out/src/reqlan-import-bindings.js.map +1 -0
  203. package/out/src/reqlan-import-edits.d.ts +17 -0
  204. package/out/src/reqlan-import-edits.js +96 -0
  205. package/out/src/reqlan-import-edits.js.map +1 -0
  206. package/out/src/reqlan-imports.d.ts +22 -0
  207. package/out/src/reqlan-imports.js +61 -0
  208. package/out/src/reqlan-imports.js.map +1 -0
  209. package/out/src/reqlan-inbound-reference-inlay-label.d.ts +23 -0
  210. package/out/src/reqlan-inbound-reference-inlay-label.js +128 -0
  211. package/out/src/reqlan-inbound-reference-inlay-label.js.map +1 -0
  212. package/out/src/reqlan-inlay-hint-provider.d.ts +15 -0
  213. package/out/src/reqlan-inlay-hint-provider.js +54 -0
  214. package/out/src/reqlan-inlay-hint-provider.js.map +1 -0
  215. package/out/src/reqlan-inlay-hint-settings.d.ts +10 -0
  216. package/out/src/reqlan-inlay-hint-settings.js +10 -0
  217. package/out/src/reqlan-inlay-hint-settings.js.map +1 -0
  218. package/out/src/reqlan-linker.d.ts +26 -0
  219. package/out/src/reqlan-linker.js +86 -0
  220. package/out/src/reqlan-linker.js.map +1 -0
  221. package/out/src/reqlan-markdown-links.d.ts +28 -0
  222. package/out/src/reqlan-markdown-links.js +113 -0
  223. package/out/src/reqlan-markdown-links.js.map +1 -0
  224. package/out/src/reqlan-module.d.ts +41 -0
  225. package/out/src/reqlan-module.js +76 -0
  226. package/out/src/reqlan-module.js.map +1 -0
  227. package/out/src/reqlan-name-catalog.d.ts +23 -0
  228. package/out/src/reqlan-name-catalog.js +63 -0
  229. package/out/src/reqlan-name-catalog.js.map +1 -0
  230. package/out/src/reqlan-name-provider.d.ts +10 -0
  231. package/out/src/reqlan-name-provider.js +38 -0
  232. package/out/src/reqlan-name-provider.js.map +1 -0
  233. package/out/src/reqlan-namespace-import-links.d.ts +10 -0
  234. package/out/src/reqlan-namespace-import-links.js +81 -0
  235. package/out/src/reqlan-namespace-import-links.js.map +1 -0
  236. package/out/src/reqlan-path-completion.d.ts +50 -0
  237. package/out/src/reqlan-path-completion.js +304 -0
  238. package/out/src/reqlan-path-completion.js.map +1 -0
  239. package/out/src/reqlan-path-references.d.ts +5 -0
  240. package/out/src/reqlan-path-references.js +124 -0
  241. package/out/src/reqlan-path-references.js.map +1 -0
  242. package/out/src/reqlan-path-resolve.d.ts +59 -0
  243. package/out/src/reqlan-path-resolve.js +173 -0
  244. package/out/src/reqlan-path-resolve.js.map +1 -0
  245. package/out/src/reqlan-quoted-strings.d.ts +9 -0
  246. package/out/src/reqlan-quoted-strings.js +26 -0
  247. package/out/src/reqlan-quoted-strings.js.map +1 -0
  248. package/out/src/reqlan-reference-at-position.d.ts +20 -0
  249. package/out/src/reqlan-reference-at-position.js +89 -0
  250. package/out/src/reqlan-reference-at-position.js.map +1 -0
  251. package/out/src/reqlan-references.d.ts +16 -0
  252. package/out/src/reqlan-references.js +51 -0
  253. package/out/src/reqlan-references.js.map +1 -0
  254. package/out/src/reqlan-scope.d.ts +25 -0
  255. package/out/src/reqlan-scope.js +266 -0
  256. package/out/src/reqlan-scope.js.map +1 -0
  257. package/out/src/reqlan-semantic-token-provider.d.ts +8 -0
  258. package/out/src/reqlan-semantic-token-provider.js +97 -0
  259. package/out/src/reqlan-semantic-token-provider.js.map +1 -0
  260. package/out/src/reqlan-token-builder.d.ts +12 -0
  261. package/out/src/reqlan-token-builder.js +459 -0
  262. package/out/src/reqlan-token-builder.js.map +1 -0
  263. package/out/src/reqlan-validator.d.ts +25 -0
  264. package/out/src/reqlan-validator.js +119 -0
  265. package/out/src/reqlan-validator.js.map +1 -0
  266. package/out/src/reqlan-workspace-attribute-catalog.d.ts +6 -0
  267. package/out/src/reqlan-workspace-attribute-catalog.js +54 -0
  268. package/out/src/reqlan-workspace-attribute-catalog.js.map +1 -0
  269. package/out/test/code-actions.test.d.ts +1 -0
  270. package/out/test/code-actions.test.js +126 -0
  271. package/out/test/code-actions.test.js.map +1 -0
  272. package/out/test/comment-in-string.test.d.ts +1 -0
  273. package/out/test/comment-in-string.test.js +100 -0
  274. package/out/test/comment-in-string.test.js.map +1 -0
  275. package/out/test/completion.test.d.ts +1 -0
  276. package/out/test/completion.test.js +467 -0
  277. package/out/test/completion.test.js.map +1 -0
  278. package/out/test/file-path-rewrite.test.d.ts +1 -0
  279. package/out/test/file-path-rewrite.test.js +64 -0
  280. package/out/test/file-path-rewrite.test.js.map +1 -0
  281. package/out/test/ignore-error.test.d.ts +1 -0
  282. package/out/test/ignore-error.test.js +87 -0
  283. package/out/test/ignore-error.test.js.map +1 -0
  284. package/out/test/implicit-import-extension.test.d.ts +1 -0
  285. package/out/test/implicit-import-extension.test.js +203 -0
  286. package/out/test/implicit-import-extension.test.js.map +1 -0
  287. package/out/test/import-edits.test.d.ts +1 -0
  288. package/out/test/import-edits.test.js +20 -0
  289. package/out/test/import-edits.test.js.map +1 -0
  290. package/out/test/inlay-hints.test.d.ts +1 -0
  291. package/out/test/inlay-hints.test.js +238 -0
  292. package/out/test/inlay-hints.test.js.map +1 -0
  293. package/out/test/linking.test.d.ts +1 -0
  294. package/out/test/linking.test.js +754 -0
  295. package/out/test/linking.test.js.map +1 -0
  296. package/out/test/naked-strings.test.d.ts +1 -0
  297. package/out/test/naked-strings.test.js +50 -0
  298. package/out/test/naked-strings.test.js.map +1 -0
  299. package/out/test/parsing.test.d.ts +1 -0
  300. package/out/test/parsing.test.js +773 -0
  301. package/out/test/parsing.test.js.map +1 -0
  302. package/out/test/path-resolve.test.d.ts +1 -0
  303. package/out/test/path-resolve.test.js +88 -0
  304. package/out/test/path-resolve.test.js.map +1 -0
  305. package/out/test/references.test.d.ts +1 -0
  306. package/out/test/references.test.js +168 -0
  307. package/out/test/references.test.js.map +1 -0
  308. package/out/test/rqconfig.test.d.ts +1 -0
  309. package/out/test/rqconfig.test.js +275 -0
  310. package/out/test/rqconfig.test.js.map +1 -0
  311. package/out/test/test-requirement-refs.d.ts +8 -0
  312. package/out/test/test-requirement-refs.js +35 -0
  313. package/out/test/test-requirement-refs.js.map +1 -0
  314. package/out/test/testing.test.d.ts +1 -0
  315. package/out/test/testing.test.js +23 -0
  316. package/out/test/testing.test.js.map +1 -0
  317. package/out/test/validating.test.d.ts +1 -0
  318. package/out/test/validating.test.js +117 -0
  319. package/out/test/validating.test.js.map +1 -0
  320. package/out/tsconfig.tsbuildinfo +1 -0
  321. package/package.json +54 -0
  322. package/src/chevrotain.d.ts +8 -0
  323. package/src/file-path-rewrite.ts +96 -0
  324. package/src/generated/ast.ts +1481 -0
  325. package/src/generated/grammar.ts +3074 -0
  326. package/src/generated/module.ts +38 -0
  327. package/src/index.ts +34 -0
  328. package/src/reqlan-attribute-catalog.ts +100 -0
  329. package/src/reqlan-code-action-provider.ts +385 -0
  330. package/src/reqlan-code-lens-provider.ts +54 -0
  331. package/src/reqlan-code-lens-settings.ts +42 -0
  332. package/src/reqlan-comment-resolver.ts +372 -0
  333. package/src/reqlan-comment.langium +23 -0
  334. package/src/reqlan-completion-context.ts +330 -0
  335. package/src/reqlan-completion-provider.ts +400 -0
  336. package/src/reqlan-definition-provider.ts +319 -0
  337. package/src/reqlan-document-highlight-provider.ts +21 -0
  338. package/src/reqlan-document-link-provider.ts +45 -0
  339. package/src/reqlan-embedded-file-references.ts +72 -0
  340. package/src/reqlan-file-link-resolver.ts +485 -0
  341. package/src/reqlan-file-references.ts +84 -0
  342. package/src/reqlan-grammar-config.ts +14 -0
  343. package/src/reqlan-idea-reference-site.ts +74 -0
  344. package/src/reqlan-idea-summary.ts +162 -0
  345. package/src/reqlan-ignore-error.ts +50 -0
  346. package/src/reqlan-import-bindings.ts +87 -0
  347. package/src/reqlan-import-edits.ts +124 -0
  348. package/src/reqlan-imports.ts +115 -0
  349. package/src/reqlan-inbound-reference-inlay-label.ts +194 -0
  350. package/src/reqlan-inlay-hint-provider.ts +88 -0
  351. package/src/reqlan-inlay-hint-settings.ts +15 -0
  352. package/src/reqlan-linker.ts +108 -0
  353. package/src/reqlan-markdown-links.ts +136 -0
  354. package/src/reqlan-module.ts +104 -0
  355. package/src/reqlan-name-catalog.ts +81 -0
  356. package/src/reqlan-name-provider.ts +56 -0
  357. package/src/reqlan-namespace-import-links.ts +92 -0
  358. package/src/reqlan-path-completion.ts +420 -0
  359. package/src/reqlan-path-references.ts +140 -0
  360. package/src/reqlan-path-resolve.ts +346 -0
  361. package/src/reqlan-quoted-strings.ts +30 -0
  362. package/src/reqlan-reference-at-position.ts +154 -0
  363. package/src/reqlan-reference-code-lens.ts +323 -0
  364. package/src/reqlan-reference-search-site.ts +202 -0
  365. package/src/reqlan-references.ts +76 -0
  366. package/src/reqlan-scope.ts +312 -0
  367. package/src/reqlan-semantic-token-provider.ts +113 -0
  368. package/src/reqlan-token-builder.ts +492 -0
  369. package/src/reqlan-validator.ts +149 -0
  370. package/src/reqlan-workspace-attribute-catalog.ts +62 -0
  371. package/src/reqlan.langium +236 -0
@@ -0,0 +1,459 @@
1
+ import { DefaultTokenBuilder } from 'langium';
2
+ const SL_COMMENT_PATTERN = /\/\/[^\n\r]*/y;
3
+ function isInsideNakedQuote(text, offset) {
4
+ let inDouble = false;
5
+ let inSingle = false;
6
+ const lineStart = text.lastIndexOf('\n', offset - 1) + 1;
7
+ for (let index = lineStart; index < offset; index++) {
8
+ const char = text[index];
9
+ if (inDouble || inSingle) {
10
+ if (char === '\\') {
11
+ index++;
12
+ continue;
13
+ }
14
+ if (inDouble && char === '"') {
15
+ inDouble = false;
16
+ }
17
+ else if (inSingle && char === "'") {
18
+ inSingle = false;
19
+ }
20
+ continue;
21
+ }
22
+ if (char === '"') {
23
+ inDouble = true;
24
+ }
25
+ else if (char === "'") {
26
+ inSingle = true;
27
+ }
28
+ }
29
+ return inDouble || inSingle;
30
+ }
31
+ const slCommentPattern = (text, offset) => {
32
+ if (text.charCodeAt(offset) !== 47 || text.charCodeAt(offset + 1) !== 47) {
33
+ return null;
34
+ }
35
+ if (isInsideNakedQuote(text, offset)) {
36
+ return null;
37
+ }
38
+ let previousIndex = offset - 1;
39
+ while (previousIndex >= 0 && /[ \t]/.test(text[previousIndex])) {
40
+ previousIndex--;
41
+ }
42
+ const previous = previousIndex >= 0 ? text[previousIndex] : '';
43
+ if (previous === ':' || previous === '/') {
44
+ return null;
45
+ }
46
+ SL_COMMENT_PATTERN.lastIndex = offset;
47
+ return SL_COMMENT_PATTERN.exec(text);
48
+ };
49
+ function makeMatch(text, offset, length) {
50
+ const image = text.slice(offset, offset + length);
51
+ const match = [image];
52
+ match.index = offset;
53
+ match.input = text;
54
+ return match;
55
+ }
56
+ /**
57
+ * `@` marks an attribute only when it is the first non-whitespace character on a line.
58
+ * Mid-line `@` (and `\@` at line start) fall through to OTHER as body text.
59
+ */
60
+ const atSignAttributeMarker = (text, offset) => {
61
+ if (text[offset] !== '@') {
62
+ return null;
63
+ }
64
+ let previousIndex = offset - 1;
65
+ while (previousIndex >= 0 && (text[previousIndex] === ' ' || text[previousIndex] === '\t')) {
66
+ previousIndex--;
67
+ }
68
+ if (previousIndex >= 0 && text[previousIndex] !== '\n' && text[previousIndex] !== '\r') {
69
+ return null;
70
+ }
71
+ return makeMatch(text, offset, 1);
72
+ };
73
+ const markdownLink = (text, offset) => {
74
+ if (text[offset] !== '[' || text[offset + 1] === '[') {
75
+ return null;
76
+ }
77
+ let index = offset + 1;
78
+ while (index < text.length) {
79
+ if (text[index] === ']' && text[index + 1] === '(') {
80
+ const label = text.slice(offset + 1, index);
81
+ const targetStart = index + 2;
82
+ let targetEnd = targetStart;
83
+ while (targetEnd < text.length && text[targetEnd] !== ')') {
84
+ if (text[targetEnd] === '\n' || text[targetEnd] === '\r') {
85
+ return null;
86
+ }
87
+ targetEnd++;
88
+ }
89
+ if (targetEnd >= text.length || label.length === 0 || targetEnd === targetStart) {
90
+ return null;
91
+ }
92
+ return makeMatch(text, offset, targetEnd + 1 - offset);
93
+ }
94
+ if (text[index] === '\n' || text[index] === '\r') {
95
+ return null;
96
+ }
97
+ index++;
98
+ }
99
+ return null;
100
+ };
101
+ const topLevelBlockOpener = /(?:^|\n)[ \t]*(?:[A-Za-z_.][\w.-]*|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')\s*$/;
102
+ function isEscapedAt(text, offset) {
103
+ let backslashes = 0;
104
+ for (let index = offset - 1; index >= 0 && text[index] === '\\'; index--) {
105
+ backslashes++;
106
+ }
107
+ return backslashes % 2 === 1;
108
+ }
109
+ function isStructuralOpenBraceAtDepth(text, offset, depth) {
110
+ if (text[offset] !== '{') {
111
+ return false;
112
+ }
113
+ if (isEscapedAt(text, offset)) {
114
+ return false;
115
+ }
116
+ const before = text.slice(0, offset).replace(/[ \t]+$/, '');
117
+ if (depth === 0 && topLevelBlockOpener.test(before)) {
118
+ return true;
119
+ }
120
+ if (/@[A-Za-z_][\w-]*(?::)?\s*$/.test(before)) {
121
+ return true;
122
+ }
123
+ if (depth >= 1 && isLineStartAt(text, offset)) {
124
+ return true;
125
+ }
126
+ if (depth >= 1 && /[A-Za-z_][\w-]*\s*$/.test(before) && !isLineStartAt(text, offset)) {
127
+ const after = text.slice(offset + 1);
128
+ return /^[ \t]*(?:\r?\n|$)/.test(after);
129
+ }
130
+ return false;
131
+ }
132
+ /**
133
+ * A `}` closes a structural block only when it is the last non-whitespace on its line
134
+ * and it is not pairing with an unmatched prose `{` earlier on that line / in the body.
135
+ * Own-line closers (`}` after only indentation) always close structurally so an
136
+ * unbalanced prose `{` does not swallow the idea's closing brace.
137
+ */
138
+ function isStructuralCloseBraceAt(text, offset) {
139
+ if (text[offset] !== '}') {
140
+ return false;
141
+ }
142
+ if (isEscapedAt(text, offset)) {
143
+ return false;
144
+ }
145
+ const after = text.slice(offset + 1);
146
+ const restOfLine = after.split(/\r?\n/, 1)[0] ?? '';
147
+ if (restOfLine.trim().length !== 0) {
148
+ return false;
149
+ }
150
+ const { structuralDepth, proseDepth } = scanBraceState(text, offset);
151
+ if (structuralDepth <= 0) {
152
+ return false;
153
+ }
154
+ if (isLineStartAt(text, offset)) {
155
+ return true;
156
+ }
157
+ return proseDepth === 0;
158
+ }
159
+ function scanBraceState(text, offset) {
160
+ let structuralDepth = 0;
161
+ const proseDepthByStructural = [0];
162
+ const proseDepthAt = () => proseDepthByStructural[structuralDepth] ?? 0;
163
+ const setProseDepth = (value) => {
164
+ proseDepthByStructural[structuralDepth] = value;
165
+ };
166
+ for (let index = 0; index < offset; index++) {
167
+ const char = text[index];
168
+ if (char === '{') {
169
+ if (isEscapedAt(text, index)) {
170
+ continue;
171
+ }
172
+ if (isStructuralOpenBraceAtDepth(text, index, structuralDepth)) {
173
+ structuralDepth++;
174
+ proseDepthByStructural[structuralDepth] = 0;
175
+ }
176
+ else {
177
+ setProseDepth(proseDepthAt() + 1);
178
+ }
179
+ continue;
180
+ }
181
+ if (char !== '}') {
182
+ continue;
183
+ }
184
+ if (isEscapedAt(text, index)) {
185
+ continue;
186
+ }
187
+ const after = text.slice(index + 1);
188
+ const restOfLine = after.split(/\r?\n/, 1)[0] ?? '';
189
+ const atEndOfLine = restOfLine.trim().length === 0;
190
+ if (!atEndOfLine) {
191
+ if (proseDepthAt() > 0) {
192
+ setProseDepth(proseDepthAt() - 1);
193
+ }
194
+ continue;
195
+ }
196
+ if (structuralDepth <= 0) {
197
+ if (proseDepthAt() > 0) {
198
+ setProseDepth(proseDepthAt() - 1);
199
+ }
200
+ continue;
201
+ }
202
+ if (isLineStartAt(text, index)) {
203
+ structuralDepth--;
204
+ continue;
205
+ }
206
+ if (proseDepthAt() > 0) {
207
+ setProseDepth(proseDepthAt() - 1);
208
+ }
209
+ else {
210
+ structuralDepth--;
211
+ }
212
+ }
213
+ return {
214
+ structuralDepth,
215
+ proseDepth: proseDepthAt()
216
+ };
217
+ }
218
+ function scanStructuralBraceDepth(text, offset) {
219
+ return scanBraceState(text, offset).structuralDepth;
220
+ }
221
+ function isStructuralOpenBraceAt(text, offset) {
222
+ return isStructuralOpenBraceAtDepth(text, offset, scanStructuralBraceDepth(text, offset));
223
+ }
224
+ const structuralOpenBrace = (text, offset) => {
225
+ if (text[offset] !== '{') {
226
+ return null;
227
+ }
228
+ return isStructuralOpenBraceAt(text, offset) ? makeMatch(text, offset, 1) : null;
229
+ };
230
+ const structuralCloseBrace = (text, offset) => {
231
+ if (text[offset] !== '}') {
232
+ return null;
233
+ }
234
+ return isStructuralCloseBraceAt(text, offset) ? makeMatch(text, offset, 1) : null;
235
+ };
236
+ const proseOpenBrace = (text, offset) => {
237
+ if (text[offset] !== '{') {
238
+ return null;
239
+ }
240
+ return isStructuralOpenBraceAt(text, offset) ? null : makeMatch(text, offset, 1);
241
+ };
242
+ const proseCloseBrace = (text, offset) => {
243
+ if (text[offset] !== '}') {
244
+ return null;
245
+ }
246
+ return isStructuralCloseBraceAt(text, offset) ? null : makeMatch(text, offset, 1);
247
+ };
248
+ function braceDepthBefore(text, offset) {
249
+ return scanStructuralBraceDepth(text, offset);
250
+ }
251
+ function isLineStartAt(text, offset) {
252
+ let previousIndex = offset - 1;
253
+ while (previousIndex >= 0 && (text[previousIndex] === ' ' || text[previousIndex] === '\t')) {
254
+ previousIndex--;
255
+ }
256
+ return previousIndex < 0 || text[previousIndex] === '\n' || text[previousIndex] === '\r';
257
+ }
258
+ function isStringLiteralContext(text, offset) {
259
+ const depth = braceDepthBefore(text, offset);
260
+ const trimmed = text.slice(0, offset).replace(/[ \t]+$/, '');
261
+ if (depth === 0 && /\b(?:from|import)\s*$/.test(trimmed)) {
262
+ return true;
263
+ }
264
+ if (/\[\s*$/.test(trimmed)) {
265
+ return true;
266
+ }
267
+ const lineStart = trimmed.lastIndexOf('\n') + 1;
268
+ if (trimmed.slice(lineStart).length === 0 && depth === 0) {
269
+ return true;
270
+ }
271
+ return false;
272
+ }
273
+ /** Import keywords are reserved only at top level; in bodies they lex as ordinary words. */
274
+ function topLevelFromKeyword(text, offset) {
275
+ if (!text.startsWith('from', offset)) {
276
+ return null;
277
+ }
278
+ const next = text[offset + 4];
279
+ if (next !== undefined && /[\w-]/.test(next)) {
280
+ return null;
281
+ }
282
+ if (braceDepthBefore(text, offset) !== 0 || !isLineStartAt(text, offset)) {
283
+ return null;
284
+ }
285
+ return makeMatch(text, offset, 4);
286
+ }
287
+ ;
288
+ function topLevelImportKeyword(text, offset) {
289
+ if (!text.startsWith('import', offset)) {
290
+ return null;
291
+ }
292
+ const next = text[offset + 6];
293
+ if (next !== undefined && /[\w-]/.test(next)) {
294
+ return null;
295
+ }
296
+ if (braceDepthBefore(text, offset) !== 0) {
297
+ return null;
298
+ }
299
+ if (isLineStartAt(text, offset)) {
300
+ return makeMatch(text, offset, 6);
301
+ }
302
+ const before = text.slice(0, offset).replace(/[ \t]+$/, '');
303
+ if (/(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')$/.test(before)) {
304
+ return makeMatch(text, offset, 6);
305
+ }
306
+ return null;
307
+ }
308
+ ;
309
+ function topLevelAsKeyword(text, offset) {
310
+ if (!text.startsWith('as', offset)) {
311
+ return null;
312
+ }
313
+ const next = text[offset + 2];
314
+ if (next !== undefined && /[\w-]/.test(next)) {
315
+ return null;
316
+ }
317
+ if (braceDepthBefore(text, offset) !== 0) {
318
+ return null;
319
+ }
320
+ const before = text.slice(0, offset).replace(/[ \t]+$/, '');
321
+ if (/(?:[_a-zA-Z][\w-]*|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')$/.test(before)) {
322
+ return makeMatch(text, offset, 2);
323
+ }
324
+ return null;
325
+ }
326
+ ;
327
+ const reqlanString = (text, offset) => {
328
+ const quote = text[offset];
329
+ if (quote !== '"' && quote !== "'") {
330
+ return null;
331
+ }
332
+ if (!isStringLiteralContext(text, offset)) {
333
+ return null;
334
+ }
335
+ let index = offset + 1;
336
+ while (index < text.length) {
337
+ const char = text[index];
338
+ if (char === '\n' || char === '\r') {
339
+ return null;
340
+ }
341
+ if (char === '\\') {
342
+ index += 2;
343
+ continue;
344
+ }
345
+ if (char === quote) {
346
+ return makeMatch(text, offset, index + 1 - offset);
347
+ }
348
+ index++;
349
+ }
350
+ return null;
351
+ };
352
+ /** Body words with interior apostrophes (e.g. user's); plain identifiers stay ID. */
353
+ const reqlanWord = (text, offset) => {
354
+ const match = /^[A-Za-z_][\w']*/.exec(text.slice(offset));
355
+ if (!match || !match[0].includes("'")) {
356
+ return null;
357
+ }
358
+ return makeMatch(text, offset, match[0].length);
359
+ };
360
+ export class ReqlanTokenBuilder extends DefaultTokenBuilder {
361
+ buildTokens(grammar, options) {
362
+ const tokens = super.buildTokens(grammar, options);
363
+ if (!Array.isArray(tokens)) {
364
+ return tokens;
365
+ }
366
+ const atToken = tokens.find(token => token.name === '@');
367
+ if (atToken) {
368
+ atToken.PATTERN = atSignAttributeMarker;
369
+ atToken.LINE_BREAKS = false;
370
+ }
371
+ const markdownIndex = tokens.findIndex(token => token.name === 'MARKDOWN_LINK');
372
+ if (markdownIndex >= 0) {
373
+ const [markdown] = tokens.splice(markdownIndex, 1);
374
+ tokens.unshift(markdown);
375
+ }
376
+ const wordIndex = tokens.findIndex(token => token.name === 'WORD');
377
+ const idIndex = tokens.findIndex(token => token.name === 'ID');
378
+ if (wordIndex >= 0 && idIndex >= 0 && idIndex < wordIndex) {
379
+ const [word] = tokens.splice(wordIndex, 1);
380
+ tokens.splice(idIndex, 0, word);
381
+ }
382
+ for (const [name, pattern] of [
383
+ ['from', topLevelFromKeyword],
384
+ ['import', topLevelImportKeyword],
385
+ ['as', topLevelAsKeyword]
386
+ ]) {
387
+ const token = tokens.find(entry => entry.name === name);
388
+ if (token) {
389
+ token.PATTERN = pattern;
390
+ token.LINE_BREAKS = false;
391
+ }
392
+ }
393
+ const openBrace = tokens.find(entry => entry.name === '{');
394
+ if (openBrace) {
395
+ openBrace.PATTERN = structuralOpenBrace;
396
+ openBrace.LINE_BREAKS = false;
397
+ }
398
+ const closeBrace = tokens.find(entry => entry.name === '}');
399
+ if (closeBrace) {
400
+ closeBrace.PATTERN = structuralCloseBrace;
401
+ closeBrace.LINE_BREAKS = false;
402
+ }
403
+ const otherIndex = tokens.findIndex(entry => entry.name === 'OTHER');
404
+ if (otherIndex >= 0) {
405
+ const other = tokens[otherIndex];
406
+ const basePattern = other.PATTERN;
407
+ other.PATTERN = (text, offset) => {
408
+ const proseBrace = proseOpenBrace(text, offset) ?? proseCloseBrace(text, offset);
409
+ if (proseBrace) {
410
+ return proseBrace;
411
+ }
412
+ if (typeof basePattern === 'function') {
413
+ return basePattern(text, offset);
414
+ }
415
+ if (basePattern instanceof RegExp) {
416
+ const slice = text.slice(offset);
417
+ const match = basePattern.exec(slice);
418
+ return match?.index === 0 ? makeMatch(text, offset, match[0].length) : null;
419
+ }
420
+ return null;
421
+ };
422
+ other.LINE_BREAKS = false;
423
+ }
424
+ return tokens;
425
+ }
426
+ buildTerminalToken(terminal) {
427
+ if (terminal.name === 'SL_COMMENT') {
428
+ return {
429
+ name: 'SL_COMMENT',
430
+ GROUP: 'hidden',
431
+ LINE_BREAKS: true,
432
+ PATTERN: slCommentPattern
433
+ };
434
+ }
435
+ if (terminal.name === 'MARKDOWN_LINK') {
436
+ return {
437
+ name: 'MARKDOWN_LINK',
438
+ LINE_BREAKS: false,
439
+ PATTERN: markdownLink
440
+ };
441
+ }
442
+ if (terminal.name === 'STRING') {
443
+ return {
444
+ name: 'STRING',
445
+ LINE_BREAKS: false,
446
+ PATTERN: reqlanString
447
+ };
448
+ }
449
+ if (terminal.name === 'WORD') {
450
+ return {
451
+ name: 'WORD',
452
+ LINE_BREAKS: false,
453
+ PATTERN: reqlanWord
454
+ };
455
+ }
456
+ return super.buildTerminalToken(terminal);
457
+ }
458
+ }
459
+ //# sourceMappingURL=reqlan-token-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reqlan-token-builder.js","sourceRoot":"","sources":["../src/reqlan-token-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ValidationAcceptor } from 'langium';
2
+ import { type Model } from './generated/ast.js';
3
+ import type { ReqlanServices } from './reqlan-module.js';
4
+ /**
5
+ * Registers validation hooks for the requirement graph AST.
6
+ * rq:["../../../reqlan rq/extension/language-support/features-imports.rq".import_does_not_exist_error]
7
+ */
8
+ export declare function registerValidationChecks(services: ReqlanServices): void;
9
+ /**
10
+ * Custom validations for Reqlan documents.
11
+ * rq:["../../../reqlan rq/extension/language-support/features-imports.rq".import_does_not_exist_error]
12
+ */
13
+ export declare class ReqlanValidator {
14
+ private readonly services;
15
+ constructor(services: ReqlanServices);
16
+ checkModelDuplicates(model: Model, accept: ValidationAcceptor): void;
17
+ checkDuplicateImportBindings(model: Model, accept: ValidationAcceptor): void;
18
+ checkDuplicateIdeaNames(model: Model, accept: ValidationAcceptor): void;
19
+ /**
20
+ * Error underline when an `import` / `from` path does not resolve to a file.
21
+ * Missing imported ideas are reported by the linker as unresolved references.
22
+ */
23
+ checkImportTargets(model: Model, accept: ValidationAcceptor): void;
24
+ checkFileReferenceTargets(model: Model, accept: ValidationAcceptor): void;
25
+ }
@@ -0,0 +1,119 @@
1
+ import { AstUtils } from 'langium';
2
+ import { isIdea, isOneLinerIdea } from './generated/ast.js';
3
+ import { collectFileLinks, fileLinkTargetIssueMessage } from './reqlan-file-link-resolver.js';
4
+ import { importBindings, importedIdeaNames } from './reqlan-import-bindings.js';
5
+ import { isResolvableImportPath } from './reqlan-imports.js';
6
+ import { pathResolveContextFromServices } from './reqlan-path-resolve.js';
7
+ import { unquoteReqlanString } from './reqlan-quoted-strings.js';
8
+ /**
9
+ * Registers validation hooks for the requirement graph AST.
10
+ * rq:["../../../reqlan rq/extension/language-support/features-imports.rq".import_does_not_exist_error]
11
+ */
12
+ export function registerValidationChecks(services) {
13
+ const registry = services.validation.ValidationRegistry;
14
+ const validator = services.validation.ReqlanValidator;
15
+ const checks = {
16
+ Model: validator.checkModelDuplicates
17
+ };
18
+ registry.register(checks, validator);
19
+ }
20
+ /**
21
+ * Custom validations for Reqlan documents.
22
+ * rq:["../../../reqlan rq/extension/language-support/features-imports.rq".import_does_not_exist_error]
23
+ */
24
+ export class ReqlanValidator {
25
+ constructor(services) {
26
+ this.services = services;
27
+ }
28
+ checkModelDuplicates(model, accept) {
29
+ this.checkDuplicateImportBindings(model, accept);
30
+ this.checkDuplicateIdeaNames(model, accept);
31
+ this.checkImportTargets(model, accept);
32
+ this.checkFileReferenceTargets(model, accept);
33
+ }
34
+ checkDuplicateImportBindings(model, accept) {
35
+ const seen = new Map();
36
+ for (const importDecl of model.imports) {
37
+ for (const binding of importBindings(importDecl)) {
38
+ if (seen.has(binding.name)) {
39
+ accept('error', `'${binding.name}' is already defined in this file.`, {
40
+ node: binding.node,
41
+ property: binding.property
42
+ });
43
+ }
44
+ else {
45
+ seen.set(binding.name, binding);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ checkDuplicateIdeaNames(model, accept) {
51
+ const seen = new Map();
52
+ for (const importDecl of model.imports) {
53
+ for (const binding of importBindings(importDecl)) {
54
+ seen.set(binding.name, importDecl);
55
+ }
56
+ }
57
+ for (const element of model.elements) {
58
+ if (!isIdea(element) && !isOneLinerIdea(element)) {
59
+ continue;
60
+ }
61
+ const name = element.name;
62
+ if (seen.has(name)) {
63
+ accept('error', `'${name}' is already defined in this file.`, {
64
+ node: element,
65
+ property: 'name'
66
+ });
67
+ continue;
68
+ }
69
+ const importedNameConflict = model.imports.some(importDecl => importedIdeaNames(importDecl).includes(name));
70
+ if (importedNameConflict) {
71
+ accept('error', `'${name}' is already defined in this file.`, {
72
+ node: element,
73
+ property: 'name'
74
+ });
75
+ continue;
76
+ }
77
+ seen.set(name, element);
78
+ }
79
+ }
80
+ /**
81
+ * Error underline when an `import` / `from` path does not resolve to a file.
82
+ * Missing imported ideas are reported by the linker as unresolved references.
83
+ */
84
+ checkImportTargets(model, accept) {
85
+ const document = AstUtils.getDocument(model);
86
+ const { shared } = this.services;
87
+ const pathContext = pathResolveContextFromServices(this.services);
88
+ for (const importDecl of model.imports) {
89
+ const path = unquoteReqlanString(importDecl.path);
90
+ if (!path || isRemoteImportPath(path)) {
91
+ continue;
92
+ }
93
+ if (isResolvableImportPath(path, document, shared.workspace.LangiumDocuments, shared.workspace.FileSystemProvider, pathContext)) {
94
+ continue;
95
+ }
96
+ accept('error', `Could not resolve import '${path}'.`, {
97
+ node: importDecl,
98
+ property: 'path'
99
+ });
100
+ }
101
+ }
102
+ checkFileReferenceTargets(model, accept) {
103
+ const document = AstUtils.getDocument(model);
104
+ const { shared } = this.services;
105
+ for (const link of collectFileLinks(document, shared.workspace.LangiumDocuments, shared.workspace.FileSystemProvider, pathResolveContextFromServices(this.services))) {
106
+ if (!link.targetIssue) {
107
+ continue;
108
+ }
109
+ accept('warning', fileLinkTargetIssueMessage(link.targetIssue), {
110
+ node: model,
111
+ range: link.sourceRange
112
+ });
113
+ }
114
+ }
115
+ }
116
+ function isRemoteImportPath(path) {
117
+ return /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(path);
118
+ }
119
+ //# sourceMappingURL=reqlan-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reqlan-validator.js","sourceRoot":"","sources":["../src/reqlan-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Collects attribute keys and values from parsed workspace documents.
3
+ */
4
+ import type { LangiumDocuments } from 'langium';
5
+ import type { AttributeCatalog } from './reqlan-attribute-catalog.js';
6
+ export declare function collectWorkspaceAttributeCatalog(documents: LangiumDocuments): AttributeCatalog;