@untangle-code/parser-registry 0.0.0-stage → 0.1.1
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/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +352 -2
- package/THIRD_PARTY_LICENSES.md +91 -0
- package/dist/boundaries/expression.d.ts +10 -0
- package/dist/boundaries/expression.d.ts.map +1 -0
- package/dist/boundaries/expression.js +95 -0
- package/dist/boundaries/expression.js.map +1 -0
- package/dist/boundaries/extract.d.ts +12 -0
- package/dist/boundaries/extract.d.ts.map +1 -0
- package/dist/boundaries/extract.js +259 -0
- package/dist/boundaries/extract.js.map +1 -0
- package/dist/boundaries/python.d.ts +6 -0
- package/dist/boundaries/python.d.ts.map +1 -0
- package/dist/boundaries/python.js +154 -0
- package/dist/boundaries/python.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/astgrep-backend/adapter.d.ts +101 -0
- package/dist/languages/astgrep-backend/adapter.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/adapter.js +130 -0
- package/dist/languages/astgrep-backend/adapter.js.map +1 -0
- package/dist/languages/astgrep-backend/index.d.ts +29 -0
- package/dist/languages/astgrep-backend/index.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/index.js +28 -0
- package/dist/languages/astgrep-backend/index.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/bash.d.ts +38 -0
- package/dist/languages/astgrep-backend/lang/bash.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/bash.js +42 -0
- package/dist/languages/astgrep-backend/lang/bash.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/c.d.ts +33 -0
- package/dist/languages/astgrep-backend/lang/c.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/c.js +85 -0
- package/dist/languages/astgrep-backend/lang/c.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/cpp.d.ts +27 -0
- package/dist/languages/astgrep-backend/lang/cpp.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/cpp.js +38 -0
- package/dist/languages/astgrep-backend/lang/cpp.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/csharp.d.ts +24 -0
- package/dist/languages/astgrep-backend/lang/csharp.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/csharp.js +102 -0
- package/dist/languages/astgrep-backend/lang/csharp.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/index.d.ts +29 -0
- package/dist/languages/astgrep-backend/lang/index.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/index.js +22 -0
- package/dist/languages/astgrep-backend/lang/index.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/java.d.ts +26 -0
- package/dist/languages/astgrep-backend/lang/java.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/java.js +89 -0
- package/dist/languages/astgrep-backend/lang/java.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/kotlin.d.ts +44 -0
- package/dist/languages/astgrep-backend/lang/kotlin.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/kotlin.js +94 -0
- package/dist/languages/astgrep-backend/lang/kotlin.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/php.d.ts +23 -0
- package/dist/languages/astgrep-backend/lang/php.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/php.js +80 -0
- package/dist/languages/astgrep-backend/lang/php.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/ruby.d.ts +37 -0
- package/dist/languages/astgrep-backend/lang/ruby.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/ruby.js +70 -0
- package/dist/languages/astgrep-backend/lang/ruby.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/swift.d.ts +34 -0
- package/dist/languages/astgrep-backend/lang/swift.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/swift.js +86 -0
- package/dist/languages/astgrep-backend/lang/swift.js.map +1 -0
- package/dist/languages/astgrep-backend/languages.d.ts +55 -0
- package/dist/languages/astgrep-backend/languages.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/languages.js +214 -0
- package/dist/languages/astgrep-backend/languages.js.map +1 -0
- package/dist/languages/astgrep-backend/napi.d.ts +71 -0
- package/dist/languages/astgrep-backend/napi.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/napi.js +176 -0
- package/dist/languages/astgrep-backend/napi.js.map +1 -0
- package/dist/languages/astgrep-backend/syntax.d.ts +88 -0
- package/dist/languages/astgrep-backend/syntax.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/syntax.js +180 -0
- package/dist/languages/astgrep-backend/syntax.js.map +1 -0
- package/dist/languages/index.d.ts +14 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +37 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/javascript/index.d.ts +4 -0
- package/dist/languages/javascript/index.d.ts.map +1 -0
- package/dist/languages/javascript/index.js +7 -0
- package/dist/languages/javascript/index.js.map +1 -0
- package/dist/languages/jsx/index.d.ts +4 -0
- package/dist/languages/jsx/index.d.ts.map +1 -0
- package/dist/languages/jsx/index.js +7 -0
- package/dist/languages/jsx/index.js.map +1 -0
- package/dist/languages/prose/index.d.ts +53 -0
- package/dist/languages/prose/index.d.ts.map +1 -0
- package/dist/languages/prose/index.js +172 -0
- package/dist/languages/prose/index.js.map +1 -0
- package/dist/languages/prose/line-bytes.d.ts +31 -0
- package/dist/languages/prose/line-bytes.d.ts.map +1 -0
- package/dist/languages/prose/line-bytes.js +39 -0
- package/dist/languages/prose/line-bytes.js.map +1 -0
- package/dist/languages/python/create-adapter.d.ts +20 -0
- package/dist/languages/python/create-adapter.d.ts.map +1 -0
- package/dist/languages/python/create-adapter.js +9 -0
- package/dist/languages/python/create-adapter.js.map +1 -0
- package/dist/languages/python/index.d.ts +4 -0
- package/dist/languages/python/index.d.ts.map +1 -0
- package/dist/languages/python/index.js +6 -0
- package/dist/languages/python/index.js.map +1 -0
- package/dist/languages/python/profile.d.ts +36 -0
- package/dist/languages/python/profile.d.ts.map +1 -0
- package/dist/languages/python/profile.js +282 -0
- package/dist/languages/python/profile.js.map +1 -0
- package/dist/languages/python/signature.d.ts +53 -0
- package/dist/languages/python/signature.d.ts.map +1 -0
- package/dist/languages/python/signature.js +188 -0
- package/dist/languages/python/signature.js.map +1 -0
- package/dist/languages/python/table.d.ts +46 -0
- package/dist/languages/python/table.d.ts.map +1 -0
- package/dist/languages/python/table.js +88 -0
- package/dist/languages/python/table.js.map +1 -0
- package/dist/languages/shared/call-detection.d.ts +17 -0
- package/dist/languages/shared/call-detection.d.ts.map +1 -0
- package/dist/languages/shared/call-detection.js +86 -0
- package/dist/languages/shared/call-detection.js.map +1 -0
- package/dist/languages/shared/chunks.d.ts +28 -0
- package/dist/languages/shared/chunks.d.ts.map +1 -0
- package/dist/languages/shared/chunks.js +181 -0
- package/dist/languages/shared/chunks.js.map +1 -0
- package/dist/languages/shared/create-adapter.d.ts +11 -0
- package/dist/languages/shared/create-adapter.d.ts.map +1 -0
- package/dist/languages/shared/create-adapter.js +90 -0
- package/dist/languages/shared/create-adapter.js.map +1 -0
- package/dist/languages/shared/decisions.d.ts +45 -0
- package/dist/languages/shared/decisions.d.ts.map +1 -0
- package/dist/languages/shared/decisions.js +141 -0
- package/dist/languages/shared/decisions.js.map +1 -0
- package/dist/languages/shared/dialect.d.ts +18 -0
- package/dist/languages/shared/dialect.d.ts.map +1 -0
- package/dist/languages/shared/dialect.js +37 -0
- package/dist/languages/shared/dialect.js.map +1 -0
- package/dist/languages/shared/doc-binding.d.ts +26 -0
- package/dist/languages/shared/doc-binding.d.ts.map +1 -0
- package/dist/languages/shared/doc-binding.js +50 -0
- package/dist/languages/shared/doc-binding.js.map +1 -0
- package/dist/languages/shared/engine.d.ts +49 -0
- package/dist/languages/shared/engine.d.ts.map +1 -0
- package/dist/languages/shared/engine.js +317 -0
- package/dist/languages/shared/engine.js.map +1 -0
- package/dist/languages/shared/extract-symbols.d.ts +5 -0
- package/dist/languages/shared/extract-symbols.d.ts.map +1 -0
- package/dist/languages/shared/extract-symbols.js +31 -0
- package/dist/languages/shared/extract-symbols.js.map +1 -0
- package/dist/languages/shared/fingerprint.d.ts +7 -0
- package/dist/languages/shared/fingerprint.d.ts.map +1 -0
- package/dist/languages/shared/fingerprint.js +95 -0
- package/dist/languages/shared/fingerprint.js.map +1 -0
- package/dist/languages/shared/grammar-loader.d.ts +15 -0
- package/dist/languages/shared/grammar-loader.d.ts.map +1 -0
- package/dist/languages/shared/grammar-loader.js +48 -0
- package/dist/languages/shared/grammar-loader.js.map +1 -0
- package/dist/languages/shared/import-detection.d.ts +24 -0
- package/dist/languages/shared/import-detection.d.ts.map +1 -0
- package/dist/languages/shared/import-detection.js +138 -0
- package/dist/languages/shared/import-detection.js.map +1 -0
- package/dist/languages/shared/js-family-profile.d.ts +5 -0
- package/dist/languages/shared/js-family-profile.d.ts.map +1 -0
- package/dist/languages/shared/js-family-profile.js +179 -0
- package/dist/languages/shared/js-family-profile.js.map +1 -0
- package/dist/languages/shared/node-kinds.d.ts +78 -0
- package/dist/languages/shared/node-kinds.d.ts.map +1 -0
- package/dist/languages/shared/node-kinds.js +141 -0
- package/dist/languages/shared/node-kinds.js.map +1 -0
- package/dist/languages/shared/node-utils.d.ts +31 -0
- package/dist/languages/shared/node-utils.d.ts.map +1 -0
- package/dist/languages/shared/node-utils.js +89 -0
- package/dist/languages/shared/node-utils.js.map +1 -0
- package/dist/languages/shared/parse-diagnostics.d.ts +44 -0
- package/dist/languages/shared/parse-diagnostics.d.ts.map +1 -0
- package/dist/languages/shared/parse-diagnostics.js +64 -0
- package/dist/languages/shared/parse-diagnostics.js.map +1 -0
- package/dist/languages/shared/parse-limits.d.ts +24 -0
- package/dist/languages/shared/parse-limits.d.ts.map +1 -0
- package/dist/languages/shared/parse-limits.js +134 -0
- package/dist/languages/shared/parse-limits.js.map +1 -0
- package/dist/languages/shared/profile.d.ts +149 -0
- package/dist/languages/shared/profile.d.ts.map +1 -0
- package/dist/languages/shared/profile.js +9 -0
- package/dist/languages/shared/profile.js.map +1 -0
- package/dist/languages/shared/scope-model.d.ts +32 -0
- package/dist/languages/shared/scope-model.d.ts.map +1 -0
- package/dist/languages/shared/scope-model.js +2 -0
- package/dist/languages/shared/scope-model.js.map +1 -0
- package/dist/languages/shared/scope-naming.d.ts +20 -0
- package/dist/languages/shared/scope-naming.d.ts.map +1 -0
- package/dist/languages/shared/scope-naming.js +118 -0
- package/dist/languages/shared/scope-naming.js.map +1 -0
- package/dist/languages/shared/scope-signature.d.ts +14 -0
- package/dist/languages/shared/scope-signature.d.ts.map +1 -0
- package/dist/languages/shared/scope-signature.js +82 -0
- package/dist/languages/shared/scope-signature.js.map +1 -0
- package/dist/languages/shared/signature.d.ts +55 -0
- package/dist/languages/shared/signature.d.ts.map +1 -0
- package/dist/languages/shared/signature.js +147 -0
- package/dist/languages/shared/signature.js.map +1 -0
- package/dist/languages/shared/syntax.d.ts +115 -0
- package/dist/languages/shared/syntax.d.ts.map +1 -0
- package/dist/languages/shared/syntax.js +2 -0
- package/dist/languages/shared/syntax.js.map +1 -0
- package/dist/languages/shared/table-profile-decisions.d.ts +54 -0
- package/dist/languages/shared/table-profile-decisions.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-decisions.js +245 -0
- package/dist/languages/shared/table-profile-decisions.js.map +1 -0
- package/dist/languages/shared/table-profile-module-facts.d.ts +29 -0
- package/dist/languages/shared/table-profile-module-facts.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-module-facts.js +139 -0
- package/dist/languages/shared/table-profile-module-facts.js.map +1 -0
- package/dist/languages/shared/table-profile-queries.d.ts +27 -0
- package/dist/languages/shared/table-profile-queries.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-queries.js +70 -0
- package/dist/languages/shared/table-profile-queries.js.map +1 -0
- package/dist/languages/shared/table-profile-scopes.d.ts +46 -0
- package/dist/languages/shared/table-profile-scopes.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-scopes.js +180 -0
- package/dist/languages/shared/table-profile-scopes.js.map +1 -0
- package/dist/languages/shared/table-profile.d.ts +302 -0
- package/dist/languages/shared/table-profile.d.ts.map +1 -0
- package/dist/languages/shared/table-profile.js +125 -0
- package/dist/languages/shared/table-profile.js.map +1 -0
- package/dist/languages/shared/tree-sitter-types.d.ts +44 -0
- package/dist/languages/shared/tree-sitter-types.d.ts.map +1 -0
- package/dist/languages/shared/tree-sitter-types.js +2 -0
- package/dist/languages/shared/tree-sitter-types.js.map +1 -0
- package/dist/languages/structured-text/index.d.ts +48 -0
- package/dist/languages/structured-text/index.d.ts.map +1 -0
- package/dist/languages/structured-text/index.js +120 -0
- package/dist/languages/structured-text/index.js.map +1 -0
- package/dist/languages/tsx/index.d.ts +4 -0
- package/dist/languages/tsx/index.d.ts.map +1 -0
- package/dist/languages/tsx/index.js +7 -0
- package/dist/languages/tsx/index.js.map +1 -0
- package/dist/languages/typescript/index.d.ts +4 -0
- package/dist/languages/typescript/index.d.ts.map +1 -0
- package/dist/languages/typescript/index.js +7 -0
- package/dist/languages/typescript/index.js.map +1 -0
- package/dist/languages/vue/index.d.ts +21 -0
- package/dist/languages/vue/index.d.ts.map +1 -0
- package/dist/languages/vue/index.js +234 -0
- package/dist/languages/vue/index.js.map +1 -0
- package/dist/languages/vue/mapping.d.ts +11 -0
- package/dist/languages/vue/mapping.d.ts.map +1 -0
- package/dist/languages/vue/mapping.js +77 -0
- package/dist/languages/vue/mapping.js.map +1 -0
- package/dist/registry.d.ts +24 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +42 -0
- package/dist/registry.js.map +1 -0
- package/dist/text/byte-offset-table.d.ts +27 -0
- package/dist/text/byte-offset-table.d.ts.map +1 -0
- package/dist/text/byte-offset-table.js +39 -0
- package/dist/text/byte-offset-table.js.map +1 -0
- package/package.json +125 -3
- package/src/boundaries/expression.ts +95 -0
- package/src/boundaries/extract.ts +307 -0
- package/src/boundaries/python.ts +181 -0
- package/src/index.ts +51 -0
- package/src/languages/__golden__/javascript-basic.json +32 -0
- package/src/languages/__golden__/tsx-basic.json +19 -0
- package/src/languages/__golden__/typescript-basic.json +37 -0
- package/src/languages/astgrep-backend/GRAMMARS.md +86 -0
- package/src/languages/astgrep-backend/README.md +112 -0
- package/src/languages/astgrep-backend/__golden__/bash-basic.sh +53 -0
- package/src/languages/astgrep-backend/__golden__/c-basic.c +64 -0
- package/src/languages/astgrep-backend/__golden__/cpp-basic.cpp +65 -0
- package/src/languages/astgrep-backend/__golden__/csharp-basic.cs +73 -0
- package/src/languages/astgrep-backend/__golden__/go-basic.go +93 -0
- package/src/languages/astgrep-backend/__golden__/java-basic.java +62 -0
- package/src/languages/astgrep-backend/__golden__/kotlin-basic.kt +58 -0
- package/src/languages/astgrep-backend/__golden__/php-basic.php +72 -0
- package/src/languages/astgrep-backend/__golden__/ruby-basic.rb +62 -0
- package/src/languages/astgrep-backend/__golden__/rust-basic.rs +82 -0
- package/src/languages/astgrep-backend/__golden__/swift-basic.swift +73 -0
- package/src/languages/astgrep-backend/adapter.ts +240 -0
- package/src/languages/astgrep-backend/index.ts +44 -0
- package/src/languages/astgrep-backend/lang/README.md +115 -0
- package/src/languages/astgrep-backend/lang/bash.ts +78 -0
- package/src/languages/astgrep-backend/lang/c.ts +119 -0
- package/src/languages/astgrep-backend/lang/cpp.ts +65 -0
- package/src/languages/astgrep-backend/lang/csharp.ts +125 -0
- package/src/languages/astgrep-backend/lang/index.ts +61 -0
- package/src/languages/astgrep-backend/lang/java.ts +115 -0
- package/src/languages/astgrep-backend/lang/kotlin.ts +136 -0
- package/src/languages/astgrep-backend/lang/php.ts +105 -0
- package/src/languages/astgrep-backend/lang/ruby.ts +105 -0
- package/src/languages/astgrep-backend/lang/swift.ts +118 -0
- package/src/languages/astgrep-backend/languages.ts +238 -0
- package/src/languages/astgrep-backend/napi.ts +261 -0
- package/src/languages/astgrep-backend/syntax.ts +242 -0
- package/src/languages/index.ts +53 -0
- package/src/languages/javascript/index.ts +9 -0
- package/src/languages/jsx/index.ts +9 -0
- package/src/languages/prose/index.ts +270 -0
- package/src/languages/prose/line-bytes.ts +52 -0
- package/src/languages/python/README.md +246 -0
- package/src/languages/python/__golden__/python-basic.json +44 -0
- package/src/languages/python/create-adapter.ts +29 -0
- package/src/languages/python/index.ts +8 -0
- package/src/languages/python/profile.ts +341 -0
- package/src/languages/python/signature.ts +183 -0
- package/src/languages/python/table.ts +135 -0
- package/src/languages/shared/__fixtures__/large-over-32kib.ts.txt +1207 -0
- package/src/languages/shared/call-detection.ts +112 -0
- package/src/languages/shared/chunks.ts +255 -0
- package/src/languages/shared/create-adapter.ts +136 -0
- package/src/languages/shared/decisions.ts +204 -0
- package/src/languages/shared/dialect.ts +55 -0
- package/src/languages/shared/doc-binding.ts +78 -0
- package/src/languages/shared/engine.ts +461 -0
- package/src/languages/shared/extract-symbols.ts +35 -0
- package/src/languages/shared/fingerprint.ts +99 -0
- package/src/languages/shared/grammar-loader.ts +67 -0
- package/src/languages/shared/import-detection.ts +154 -0
- package/src/languages/shared/js-family-profile.ts +246 -0
- package/src/languages/shared/node-kinds.ts +153 -0
- package/src/languages/shared/node-utils.ts +120 -0
- package/src/languages/shared/parse-diagnostics.ts +125 -0
- package/src/languages/shared/parse-limits.ts +147 -0
- package/src/languages/shared/profile.ts +184 -0
- package/src/languages/shared/scope-model.ts +43 -0
- package/src/languages/shared/scope-naming.ts +124 -0
- package/src/languages/shared/scope-signature.ts +108 -0
- package/src/languages/shared/signature.ts +149 -0
- package/src/languages/shared/syntax.ts +116 -0
- package/src/languages/shared/table-profile-decisions.ts +251 -0
- package/src/languages/shared/table-profile-module-facts.ts +177 -0
- package/src/languages/shared/table-profile-queries.ts +85 -0
- package/src/languages/shared/table-profile-scopes.ts +198 -0
- package/src/languages/shared/table-profile.ts +427 -0
- package/src/languages/shared/tree-sitter-types.ts +46 -0
- package/src/languages/structured-text/index.ts +192 -0
- package/src/languages/tsx/index.ts +9 -0
- package/src/languages/typescript/index.ts +9 -0
- package/src/languages/vue/index.ts +312 -0
- package/src/languages/vue/mapping.ts +93 -0
- package/src/registry.ts +61 -0
- package/src/text/byte-offset-table.ts +63 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { COMMENT_TYPE, DECORATOR_TYPE } from "./node-kinds.js";
|
|
2
|
+
import { rangeOf, unionRange } from "./node-utils.js";
|
|
3
|
+
/** Climbs from a (possibly deeply nested) scope-defining node to its statement-level anchor. */
|
|
4
|
+
export function resolveDocAnchor(node) {
|
|
5
|
+
let anchor = node;
|
|
6
|
+
const parent = node.parent;
|
|
7
|
+
if (parent !== null) {
|
|
8
|
+
if (parent.type === "variable_declarator") {
|
|
9
|
+
const declarationList = parent.parent;
|
|
10
|
+
if (declarationList !== null &&
|
|
11
|
+
(declarationList.type === "lexical_declaration" ||
|
|
12
|
+
declarationList.type === "variable_declaration")) {
|
|
13
|
+
anchor = declarationList;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
else if (parent.type === "assignment_expression" &&
|
|
17
|
+
parent.parent?.type === "expression_statement") {
|
|
18
|
+
anchor = parent.parent;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (anchor.parent !== null && anchor.parent.type === "export_statement") {
|
|
22
|
+
anchor = anchor.parent;
|
|
23
|
+
}
|
|
24
|
+
return anchor;
|
|
25
|
+
}
|
|
26
|
+
const MAX_BLANK_LINES_BETWEEN_DOC_AND_SYMBOL = 1;
|
|
27
|
+
/** Resolves the bound doc-comment range for a scope-defining node, if any (spec.md §8.3 step 2). */
|
|
28
|
+
export function resolveDocRange(node, ctx) {
|
|
29
|
+
const anchor = resolveDocAnchor(node);
|
|
30
|
+
let cursor = anchor.previousSibling;
|
|
31
|
+
let boundary = anchor;
|
|
32
|
+
// Skip immediately-preceding decorators (they travel with the symbol's own range, not the doc range,
|
|
33
|
+
// but a comment further back must still be considered "immediately preceding" through them).
|
|
34
|
+
while (cursor !== null && cursor.type === DECORATOR_TYPE) {
|
|
35
|
+
boundary = cursor;
|
|
36
|
+
cursor = cursor.previousSibling;
|
|
37
|
+
}
|
|
38
|
+
let docRange;
|
|
39
|
+
while (cursor !== null && cursor.type === COMMENT_TYPE) {
|
|
40
|
+
const gap = boundary.startPosition.row - cursor.endPosition.row;
|
|
41
|
+
if (gap > MAX_BLANK_LINES_BETWEEN_DOC_AND_SYMBOL)
|
|
42
|
+
break;
|
|
43
|
+
const commentRange = rangeOf(cursor, ctx);
|
|
44
|
+
docRange = docRange === undefined ? commentRange : unionRange(commentRange, docRange);
|
|
45
|
+
boundary = cursor;
|
|
46
|
+
cursor = cursor.previousSibling;
|
|
47
|
+
}
|
|
48
|
+
return docRange;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=doc-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-binding.js","sourceRoot":"","sources":["../../../src/languages/shared/doc-binding.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGtD,gGAAgG;AAChG,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;YACtC,IACE,eAAe,KAAK,IAAI;gBACxB,CAAC,eAAe,CAAC,IAAI,KAAK,qBAAqB;oBAC7C,eAAe,CAAC,IAAI,KAAK,sBAAsB,CAAC,EAClD,CAAC;gBACD,MAAM,GAAG,eAAe,CAAC;YAC3B,CAAC;QACH,CAAC;aAAM,IACL,MAAM,CAAC,IAAI,KAAK,uBAAuB;YACvC,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,sBAAsB,EAC9C,CAAC;YACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACxE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,sCAAsC,GAAG,CAAC,CAAC;AAEjD,oGAAoG;AACpG,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,GAAoB;IACpE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;IACpC,IAAI,QAAQ,GAAG,MAAM,CAAC;IACtB,qGAAqG;IACrG,6FAA6F;IAC7F,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACzD,QAAQ,GAAG,MAAM,CAAC;QAClB,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;IAClC,CAAC;IAED,IAAI,QAAiC,CAAC;IACtC,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;QAChE,IAAI,GAAG,GAAG,sCAAsC;YAAE,MAAM;QACxD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1C,QAAQ,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACtF,QAAQ,GAAG,MAAM,CAAC;QAClB,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;IAClC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single unified AST walk. Every `LanguageAdapter` extraction method
|
|
3
|
+
* (`extractSymbols`, `extractImports`, `extractCalls`, `computeComplexity`,
|
|
4
|
+
* `tokenizeForHalstead`, `extractChunks`) is a thin projection over the ONE
|
|
5
|
+
* `AnalysisResult` this module computes — see `create-adapter.ts`, which
|
|
6
|
+
* memoizes it per `ParsedAst` (via `WeakMap`) so calling multiple extract
|
|
7
|
+
* methods on the same parse re-walks the tree only once.
|
|
8
|
+
*
|
|
9
|
+
* Building everything in one pass is not just a performance optimization:
|
|
10
|
+
* it is what GUARANTEES that a `symbolScopeId` produced for a
|
|
11
|
+
* `SymbolScopeFact` (from `computeComplexity`) is the exact same string as
|
|
12
|
+
* the `callerScopeId` on a `RawCall` (from `extractCalls`) for a call
|
|
13
|
+
* written inside that scope — both come from the same live scope-stack
|
|
14
|
+
* frame during the same walk, not from two independently-reimplemented
|
|
15
|
+
* scope-id algorithms that could drift apart.
|
|
16
|
+
*
|
|
17
|
+
* TRAVERSIERUNG (WP-95): der Walk laeuft ueber die CURSOR-API
|
|
18
|
+
* (`tree.walk()` / `gotoFirstChild` / `gotoNextSibling` / `gotoParent`),
|
|
19
|
+
* NICHT ueber `node.children`. Gemessen an diesem Repository (716 Dateien,
|
|
20
|
+
* 128.219 Zeilen) kostete der `.children`-Weg 25,6 s fuer den Walk gegen
|
|
21
|
+
* 3,6 s fuers Parsen: jeder `.children`-Zugriff baut ein JS-Array aus
|
|
22
|
+
* Knotenwrappern und ueberquert die Grenze zur nativen Bibliothek einmal je
|
|
23
|
+
* Knoten. Der Cursor haelt die Position nativ.
|
|
24
|
+
*
|
|
25
|
+
* WAS DER CURSOR NICHT HAT, und wie es hier ersetzt wird:
|
|
26
|
+
* - `node.parent` -> `parentTypeAt[depth]`, waehrend des Abstiegs gefuehrt.
|
|
27
|
+
* - `node.childCount === 0` -> ein probeweises `gotoFirstChild()`; schlaegt
|
|
28
|
+
* es fehl, ist der Knoten ein Blatt (sonst bringt `gotoParent()` zurueck).
|
|
29
|
+
* - `parent.childForFieldName(...)` fuer die Rolle eines Bezeichners ->
|
|
30
|
+
* `cursor.currentFieldName`, das denselben Feldnamen ohne Wrapper liefert.
|
|
31
|
+
*
|
|
32
|
+
* Ein `SyntaxNode`-Wrapper entsteht nur noch dort, wo ein Detektor ihn
|
|
33
|
+
* wirklich braucht (siehe `visitInnerNode`) — wer diese Vorsiebe aufweicht,
|
|
34
|
+
* baut die Grenzueberquerung je Knoten wieder ein.
|
|
35
|
+
*/
|
|
36
|
+
import type { ComplexityFacts, RawCall, RawImport } from "@untangle-code/domain";
|
|
37
|
+
import type { FileTextContext } from "./node-utils.js";
|
|
38
|
+
import type { LanguageProfile } from "./profile.js";
|
|
39
|
+
import type { ScopeNode } from "./scope-model.js";
|
|
40
|
+
import type { SyntaxNode } from "./syntax.js";
|
|
41
|
+
export interface AnalysisResult {
|
|
42
|
+
scopeTree: ScopeNode;
|
|
43
|
+
facts: ComplexityFacts;
|
|
44
|
+
imports: RawImport[];
|
|
45
|
+
calls: RawCall[];
|
|
46
|
+
}
|
|
47
|
+
/** Runs the single unified walk over a file's root node. */
|
|
48
|
+
export declare function analyzeTree(root: SyntaxNode, ctx: FileTextContext, fileId: string, profile: LanguageProfile): AnalysisResult;
|
|
49
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,KAAK,EACV,eAAe,EAIf,OAAO,EACP,SAAS,EAIV,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,cAAc,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAyUD,4DAA4D;AAC5D,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,GACvB,cAAc,CAgEhB"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { lambdaNesting } from "./decisions.js";
|
|
2
|
+
import { computeAstHash, computeTokenFingerprint } from "./fingerprint.js";
|
|
3
|
+
import { commentRangeOfCursor, rangeOf, rangeOfCursor } from "./node-utils.js";
|
|
4
|
+
import { isExecutableScopeKind } from "./profile.js";
|
|
5
|
+
/** Separates scope-id components (U+001F, unit separator) — avoids the classic "ab"+"c" == "a"+"bc" join ambiguity. */
|
|
6
|
+
const SCOPE_ID_SEPARATOR = "";
|
|
7
|
+
function toSymbolScopeFact(frame, parentScopeId) {
|
|
8
|
+
const { scopeNode } = frame;
|
|
9
|
+
return {
|
|
10
|
+
symbolScopeId: scopeNode.scopeId,
|
|
11
|
+
name: scopeNode.name,
|
|
12
|
+
qualifiedName: scopeNode.qualifiedName,
|
|
13
|
+
kind: scopeNode.kind,
|
|
14
|
+
range: scopeNode.range,
|
|
15
|
+
...(parentScopeId !== undefined ? { parentScopeId } : {}),
|
|
16
|
+
executable: scopeNode.executable,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function openScope(cursor, node, parent, profile, ctx, fileId, out) {
|
|
20
|
+
if (profile.suppressesScope(node))
|
|
21
|
+
return null;
|
|
22
|
+
const kind = profile.scopeKindOf(node);
|
|
23
|
+
if (kind === null)
|
|
24
|
+
return null;
|
|
25
|
+
const name = profile.scopeName(node);
|
|
26
|
+
// WP-237: Sprachen, die den Traeger als FELD statt als Elternknoten fuehren
|
|
27
|
+
// (Gos Methodenempfaenger), liefern ihn hier nach. Der SYMBOLNAME bleibt
|
|
28
|
+
// unveraendert `Run` — nur der qualifizierte Name wird `A.Run`, damit zwei
|
|
29
|
+
// gleichnamige Methoden auf verschiedenen Typen unterscheidbar bleiben.
|
|
30
|
+
const qualifier = profile.scopeQualifier?.(node);
|
|
31
|
+
const localName = qualifier === undefined ? name : `${qualifier}.${name}`;
|
|
32
|
+
const qualifiedName = parent.qualifiedName.length > 0 ? `${parent.qualifiedName}.${localName}` : localName;
|
|
33
|
+
const counterKey = `${kind}:${qualifiedName}`;
|
|
34
|
+
const ordinal = parent.childOrdinalCounters.get(counterKey) ?? 0;
|
|
35
|
+
parent.childOrdinalCounters.set(counterKey, ordinal + 1);
|
|
36
|
+
const scopeId = [fileId, "scope", qualifiedName, kind, String(ordinal)].join(SCOPE_ID_SEPARATOR);
|
|
37
|
+
const signature = profile.scopeSignature(node, kind, name);
|
|
38
|
+
const docRange = profile.docRange(node, ctx);
|
|
39
|
+
const executable = isExecutableScopeKind(kind);
|
|
40
|
+
const visibility = profile.visibility(node, name);
|
|
41
|
+
const parentQualifiedName = parent.qualifiedName.length > 0 ? parent.qualifiedName : undefined;
|
|
42
|
+
const scopeNode = {
|
|
43
|
+
scopeId,
|
|
44
|
+
kind,
|
|
45
|
+
name,
|
|
46
|
+
qualifiedName,
|
|
47
|
+
...(parentQualifiedName !== undefined ? { parentQualifiedName } : {}),
|
|
48
|
+
range: rangeOf(node, ctx),
|
|
49
|
+
...(docRange !== undefined ? { docRange } : {}),
|
|
50
|
+
...(signature.raw !== undefined ? { signature: signature.raw } : {}),
|
|
51
|
+
normalizedSignature: signature.normalized,
|
|
52
|
+
exportedNames: profile.exportedNames(node, name),
|
|
53
|
+
...(visibility !== undefined ? { visibility } : {}),
|
|
54
|
+
executable,
|
|
55
|
+
astHash: computeAstHash(cursor, profile),
|
|
56
|
+
tokenFingerprint: computeTokenFingerprint(cursor, profile),
|
|
57
|
+
node,
|
|
58
|
+
children: [],
|
|
59
|
+
};
|
|
60
|
+
const frame = {
|
|
61
|
+
scopeId,
|
|
62
|
+
qualifiedName,
|
|
63
|
+
executable,
|
|
64
|
+
scopeNode,
|
|
65
|
+
childOrdinalCounters: new Map(),
|
|
66
|
+
};
|
|
67
|
+
out.symbolScopes.push(toSymbolScopeFact(frame, parent.scopeId));
|
|
68
|
+
parent.scopeNode.children.push(scopeNode);
|
|
69
|
+
return frame;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Ein Blattknoten (kein Kind) wird eingeordnet. Der Cursor steht auf ihm; ein
|
|
73
|
+
* `SyntaxNode`-Wrapper wird NICHT gebaut — `nodeText`, `nodeType` und
|
|
74
|
+
* `currentFieldName` liefern alles Noetige, `parentType` kommt aus dem Abstieg.
|
|
75
|
+
*
|
|
76
|
+
* Die frueher hier stehende `predefined_type`-Pruefung ist ENTFALLEN, nicht
|
|
77
|
+
* vergessen: der einzige Aufrufer (`walkWithCursor`) siebt diesen Fall bereits
|
|
78
|
+
* vor dem Blatt-Zweig aus (ueber `profile.typeKeywordParentKinds`), die
|
|
79
|
+
* Pruefung war an dieser Stelle unerreichbar.
|
|
80
|
+
*/
|
|
81
|
+
function classifyAndRecordLeaf(cursor, nodeType, parentType, range, frame, profile, out) {
|
|
82
|
+
const scopeId = frame.scopeId;
|
|
83
|
+
if (profile.identifierLeafKinds.has(nodeType)) {
|
|
84
|
+
const text = cursor.nodeText;
|
|
85
|
+
out.identifiers.push({
|
|
86
|
+
name: text,
|
|
87
|
+
range,
|
|
88
|
+
symbolScopeId: scopeId,
|
|
89
|
+
role: profile.identifierRole(cursor.currentFieldName, parentType),
|
|
90
|
+
});
|
|
91
|
+
out.operands.push({ text, range, symbolScopeId: scopeId });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (profile.simpleLiteralLeafKinds.has(nodeType)) {
|
|
95
|
+
const text = cursor.nodeText;
|
|
96
|
+
out.literals.push({
|
|
97
|
+
raw: text,
|
|
98
|
+
literalKind: profile.simpleLiteralKind(nodeType),
|
|
99
|
+
range,
|
|
100
|
+
symbolScopeId: scopeId,
|
|
101
|
+
});
|
|
102
|
+
out.operands.push({ text, range, symbolScopeId: scopeId });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (profile.templateTextLeafKinds.has(nodeType)) {
|
|
106
|
+
const text = cursor.nodeText;
|
|
107
|
+
out.literals.push({ raw: text, literalKind: "template", range, symbolScopeId: scopeId });
|
|
108
|
+
out.operands.push({ text, range, symbolScopeId: scopeId });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (profile.ignoredPunctuationKinds.has(nodeType))
|
|
112
|
+
return;
|
|
113
|
+
out.operators.push({ text: cursor.nodeText, range, symbolScopeId: scopeId });
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Alles, was ein innerer Knoten (mindestens ein Kind) beitraegt: Entscheidung,
|
|
117
|
+
* Nesting, Import, Aufruf, eigener Scope. Gibt den neu geoeffneten Scope-Rahmen
|
|
118
|
+
* zurueck, sonst `null`.
|
|
119
|
+
*
|
|
120
|
+
* HIER und nur hier entsteht ein `SyntaxNode`-Wrapper, und nur wenn das Profil
|
|
121
|
+
* fuer diese Knotenart ueberhaupt einen Detektor auf den Plan ruft
|
|
122
|
+
* (`profile.needsNode`). Fuer die grosse Mehrheit der inneren Knoten faellt die
|
|
123
|
+
* Grenzueberquerung damit ganz weg — beim tree-sitter-Backend spart das den
|
|
124
|
+
* Wrapper, beim ast-grep-Backend den weit teureren `children()`-Aufbau.
|
|
125
|
+
*/
|
|
126
|
+
function visitInnerNode(cursor, nodeType, range, frame, profile, ctx, fileId, out) {
|
|
127
|
+
// Kein Detektor zustaendig: kein Wrapper, kein Scope. Das Lambda-Nesting
|
|
128
|
+
// unten kann hier nicht verloren gehen — ein funktionsartiger Knoten oeffnet
|
|
129
|
+
// immer auch einen Scope, also ist `needsNode` dort wahr (in
|
|
130
|
+
// `js-family-profile.ts` wie in `table-profile.ts` durch Konstruktion).
|
|
131
|
+
if (!profile.needsNode(nodeType))
|
|
132
|
+
return null;
|
|
133
|
+
const node = cursor.currentNode;
|
|
134
|
+
// Decision / nesting facts.
|
|
135
|
+
const detected = profile.detectDecisionAndNesting(node);
|
|
136
|
+
if (detected.decision !== undefined) {
|
|
137
|
+
const fact = {
|
|
138
|
+
kind: detected.decision.kind,
|
|
139
|
+
range,
|
|
140
|
+
symbolScopeId: frame.scopeId,
|
|
141
|
+
countsForClassic: detected.decision.countsForClassic,
|
|
142
|
+
countsForExtended: detected.decision.countsForExtended,
|
|
143
|
+
...(detected.decision.logicalGroupId !== undefined
|
|
144
|
+
? { logicalGroupId: detected.decision.logicalGroupId }
|
|
145
|
+
: {}),
|
|
146
|
+
};
|
|
147
|
+
// `repeat` (Vorgabe 1) ist die flache n-stellige Alternative — siehe
|
|
148
|
+
// `DetectedDecision.repeat`. Jede Wiederholung ist eine EIGENE Tatsache
|
|
149
|
+
// mit demselben Bereich, kein Zaehler auf einer.
|
|
150
|
+
for (let index = 0; index < (detected.decision.repeat ?? 1); index += 1) {
|
|
151
|
+
out.decisions.push({ ...fact });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (detected.nesting !== undefined) {
|
|
155
|
+
out.nestingEvents.push({
|
|
156
|
+
construct: detected.nesting.construct,
|
|
157
|
+
range,
|
|
158
|
+
symbolScopeId: frame.scopeId,
|
|
159
|
+
continuation: detected.nesting.continuation,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// Importe und Aufrufe (Aufrufe dem AKTUELLEN Scope zugerechnet, also dem Rufer).
|
|
163
|
+
const sink = { imports: out.imports, calls: out.calls };
|
|
164
|
+
profile.collectModuleFacts(node, nodeType, frame.scopeId, ctx, sink);
|
|
165
|
+
const openedScope = openScope(cursor, node, frame, profile, ctx, fileId, out);
|
|
166
|
+
// A directly-nested function-like node (lambda/local function) inside an
|
|
167
|
+
// already-executable scope gets an extra lambda nesting event (spec.md
|
|
168
|
+
// §16.4: "lokale Funktionen/Lambdas verwenden einen dokumentierten
|
|
169
|
+
// Nesting-Kontext") in addition to becoming its own scope below. A node kind
|
|
170
|
+
// can be function-like only in a particular syntactic context, so a rejected
|
|
171
|
+
// scope must not leave behind a phantom lambda event.
|
|
172
|
+
if (openedScope !== null && frame.executable && profile.functionLikeKinds.has(nodeType)) {
|
|
173
|
+
const lambda = lambdaNesting();
|
|
174
|
+
out.nestingEvents.push({
|
|
175
|
+
construct: lambda.construct,
|
|
176
|
+
range,
|
|
177
|
+
symbolScopeId: frame.scopeId,
|
|
178
|
+
continuation: lambda.continuation,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return openedScope;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Der vereinheitlichte Walk, iterativ ueber einen Baumcursor.
|
|
185
|
+
*
|
|
186
|
+
* Der Cursor beginnt auf der Wurzel und endet wieder dort. Besuchsreihenfolge,
|
|
187
|
+
* `depth`-Zaehlung und die Reihenfolge JEDER Faktenliste sind identisch mit
|
|
188
|
+
* der frueheren Rekursion ueber `node.children` — die Gegenprobe
|
|
189
|
+
* (`diff-walk.mjs`, siehe README) faehrt beide Wege ueber dieses Repository
|
|
190
|
+
* und vergleicht Symbole, Regionen, Chunk-IDs und Metriken Datei fuer Datei.
|
|
191
|
+
*
|
|
192
|
+
* `frameAt`/`parentTypeAt` sind nach Tiefe indiziert und ersetzen zusammen den
|
|
193
|
+
* Aufrufstapel der Rekursion samt `node.parent`. Eintraege unterhalb der
|
|
194
|
+
* aktuellen Tiefe sind veraltet, werden aber vor jedem Lesen ueberschrieben.
|
|
195
|
+
*/
|
|
196
|
+
function walkWithCursor(cursor, rootType, rootFrame, profile, ctx, fileId, out) {
|
|
197
|
+
if (!cursor.gotoFirstChild())
|
|
198
|
+
return;
|
|
199
|
+
const frameAt = [rootFrame, rootFrame];
|
|
200
|
+
const parentTypeAt = [rootType, rootType];
|
|
201
|
+
let depth = 1;
|
|
202
|
+
for (;;) {
|
|
203
|
+
const frame = frameAt[depth];
|
|
204
|
+
const parentType = parentTypeAt[depth];
|
|
205
|
+
const nodeType = cursor.nodeType;
|
|
206
|
+
const range = rangeOfCursor(cursor, ctx);
|
|
207
|
+
out.nodeKinds.push({ kind: nodeType, depth, symbolScopeId: frame.scopeId });
|
|
208
|
+
let descended = false;
|
|
209
|
+
if (profile.commentKinds.has(nodeType)) {
|
|
210
|
+
out.comments.push(commentRangeOfCursor(cursor, ctx));
|
|
211
|
+
}
|
|
212
|
+
else if (profile.typeKeywordParentKinds.has(parentType)) {
|
|
213
|
+
// Ein Typschluessselwort-Blatt (z. B. das `string`/`number`/`void`-Kind
|
|
214
|
+
// von `predefined_type`): dieselben Namen wie Literale, aber Typsyntax,
|
|
215
|
+
// kein Wert. Weiter in `nodeKinds` gezaehlt (oben), nie als
|
|
216
|
+
// Operator/Operand/Literal/Bezeichner. Muss VOR dem Literalcontainer
|
|
217
|
+
// unten stehen: das Kind fuer das Typschluesselwort `string` hat den
|
|
218
|
+
// Knotentyp "string" — genau denselben wie ein echtes Zeichenkettenliteral.
|
|
219
|
+
}
|
|
220
|
+
else if (profile.literalContainerKinds.has(nodeType)) {
|
|
221
|
+
const text = cursor.nodeText;
|
|
222
|
+
out.operands.push({ text, range, symbolScopeId: frame.scopeId });
|
|
223
|
+
out.literals.push({
|
|
224
|
+
raw: text,
|
|
225
|
+
literalKind: profile.containerLiteralKind(nodeType),
|
|
226
|
+
range,
|
|
227
|
+
symbolScopeId: frame.scopeId,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
else if (!cursor.gotoFirstChild()) {
|
|
231
|
+
// Der Cursor kennt kein `childCount`: der fehlgeschlagene Abstieg IST
|
|
232
|
+
// die Blattpruefung, und er hat die Position nicht veraendert.
|
|
233
|
+
classifyAndRecordLeaf(cursor, nodeType, parentType, range, frame, profile, out);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
cursor.gotoParent(); // zurueck auf den inneren Knoten selbst
|
|
237
|
+
const childFrame = visitInnerNode(cursor, nodeType, range, frame, profile, ctx, fileId, out);
|
|
238
|
+
cursor.gotoFirstChild();
|
|
239
|
+
depth += 1;
|
|
240
|
+
frameAt[depth] = childFrame ?? frame;
|
|
241
|
+
parentTypeAt[depth] = nodeType;
|
|
242
|
+
descended = true;
|
|
243
|
+
}
|
|
244
|
+
if (descended)
|
|
245
|
+
continue;
|
|
246
|
+
// Aufsteigen, bis ein Geschwisterknoten da ist. Tiefe 1 ohne Geschwister
|
|
247
|
+
// heisst: die Kinder der Wurzel sind abgearbeitet.
|
|
248
|
+
while (!cursor.gotoNextSibling()) {
|
|
249
|
+
if (depth === 1)
|
|
250
|
+
return;
|
|
251
|
+
cursor.gotoParent();
|
|
252
|
+
depth -= 1;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/** Runs the single unified walk over a file's root node. */
|
|
257
|
+
export function analyzeTree(root, ctx, fileId, profile) {
|
|
258
|
+
const out = {
|
|
259
|
+
symbolScopes: [],
|
|
260
|
+
decisions: [],
|
|
261
|
+
nestingEvents: [],
|
|
262
|
+
operators: [],
|
|
263
|
+
operands: [],
|
|
264
|
+
nodeKinds: [],
|
|
265
|
+
comments: [],
|
|
266
|
+
identifiers: [],
|
|
267
|
+
literals: [],
|
|
268
|
+
imports: [],
|
|
269
|
+
calls: [],
|
|
270
|
+
};
|
|
271
|
+
// EIN Cursor fuer alles: er beginnt auf der Wurzel, und nur ein von der
|
|
272
|
+
// Wurzel her abgestiegener Cursor meldet Knotentypen verlaesslich (siehe
|
|
273
|
+
// `fingerprint.ts`, Punkt 2). Jede Hilfsfunktion, die ihn bewegt, gibt ihn
|
|
274
|
+
// an der Ausgangsposition zurueck.
|
|
275
|
+
const cursor = root.walk();
|
|
276
|
+
const fileScopeNode = {
|
|
277
|
+
scopeId: fileId,
|
|
278
|
+
kind: "file",
|
|
279
|
+
name: "",
|
|
280
|
+
qualifiedName: "",
|
|
281
|
+
range: rangeOf(root, ctx),
|
|
282
|
+
normalizedSignature: "",
|
|
283
|
+
exportedNames: [],
|
|
284
|
+
executable: true,
|
|
285
|
+
astHash: computeAstHash(cursor, profile),
|
|
286
|
+
tokenFingerprint: computeTokenFingerprint(cursor, profile),
|
|
287
|
+
node: root,
|
|
288
|
+
children: [],
|
|
289
|
+
};
|
|
290
|
+
const rootFrame = {
|
|
291
|
+
scopeId: fileId,
|
|
292
|
+
qualifiedName: "",
|
|
293
|
+
executable: true,
|
|
294
|
+
scopeNode: fileScopeNode,
|
|
295
|
+
childOrdinalCounters: new Map(),
|
|
296
|
+
};
|
|
297
|
+
out.symbolScopes.push(toSymbolScopeFact(rootFrame, undefined));
|
|
298
|
+
walkWithCursor(cursor, root.type, rootFrame, profile, ctx, fileId, out);
|
|
299
|
+
const facts = {
|
|
300
|
+
symbolScopes: out.symbolScopes,
|
|
301
|
+
decisions: out.decisions,
|
|
302
|
+
nestingEvents: out.nestingEvents,
|
|
303
|
+
operators: out.operators,
|
|
304
|
+
operands: out.operands,
|
|
305
|
+
nodeKinds: out.nodeKinds,
|
|
306
|
+
comments: out.comments,
|
|
307
|
+
identifiers: out.identifiers,
|
|
308
|
+
literals: out.literals,
|
|
309
|
+
// Leer AN DIESER STELLE mit Absicht: die Parse-Diagnosen entstehen in
|
|
310
|
+
// `parse()` und werden in `create-adapter.ts#getAnalysis` eingesetzt,
|
|
311
|
+
// bevor die Facts den Adapter verlassen. Wer diese Zeile als "sowieso
|
|
312
|
+
// immer leer" liest, hat den falschen Ausschnitt vor sich.
|
|
313
|
+
parseDiagnostics: [],
|
|
314
|
+
};
|
|
315
|
+
return { scopeTree: fileScopeNode, facts, imports: out.imports, calls: out.calls };
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/languages/shared/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ExtractedSymbol } from "@untangle-code/domain";
|
|
2
|
+
import type { ScopeNode } from "./scope-model.js";
|
|
3
|
+
/** Flattens the scope tree (excluding the synthetic file-level root) into `ExtractedSymbol[]`, document order. */
|
|
4
|
+
export declare function extractedSymbolsOf(fileScope: ScopeNode): ExtractedSymbol[];
|
|
5
|
+
//# sourceMappingURL=extract-symbols.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-symbols.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/extract-symbols.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAqBlD,kHAAkH;AAClH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,EAAE,CAU1E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function toExtractedSymbol(scope) {
|
|
2
|
+
return {
|
|
3
|
+
name: scope.name,
|
|
4
|
+
qualifiedName: scope.qualifiedName,
|
|
5
|
+
kind: scope.kind,
|
|
6
|
+
...(scope.signature !== undefined ? { signature: scope.signature } : {}),
|
|
7
|
+
normalizedSignature: scope.normalizedSignature,
|
|
8
|
+
range: scope.range,
|
|
9
|
+
...(scope.docRange !== undefined ? { docRange: scope.docRange } : {}),
|
|
10
|
+
...(scope.parentQualifiedName !== undefined
|
|
11
|
+
? { parentQualifiedName: scope.parentQualifiedName }
|
|
12
|
+
: {}),
|
|
13
|
+
exportedNames: scope.exportedNames,
|
|
14
|
+
...(scope.visibility !== undefined ? { visibility: scope.visibility } : {}),
|
|
15
|
+
astHash: scope.astHash,
|
|
16
|
+
tokenFingerprint: scope.tokenFingerprint,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Flattens the scope tree (excluding the synthetic file-level root) into `ExtractedSymbol[]`, document order. */
|
|
20
|
+
export function extractedSymbolsOf(fileScope) {
|
|
21
|
+
const symbols = [];
|
|
22
|
+
const visit = (scope) => {
|
|
23
|
+
for (const child of scope.children) {
|
|
24
|
+
symbols.push(toExtractedSymbol(child));
|
|
25
|
+
visit(child);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
visit(fileScope);
|
|
29
|
+
return symbols;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=extract-symbols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-symbols.js","sourceRoot":"","sources":["../../../src/languages/shared/extract-symbols.ts"],"names":[],"mappings":"AAIA,SAAS,iBAAiB,CAAC,KAAgB;IACzC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC;AACJ,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,kBAAkB,CAAC,SAAoB;IACrD,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,KAAgB,EAAQ,EAAE;QACvC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,SAAS,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LanguageProfile } from "./profile.js";
|
|
2
|
+
import type { SyntaxCursor } from "./syntax.js";
|
|
3
|
+
/** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
|
|
4
|
+
export declare function computeAstHash(cursor: SyntaxCursor, profile: LanguageProfile): string;
|
|
5
|
+
/** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
|
|
6
|
+
export declare function computeTokenFingerprint(cursor: SyntaxCursor, profile: LanguageProfile): string;
|
|
7
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/fingerprint.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA4BhD,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAErF;AAoBD,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAI9F"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol fingerprints for change matching (spec.md §17.3).
|
|
3
|
+
*
|
|
4
|
+
* `astHash` — a structural fingerprint: the SHA-256 of a parenthesized
|
|
5
|
+
* `kind(child,child,...)` shape string built from node TYPES only (never
|
|
6
|
+
* identifier/literal text, never whitespace/positions). Two symbols with the
|
|
7
|
+
* same shape but renamed identifiers or reformatted whitespace hash
|
|
8
|
+
* identically — this is `spec.md §17.3` step 3 ("identischer
|
|
9
|
+
* AST-Fingerprint").
|
|
10
|
+
*
|
|
11
|
+
* `tokenFingerprint` — a lexical fingerprint: the SHA-256 of every leaf
|
|
12
|
+
* token's literal TEXT, in source order, joined by U+001F. Unlike
|
|
13
|
+
* `astHash`, a rename DOES change this fingerprint, but formatting
|
|
14
|
+
* (whitespace-only changes) does not, matching `spec.md §17.3` step 4's
|
|
15
|
+
* "Token-/MinHash-Ähnlichkeit" input.
|
|
16
|
+
*
|
|
17
|
+
* Both exclude comments (a doc-comment edit must not look like a structural
|
|
18
|
+
* or lexical change to the symbol it documents).
|
|
19
|
+
*
|
|
20
|
+
* TRAVERSIERUNG (WP-95): beide Funktionen bekommen den CURSOR des laufenden
|
|
21
|
+
* Walks und laufen den Teilbaum ab der aktuellen Position ab; sie geben ihn
|
|
22
|
+
* an genau dieser Position zurueck. Zwei Gruende, keiner davon Geschmack:
|
|
23
|
+
*
|
|
24
|
+
* 1) Tempo. Sie laufen nicht einmal je Datei, sondern einmal je Scope UND
|
|
25
|
+
* einmal je Wurzel — der Teilbaum eines verschachtelten Symbols wird also
|
|
26
|
+
* so oft durchlaufen, wie er Scopes ueber sich hat. Ueber `.children`
|
|
27
|
+
* hiesse das ein Wrapper-Array je Knoten und Durchlauf.
|
|
28
|
+
*
|
|
29
|
+
* 2) RICHTIGKEIT, und das wiegt schwerer. `tree-sitter@0.21.1` meldet den
|
|
30
|
+
* Typ eines Knotens NUR dann verlaesslich, wenn der Cursor von der Wurzel
|
|
31
|
+
* her abgestiegen ist. Weder `node.children` noch ein auf einen Teilbaum
|
|
32
|
+
* zurueckgesetzter Cursor (`node.walk()`) haben den Alias-Zusammenhang
|
|
33
|
+
* des Elternknotens; in diesem Repository meldeten beide 1.411
|
|
34
|
+
* Kommentarknoten in 207 Dateien als `interface_body`. Genau diese
|
|
35
|
+
* Knoten hat der frueher hier stehende `.children`-Lauf NICHT als
|
|
36
|
+
* Kommentar erkannt und ihren Text in beide Fingerabdruecke geschrieben —
|
|
37
|
+
* entgegen der Zusage zwei Absaetze weiter oben. Wer diese Funktionen
|
|
38
|
+
* wieder auf `node.walk()` umstellt, baut den Defekt neu ein.
|
|
39
|
+
*/
|
|
40
|
+
import { sha256Hex } from "@untangle-code/domain";
|
|
41
|
+
/**
|
|
42
|
+
* Baut die Formzeichenkette fuer den Knoten, auf dem der Cursor steht, und
|
|
43
|
+
* laesst den Cursor GENAU DORT zurueck: jede `gotoFirstChild`-Bewegung wird
|
|
44
|
+
* von einem `gotoParent` aufgewogen. Wer das verletzt, verschiebt die
|
|
45
|
+
* Traversierung des Aufrufers.
|
|
46
|
+
*/
|
|
47
|
+
function structuralShapeAt(cursor, profile) {
|
|
48
|
+
const type = cursor.nodeType;
|
|
49
|
+
if (profile.commentKinds.has(type))
|
|
50
|
+
return "";
|
|
51
|
+
if (profile.literalContainerKinds.has(type))
|
|
52
|
+
return type;
|
|
53
|
+
if (!cursor.gotoFirstChild())
|
|
54
|
+
return type; // entspricht node.childCount === 0
|
|
55
|
+
const childShapes = [];
|
|
56
|
+
do {
|
|
57
|
+
// Kommentarkinder werden AUSGELASSEN, nicht als "" aufgenommen — genau
|
|
58
|
+
// das tat das frueher vorgeschaltete
|
|
59
|
+
// `.filter((child) => child.type !== "comment")`.
|
|
60
|
+
if (!profile.commentKinds.has(cursor.nodeType)) {
|
|
61
|
+
childShapes.push(structuralShapeAt(cursor, profile));
|
|
62
|
+
}
|
|
63
|
+
} while (cursor.gotoNextSibling());
|
|
64
|
+
cursor.gotoParent();
|
|
65
|
+
return `${type}(${childShapes.join(",")})`;
|
|
66
|
+
}
|
|
67
|
+
/** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
|
|
68
|
+
export function computeAstHash(cursor, profile) {
|
|
69
|
+
return sha256Hex(structuralShapeAt(cursor, profile));
|
|
70
|
+
}
|
|
71
|
+
/** Sammelt die Blatttexte; laesst den Cursor auf dem Ausgangsknoten zurueck. */
|
|
72
|
+
function collectLeafTextsAt(cursor, profile, out) {
|
|
73
|
+
const type = cursor.nodeType;
|
|
74
|
+
if (profile.commentKinds.has(type))
|
|
75
|
+
return;
|
|
76
|
+
if (profile.literalContainerKinds.has(type)) {
|
|
77
|
+
out.push(cursor.nodeText);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (!cursor.gotoFirstChild()) {
|
|
81
|
+
out.push(cursor.nodeText); // entspricht node.childCount === 0
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
do {
|
|
85
|
+
collectLeafTextsAt(cursor, profile, out);
|
|
86
|
+
} while (cursor.gotoNextSibling());
|
|
87
|
+
cursor.gotoParent();
|
|
88
|
+
}
|
|
89
|
+
/** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
|
|
90
|
+
export function computeTokenFingerprint(cursor, profile) {
|
|
91
|
+
const tokens = [];
|
|
92
|
+
collectLeafTextsAt(cursor, profile, tokens);
|
|
93
|
+
return sha256Hex(tokens.join("\u001f"));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../src/languages/shared/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,MAAoB,EAAE,OAAwB;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,IAAI,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;QAAE,OAAO,IAAI,CAAC,CAAC,mCAAmC;IAE9E,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,GAAG,CAAC;QACF,uEAAuE;QACvE,qCAAqC;QACrC,kDAAkD;QAClD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/C,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,EAAE;IACnC,MAAM,CAAC,UAAU,EAAE,CAAC;IAEpB,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,OAAwB;IAC3E,OAAO,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,gFAAgF;AAChF,SAAS,kBAAkB,CAAC,MAAoB,EAAE,OAAwB,EAAE,GAAa;IACvF,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC3C,IAAI,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,mCAAmC;QAC9D,OAAO;IACT,CAAC;IACD,GAAG,CAAC;QACF,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,EAAE;IACnC,MAAM,CAAC,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,uBAAuB,CAAC,MAAoB,EAAE,OAAwB;IACpF,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TsLanguage, TsParserCtor } from "./tree-sitter-types.js";
|
|
2
|
+
/** Lazily requires the native `tree-sitter` Parser constructor (once per process). */
|
|
3
|
+
export declare function loadParserCtor(): TsParserCtor;
|
|
4
|
+
/** Which grammar module a dialect is loaded from, and how to reach the language export. */
|
|
5
|
+
export interface GrammarSource {
|
|
6
|
+
/** npm module to `require` lazily. */
|
|
7
|
+
moduleName: "tree-sitter-typescript" | "tree-sitter-javascript";
|
|
8
|
+
/** Property on the required module holding the `Language`, or `undefined` for the module's default export itself. */
|
|
9
|
+
exportName?: "typescript" | "tsx";
|
|
10
|
+
}
|
|
11
|
+
/** Lazily requires and caches a single grammar `Language` handle. */
|
|
12
|
+
export declare function loadGrammar(source: GrammarSource): TsLanguage;
|
|
13
|
+
/** Test-only: clears caches so grammar-loading behavior can be re-exercised. */
|
|
14
|
+
export declare function resetGrammarCachesForTests(): void;
|
|
15
|
+
//# sourceMappingURL=grammar-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammar-loader.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/grammar-loader.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMvE,sFAAsF;AACtF,wBAAgB,cAAc,IAAI,YAAY,CAK7C;AAED,2FAA2F;AAC3F,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,UAAU,EAAE,wBAAwB,GAAG,wBAAwB,CAAC;IAChE,qHAAqH;IACrH,UAAU,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;CACnC;AAQD,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAa7D;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD"}
|