@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.
- package/README.md +24 -0
- package/out/file-path-rewrite.d.ts +25 -0
- package/out/file-path-rewrite.js +56 -0
- package/out/file-path-rewrite.js.map +1 -0
- package/out/generated/ast.d.ts +1157 -0
- package/out/generated/ast.js +980 -0
- package/out/generated/ast.js.map +1 -0
- package/out/generated/grammar.d.ts +7 -0
- package/out/generated/grammar.js +3071 -0
- package/out/generated/grammar.js.map +1 -0
- package/out/generated/module.d.ts +20 -0
- package/out/generated/module.js +32 -0
- package/out/generated/module.js.map +1 -0
- package/out/index.d.ts +34 -0
- package/out/index.js +35 -0
- package/out/index.js.map +1 -0
- package/out/reqlan-attribute-catalog.d.ts +19 -0
- package/out/reqlan-attribute-catalog.js +87 -0
- package/out/reqlan-attribute-catalog.js.map +1 -0
- package/out/reqlan-code-action-provider.d.ts +55 -0
- package/out/reqlan-code-action-provider.js +269 -0
- package/out/reqlan-code-action-provider.js.map +1 -0
- package/out/reqlan-code-lens-provider.d.ts +13 -0
- package/out/reqlan-code-lens-provider.js +27 -0
- package/out/reqlan-code-lens-provider.js.map +1 -0
- package/out/reqlan-code-lens-settings.d.ts +34 -0
- package/out/reqlan-code-lens-settings.js +12 -0
- package/out/reqlan-code-lens-settings.js.map +1 -0
- package/out/reqlan-comment-resolver.d.ts +35 -0
- package/out/reqlan-comment-resolver.js +308 -0
- package/out/reqlan-comment-resolver.js.map +1 -0
- package/out/reqlan-completion-context.d.ts +46 -0
- package/out/reqlan-completion-context.js +244 -0
- package/out/reqlan-completion-context.js.map +1 -0
- package/out/reqlan-completion-provider.d.ts +41 -0
- package/out/reqlan-completion-provider.js +317 -0
- package/out/reqlan-completion-provider.js.map +1 -0
- package/out/reqlan-definition-provider.d.ts +31 -0
- package/out/reqlan-definition-provider.js +240 -0
- package/out/reqlan-definition-provider.js.map +1 -0
- package/out/reqlan-document-highlight-provider.d.ts +10 -0
- package/out/reqlan-document-highlight-provider.js +11 -0
- package/out/reqlan-document-highlight-provider.js.map +1 -0
- package/out/reqlan-document-link-provider.d.ts +14 -0
- package/out/reqlan-document-link-provider.js +24 -0
- package/out/reqlan-document-link-provider.js.map +1 -0
- package/out/reqlan-embedded-file-references.d.ts +11 -0
- package/out/reqlan-embedded-file-references.js +50 -0
- package/out/reqlan-embedded-file-references.js.map +1 -0
- package/out/reqlan-file-link-resolver.d.ts +44 -0
- package/out/reqlan-file-link-resolver.js +347 -0
- package/out/reqlan-file-link-resolver.js.map +1 -0
- package/out/reqlan-file-references.d.ts +15 -0
- package/out/reqlan-file-references.js +72 -0
- package/out/reqlan-file-references.js.map +1 -0
- package/out/reqlan-grammar-config.d.ts +5 -0
- package/out/reqlan-grammar-config.js +9 -0
- package/out/reqlan-grammar-config.js.map +1 -0
- package/out/reqlan-idea-reference-site.d.ts +14 -0
- package/out/reqlan-idea-reference-site.js +47 -0
- package/out/reqlan-idea-reference-site.js.map +1 -0
- package/out/reqlan-idea-summary.d.ts +6 -0
- package/out/reqlan-idea-summary.js +134 -0
- package/out/reqlan-idea-summary.js.map +1 -0
- package/out/reqlan-ignore-error.d.ts +10 -0
- package/out/reqlan-ignore-error.js +42 -0
- package/out/reqlan-ignore-error.js.map +1 -0
- package/out/reqlan-import-bindings.d.ts +12 -0
- package/out/reqlan-import-bindings.js +65 -0
- package/out/reqlan-import-bindings.js.map +1 -0
- package/out/reqlan-import-edits.d.ts +17 -0
- package/out/reqlan-import-edits.js +96 -0
- package/out/reqlan-import-edits.js.map +1 -0
- package/out/reqlan-imports.d.ts +22 -0
- package/out/reqlan-imports.js +61 -0
- package/out/reqlan-imports.js.map +1 -0
- package/out/reqlan-inbound-reference-inlay-label.d.ts +27 -0
- package/out/reqlan-inbound-reference-inlay-label.js +142 -0
- package/out/reqlan-inbound-reference-inlay-label.js.map +1 -0
- package/out/reqlan-inlay-hint-provider.d.ts +15 -0
- package/out/reqlan-inlay-hint-provider.js +54 -0
- package/out/reqlan-inlay-hint-provider.js.map +1 -0
- package/out/reqlan-inlay-hint-settings.d.ts +10 -0
- package/out/reqlan-inlay-hint-settings.js +10 -0
- package/out/reqlan-inlay-hint-settings.js.map +1 -0
- package/out/reqlan-linker.d.ts +26 -0
- package/out/reqlan-linker.js +83 -0
- package/out/reqlan-linker.js.map +1 -0
- package/out/reqlan-markdown-links.d.ts +28 -0
- package/out/reqlan-markdown-links.js +113 -0
- package/out/reqlan-markdown-links.js.map +1 -0
- package/out/reqlan-module.d.ts +41 -0
- package/out/reqlan-module.js +78 -0
- package/out/reqlan-module.js.map +1 -0
- package/out/reqlan-name-catalog.d.ts +23 -0
- package/out/reqlan-name-catalog.js +63 -0
- package/out/reqlan-name-catalog.js.map +1 -0
- package/out/reqlan-name-provider.d.ts +10 -0
- package/out/reqlan-name-provider.js +38 -0
- package/out/reqlan-name-provider.js.map +1 -0
- package/out/reqlan-namespace-import-links.d.ts +10 -0
- package/out/reqlan-namespace-import-links.js +69 -0
- package/out/reqlan-namespace-import-links.js.map +1 -0
- package/out/reqlan-path-completion.d.ts +50 -0
- package/out/reqlan-path-completion.js +304 -0
- package/out/reqlan-path-completion.js.map +1 -0
- package/out/reqlan-path-references.d.ts +5 -0
- package/out/reqlan-path-references.js +124 -0
- package/out/reqlan-path-references.js.map +1 -0
- package/out/reqlan-path-resolve.d.ts +81 -0
- package/out/reqlan-path-resolve.js +245 -0
- package/out/reqlan-path-resolve.js.map +1 -0
- package/out/reqlan-quoted-strings.d.ts +9 -0
- package/out/reqlan-quoted-strings.js +26 -0
- package/out/reqlan-quoted-strings.js.map +1 -0
- package/out/reqlan-reference-at-position.d.ts +20 -0
- package/out/reqlan-reference-at-position.js +89 -0
- package/out/reqlan-reference-at-position.js.map +1 -0
- package/out/reqlan-reference-code-lens.d.ts +32 -0
- package/out/reqlan-reference-code-lens.js +240 -0
- package/out/reqlan-reference-code-lens.js.map +1 -0
- package/out/reqlan-reference-search-site.d.ts +34 -0
- package/out/reqlan-reference-search-site.js +136 -0
- package/out/reqlan-reference-search-site.js.map +1 -0
- package/out/reqlan-references.d.ts +16 -0
- package/out/reqlan-references.js +51 -0
- package/out/reqlan-references.js.map +1 -0
- package/out/reqlan-scope.d.ts +25 -0
- package/out/reqlan-scope.js +259 -0
- package/out/reqlan-scope.js.map +1 -0
- package/out/reqlan-semantic-token-provider.d.ts +8 -0
- package/out/reqlan-semantic-token-provider.js +91 -0
- package/out/reqlan-semantic-token-provider.js.map +1 -0
- package/out/reqlan-token-builder.d.ts +12 -0
- package/out/reqlan-token-builder.js +459 -0
- package/out/reqlan-token-builder.js.map +1 -0
- package/out/reqlan-validator.d.ts +25 -0
- package/out/reqlan-validator.js +119 -0
- package/out/reqlan-validator.js.map +1 -0
- package/out/reqlan-workspace-attribute-catalog.d.ts +6 -0
- package/out/reqlan-workspace-attribute-catalog.js +54 -0
- package/out/reqlan-workspace-attribute-catalog.js.map +1 -0
- package/out/src/file-path-rewrite.d.ts +25 -0
- package/out/src/file-path-rewrite.js +56 -0
- package/out/src/file-path-rewrite.js.map +1 -0
- package/out/src/generated/ast.d.ts +1173 -0
- package/out/src/generated/ast.js +994 -0
- package/out/src/generated/ast.js.map +1 -0
- package/out/src/generated/grammar.d.ts +7 -0
- package/out/src/generated/grammar.js +3045 -0
- package/out/src/generated/grammar.js.map +1 -0
- package/out/src/generated/module.d.ts +20 -0
- package/out/src/generated/module.js +32 -0
- package/out/src/generated/module.js.map +1 -0
- package/out/src/index.d.ts +29 -0
- package/out/src/index.js +30 -0
- package/out/src/index.js.map +1 -0
- package/out/src/reqlan-attribute-catalog.d.ts +19 -0
- package/out/src/reqlan-attribute-catalog.js +87 -0
- package/out/src/reqlan-attribute-catalog.js.map +1 -0
- package/out/src/reqlan-code-action-provider.d.ts +34 -0
- package/out/src/reqlan-code-action-provider.js +206 -0
- package/out/src/reqlan-code-action-provider.js.map +1 -0
- package/out/src/reqlan-comment-resolver.d.ts +35 -0
- package/out/src/reqlan-comment-resolver.js +308 -0
- package/out/src/reqlan-comment-resolver.js.map +1 -0
- package/out/src/reqlan-completion-context.d.ts +46 -0
- package/out/src/reqlan-completion-context.js +244 -0
- package/out/src/reqlan-completion-context.js.map +1 -0
- package/out/src/reqlan-completion-provider.d.ts +41 -0
- package/out/src/reqlan-completion-provider.js +320 -0
- package/out/src/reqlan-completion-provider.js.map +1 -0
- package/out/src/reqlan-definition-provider.d.ts +31 -0
- package/out/src/reqlan-definition-provider.js +240 -0
- package/out/src/reqlan-definition-provider.js.map +1 -0
- package/out/src/reqlan-document-highlight-provider.d.ts +10 -0
- package/out/src/reqlan-document-highlight-provider.js +11 -0
- package/out/src/reqlan-document-highlight-provider.js.map +1 -0
- package/out/src/reqlan-document-link-provider.d.ts +14 -0
- package/out/src/reqlan-document-link-provider.js +24 -0
- package/out/src/reqlan-document-link-provider.js.map +1 -0
- package/out/src/reqlan-embedded-file-references.d.ts +11 -0
- package/out/src/reqlan-embedded-file-references.js +50 -0
- package/out/src/reqlan-embedded-file-references.js.map +1 -0
- package/out/src/reqlan-file-link-resolver.d.ts +44 -0
- package/out/src/reqlan-file-link-resolver.js +347 -0
- package/out/src/reqlan-file-link-resolver.js.map +1 -0
- package/out/src/reqlan-file-references.d.ts +15 -0
- package/out/src/reqlan-file-references.js +72 -0
- package/out/src/reqlan-file-references.js.map +1 -0
- package/out/src/reqlan-grammar-config.d.ts +5 -0
- package/out/src/reqlan-grammar-config.js +9 -0
- package/out/src/reqlan-grammar-config.js.map +1 -0
- package/out/src/reqlan-idea-summary.d.ts +6 -0
- package/out/src/reqlan-idea-summary.js +78 -0
- package/out/src/reqlan-idea-summary.js.map +1 -0
- package/out/src/reqlan-ignore-error.d.ts +10 -0
- package/out/src/reqlan-ignore-error.js +42 -0
- package/out/src/reqlan-ignore-error.js.map +1 -0
- package/out/src/reqlan-import-bindings.d.ts +12 -0
- package/out/src/reqlan-import-bindings.js +65 -0
- package/out/src/reqlan-import-bindings.js.map +1 -0
- package/out/src/reqlan-import-edits.d.ts +17 -0
- package/out/src/reqlan-import-edits.js +96 -0
- package/out/src/reqlan-import-edits.js.map +1 -0
- package/out/src/reqlan-imports.d.ts +22 -0
- package/out/src/reqlan-imports.js +61 -0
- package/out/src/reqlan-imports.js.map +1 -0
- package/out/src/reqlan-inbound-reference-inlay-label.d.ts +23 -0
- package/out/src/reqlan-inbound-reference-inlay-label.js +128 -0
- package/out/src/reqlan-inbound-reference-inlay-label.js.map +1 -0
- package/out/src/reqlan-inlay-hint-provider.d.ts +15 -0
- package/out/src/reqlan-inlay-hint-provider.js +54 -0
- package/out/src/reqlan-inlay-hint-provider.js.map +1 -0
- package/out/src/reqlan-inlay-hint-settings.d.ts +10 -0
- package/out/src/reqlan-inlay-hint-settings.js +10 -0
- package/out/src/reqlan-inlay-hint-settings.js.map +1 -0
- package/out/src/reqlan-linker.d.ts +26 -0
- package/out/src/reqlan-linker.js +86 -0
- package/out/src/reqlan-linker.js.map +1 -0
- package/out/src/reqlan-markdown-links.d.ts +28 -0
- package/out/src/reqlan-markdown-links.js +113 -0
- package/out/src/reqlan-markdown-links.js.map +1 -0
- package/out/src/reqlan-module.d.ts +41 -0
- package/out/src/reqlan-module.js +76 -0
- package/out/src/reqlan-module.js.map +1 -0
- package/out/src/reqlan-name-catalog.d.ts +23 -0
- package/out/src/reqlan-name-catalog.js +63 -0
- package/out/src/reqlan-name-catalog.js.map +1 -0
- package/out/src/reqlan-name-provider.d.ts +10 -0
- package/out/src/reqlan-name-provider.js +38 -0
- package/out/src/reqlan-name-provider.js.map +1 -0
- package/out/src/reqlan-namespace-import-links.d.ts +10 -0
- package/out/src/reqlan-namespace-import-links.js +81 -0
- package/out/src/reqlan-namespace-import-links.js.map +1 -0
- package/out/src/reqlan-path-completion.d.ts +50 -0
- package/out/src/reqlan-path-completion.js +304 -0
- package/out/src/reqlan-path-completion.js.map +1 -0
- package/out/src/reqlan-path-references.d.ts +5 -0
- package/out/src/reqlan-path-references.js +124 -0
- package/out/src/reqlan-path-references.js.map +1 -0
- package/out/src/reqlan-path-resolve.d.ts +59 -0
- package/out/src/reqlan-path-resolve.js +173 -0
- package/out/src/reqlan-path-resolve.js.map +1 -0
- package/out/src/reqlan-quoted-strings.d.ts +9 -0
- package/out/src/reqlan-quoted-strings.js +26 -0
- package/out/src/reqlan-quoted-strings.js.map +1 -0
- package/out/src/reqlan-reference-at-position.d.ts +20 -0
- package/out/src/reqlan-reference-at-position.js +89 -0
- package/out/src/reqlan-reference-at-position.js.map +1 -0
- package/out/src/reqlan-references.d.ts +16 -0
- package/out/src/reqlan-references.js +51 -0
- package/out/src/reqlan-references.js.map +1 -0
- package/out/src/reqlan-scope.d.ts +25 -0
- package/out/src/reqlan-scope.js +266 -0
- package/out/src/reqlan-scope.js.map +1 -0
- package/out/src/reqlan-semantic-token-provider.d.ts +8 -0
- package/out/src/reqlan-semantic-token-provider.js +97 -0
- package/out/src/reqlan-semantic-token-provider.js.map +1 -0
- package/out/src/reqlan-token-builder.d.ts +12 -0
- package/out/src/reqlan-token-builder.js +459 -0
- package/out/src/reqlan-token-builder.js.map +1 -0
- package/out/src/reqlan-validator.d.ts +25 -0
- package/out/src/reqlan-validator.js +119 -0
- package/out/src/reqlan-validator.js.map +1 -0
- package/out/src/reqlan-workspace-attribute-catalog.d.ts +6 -0
- package/out/src/reqlan-workspace-attribute-catalog.js +54 -0
- package/out/src/reqlan-workspace-attribute-catalog.js.map +1 -0
- package/out/test/code-actions.test.d.ts +1 -0
- package/out/test/code-actions.test.js +126 -0
- package/out/test/code-actions.test.js.map +1 -0
- package/out/test/comment-in-string.test.d.ts +1 -0
- package/out/test/comment-in-string.test.js +100 -0
- package/out/test/comment-in-string.test.js.map +1 -0
- package/out/test/completion.test.d.ts +1 -0
- package/out/test/completion.test.js +467 -0
- package/out/test/completion.test.js.map +1 -0
- package/out/test/file-path-rewrite.test.d.ts +1 -0
- package/out/test/file-path-rewrite.test.js +64 -0
- package/out/test/file-path-rewrite.test.js.map +1 -0
- package/out/test/ignore-error.test.d.ts +1 -0
- package/out/test/ignore-error.test.js +87 -0
- package/out/test/ignore-error.test.js.map +1 -0
- package/out/test/implicit-import-extension.test.d.ts +1 -0
- package/out/test/implicit-import-extension.test.js +203 -0
- package/out/test/implicit-import-extension.test.js.map +1 -0
- package/out/test/import-edits.test.d.ts +1 -0
- package/out/test/import-edits.test.js +20 -0
- package/out/test/import-edits.test.js.map +1 -0
- package/out/test/inlay-hints.test.d.ts +1 -0
- package/out/test/inlay-hints.test.js +238 -0
- package/out/test/inlay-hints.test.js.map +1 -0
- package/out/test/linking.test.d.ts +1 -0
- package/out/test/linking.test.js +754 -0
- package/out/test/linking.test.js.map +1 -0
- package/out/test/naked-strings.test.d.ts +1 -0
- package/out/test/naked-strings.test.js +50 -0
- package/out/test/naked-strings.test.js.map +1 -0
- package/out/test/parsing.test.d.ts +1 -0
- package/out/test/parsing.test.js +773 -0
- package/out/test/parsing.test.js.map +1 -0
- package/out/test/path-resolve.test.d.ts +1 -0
- package/out/test/path-resolve.test.js +88 -0
- package/out/test/path-resolve.test.js.map +1 -0
- package/out/test/references.test.d.ts +1 -0
- package/out/test/references.test.js +168 -0
- package/out/test/references.test.js.map +1 -0
- package/out/test/rqconfig.test.d.ts +1 -0
- package/out/test/rqconfig.test.js +275 -0
- package/out/test/rqconfig.test.js.map +1 -0
- package/out/test/test-requirement-refs.d.ts +8 -0
- package/out/test/test-requirement-refs.js +35 -0
- package/out/test/test-requirement-refs.js.map +1 -0
- package/out/test/testing.test.d.ts +1 -0
- package/out/test/testing.test.js +23 -0
- package/out/test/testing.test.js.map +1 -0
- package/out/test/validating.test.d.ts +1 -0
- package/out/test/validating.test.js +117 -0
- package/out/test/validating.test.js.map +1 -0
- package/out/tsconfig.tsbuildinfo +1 -0
- package/package.json +54 -0
- package/src/chevrotain.d.ts +8 -0
- package/src/file-path-rewrite.ts +96 -0
- package/src/generated/ast.ts +1481 -0
- package/src/generated/grammar.ts +3074 -0
- package/src/generated/module.ts +38 -0
- package/src/index.ts +34 -0
- package/src/reqlan-attribute-catalog.ts +100 -0
- package/src/reqlan-code-action-provider.ts +385 -0
- package/src/reqlan-code-lens-provider.ts +54 -0
- package/src/reqlan-code-lens-settings.ts +42 -0
- package/src/reqlan-comment-resolver.ts +372 -0
- package/src/reqlan-comment.langium +23 -0
- package/src/reqlan-completion-context.ts +330 -0
- package/src/reqlan-completion-provider.ts +400 -0
- package/src/reqlan-definition-provider.ts +319 -0
- package/src/reqlan-document-highlight-provider.ts +21 -0
- package/src/reqlan-document-link-provider.ts +45 -0
- package/src/reqlan-embedded-file-references.ts +72 -0
- package/src/reqlan-file-link-resolver.ts +485 -0
- package/src/reqlan-file-references.ts +84 -0
- package/src/reqlan-grammar-config.ts +14 -0
- package/src/reqlan-idea-reference-site.ts +74 -0
- package/src/reqlan-idea-summary.ts +162 -0
- package/src/reqlan-ignore-error.ts +50 -0
- package/src/reqlan-import-bindings.ts +87 -0
- package/src/reqlan-import-edits.ts +124 -0
- package/src/reqlan-imports.ts +115 -0
- package/src/reqlan-inbound-reference-inlay-label.ts +194 -0
- package/src/reqlan-inlay-hint-provider.ts +88 -0
- package/src/reqlan-inlay-hint-settings.ts +15 -0
- package/src/reqlan-linker.ts +108 -0
- package/src/reqlan-markdown-links.ts +136 -0
- package/src/reqlan-module.ts +104 -0
- package/src/reqlan-name-catalog.ts +81 -0
- package/src/reqlan-name-provider.ts +56 -0
- package/src/reqlan-namespace-import-links.ts +92 -0
- package/src/reqlan-path-completion.ts +420 -0
- package/src/reqlan-path-references.ts +140 -0
- package/src/reqlan-path-resolve.ts +346 -0
- package/src/reqlan-quoted-strings.ts +30 -0
- package/src/reqlan-reference-at-position.ts +154 -0
- package/src/reqlan-reference-code-lens.ts +323 -0
- package/src/reqlan-reference-search-site.ts +202 -0
- package/src/reqlan-references.ts +76 -0
- package/src/reqlan-scope.ts +312 -0
- package/src/reqlan-semantic-token-provider.ts +113 -0
- package/src/reqlan-token-builder.ts +492 -0
- package/src/reqlan-validator.ts +149 -0
- package/src/reqlan-workspace-attribute-catalog.ts +62 -0
- package/src/reqlan.langium +236 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { AstUtils, CstUtils, GrammarUtils } from 'langium';
|
|
2
|
+
import { resolveFileUri } from './reqlan-comment-resolver.js';
|
|
3
|
+
import { findEmbeddedFileReferencesInText } from './reqlan-embedded-file-references.js';
|
|
4
|
+
import { findImportedDocument, resolveExistingImportUri } from './reqlan-imports.js';
|
|
5
|
+
import { qualifiedReferenceImportPath } from './reqlan-references.js';
|
|
6
|
+
import { findTestLineInText, parseFileReferenceString } from './reqlan-file-references.js';
|
|
7
|
+
import { isFileReference, isFileSymbolReference, isImport, isLocalReference, isMarkdownLink, isQualifiedReference } from './generated/ast.js';
|
|
8
|
+
import { parseMarkdownLink } from './reqlan-references.js';
|
|
9
|
+
import { reqlanStringDelimiter } from './reqlan-quoted-strings.js';
|
|
10
|
+
import { isNamespaceImportOnlyReference, resolveNamespaceImportReferenceLink } from './reqlan-namespace-import-links.js';
|
|
11
|
+
function withFileSystem(fileSystem, context) {
|
|
12
|
+
return { ...context, fileSystem: context?.fileSystem ?? fileSystem };
|
|
13
|
+
}
|
|
14
|
+
export function classifyReferenceUri(targetUri, documents, fileSystem) {
|
|
15
|
+
if (findTargetDocument(targetUri, documents)) {
|
|
16
|
+
return 'file';
|
|
17
|
+
}
|
|
18
|
+
if (!fileSystem.existsSync(targetUri)) {
|
|
19
|
+
return 'missing';
|
|
20
|
+
}
|
|
21
|
+
return fileSystem.statSync(targetUri).isDirectory ? 'folder' : 'file';
|
|
22
|
+
}
|
|
23
|
+
export function listFolderFileNames(fileSystem, folderUri) {
|
|
24
|
+
return fileSystem.readDirectorySync(folderUri)
|
|
25
|
+
.filter(entry => entry.isFile)
|
|
26
|
+
.map(entry => {
|
|
27
|
+
const segments = entry.uri.path.split('/');
|
|
28
|
+
return segments[segments.length - 1] ?? '';
|
|
29
|
+
})
|
|
30
|
+
.filter(name => name.length > 0)
|
|
31
|
+
.sort((left, right) => left.localeCompare(right));
|
|
32
|
+
}
|
|
33
|
+
export function resolveFileReferenceLink(reference, documents, fileSystem, context) {
|
|
34
|
+
const document = AstUtils.getDocument(reference);
|
|
35
|
+
const parsed = parseFileReferenceString(reference.file);
|
|
36
|
+
const pathNode = GrammarUtils.findNodeForProperty(reference.$cstNode, 'file');
|
|
37
|
+
if (!pathNode) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return resolveParsedFileLink(document, documents, fileSystem, parsed, pathNode, context);
|
|
41
|
+
}
|
|
42
|
+
export function resolveImportPathLink(importDecl, documents, context) {
|
|
43
|
+
const document = AstUtils.getDocument(importDecl);
|
|
44
|
+
const pathNode = GrammarUtils.findNodeForProperty(importDecl.$cstNode, 'path');
|
|
45
|
+
if (!pathNode) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const imported = findImportedDocument(importDecl.path, document, documents, context);
|
|
49
|
+
const target = imported?.parseResult.value.$cstNode;
|
|
50
|
+
if (!imported || !target) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
sourceRange: pathNode.range,
|
|
55
|
+
targetUri: imported.textDocument.uri,
|
|
56
|
+
targetRange: target.range
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function resolveQualifiedReferencePathLink(reference, documents, context) {
|
|
60
|
+
const pathNode = reference.path?.$refNode;
|
|
61
|
+
if (!pathNode) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const document = AstUtils.getDocument(reference);
|
|
65
|
+
const path = qualifiedReferenceImportPath(reference);
|
|
66
|
+
if (!path) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const imported = findImportedDocument(path, document, documents, context);
|
|
70
|
+
const target = imported?.parseResult.value.$cstNode;
|
|
71
|
+
if (!imported || !target) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
sourceRange: pathNode.range,
|
|
76
|
+
targetUri: imported.textDocument.uri,
|
|
77
|
+
targetRange: target.range
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function resolveMarkdownLinkTargetLink(link, document, documents, fileSystem, context) {
|
|
81
|
+
const parsedLink = parseMarkdownLink(link.raw);
|
|
82
|
+
if (!parsedLink) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
const pathNode = GrammarUtils.findNodeForProperty(link.$cstNode, 'raw');
|
|
86
|
+
if (!pathNode) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
const targetStart = link.raw.indexOf('](') + 2;
|
|
90
|
+
const targetLength = parsedLink.target.length;
|
|
91
|
+
const sourceRange = {
|
|
92
|
+
start: {
|
|
93
|
+
line: pathNode.range.start.line,
|
|
94
|
+
character: pathNode.range.start.character + targetStart
|
|
95
|
+
},
|
|
96
|
+
end: {
|
|
97
|
+
line: pathNode.range.start.line,
|
|
98
|
+
character: pathNode.range.start.character + targetStart + targetLength
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const parsed = parseFileReferenceString(parsedLink.target);
|
|
102
|
+
const targetUri = resolveFileUri(parsed.filePath, document, withFileSystem(fileSystem, context));
|
|
103
|
+
return resolvePathStringLink(document, documents, fileSystem, parsed, targetUri, sourceRange);
|
|
104
|
+
}
|
|
105
|
+
export function resolveEmbeddedFileReferenceLink(reference, document, documents, fileSystem, context) {
|
|
106
|
+
const parsed = parseFileReferenceString(reference.file);
|
|
107
|
+
const targetUri = resolveFileUri(parsed.filePath, document, withFileSystem(fileSystem, context));
|
|
108
|
+
return resolvePathStringLink(document, documents, fileSystem, parsed, targetUri, reference.range);
|
|
109
|
+
}
|
|
110
|
+
export function resolveParsedFileLink(document, documents, fileSystem, parsed, pathNode, context) {
|
|
111
|
+
const targetUri = resolveFileUri(parsed.filePath, document, withFileSystem(fileSystem, context));
|
|
112
|
+
const sourceRange = parsed.testName
|
|
113
|
+
? stringContentRange(pathNode)
|
|
114
|
+
: filePathRangeInStringNode(pathNode, parsed);
|
|
115
|
+
return resolvePathStringLink(document, documents, fileSystem, parsed, targetUri, sourceRange);
|
|
116
|
+
}
|
|
117
|
+
function resolvePathStringLink(_document, documents, fileSystem, parsed, targetUri, sourceRange) {
|
|
118
|
+
const resolution = classifyReferenceUri(targetUri, documents, fileSystem);
|
|
119
|
+
if (resolution === 'missing') {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
if (resolution === 'folder') {
|
|
123
|
+
return {
|
|
124
|
+
sourceRange,
|
|
125
|
+
targetUri: targetUri.toString(),
|
|
126
|
+
resolution,
|
|
127
|
+
folderFiles: listFolderFileNames(fileSystem, targetUri)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const text = readTargetText(targetUri, documents, fileSystem);
|
|
131
|
+
if (text === undefined) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const targetIssue = detectFileLinkTargetIssue(text, findTargetDocument(targetUri, documents));
|
|
135
|
+
let targetRange;
|
|
136
|
+
if (parsed.testName) {
|
|
137
|
+
const line = findTestLineInText(text, parsed.testName);
|
|
138
|
+
if (line !== undefined) {
|
|
139
|
+
targetRange = lineRangeFromText(text, line);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (parsed.lineStart !== undefined) {
|
|
143
|
+
targetRange = lineRangeFromText(text, parsed.lineStart - 1);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
targetRange = fileStartRange();
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
sourceRange,
|
|
150
|
+
targetUri: targetUri.toString(),
|
|
151
|
+
targetRange,
|
|
152
|
+
resolution: 'file',
|
|
153
|
+
targetIssue
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
export function detectFileLinkTargetIssue(text, targetDocument) {
|
|
157
|
+
if (text.length === 0) {
|
|
158
|
+
return 'empty';
|
|
159
|
+
}
|
|
160
|
+
if (targetDocument && targetDocument.parseResult.parserErrors.length > 0) {
|
|
161
|
+
return 'parse-error';
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
export function fileLinkTargetIssueMessage(issue) {
|
|
166
|
+
switch (issue) {
|
|
167
|
+
case 'empty':
|
|
168
|
+
return 'Referenced file is empty.';
|
|
169
|
+
case 'parse-error':
|
|
170
|
+
return 'Referenced file has parse errors.';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function findTargetDocument(targetUri, documents) {
|
|
174
|
+
const direct = documents.getDocument(targetUri);
|
|
175
|
+
if (direct) {
|
|
176
|
+
return direct;
|
|
177
|
+
}
|
|
178
|
+
const normalizedTarget = normalizeUriPath(targetUri);
|
|
179
|
+
for (const document of documents.all) {
|
|
180
|
+
if (normalizeUriPath(document.uri) === normalizedTarget) {
|
|
181
|
+
return document;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
function normalizeUriPath(uri) {
|
|
187
|
+
return decodeURIComponent(uri.path).replace(/\\/g, '/');
|
|
188
|
+
}
|
|
189
|
+
function readTargetText(targetUri, documents, fileSystem) {
|
|
190
|
+
const targetDocument = findTargetDocument(targetUri, documents);
|
|
191
|
+
if (targetDocument) {
|
|
192
|
+
return targetDocument.textDocument.getText();
|
|
193
|
+
}
|
|
194
|
+
if (!fileSystem.existsSync(targetUri)) {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
if (fileSystem.statSync(targetUri).isDirectory) {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
return fileSystem.readFileSync(targetUri);
|
|
201
|
+
}
|
|
202
|
+
export function bindingNameSourceRange(bindingNode, bindingName) {
|
|
203
|
+
const line = bindingNode.range.start.line;
|
|
204
|
+
const startCharacter = bindingNode.range.start.character;
|
|
205
|
+
return {
|
|
206
|
+
start: { line, character: startCharacter },
|
|
207
|
+
end: { line, character: startCharacter + bindingName.length }
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
export function resolveImportedFileLink(document, documents, fileSystem, filePath, sourceRange, context) {
|
|
211
|
+
const targetUri = resolveExistingImportUri(filePath, document, documents, fileSystem, context);
|
|
212
|
+
return resolvePathStringLink(document, documents, fileSystem, { filePath }, targetUri, sourceRange);
|
|
213
|
+
}
|
|
214
|
+
export function filePathRangeInStringNode(pathNode, parsed) {
|
|
215
|
+
const text = pathNode.text;
|
|
216
|
+
const contentStart = pathNode.range.start.character + (reqlanStringDelimiter(text) ? 1 : 0);
|
|
217
|
+
return {
|
|
218
|
+
start: { line: pathNode.range.start.line, character: contentStart },
|
|
219
|
+
end: { line: pathNode.range.start.line, character: contentStart + parsed.filePath.length }
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function stringContentRange(pathNode) {
|
|
223
|
+
const text = pathNode.text;
|
|
224
|
+
const quoteOffset = reqlanStringDelimiter(text) ? 1 : 0;
|
|
225
|
+
const trailingQuote = quoteOffset;
|
|
226
|
+
return {
|
|
227
|
+
start: { line: pathNode.range.start.line, character: pathNode.range.start.character + quoteOffset },
|
|
228
|
+
end: { line: pathNode.range.end.line, character: pathNode.range.end.character - trailingQuote }
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function lineRangeFromText(text, line) {
|
|
232
|
+
const lineText = text.split(/\r?\n/)[line] ?? '';
|
|
233
|
+
return {
|
|
234
|
+
start: { line, character: 0 },
|
|
235
|
+
end: { line, character: lineText.length }
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
function fileStartRange() {
|
|
239
|
+
return {
|
|
240
|
+
start: { line: 0, character: 0 },
|
|
241
|
+
end: { line: 0, character: 0 }
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
export function collectFileLinks(document, documents, fileSystem, context) {
|
|
245
|
+
const pathContext = withFileSystem(fileSystem, context);
|
|
246
|
+
const links = [];
|
|
247
|
+
const linkedRanges = [];
|
|
248
|
+
for (const node of AstUtils.streamAst(document.parseResult.value)) {
|
|
249
|
+
if (isFileReference(node) || isFileSymbolReference(node)) {
|
|
250
|
+
const link = resolveFileReferenceLink(node, documents, fileSystem, pathContext);
|
|
251
|
+
if (link) {
|
|
252
|
+
links.push(link);
|
|
253
|
+
linkedRanges.push(rangeKey(link.sourceRange));
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if ((isLocalReference(node) || isQualifiedReference(node)) && isNamespaceImportOnlyReference(node)) {
|
|
257
|
+
const link = resolveNamespaceImportReferenceLink(node, documents, fileSystem, pathContext);
|
|
258
|
+
if (link) {
|
|
259
|
+
links.push(link);
|
|
260
|
+
linkedRanges.push(rangeKey(link.sourceRange));
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (isImport(node)) {
|
|
264
|
+
const link = resolveImportPathLink(node, documents, pathContext);
|
|
265
|
+
if (link) {
|
|
266
|
+
links.push(link);
|
|
267
|
+
linkedRanges.push(rangeKey(link.sourceRange));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (isQualifiedReference(node) && node.path && !node.path.ref) {
|
|
271
|
+
const link = resolveQualifiedReferencePathLink(node, documents, pathContext);
|
|
272
|
+
if (link) {
|
|
273
|
+
links.push(link);
|
|
274
|
+
linkedRanges.push(rangeKey(link.sourceRange));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (isMarkdownLink(node)) {
|
|
278
|
+
const link = resolveMarkdownLinkTargetLink(node, document, documents, fileSystem, pathContext);
|
|
279
|
+
if (link) {
|
|
280
|
+
links.push(link);
|
|
281
|
+
linkedRanges.push(rangeKey(link.sourceRange));
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
for (const reference of findEmbeddedFileReferencesInText(document.textDocument.getText())) {
|
|
286
|
+
const key = rangeKey(reference.range);
|
|
287
|
+
if (linkedRanges.includes(key) || links.some(link => rangesOverlap(link.sourceRange, reference.range))) {
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
const link = resolveEmbeddedFileReferenceLink(reference, document, documents, fileSystem, pathContext);
|
|
291
|
+
if (link) {
|
|
292
|
+
links.push(link);
|
|
293
|
+
linkedRanges.push(key);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return links;
|
|
297
|
+
}
|
|
298
|
+
function rangeKey(range) {
|
|
299
|
+
return `${range.start.line}:${range.start.character}-${range.end.line}:${range.end.character}`;
|
|
300
|
+
}
|
|
301
|
+
function rangesOverlap(left, right) {
|
|
302
|
+
if (left.start.line !== right.start.line || right.start.line !== right.end.line || left.start.line !== left.end.line) {
|
|
303
|
+
return left.start.line === right.start.line;
|
|
304
|
+
}
|
|
305
|
+
return left.start.character <= right.end.character && right.start.character <= left.end.character;
|
|
306
|
+
}
|
|
307
|
+
export function resolvedFileLinkTargetUri(link) {
|
|
308
|
+
if (link.resolution === 'folder' || link.resolution === 'missing') {
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
if (link.targetRange) {
|
|
312
|
+
return `${link.targetUri}#L${link.targetRange.start.line + 1}`;
|
|
313
|
+
}
|
|
314
|
+
return link.targetUri;
|
|
315
|
+
}
|
|
316
|
+
export function resolvedFileLinkToGoToTarget(link, sourceNode, targetDocument) {
|
|
317
|
+
const root = targetDocument.parseResult.value.$cstNode;
|
|
318
|
+
if (!root) {
|
|
319
|
+
return undefined;
|
|
320
|
+
}
|
|
321
|
+
const target = link.targetRange
|
|
322
|
+
? {
|
|
323
|
+
range: link.targetRange,
|
|
324
|
+
astNode: root.astNode
|
|
325
|
+
}
|
|
326
|
+
: root;
|
|
327
|
+
return {
|
|
328
|
+
source: CstUtils.getDatatypeNode(sourceNode) ?? sourceNode,
|
|
329
|
+
target,
|
|
330
|
+
targetDocument
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
export function resolvedFileLinkToGoToTargetFromFilesystem(link, sourceNode) {
|
|
334
|
+
if (!link.targetRange) {
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
const target = { range: link.targetRange };
|
|
338
|
+
const targetDocument = {
|
|
339
|
+
textDocument: { uri: link.targetUri }
|
|
340
|
+
};
|
|
341
|
+
return {
|
|
342
|
+
source: CstUtils.getDatatypeNode(sourceNode) ?? sourceNode,
|
|
343
|
+
target,
|
|
344
|
+
targetDocument
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=reqlan-file-link-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqlan-file-link-resolver.js","sourceRoot":"","sources":["../src/reqlan-file-link-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses file path strings from bracket references, including L# line suffixes and :test name suffixes.
|
|
3
|
+
*/
|
|
4
|
+
export interface ParsedFileReference {
|
|
5
|
+
filePath: string;
|
|
6
|
+
lineStart?: number;
|
|
7
|
+
lineEnd?: number;
|
|
8
|
+
testName?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseFileReferenceString(file: string): ParsedFileReference;
|
|
11
|
+
/**
|
|
12
|
+
* True when a bracketed quoted path is an arbitrary file reference, not an inline .rq import path.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isOpaqueFileReferencePath(path: string): boolean;
|
|
15
|
+
export declare function findTestLineInText(text: string, testName: string): number | undefined;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses file path strings from bracket references, including L# line suffixes and :test name suffixes.
|
|
3
|
+
*/
|
|
4
|
+
const LINE_SUFFIX_PATTERN = /^(.*?)L#(\d+)(?:-(\d+))?$/;
|
|
5
|
+
export function parseFileReferenceString(file) {
|
|
6
|
+
const lineMatch = LINE_SUFFIX_PATTERN.exec(file);
|
|
7
|
+
const lineParsed = lineMatch
|
|
8
|
+
? {
|
|
9
|
+
filePath: lineMatch[1],
|
|
10
|
+
lineStart: Number.parseInt(lineMatch[2], 10),
|
|
11
|
+
lineEnd: lineMatch[3] ? Number.parseInt(lineMatch[3], 10) : Number.parseInt(lineMatch[2], 10)
|
|
12
|
+
}
|
|
13
|
+
: { filePath: file };
|
|
14
|
+
const testParsed = parseTestNameSuffix(lineParsed.filePath);
|
|
15
|
+
return {
|
|
16
|
+
filePath: testParsed.filePath,
|
|
17
|
+
lineStart: lineParsed.lineStart,
|
|
18
|
+
lineEnd: lineParsed.lineEnd,
|
|
19
|
+
testName: testParsed.testName
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function parseTestNameSuffix(file) {
|
|
23
|
+
let colonIndex = -1;
|
|
24
|
+
for (let index = file.length - 1; index >= 0; index--) {
|
|
25
|
+
if (file[index] !== ':') {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (index > 0 && file[index - 1] === '/' && index > 1 && file[index - 2] === '/') {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
colonIndex = index;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
if (colonIndex < 0) {
|
|
35
|
+
return { filePath: file };
|
|
36
|
+
}
|
|
37
|
+
const testName = file.slice(colonIndex + 1);
|
|
38
|
+
if (!testName) {
|
|
39
|
+
return { filePath: file };
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
filePath: file.slice(0, colonIndex),
|
|
43
|
+
testName
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const NON_RQ_FILE_EXTENSION = /\.[^./\\]+$/;
|
|
47
|
+
/**
|
|
48
|
+
* True when a bracketed quoted path is an arbitrary file reference, not an inline .rq import path.
|
|
49
|
+
*/
|
|
50
|
+
export function isOpaqueFileReferencePath(path) {
|
|
51
|
+
const parsed = parseFileReferenceString(path);
|
|
52
|
+
if (parsed.testName !== undefined || parsed.lineStart !== undefined) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
const filePath = parsed.filePath;
|
|
56
|
+
if (/\.rq$/i.test(filePath)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return NON_RQ_FILE_EXTENSION.test(filePath);
|
|
60
|
+
}
|
|
61
|
+
export function findTestLineInText(text, testName) {
|
|
62
|
+
const escaped = testName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
63
|
+
const pattern = new RegExp(`\\b(?:test|it)\\(\\s*['\`]${escaped}['\`]`);
|
|
64
|
+
const lines = text.split(/\r?\n/);
|
|
65
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
66
|
+
if (pattern.test(lines[lineIndex])) {
|
|
67
|
+
return lineIndex;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=reqlan-file-references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqlan-file-references.js","sourceRoot":"","sources":["../src/reqlan-file-references.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createGrammarConfig } from 'langium';
|
|
2
|
+
const ReqlanNameRegexp = /"[^"]*"|'[^']*'|\w[\w_]*/;
|
|
3
|
+
export function createReqlanGrammarConfig(services) {
|
|
4
|
+
return {
|
|
5
|
+
...createGrammarConfig(services),
|
|
6
|
+
nameRegexp: ReqlanNameRegexp
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=reqlan-grammar-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqlan-grammar-config.js","sourceRoot":"","sources":["../src/reqlan-grammar-config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAEpD,MAAM,UAAU,yBAAyB,CAAC,QAA6B;IACnE,OAAO;QACH,GAAG,mBAAmB,CAAC,QAAQ,CAAC;QAChC,UAAU,EAAE,gBAAgB;KAC/B,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locate a bracket/wiki idea reference under the cursor for search code actions.
|
|
3
|
+
* rq:["../../../reqlan rq/extension/features-commands.rq".search_code_actions]
|
|
4
|
+
*/
|
|
5
|
+
import type { LangiumDocument } from 'langium';
|
|
6
|
+
import type { Position, Range } from 'vscode-languageserver';
|
|
7
|
+
export interface IdeaReferenceSite {
|
|
8
|
+
/** Current idea name text inside the reference (may be empty or partial). */
|
|
9
|
+
refText: string;
|
|
10
|
+
/** Range of text to replace with the chosen idea name (inside brackets). */
|
|
11
|
+
range: Range;
|
|
12
|
+
kind: 'bracket' | 'wikilink';
|
|
13
|
+
}
|
|
14
|
+
export declare function findIdeaReferenceAtPosition(document: LangiumDocument, position: Position): IdeaReferenceSite | undefined;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { CstUtils } from 'langium';
|
|
2
|
+
import { isBracketReference, isLocalReference, isQualifiedReference, isWikiLink } from './generated/ast.js';
|
|
3
|
+
import { referenceIdea } from './reqlan-references.js';
|
|
4
|
+
export function findIdeaReferenceAtPosition(document, position) {
|
|
5
|
+
const root = document.parseResult.value.$cstNode;
|
|
6
|
+
if (!root) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
const offset = document.textDocument.offsetAt(position);
|
|
10
|
+
let current = CstUtils.findLeafNodeAtOffset(root, offset);
|
|
11
|
+
while (current) {
|
|
12
|
+
const node = current.astNode;
|
|
13
|
+
if (isBracketReference(node) || isWikiLink(node)) {
|
|
14
|
+
return siteFromReferenceContainer(node);
|
|
15
|
+
}
|
|
16
|
+
current = current.container;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
function siteFromReferenceContainer(node) {
|
|
21
|
+
const kind = isWikiLink(node) ? 'wikilink' : 'bracket';
|
|
22
|
+
const target = node.target;
|
|
23
|
+
if (!target) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
if (isLocalReference(target) || isQualifiedReference(target)) {
|
|
27
|
+
const idea = referenceIdea(target);
|
|
28
|
+
const ideaNode = idea?.$refNode;
|
|
29
|
+
if (ideaNode) {
|
|
30
|
+
return {
|
|
31
|
+
refText: idea.$refText,
|
|
32
|
+
range: ideaNode.range,
|
|
33
|
+
kind
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const targetNode = target.$cstNode;
|
|
38
|
+
if (!targetNode) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
refText: targetNode.text,
|
|
43
|
+
range: targetNode.range,
|
|
44
|
+
kind
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=reqlan-idea-reference-site.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqlan-idea-reference-site.js","sourceRoot":"","sources":["../src/reqlan-idea-reference-site.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EAGb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAUvD,MAAM,UAAU,2BAA2B,CACvC,QAAyB,EACzB,QAAkB;IAElB,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,OAAO,GAAwB,QAAQ,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,OAAO,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,0BAA0B,CAAC,IAAiC;IACjE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC;QAChC,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO;gBACH,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,IAAI;aACP,CAAC;QACN,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO;QACH,OAAO,EAAE,UAAU,CAAC,IAAI;QACxB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,IAAI;KACP,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compact idea body summaries for inline editor hints and indexing.
|
|
3
|
+
*/
|
|
4
|
+
import { type IdeaDeclaration } from './generated/ast.js';
|
|
5
|
+
export declare function summarizeIdeaDeclaration(idea: IdeaDeclaration): string;
|
|
6
|
+
export declare function truncateSummary(text: string, maxLength?: number): string;
|