@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,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification labels and summary stats for reference CodeLens buttons.
|
|
3
|
+
* Click opens a reference card; navigation stays on document links / go-to-definition.
|
|
4
|
+
*/
|
|
5
|
+
import { type AstNode } from 'langium';
|
|
6
|
+
import { type CodeLens } from 'vscode-languageserver';
|
|
7
|
+
import { type ReferencedDeclaration } from './reqlan-inbound-reference-inlay-label.js';
|
|
8
|
+
import { type ResolvedFileLink } from './reqlan-file-link-resolver.js';
|
|
9
|
+
import type { ReqlanServices } from './reqlan-module.js';
|
|
10
|
+
export type ReferenceCodeLensClassification = {
|
|
11
|
+
kind: 'idea';
|
|
12
|
+
declaration: ReferencedDeclaration;
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'reqlan-file';
|
|
15
|
+
link: ResolvedFileLink;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'file';
|
|
18
|
+
link: ResolvedFileLink;
|
|
19
|
+
extension: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'folder';
|
|
22
|
+
link: ResolvedFileLink;
|
|
23
|
+
};
|
|
24
|
+
export declare function classifyReferenceForCodeLens(services: ReqlanServices, node: AstNode): ReferenceCodeLensClassification | undefined;
|
|
25
|
+
export declare function referenceCodeLensTitle(classification: ReferenceCodeLensClassification): string;
|
|
26
|
+
export declare function buildReferenceCodeLens(services: ReqlanServices, node: AstNode, classification: ReferenceCodeLensClassification): CodeLens | undefined;
|
|
27
|
+
export declare function buildReferenceCodeLensStats(services: ReqlanServices, classification: ReferenceCodeLensClassification): string[];
|
|
28
|
+
/** @deprecated Prefer {@link buildReferenceCodeLensStats} — kept for existing tests. */
|
|
29
|
+
export declare function buildReferenceCodeLensTooltip(services: ReqlanServices, classification: ReferenceCodeLensClassification): string | undefined;
|
|
30
|
+
export declare function countOutboundReferences(declaration: ReferencedDeclaration): number;
|
|
31
|
+
export declare function fileExtension(targetUri: string): string | undefined;
|
|
32
|
+
export declare function fileLastEditedLabel(targetUri: string): string | undefined;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification labels and summary stats for reference CodeLens buttons.
|
|
3
|
+
* Click opens a reference card; navigation stays on document links / go-to-definition.
|
|
4
|
+
*/
|
|
5
|
+
import { AstUtils, GrammarUtils, URI } from 'langium';
|
|
6
|
+
import { Command } from 'vscode-languageserver';
|
|
7
|
+
import { statSync } from 'node:fs';
|
|
8
|
+
import { isBracketReference, isFileReference, isFileSymbolReference, isIdea, isIdeaSet, isLocalReference, isOneLinerIdea, isQualifiedReference, isWikiLink } from './generated/ast.js';
|
|
9
|
+
import { collectInboundReferencers } from './reqlan-inbound-reference-inlay-label.js';
|
|
10
|
+
import { listFolderFileNames, resolveFileReferenceLink } from './reqlan-file-link-resolver.js';
|
|
11
|
+
import { isNamespaceImportOnlyReference, resolveNamespaceImportReferenceLink } from './reqlan-namespace-import-links.js';
|
|
12
|
+
import { pathResolveContextFromServices } from './reqlan-path-resolve.js';
|
|
13
|
+
import { referenceIdea } from './reqlan-references.js';
|
|
14
|
+
import { summarizeIdeaDeclaration, truncateSummary } from './reqlan-idea-summary.js';
|
|
15
|
+
import { REQLAN_OPEN_REFERENCE_CODE_LENS_COMMAND } from './reqlan-code-lens-settings.js';
|
|
16
|
+
export function classifyReferenceForCodeLens(services, node) {
|
|
17
|
+
if (!isBracketReference(node) && !isWikiLink(node)) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const target = node.target;
|
|
21
|
+
if (isLocalReference(target) || isQualifiedReference(target)) {
|
|
22
|
+
if (isNamespaceImportOnlyReference(target)) {
|
|
23
|
+
const link = resolveNamespaceImportReferenceLink(target, services.shared.workspace.LangiumDocuments, services.shared.workspace.FileSystemProvider, pathResolveContextFromServices(services));
|
|
24
|
+
return classifyResolvedFileLink(link);
|
|
25
|
+
}
|
|
26
|
+
const ideaRef = referenceIdea(target);
|
|
27
|
+
if (ideaRef?.ref) {
|
|
28
|
+
return { kind: 'idea', declaration: ideaRef.ref };
|
|
29
|
+
}
|
|
30
|
+
if (isQualifiedReference(target) && target.ideaset?.ref) {
|
|
31
|
+
return { kind: 'idea', declaration: target.ideaset.ref };
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
if (isFileReference(target) || isFileSymbolReference(target)) {
|
|
36
|
+
const link = resolveFileReferenceLink(target, services.shared.workspace.LangiumDocuments, services.shared.workspace.FileSystemProvider, pathResolveContextFromServices(services));
|
|
37
|
+
if (isFileSymbolReference(target) && target.symbols.length > 0) {
|
|
38
|
+
const idea = resolveFileSymbolIdea(services, link, target.symbols[0]);
|
|
39
|
+
if (idea) {
|
|
40
|
+
return { kind: 'idea', declaration: idea };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return classifyResolvedFileLink(link);
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
function classifyResolvedFileLink(link) {
|
|
48
|
+
if (!link || link.resolution === 'missing') {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
if (link.resolution === 'folder') {
|
|
52
|
+
return { kind: 'folder', link };
|
|
53
|
+
}
|
|
54
|
+
const extension = fileExtension(link.targetUri);
|
|
55
|
+
if (!extension || extension === 'rq') {
|
|
56
|
+
return { kind: 'reqlan-file', link };
|
|
57
|
+
}
|
|
58
|
+
return { kind: 'file', link, extension };
|
|
59
|
+
}
|
|
60
|
+
function resolveFileSymbolIdea(services, link, symbolName) {
|
|
61
|
+
if (!link || link.resolution !== 'file') {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const targetDocument = services.shared.workspace.LangiumDocuments.getDocument(URI.parse(link.targetUri));
|
|
65
|
+
if (!targetDocument) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
for (const candidate of AstUtils.streamAst(targetDocument.parseResult.value)) {
|
|
69
|
+
if ((isIdea(candidate) || isOneLinerIdea(candidate) || isIdeaSet(candidate)) && candidate.name === symbolName) {
|
|
70
|
+
return candidate;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
export function referenceCodeLensTitle(classification) {
|
|
76
|
+
switch (classification.kind) {
|
|
77
|
+
case 'idea':
|
|
78
|
+
return 'open idea';
|
|
79
|
+
case 'reqlan-file':
|
|
80
|
+
return 'open reqlan file';
|
|
81
|
+
case 'file':
|
|
82
|
+
return `open ${classification.extension} file`;
|
|
83
|
+
case 'folder':
|
|
84
|
+
return 'open folder';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export function buildReferenceCodeLens(services, node, classification) {
|
|
88
|
+
const range = codeLensRange(node);
|
|
89
|
+
if (!range) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const payload = payloadForClassification(services, classification);
|
|
93
|
+
if (!payload) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
const title = payload.classification;
|
|
97
|
+
const tooltip = payload.stats.length > 0
|
|
98
|
+
? `${payload.displayName} · ${payload.stats.join(' · ')}`
|
|
99
|
+
: payload.displayName;
|
|
100
|
+
const command = Command.create(title, REQLAN_OPEN_REFERENCE_CODE_LENS_COMMAND, payload);
|
|
101
|
+
command.tooltip = tooltip;
|
|
102
|
+
return { range, command };
|
|
103
|
+
}
|
|
104
|
+
export function buildReferenceCodeLensStats(services, classification) {
|
|
105
|
+
const parts = [];
|
|
106
|
+
if (classification.kind === 'idea') {
|
|
107
|
+
const referencers = collectInboundReferencers(services, classification.declaration).length;
|
|
108
|
+
const references = countOutboundReferences(classification.declaration);
|
|
109
|
+
parts.push(`${referencers} referencer${referencers === 1 ? '' : 's'}`);
|
|
110
|
+
parts.push(`${references} reference${references === 1 ? '' : 's'}`);
|
|
111
|
+
const edited = fileLastEditedLabel(AstUtils.getDocument(classification.declaration).uri.toString());
|
|
112
|
+
if (edited) {
|
|
113
|
+
parts.push(`last edited ${edited}`);
|
|
114
|
+
}
|
|
115
|
+
return parts;
|
|
116
|
+
}
|
|
117
|
+
if (classification.kind === 'folder') {
|
|
118
|
+
const files = classification.link.folderFiles
|
|
119
|
+
?? listFolderFileNames(services.shared.workspace.FileSystemProvider, URI.parse(classification.link.targetUri));
|
|
120
|
+
parts.push(`${files.length} file${files.length === 1 ? '' : 's'}`);
|
|
121
|
+
return parts;
|
|
122
|
+
}
|
|
123
|
+
const edited = fileLastEditedLabel(classification.link.targetUri);
|
|
124
|
+
if (edited) {
|
|
125
|
+
parts.push(`last edited ${edited}`);
|
|
126
|
+
}
|
|
127
|
+
if (classification.kind === 'reqlan-file') {
|
|
128
|
+
const targetDocument = services.shared.workspace.LangiumDocuments.getDocument(URI.parse(classification.link.targetUri));
|
|
129
|
+
if (targetDocument) {
|
|
130
|
+
let ideaCount = 0;
|
|
131
|
+
for (const candidate of AstUtils.streamAst(targetDocument.parseResult.value)) {
|
|
132
|
+
if (isIdea(candidate) || isOneLinerIdea(candidate) || isIdeaSet(candidate)) {
|
|
133
|
+
ideaCount++;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
parts.push(`${ideaCount} idea${ideaCount === 1 ? '' : 's'}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return parts;
|
|
140
|
+
}
|
|
141
|
+
/** @deprecated Prefer {@link buildReferenceCodeLensStats} — kept for existing tests. */
|
|
142
|
+
export function buildReferenceCodeLensTooltip(services, classification) {
|
|
143
|
+
const parts = buildReferenceCodeLensStats(services, classification);
|
|
144
|
+
return parts.length > 0 ? parts.join(' · ') : undefined;
|
|
145
|
+
}
|
|
146
|
+
export function countOutboundReferences(declaration) {
|
|
147
|
+
let count = 0;
|
|
148
|
+
for (const node of AstUtils.streamAst(declaration)) {
|
|
149
|
+
if (isBracketReference(node) || isWikiLink(node)) {
|
|
150
|
+
count++;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return count;
|
|
154
|
+
}
|
|
155
|
+
export function fileExtension(targetUri) {
|
|
156
|
+
const path = URI.parse(targetUri).path;
|
|
157
|
+
const slash = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\'));
|
|
158
|
+
const base = slash >= 0 ? path.slice(slash + 1) : path;
|
|
159
|
+
const dot = base.lastIndexOf('.');
|
|
160
|
+
if (dot <= 0 || dot === base.length - 1) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
return base.slice(dot + 1).toLowerCase();
|
|
164
|
+
}
|
|
165
|
+
export function fileLastEditedLabel(targetUri) {
|
|
166
|
+
try {
|
|
167
|
+
const uri = URI.parse(targetUri);
|
|
168
|
+
if (uri.scheme !== 'file') {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
const mtime = statSync(uri.fsPath).mtime;
|
|
172
|
+
return mtime.toISOString().slice(0, 10);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function displayNameForUri(targetUri) {
|
|
179
|
+
const path = URI.parse(targetUri).path;
|
|
180
|
+
const slash = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\'));
|
|
181
|
+
return slash >= 0 ? path.slice(slash + 1) : path;
|
|
182
|
+
}
|
|
183
|
+
function payloadForClassification(services, classification) {
|
|
184
|
+
const classificationLabel = referenceCodeLensTitle(classification);
|
|
185
|
+
const stats = buildReferenceCodeLensStats(services, classification);
|
|
186
|
+
if (classification.kind === 'idea') {
|
|
187
|
+
const declaration = classification.declaration;
|
|
188
|
+
const nameNode = GrammarUtils.findNodeForProperty(declaration.$cstNode, 'name');
|
|
189
|
+
const document = AstUtils.getDocument(declaration);
|
|
190
|
+
const summary = isIdea(declaration) || isOneLinerIdea(declaration)
|
|
191
|
+
? truncateSummary(summarizeIdeaDeclaration(declaration), 240)
|
|
192
|
+
: undefined;
|
|
193
|
+
return {
|
|
194
|
+
kind: 'idea',
|
|
195
|
+
classification: classificationLabel,
|
|
196
|
+
displayName: declaration.name,
|
|
197
|
+
targetUri: document.uri.toString(),
|
|
198
|
+
line: nameNode?.range.start.line ?? 0,
|
|
199
|
+
character: nameNode?.range.start.character ?? 0,
|
|
200
|
+
summary: summary || undefined,
|
|
201
|
+
stats
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const link = classification.link;
|
|
205
|
+
const displayName = displayNameForUri(link.targetUri);
|
|
206
|
+
if (classification.kind === 'folder') {
|
|
207
|
+
const folderFiles = link.folderFiles
|
|
208
|
+
?? listFolderFileNames(services.shared.workspace.FileSystemProvider, URI.parse(link.targetUri));
|
|
209
|
+
return {
|
|
210
|
+
kind: 'folder',
|
|
211
|
+
classification: classificationLabel,
|
|
212
|
+
displayName,
|
|
213
|
+
targetUri: link.targetUri,
|
|
214
|
+
folderFiles,
|
|
215
|
+
summary: folderFiles.slice(0, 8).join(', ') + (folderFiles.length > 8 ? '…' : ''),
|
|
216
|
+
stats
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
kind: classification.kind === 'reqlan-file' ? 'reqlan-file' : 'file',
|
|
221
|
+
classification: classificationLabel,
|
|
222
|
+
displayName,
|
|
223
|
+
targetUri: link.targetUri,
|
|
224
|
+
line: link.targetRange?.start.line ?? 0,
|
|
225
|
+
character: link.targetRange?.start.character ?? 0,
|
|
226
|
+
extension: classification.kind === 'file' ? classification.extension : undefined,
|
|
227
|
+
stats
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function codeLensRange(node) {
|
|
231
|
+
const cst = node.$cstNode;
|
|
232
|
+
if (!cst) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
start: { line: cst.range.start.line, character: 0 },
|
|
237
|
+
end: cst.range.end
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=reqlan-reference-code-lens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqlan-reference-code-lens.js","sourceRoot":"","sources":["../src/reqlan-reference-code-lens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locate places where a selection or word can become a [reference],
|
|
3
|
+
* and extract surrounding idea text for the search modal preview.
|
|
4
|
+
* rq:["../../../reqlan rq/extension/features-commands.rq".search_code_actions]
|
|
5
|
+
*/
|
|
6
|
+
import type { LangiumDocument } from 'langium';
|
|
7
|
+
import type { Position, Range } from 'vscode-languageserver';
|
|
8
|
+
import { type IdeaDeclaration } from './generated/ast.js';
|
|
9
|
+
export type ReferenceSearchMode = 'replace' | 'wrap';
|
|
10
|
+
export interface ReferenceSearchContext {
|
|
11
|
+
ideaName: string;
|
|
12
|
+
/** Text before the target within the idea source. */
|
|
13
|
+
before: string;
|
|
14
|
+
/** Selected / reference text that will become (or already is) the reference. */
|
|
15
|
+
target: string;
|
|
16
|
+
/** Text after the target within the idea source. */
|
|
17
|
+
after: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ReferenceSearchSite {
|
|
20
|
+
refText: string;
|
|
21
|
+
range: Range;
|
|
22
|
+
mode: ReferenceSearchMode;
|
|
23
|
+
kind: 'bracket' | 'wikilink' | 'prose';
|
|
24
|
+
context?: ReferenceSearchContext;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Prefer an existing [reference]/[[wikilink]] under the cursor; otherwise a
|
|
28
|
+
* selection or word in idea-body prose that can be wrapped as `[name]`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function findReferenceSearchSite(document: LangiumDocument, range: Range): ReferenceSearchSite | undefined;
|
|
31
|
+
export declare function isAppropriateWrapLocation(document: LangiumDocument, position: Position): boolean;
|
|
32
|
+
export declare function buildContextForRange(document: LangiumDocument, range: Range, idea?: IdeaDeclaration): ReferenceSearchContext | undefined;
|
|
33
|
+
export declare function expandToWordAtPosition(document: LangiumDocument, position: Position): Range | undefined;
|
|
34
|
+
export declare function isBlockOrOneLinerIdea(node: unknown): node is IdeaDeclaration;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { findContainingIdea, isInMainDescriptionProse } from './reqlan-completion-context.js';
|
|
2
|
+
import { findIdeaReferenceAtPosition } from './reqlan-idea-reference-site.js';
|
|
3
|
+
import { isIdea, isOneLinerIdea } from './generated/ast.js';
|
|
4
|
+
/**
|
|
5
|
+
* Prefer an existing [reference]/[[wikilink]] under the cursor; otherwise a
|
|
6
|
+
* selection or word in idea-body prose that can be wrapped as `[name]`.
|
|
7
|
+
*/
|
|
8
|
+
export function findReferenceSearchSite(document, range) {
|
|
9
|
+
const existing = findIdeaReferenceAtPosition(document, range.start);
|
|
10
|
+
if (existing) {
|
|
11
|
+
return siteFromExistingReference(document, existing);
|
|
12
|
+
}
|
|
13
|
+
return findWrapSite(document, range);
|
|
14
|
+
}
|
|
15
|
+
function siteFromExistingReference(document, existing) {
|
|
16
|
+
return {
|
|
17
|
+
refText: existing.refText,
|
|
18
|
+
range: existing.range,
|
|
19
|
+
mode: 'replace',
|
|
20
|
+
kind: existing.kind,
|
|
21
|
+
context: buildContextForRange(document, existing.range)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function findWrapSite(document, range) {
|
|
25
|
+
const rawRange = isEmptyRange(range)
|
|
26
|
+
? expandToWordAtPosition(document, range.start)
|
|
27
|
+
: normalizeForwardRange(range);
|
|
28
|
+
const wrapRange = rawRange ? trimRangeWhitespace(document, rawRange) : undefined;
|
|
29
|
+
if (!wrapRange || isEmptyRange(wrapRange)) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
// Both ends must sit in idea-body prose (not imports, attribute keys, refs, etc.)
|
|
33
|
+
const endProbe = document.textDocument.positionAt(Math.max(document.textDocument.offsetAt(wrapRange.start), document.textDocument.offsetAt(wrapRange.end) - 1));
|
|
34
|
+
if (!isAppropriateWrapLocation(document, wrapRange.start)
|
|
35
|
+
|| !isAppropriateWrapLocation(document, endProbe)) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
// Keep wrap inside a single idea
|
|
39
|
+
const idea = findContainingIdea(document, wrapRange.start);
|
|
40
|
+
if (!idea || findContainingIdea(document, wrapRange.end) !== idea) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const refText = document.textDocument.getText(wrapRange).trim();
|
|
44
|
+
if (!refText || /\n/.test(refText)) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
// Avoid wrapping text that is already bracket-wrapped
|
|
48
|
+
if (/^\[.*\]$/.test(refText) || /^\[\[.*\]\]$/.test(refText)) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
refText,
|
|
53
|
+
range: wrapRange,
|
|
54
|
+
mode: 'wrap',
|
|
55
|
+
kind: 'prose',
|
|
56
|
+
context: buildContextForRange(document, wrapRange, idea)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function isAppropriateWrapLocation(document, position) {
|
|
60
|
+
return isInMainDescriptionProse(document, position);
|
|
61
|
+
}
|
|
62
|
+
export function buildContextForRange(document, range, idea) {
|
|
63
|
+
const containing = idea ?? findContainingIdea(document, range.start);
|
|
64
|
+
if (!containing?.$cstNode) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
const ideaRange = containing.$cstNode.range;
|
|
68
|
+
const ideaText = document.textDocument.getText(ideaRange);
|
|
69
|
+
const ideaStart = document.textDocument.offsetAt(ideaRange.start);
|
|
70
|
+
const targetStart = document.textDocument.offsetAt(range.start) - ideaStart;
|
|
71
|
+
const targetEnd = document.textDocument.offsetAt(range.end) - ideaStart;
|
|
72
|
+
if (targetStart < 0 || targetEnd > ideaText.length || targetStart > targetEnd) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
ideaName: containing.name,
|
|
77
|
+
before: ideaText.slice(0, targetStart),
|
|
78
|
+
target: ideaText.slice(targetStart, targetEnd),
|
|
79
|
+
after: ideaText.slice(targetEnd)
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function expandToWordAtPosition(document, position) {
|
|
83
|
+
const line = document.textDocument.getText({
|
|
84
|
+
start: { line: position.line, character: 0 },
|
|
85
|
+
end: { line: position.line + 1, character: 0 }
|
|
86
|
+
});
|
|
87
|
+
// Strip trailing newline for indexing
|
|
88
|
+
const lineText = line.replace(/\r?\n$/, '');
|
|
89
|
+
if (position.character > lineText.length) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const isWord = (ch) => !!ch && /[A-Za-z0-9_]/.test(ch);
|
|
93
|
+
let start = position.character;
|
|
94
|
+
let end = position.character;
|
|
95
|
+
while (start > 0 && isWord(lineText[start - 1])) {
|
|
96
|
+
start -= 1;
|
|
97
|
+
}
|
|
98
|
+
while (end < lineText.length && isWord(lineText[end])) {
|
|
99
|
+
end += 1;
|
|
100
|
+
}
|
|
101
|
+
if (start === end) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
start: { line: position.line, character: start },
|
|
106
|
+
end: { line: position.line, character: end }
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function trimRangeWhitespace(document, range) {
|
|
110
|
+
const text = document.textDocument.getText(range);
|
|
111
|
+
const lead = /^\s*/.exec(text)?.[0].length ?? 0;
|
|
112
|
+
const trail = /\s*$/.exec(text)?.[0].length ?? 0;
|
|
113
|
+
if (lead + trail >= text.length) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
const startOffset = document.textDocument.offsetAt(range.start) + lead;
|
|
117
|
+
const endOffset = document.textDocument.offsetAt(range.end) - trail;
|
|
118
|
+
return {
|
|
119
|
+
start: document.textDocument.positionAt(startOffset),
|
|
120
|
+
end: document.textDocument.positionAt(endOffset)
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function isEmptyRange(range) {
|
|
124
|
+
return range.start.line === range.end.line && range.start.character === range.end.character;
|
|
125
|
+
}
|
|
126
|
+
function normalizeForwardRange(range) {
|
|
127
|
+
if (range.start.line > range.end.line
|
|
128
|
+
|| (range.start.line === range.end.line && range.start.character > range.end.character)) {
|
|
129
|
+
return { start: range.end, end: range.start };
|
|
130
|
+
}
|
|
131
|
+
return range;
|
|
132
|
+
}
|
|
133
|
+
export function isBlockOrOneLinerIdea(node) {
|
|
134
|
+
return isIdea(node) || isOneLinerIdea(node);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=reqlan-reference-search-site.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqlan-reference-search-site.js","sourceRoot":"","sources":["../src/reqlan-reference-search-site.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,kBAAkB,EAClB,wBAAwB,EAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACH,2BAA2B,EAE9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAwB,MAAM,oBAAoB,CAAC;AAsBlF;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACnC,QAAyB,EACzB,KAAY;IAEZ,MAAM,QAAQ,GAAG,2BAA2B,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpE,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,yBAAyB,CAC9B,QAAyB,EACzB,QAA2B;IAE3B,OAAO;QACH,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;KAC1D,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,QAAyB,EAAE,KAAY;IACzD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC;QAChC,CAAC,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC;QAC/C,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,kFAAkF;IAClF,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,CAC7C,IAAI,CAAC,GAAG,CACJ,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAC/C,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CACpD,CACJ,CAAC;IACF,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC;WAClD,CAAC,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,iCAAiC;IACjC,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,IAAI,IAAI,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,sDAAsD;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,OAAO;QACP,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC;KAC3D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAyB,EAAE,QAAkB;IACnF,OAAO,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAChC,QAAyB,EACzB,KAAY,EACZ,IAAsB;IAEtB,MAAM,UAAU,GAAG,IAAI,IAAI,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACrE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAC5E,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACxE,IAAI,WAAW,GAAG,CAAC,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,GAAG,SAAS,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO;QACH,QAAQ,EAAE,UAAU,CAAC,IAAI;QACzB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;QACtC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC;QAC9C,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;KACnC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,sBAAsB,CAClC,QAAyB,EACzB,QAAkB;IAElB,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;QACvC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE;QAC5C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;KACjD,CAAC,CAAC;IACH,sCAAsC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,EAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,IAAI,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;IAC/B,IAAI,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;IAC7B,OAAO,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,IAAI,CAAC,CAAC;IACb,CAAC;IACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO;QACH,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAChD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;KAC/C,CAAC;AACN,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAyB,EAAE,KAAY;IAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACvE,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpE,OAAO;QACH,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC;QACpD,GAAG,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC;KACnD,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,KAAY;IAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;AAChG,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAY;IACvC,IACI,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI;WAC9B,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EACzF,CAAC;QACC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAa;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the reference target union types.
|
|
3
|
+
*/
|
|
4
|
+
import type { Reference } from 'langium';
|
|
5
|
+
import { type IdeaDeclaration, type Import, type QualifiedReference, type ReferenceTarget } from './generated/ast.js';
|
|
6
|
+
export declare function referenceImport(target: ReferenceTarget): Reference<Import> | undefined;
|
|
7
|
+
export declare function referenceIdea(target: ReferenceTarget): Reference<IdeaDeclaration> | undefined;
|
|
8
|
+
export declare function referenceFilePath(target: ReferenceTarget): string | undefined;
|
|
9
|
+
export declare function qualifiedReferenceImportPath(reference: QualifiedReference): string | undefined;
|
|
10
|
+
export declare function isAnonymousQualifiedReference(reference: QualifiedReference): boolean;
|
|
11
|
+
export { unquoteReqlanString } from './reqlan-quoted-strings.js';
|
|
12
|
+
export interface ParsedMarkdownLink {
|
|
13
|
+
label: string;
|
|
14
|
+
target: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function parseMarkdownLink(raw: string): ParsedMarkdownLink | undefined;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { isFileReference, isFileSymbolReference, isLocalReference, isQualifiedReference } from './generated/ast.js';
|
|
2
|
+
import { unquoteReqlanString } from './reqlan-quoted-strings.js';
|
|
3
|
+
export function referenceImport(target) {
|
|
4
|
+
if (isQualifiedReference(target)) {
|
|
5
|
+
return target.path?.ref || target.qualifier?.ref ? (target.path ?? target.qualifier) : undefined;
|
|
6
|
+
}
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
export function referenceIdea(target) {
|
|
10
|
+
if (isQualifiedReference(target) || isLocalReference(target)) {
|
|
11
|
+
return target.idea;
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
export function referenceFilePath(target) {
|
|
16
|
+
if (isFileReference(target) || isFileSymbolReference(target)) {
|
|
17
|
+
return target.file;
|
|
18
|
+
}
|
|
19
|
+
if (isQualifiedReference(target)) {
|
|
20
|
+
return qualifiedReferenceImportPath(target);
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
export function qualifiedReferenceImportPath(reference) {
|
|
25
|
+
if (reference.qualifier?.ref) {
|
|
26
|
+
return reference.qualifier.ref.path;
|
|
27
|
+
}
|
|
28
|
+
if (reference.path?.ref) {
|
|
29
|
+
return reference.path.ref.path;
|
|
30
|
+
}
|
|
31
|
+
if (reference.path?.$refText) {
|
|
32
|
+
return unquoteReqlanString(reference.path.$refText);
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
export function isAnonymousQualifiedReference(reference) {
|
|
37
|
+
return reference.path !== undefined && reference.path.ref === undefined && reference.qualifier === undefined;
|
|
38
|
+
}
|
|
39
|
+
export { unquoteReqlanString } from './reqlan-quoted-strings.js';
|
|
40
|
+
const MARKDOWN_LINK_PATTERN = /^\[([^\]]+)\]\(([^)]+)\)$/;
|
|
41
|
+
export function parseMarkdownLink(raw) {
|
|
42
|
+
const match = MARKDOWN_LINK_PATTERN.exec(raw);
|
|
43
|
+
if (!match) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
label: match[1],
|
|
48
|
+
target: match[2]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=reqlan-references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqlan-references.js","sourceRoot":"","sources":["../src/reqlan-references.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EAKvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,eAAe,CAAC,MAAuB;IACnD,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAuB;IACjD,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACrD,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,IAAI,CAAC;IACvB,CAAC;IACD,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,SAA6B;IACtE,IAAI,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IACxC,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACnC,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3B,OAAO,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,SAA6B;IACvE,OAAO,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC;AACjH,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOjE,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AAE1D,MAAM,UAAU,iBAAiB,CAAC,GAAW;IACzC,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO;QACH,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE;QAChB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE;KACpB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Publishes idea and ideaset declarations for file-local and cross-file reference resolution.
|
|
3
|
+
*/
|
|
4
|
+
import type { AstNodeDescription, LangiumDocument, ReferenceInfo } from 'langium';
|
|
5
|
+
import { DefaultScopeComputation, DefaultScopeProvider, type Scope } from 'langium';
|
|
6
|
+
import type { ReqlanServices } from './reqlan-module.js';
|
|
7
|
+
export declare class ReqlanScopeComputation extends DefaultScopeComputation {
|
|
8
|
+
collectExportedSymbols(document: LangiumDocument): Promise<AstNodeDescription[]>;
|
|
9
|
+
}
|
|
10
|
+
export declare class ReqlanScopeProvider extends DefaultScopeProvider {
|
|
11
|
+
protected readonly documents: ReqlanServices['shared']['workspace']['LangiumDocuments'];
|
|
12
|
+
private readonly services;
|
|
13
|
+
constructor(services: ReqlanServices);
|
|
14
|
+
getScope(context: ReferenceInfo): Scope;
|
|
15
|
+
private scopeForFileIdeas;
|
|
16
|
+
private scopeForIdeasetMembers;
|
|
17
|
+
private scopeForIdeasets;
|
|
18
|
+
private scopeForReferenceQualifiers;
|
|
19
|
+
private scopeForImportPaths;
|
|
20
|
+
private scopeForImportDeclaration;
|
|
21
|
+
private scopeForImportAliasName;
|
|
22
|
+
private scopeForImportPath;
|
|
23
|
+
private findImportedDocument;
|
|
24
|
+
private documentForQualifiedReference;
|
|
25
|
+
}
|