@untangle-code/parser-registry 0.0.0-stage → 0.1.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/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,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tree-sitter node `.type` string constants shared by the JS/TS grammar
|
|
3
|
+
* family (tree-sitter-javascript, tree-sitter-typescript `typescript` and
|
|
4
|
+
* `tsx` dialects). Verified against each grammar's `src/node-types.json`
|
|
5
|
+
* (see package README, "Grammatik-Wahl").
|
|
6
|
+
*
|
|
7
|
+
* A set may list a node kind that a particular dialect's grammar never
|
|
8
|
+
* actually produces (e.g. `public_field_definition` never appears in a
|
|
9
|
+
* plain JavaScript tree) — that is harmless: `Set#has` on a type string the
|
|
10
|
+
* grammar never emits simply never matches.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Nodes whose entire subtree collapses to ONE operand/literal token (do not
|
|
14
|
+
* recurse into children). `template_string` is deliberately EXCLUDED here
|
|
15
|
+
* even though it is a literal: `${expr}` interpolations can contain calls,
|
|
16
|
+
* identifiers and decisions that must still be walked (verified against the
|
|
17
|
+
* grammar: a `template_string` node's children are `` ` ``, `string_fragment`,
|
|
18
|
+
* `escape_sequence` and `template_substitution` — see `TEMPLATE_TEXT_LEAF_TYPES`
|
|
19
|
+
* below, and the `` ` ``/`${` delimiters folded into `IGNORED_PUNCTUATION_TYPES`,
|
|
20
|
+
* for how its non-substitution parts are classified instead).
|
|
21
|
+
*/
|
|
22
|
+
export const LITERAL_CONTAINER_STOP_TYPES = new Set(["string", "regex"]);
|
|
23
|
+
/** Static-text leaves inside a `template_string` (its non-`${}` content) — operands. */
|
|
24
|
+
export const TEMPLATE_TEXT_LEAF_TYPES = new Set([
|
|
25
|
+
"string_fragment",
|
|
26
|
+
"escape_sequence",
|
|
27
|
+
]);
|
|
28
|
+
/** Leaf node types that are identifier occurrences (operands). */
|
|
29
|
+
export const IDENTIFIER_LEAF_TYPES = new Set([
|
|
30
|
+
"identifier",
|
|
31
|
+
"property_identifier",
|
|
32
|
+
"type_identifier",
|
|
33
|
+
"private_property_identifier",
|
|
34
|
+
"shorthand_property_identifier",
|
|
35
|
+
"shorthand_property_identifier_pattern",
|
|
36
|
+
"statement_identifier",
|
|
37
|
+
"this",
|
|
38
|
+
"super",
|
|
39
|
+
]);
|
|
40
|
+
/** Leaf node types that are simple (non-container) literals. */
|
|
41
|
+
export const SIMPLE_LITERAL_LEAF_TYPES = new Set([
|
|
42
|
+
"number",
|
|
43
|
+
"true",
|
|
44
|
+
"false",
|
|
45
|
+
"null",
|
|
46
|
+
"undefined",
|
|
47
|
+
]);
|
|
48
|
+
/** Punctuation leaves that count neither as operator nor operand (pure structure). */
|
|
49
|
+
export const IGNORED_PUNCTUATION_TYPES = new Set([
|
|
50
|
+
"(",
|
|
51
|
+
")",
|
|
52
|
+
"{",
|
|
53
|
+
"}",
|
|
54
|
+
"[",
|
|
55
|
+
"]",
|
|
56
|
+
",",
|
|
57
|
+
";",
|
|
58
|
+
".",
|
|
59
|
+
"`",
|
|
60
|
+
"${",
|
|
61
|
+
]);
|
|
62
|
+
/** Function-shaped scope node types (produce ExtractedSymbol kind "function"). */
|
|
63
|
+
export const FUNCTION_LIKE_TYPES = new Set([
|
|
64
|
+
"function_declaration",
|
|
65
|
+
"generator_function_declaration",
|
|
66
|
+
"function_expression",
|
|
67
|
+
"generator_function",
|
|
68
|
+
"arrow_function",
|
|
69
|
+
]);
|
|
70
|
+
export const METHOD_TYPE = "method_definition";
|
|
71
|
+
export const CLASS_TYPES = new Set([
|
|
72
|
+
"class_declaration",
|
|
73
|
+
"abstract_class_declaration",
|
|
74
|
+
"class",
|
|
75
|
+
]);
|
|
76
|
+
export const INTERFACE_TYPE = "interface_declaration";
|
|
77
|
+
export const TYPE_ALIAS_TYPE = "type_alias_declaration";
|
|
78
|
+
export const ENUM_TYPE = "enum_declaration";
|
|
79
|
+
export const NAMESPACE_TYPE = "internal_module";
|
|
80
|
+
export const FIELD_TYPES = new Set([
|
|
81
|
+
"field_definition",
|
|
82
|
+
"public_field_definition",
|
|
83
|
+
]);
|
|
84
|
+
/**
|
|
85
|
+
* `static { ... }` initialization block inside a class body. NOT a scope
|
|
86
|
+
* opener (it declares no symbol and has no name to build a stable scope id
|
|
87
|
+
* from) — but it carries executable content, so `chunks.ts` models it as an
|
|
88
|
+
* explicit child region of its class so its bytes become a real content
|
|
89
|
+
* chunk instead of falling through the chunker's member walk (spec.md §8.4:
|
|
90
|
+
* no silent data loss).
|
|
91
|
+
*/
|
|
92
|
+
export const CLASS_STATIC_BLOCK_TYPE = "class_static_block";
|
|
93
|
+
/** All node types that open a new symbol scope (superset across dialects). */
|
|
94
|
+
export const SCOPE_OPENING_TYPES = new Set([
|
|
95
|
+
...FUNCTION_LIKE_TYPES,
|
|
96
|
+
METHOD_TYPE,
|
|
97
|
+
...CLASS_TYPES,
|
|
98
|
+
INTERFACE_TYPE,
|
|
99
|
+
TYPE_ALIAS_TYPE,
|
|
100
|
+
ENUM_TYPE,
|
|
101
|
+
NAMESPACE_TYPE,
|
|
102
|
+
...FIELD_TYPES,
|
|
103
|
+
]);
|
|
104
|
+
/** Decision-bearing node types (spec.md §16.2-16.3). */
|
|
105
|
+
export const IF_STATEMENT = "if_statement";
|
|
106
|
+
export const LOOP_TYPES = new Set([
|
|
107
|
+
"for_statement",
|
|
108
|
+
"for_in_statement",
|
|
109
|
+
"while_statement",
|
|
110
|
+
"do_statement",
|
|
111
|
+
]);
|
|
112
|
+
export const CATCH_CLAUSE = "catch_clause";
|
|
113
|
+
export const TERNARY_EXPRESSION = "ternary_expression";
|
|
114
|
+
export const SWITCH_CASE = "switch_case";
|
|
115
|
+
export const SWITCH_STATEMENT = "switch_statement";
|
|
116
|
+
export const BINARY_EXPRESSION = "binary_expression";
|
|
117
|
+
export const AUGMENTED_ASSIGNMENT = "augmented_assignment_expression";
|
|
118
|
+
/** Jump statements used by the guard-clause heuristic. */
|
|
119
|
+
export const JUMP_STATEMENT_TYPES = new Set([
|
|
120
|
+
"return_statement",
|
|
121
|
+
"throw_statement",
|
|
122
|
+
"break_statement",
|
|
123
|
+
"continue_statement",
|
|
124
|
+
]);
|
|
125
|
+
export const COMMENT_TYPE = "comment";
|
|
126
|
+
export const DECORATOR_TYPE = "decorator";
|
|
127
|
+
/** Import/export related node types (architecture.md §6.5, spec.md §14.2). */
|
|
128
|
+
export const IMPORT_STATEMENT = "import_statement";
|
|
129
|
+
export const IMPORT_CLAUSE = "import_clause";
|
|
130
|
+
export const IMPORT_REQUIRE_CLAUSE = "import_require_clause"; // TS only: `import x = require(...)`
|
|
131
|
+
export const NAMED_IMPORTS = "named_imports";
|
|
132
|
+
export const NAMESPACE_IMPORT = "namespace_import";
|
|
133
|
+
export const IMPORT_SPECIFIER = "import_specifier";
|
|
134
|
+
export const EXPORT_STATEMENT = "export_statement";
|
|
135
|
+
export const EXPORT_CLAUSE = "export_clause";
|
|
136
|
+
export const EXPORT_SPECIFIER = "export_specifier";
|
|
137
|
+
export const CALL_EXPRESSION = "call_expression";
|
|
138
|
+
export const NEW_EXPRESSION = "new_expression";
|
|
139
|
+
export const MEMBER_EXPRESSION = "member_expression";
|
|
140
|
+
export const IMPORT_KEYWORD_NODE = "import"; // the bare `import` token used in `import(...)` dynamic import
|
|
141
|
+
//# sourceMappingURL=node-kinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-kinds.js","sourceRoot":"","sources":["../../../src/languages/shared/node-kinds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SourceRange } from "@untangle-code/domain";
|
|
2
|
+
import type { ByteOffsetTable } from "../../text/byte-offset-table.js";
|
|
3
|
+
import type { SyntaxNode, SyntaxCursor } from "./syntax.js";
|
|
4
|
+
/** Per-file context threaded through the analysis walk. */
|
|
5
|
+
export interface FileTextContext {
|
|
6
|
+
sourceText: string;
|
|
7
|
+
byteTable: ByteOffsetTable;
|
|
8
|
+
}
|
|
9
|
+
export declare function rangeOf(node: SyntaxNode, ctx: FileTextContext): SourceRange;
|
|
10
|
+
/**
|
|
11
|
+
* `rangeOf` for a cursor position — identical result, but WITHOUT
|
|
12
|
+
* materializing a `SyntaxNode` wrapper. `TreeCursor` exposes the same four
|
|
13
|
+
* values (`startPosition`, `endPosition`, `startIndex`, `endIndex`) with the
|
|
14
|
+
* same UTF-16 index convention as `SyntaxNode`, so the two functions are
|
|
15
|
+
* interchangeable per node (WP-95).
|
|
16
|
+
*/
|
|
17
|
+
export declare function rangeOfCursor(cursor: SyntaxCursor, ctx: FileTextContext): SourceRange;
|
|
18
|
+
/** `rangeOf`, mit der sprachuebergreifenden Zeilenkommentar-Normalisierung. */
|
|
19
|
+
export declare function commentRangeOf(node: SyntaxNode, ctx: FileTextContext): SourceRange;
|
|
20
|
+
/** Cursor-Fassung von {@link commentRangeOf}, ohne einen Knotenwrapper zu bauen. */
|
|
21
|
+
export declare function commentRangeOfCursor(cursor: SyntaxCursor, ctx: FileTextContext): SourceRange;
|
|
22
|
+
/** Union of two ranges — the smallest range containing both. */
|
|
23
|
+
export declare function unionRange(a: SourceRange, b: SourceRange): SourceRange;
|
|
24
|
+
/** Strips surrounding string quotes (`"`, `'`, `` ` ``) from raw source text, when present. */
|
|
25
|
+
export declare function unquote(text: string): string;
|
|
26
|
+
/** Finds the nearest ancestor (excluding `node` itself) whose type is in `types`. */
|
|
27
|
+
export declare function closestAncestorOfType(node: SyntaxNode, types: ReadonlySet<string>): SyntaxNode | null;
|
|
28
|
+
/** All direct children of `node` whose type equals `type` (named or anonymous). */
|
|
29
|
+
export declare function directChildrenOfType(node: SyntaxNode, type: string): SyntaxNode[];
|
|
30
|
+
export declare function hasDirectChildOfType(node: SyntaxNode, type: string): boolean;
|
|
31
|
+
//# sourceMappingURL=node-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-utils.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/node-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAO3E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAOrF;AA2BD,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAElF;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAO5F;AAED,gEAAgE;AAChE,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,WAAW,CAOtE;AAED,+FAA+F;AAC/F,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS5C;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GACzB,UAAU,GAAG,IAAI,CAOnB;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAEjF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5E"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export function rangeOf(node, ctx) {
|
|
2
|
+
return {
|
|
3
|
+
startLine: node.startPosition.row + 1,
|
|
4
|
+
endLine: node.endPosition.row + 1,
|
|
5
|
+
startByte: ctx.byteTable.toByteOffset(node.startIndex),
|
|
6
|
+
endByte: ctx.byteTable.toByteOffset(node.endIndex),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* `rangeOf` for a cursor position — identical result, but WITHOUT
|
|
11
|
+
* materializing a `SyntaxNode` wrapper. `TreeCursor` exposes the same four
|
|
12
|
+
* values (`startPosition`, `endPosition`, `startIndex`, `endIndex`) with the
|
|
13
|
+
* same UTF-16 index convention as `SyntaxNode`, so the two functions are
|
|
14
|
+
* interchangeable per node (WP-95).
|
|
15
|
+
*/
|
|
16
|
+
export function rangeOfCursor(cursor, ctx) {
|
|
17
|
+
return {
|
|
18
|
+
startLine: cursor.startPosition.row + 1,
|
|
19
|
+
endLine: cursor.endPosition.row + 1,
|
|
20
|
+
startByte: ctx.byteTable.toByteOffset(cursor.startIndex),
|
|
21
|
+
endByte: ctx.byteTable.toByteOffset(cursor.endIndex),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Kommentarknoten enden semantisch vor dem Zeilenumbruch. Manche Grammatiken
|
|
26
|
+
* halten sich daran nicht: Rusts `///` und `//!` reichen bis zum Anfang der
|
|
27
|
+
* Folgezeile. Da `SourceRange.endLine` INKLUSIV ist, wuerde diese Codezeile
|
|
28
|
+
* sonst als Kommentar gelten und aus SLOC herausfallen (WP-236).
|
|
29
|
+
*/
|
|
30
|
+
function withoutTrailingLineBreak(range, text, endIndex, ctx) {
|
|
31
|
+
const suffixLength = text.endsWith("\r\n")
|
|
32
|
+
? 2
|
|
33
|
+
: text.endsWith("\n") || text.endsWith("\r")
|
|
34
|
+
? 1
|
|
35
|
+
: 0;
|
|
36
|
+
if (suffixLength === 0)
|
|
37
|
+
return range;
|
|
38
|
+
return {
|
|
39
|
+
...range,
|
|
40
|
+
endLine: Math.max(range.startLine, range.endLine - 1),
|
|
41
|
+
endByte: ctx.byteTable.toByteOffset(endIndex - suffixLength),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** `rangeOf`, mit der sprachuebergreifenden Zeilenkommentar-Normalisierung. */
|
|
45
|
+
export function commentRangeOf(node, ctx) {
|
|
46
|
+
return withoutTrailingLineBreak(rangeOf(node, ctx), node.text, node.endIndex, ctx);
|
|
47
|
+
}
|
|
48
|
+
/** Cursor-Fassung von {@link commentRangeOf}, ohne einen Knotenwrapper zu bauen. */
|
|
49
|
+
export function commentRangeOfCursor(cursor, ctx) {
|
|
50
|
+
return withoutTrailingLineBreak(rangeOfCursor(cursor, ctx), cursor.nodeText, cursor.endIndex, ctx);
|
|
51
|
+
}
|
|
52
|
+
/** Union of two ranges — the smallest range containing both. */
|
|
53
|
+
export function unionRange(a, b) {
|
|
54
|
+
return {
|
|
55
|
+
startLine: Math.min(a.startLine, b.startLine),
|
|
56
|
+
endLine: Math.max(a.endLine, b.endLine),
|
|
57
|
+
startByte: Math.min(a.startByte, b.startByte),
|
|
58
|
+
endByte: Math.max(a.endByte, b.endByte),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Strips surrounding string quotes (`"`, `'`, `` ` ``) from raw source text, when present. */
|
|
62
|
+
export function unquote(text) {
|
|
63
|
+
if (text.length >= 2) {
|
|
64
|
+
const first = text[0];
|
|
65
|
+
const last = text[text.length - 1];
|
|
66
|
+
if ((first === '"' || first === "'" || first === "`") && first === last) {
|
|
67
|
+
return text.slice(1, -1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return text;
|
|
71
|
+
}
|
|
72
|
+
/** Finds the nearest ancestor (excluding `node` itself) whose type is in `types`. */
|
|
73
|
+
export function closestAncestorOfType(node, types) {
|
|
74
|
+
let current = node.parent;
|
|
75
|
+
while (current !== null) {
|
|
76
|
+
if (types.has(current.type))
|
|
77
|
+
return current;
|
|
78
|
+
current = current.parent;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/** All direct children of `node` whose type equals `type` (named or anonymous). */
|
|
83
|
+
export function directChildrenOfType(node, type) {
|
|
84
|
+
return node.children.filter((child) => child.type === type);
|
|
85
|
+
}
|
|
86
|
+
export function hasDirectChildOfType(node, type) {
|
|
87
|
+
return node.children.some((child) => child.type === type);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=node-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-utils.js","sourceRoot":"","sources":["../../../src/languages/shared/node-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse-quality diagnostics (spec.md §7.3): counts and reports tree-sitter
|
|
3
|
+
* `ERROR` and "missing" nodes, and classifies overall `ParseQuality`.
|
|
4
|
+
*
|
|
5
|
+
* Threshold choice (documented WP-06 decision, no normative value given by
|
|
6
|
+
* spec.md/architecture.md): `failed` is reserved for trees where at least
|
|
7
|
+
* half of all nodes are broken — tree-sitter's error recovery almost always
|
|
8
|
+
* produces SOME usable tree, even for badly broken input, so a small
|
|
9
|
+
* absolute count of error/missing nodes is treated as `partial`
|
|
10
|
+
* (spec.md §7.3: "AST nutzbar, aber mit Fehlerknoten"), while a
|
|
11
|
+
* majority-broken tree is treated as unusable (`failed`, `ast: null` per
|
|
12
|
+
* domain `ParseResult` doc).
|
|
13
|
+
*
|
|
14
|
+
* TRAVERSIERUNG (WP-95): ueber die Cursor-API statt ueber `node.children` —
|
|
15
|
+
* derselbe Grund wie in `engine.ts` und `fingerprint.ts`. Die
|
|
16
|
+
* BESUCHSREIHENFOLGE ist absichtlich unveraendert geblieben: der fruehere
|
|
17
|
+
* Stapel (`stack.pop()` nach `push` aller Kinder) lief Vorordnung mit
|
|
18
|
+
* UMGEKEHRTER Kindfolge, und genau die stellen `gotoLastChild` /
|
|
19
|
+
* `gotoPreviousSibling` nach. Wer hier auf die natuerliche Kindfolge
|
|
20
|
+
* umstellt, aendert die Reihenfolge von `ParseDiagnostic[]` — sichtbar in
|
|
21
|
+
* jedem Bericht, der die erste Diagnose zeigt.
|
|
22
|
+
*/
|
|
23
|
+
import type { ParseDiagnostic, ParseQuality } from "@untangle-code/domain";
|
|
24
|
+
import type { FileTextContext } from "./node-utils.js";
|
|
25
|
+
import type { SyntaxNode } from "./syntax.js";
|
|
26
|
+
/**
|
|
27
|
+
* Woher die Angabe "fehlender Knoten" stammt.
|
|
28
|
+
*
|
|
29
|
+
* `measured` — tree-sitter meldet `ts_node_is_missing`, ein Messwert der
|
|
30
|
+
* Fehlerkorrektur. `heuristic` — ast-grep hat dazu kein Gegenstueck; dort ist
|
|
31
|
+
* es ein Blatt der Breite null (siehe `languages/astgrep-backend/syntax.ts`).
|
|
32
|
+
* Der Unterschied gehoert in die DIAGNOSE, nicht in eine Fussnote: wer
|
|
33
|
+
* `missing_node_count` liest, muss wissen, ob die Zahl gemessen oder
|
|
34
|
+
* geschaetzt ist (E4).
|
|
35
|
+
*/
|
|
36
|
+
export type MissingNodeEvidence = "measured" | "heuristic";
|
|
37
|
+
export interface ParseDiagnosticsResult {
|
|
38
|
+
parseQuality: ParseQuality;
|
|
39
|
+
diagnostics: ParseDiagnostic[];
|
|
40
|
+
errorNodeCount: number;
|
|
41
|
+
missingNodeCount: number;
|
|
42
|
+
}
|
|
43
|
+
export declare function collectParseDiagnostics(root: SyntaxNode, ctx: FileTextContext, missingNodeEvidence?: MissingNodeEvidence): ParseDiagnosticsResult;
|
|
44
|
+
//# sourceMappingURL=parse-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/parse-diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,eAAe,EACpB,mBAAmB,GAAE,mBAAgC,GACpD,sBAAsB,CAqDxB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { rangeOfCursor } from "./node-utils.js";
|
|
2
|
+
const ERROR_NODE_TYPE = "ERROR";
|
|
3
|
+
const FAILED_RATIO_THRESHOLD = 0.5;
|
|
4
|
+
export function collectParseDiagnostics(root, ctx, missingNodeEvidence = "measured") {
|
|
5
|
+
const diagnostics = [];
|
|
6
|
+
let errorNodeCount = 0;
|
|
7
|
+
let missingNodeCount = 0;
|
|
8
|
+
let totalNodeCount = 0;
|
|
9
|
+
// Iterativ, nicht rekursiv: ein Syntaxbaum kann tausende Ebenen tief sein
|
|
10
|
+
// (eine lange `a || b || c ...`-Kette genuegt), und ein Aufrufstapel darf
|
|
11
|
+
// daran nicht zerbrechen.
|
|
12
|
+
const cursor = root.walk();
|
|
13
|
+
let depth = 0;
|
|
14
|
+
for (;;) {
|
|
15
|
+
totalNodeCount += 1;
|
|
16
|
+
const nodeType = cursor.nodeType;
|
|
17
|
+
if (cursor.nodeIsMissing) {
|
|
18
|
+
missingNodeCount += 1;
|
|
19
|
+
diagnostics.push({
|
|
20
|
+
severity: "error",
|
|
21
|
+
kind: "missing_node",
|
|
22
|
+
message: missingNodeEvidence === "measured"
|
|
23
|
+
? `Missing "${nodeType}" node`
|
|
24
|
+
: `Missing "${nodeType}" node (heuristically detected as a zero-width node; ` +
|
|
25
|
+
`ast-grep has no nodeIsMissing API)`,
|
|
26
|
+
range: rangeOfCursor(cursor, ctx),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else if (nodeType === ERROR_NODE_TYPE) {
|
|
30
|
+
// Frueher stand hier zusaetzlich `|| node.isError`. Das ist dieselbe
|
|
31
|
+
// Bedingung: `ts_node_is_error` prueft auf das eingebaute Fehlersymbol,
|
|
32
|
+
// und dessen Typname IST "ERROR" — ein eingebautes Symbol wird nie
|
|
33
|
+
// aliasiert. Der Cursor bietet kein `nodeIsError`, wohl aber `nodeType`.
|
|
34
|
+
errorNodeCount += 1;
|
|
35
|
+
diagnostics.push({
|
|
36
|
+
severity: "error",
|
|
37
|
+
kind: "error_node",
|
|
38
|
+
message: `Unexpected syntax near "${cursor.nodeText.slice(0, 40)}"`,
|
|
39
|
+
range: rangeOfCursor(cursor, ctx),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (cursor.gotoLastChild()) {
|
|
43
|
+
depth += 1;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
while (!cursor.gotoPreviousSibling()) {
|
|
47
|
+
if (depth === 0) {
|
|
48
|
+
return finish(diagnostics, errorNodeCount, missingNodeCount, totalNodeCount);
|
|
49
|
+
}
|
|
50
|
+
cursor.gotoParent();
|
|
51
|
+
depth -= 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function finish(diagnostics, errorNodeCount, missingNodeCount, totalNodeCount) {
|
|
56
|
+
const brokenRatio = totalNodeCount > 0 ? (errorNodeCount + missingNodeCount) / totalNodeCount : 0;
|
|
57
|
+
const parseQuality = errorNodeCount === 0 && missingNodeCount === 0
|
|
58
|
+
? "complete"
|
|
59
|
+
: brokenRatio >= FAILED_RATIO_THRESHOLD
|
|
60
|
+
? "failed"
|
|
61
|
+
: "partial";
|
|
62
|
+
return { parseQuality, diagnostics, errorNodeCount, missingNodeCount };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=parse-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-diagnostics.js","sourceRoot":"","sources":["../../../src/languages/shared/parse-diagnostics.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,eAAe,GAAG,OAAO,CAAC;AAChC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAqBnC,MAAM,UAAU,uBAAuB,CACrC,IAAgB,EAChB,GAAoB,EACpB,sBAA2C,UAAU;IAErD,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,0EAA0E;IAC1E,0EAA0E;IAC1E,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,CAAC;QACR,cAAc,IAAI,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,gBAAgB,IAAI,CAAC,CAAC;YACtB,WAAW,CAAC,IAAI,CAAC;gBACf,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,cAAc;gBACpB,OAAO,EACL,mBAAmB,KAAK,UAAU;oBAChC,CAAC,CAAC,YAAY,QAAQ,QAAQ;oBAC9B,CAAC,CAAC,YAAY,QAAQ,uDAAuD;wBAC3E,oCAAoC;gBAC1C,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;YACxC,qEAAqE;YACrE,wEAAwE;YACxE,mEAAmE;YACnE,yEAAyE;YACzE,cAAc,IAAI,CAAC,CAAC;YACpB,WAAW,CAAC,IAAI,CAAC;gBACf,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,2BAA2B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;gBACnE,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACrC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CACb,WAA8B,EAC9B,cAAsB,EACtB,gBAAwB,EACxB,cAAsB;IAEtB,MAAM,WAAW,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,gBAAgB,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,YAAY,GAChB,cAAc,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC;QAC5C,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,WAAW,IAAI,sBAAsB;YACrC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,SAAS,CAAC;IAElB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TsParser, TsTree } from "./tree-sitter-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Vorgabegroesse des Eingabepuffers der nativen Bindung, in Bytes.
|
|
4
|
+
* Alles darunter braucht `bufferSize` nicht — alles darueber schon.
|
|
5
|
+
* Nur dokumentarisch und fuer Tests; der Aufrufpfad uebergibt IMMER `bufferSize`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const NATIVE_DEFAULT_BUFFER_BYTES: number;
|
|
8
|
+
/** Gemessene Obergrenze fuer eine einzelne Quelldatei, in Bytes (Begruendung siehe Modulkopf). */
|
|
9
|
+
export declare const MAX_PARSE_SOURCE_BYTES: number;
|
|
10
|
+
/** Laenge des Quelltexts in UTF-8-Bytes — NICHT in Zeichen: die Bindung puffert Bytes. */
|
|
11
|
+
export declare function sourceByteLength(source: string): number;
|
|
12
|
+
/** Der `bufferSize`-Wert fuer eine Eingabe dieser Bytelaenge. */
|
|
13
|
+
export declare function parseBufferSizeFor(byteLength: number): number;
|
|
14
|
+
/**
|
|
15
|
+
* DER EINZIGE erlaubte Aufruf von `Parser#parse` in diesem Paket.
|
|
16
|
+
*
|
|
17
|
+
* Wer `parser.parse(text)` direkt aufruft, baut den 32-KiB-Defekt neu ein.
|
|
18
|
+
* Diese Funktion (a) prueft die Groessengrenze VOR dem Parsen, (b) uebergibt
|
|
19
|
+
* `bufferSize` und (c) verwandelt jede Ausnahme der Bindung in einen
|
|
20
|
+
* `AdapterParseError` mit benanntem Grund (WP-216), damit kein
|
|
21
|
+
* Bibliothekstext mehr als "Grund" durchgereicht wird.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseWithBuffer(parser: TsParser, source: string): TsTree;
|
|
24
|
+
//# sourceMappingURL=parse-limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-limits.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/parse-limits.ts"],"names":[],"mappings":"AA4EA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,QAAY,CAAC;AAErD,kGAAkG;AAClG,eAAO,MAAM,sBAAsB,QAAkB,CAAC;AAgBtD,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAyBxE"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eingabepuffer und Groessengrenze fuer die native tree-sitter-Bindung
|
|
3
|
+
* (WP-215).
|
|
4
|
+
*
|
|
5
|
+
* DER DEFEKT: `Parser#parse(text)` reicht den Quelltext ueber eine
|
|
6
|
+
* Rueckruffunktion an die native Seite; die Bindung kopiert den
|
|
7
|
+
* zurueckgegebenen Abschnitt in einen Puffer FESTER Groesse. Ohne
|
|
8
|
+
* `options.bufferSize` ist dieser Puffer 32 KiB gross (`tree-sitter@0.21.1`,
|
|
9
|
+
* `binding.cc`). Eine Datei ueber 32 KiB passt nicht hinein und die Bindung
|
|
10
|
+
* wirft `Invalid argument` — ohne Zeile, ohne Spalte, ohne Hinweis auf die
|
|
11
|
+
* Groesse. Auf dem eigenen Repository scheiterten daran ACHT Dateien:
|
|
12
|
+
* `packages/complexity/src/scope-aggregate.ts` (31.246 B) wurde noch
|
|
13
|
+
* gerechnet, `packages/search/src/regex-safety.ts` (33.871 B) nicht mehr.
|
|
14
|
+
*
|
|
15
|
+
* DIE GEGENMASSNAHME: `bufferSize` proportional zur Eingabelaenge uebergeben.
|
|
16
|
+
* Gemessen im Paketkontext an `regex-safety.ts` (33.806 Zeichen / 33.871 Bytes):
|
|
17
|
+
*
|
|
18
|
+
* ohne bufferSize: FEHLER — Invalid argument
|
|
19
|
+
* mit bufferSize: OK, root program | Kinder 66 | hasError false
|
|
20
|
+
*
|
|
21
|
+
* WARUM EINE OBERGRENZE NOETIG IST: `bufferSize` waechst mit der Datei, der
|
|
22
|
+
* Syntaxbaum ebenfalls — nur schneller. Gemessen in ISOLIERTEN Prozessen
|
|
23
|
+
* (`maxRSS` aus `process.resourceUsage()`, tree-sitter-typescript, Node 26.7.0,
|
|
24
|
+
* darwin/arm64), erst das reine `parse()`:
|
|
25
|
+
*
|
|
26
|
+
* Bytes parse Spitzen-RSS
|
|
27
|
+
* 1.082.765 62 ms 112 MiB
|
|
28
|
+
* 4.213.735 268 ms 252 MiB
|
|
29
|
+
* 8.396.927 495 ms 441 MiB
|
|
30
|
+
* 16.803.534 964 ms 683 MiB
|
|
31
|
+
* 33.576.525 3136 ms 1087 MiB
|
|
32
|
+
* 67.141.068 3814 ms 1545 MiB
|
|
33
|
+
*
|
|
34
|
+
* `parse()` allein ist aber NICHT, was der Aufrufer bezahlt. Der Adapter legt
|
|
35
|
+
* anschliessend `analyzeTree` darueber und materialisiert JS-Wrapper fuer jeden
|
|
36
|
+
* Knoten (bei 1 MiB Quelltext sind das 216.406 Knoten). Dieselbe Messung ueber
|
|
37
|
+
* die VOLLE Strecke `parse()` + `computeComplexity()`:
|
|
38
|
+
*
|
|
39
|
+
* Bytes gesamt Spitzen-RSS Scopes
|
|
40
|
+
* 1.082.765 8.899 ms 276 MiB 1.162
|
|
41
|
+
* 2.126.275 13.227 ms 389 MiB 2.280
|
|
42
|
+
* 4.213.735 22.990 ms 585 MiB 4.516
|
|
43
|
+
* 5.259.533 32.394 ms 673 MiB 5.634
|
|
44
|
+
* 8.316.481 50.179 ms 966 MiB 8.902
|
|
45
|
+
*
|
|
46
|
+
* Der bestimmende Posten ist also der BAUMLAUF, nicht das Parsen — rund sechs
|
|
47
|
+
* Sekunden je Megabyte. Wer diese Tabelle liest, soll die Grenze nicht fuer
|
|
48
|
+
* billig halten: eine Datei DICHT an der Grenze kostet eine knappe Minute und
|
|
49
|
+
* fast ein Gigabyte.
|
|
50
|
+
*
|
|
51
|
+
* DIE GRENZE: {@link MAX_PARSE_SOURCE_BYTES} = 8 MiB. Sie ist eine MAUER gegen
|
|
52
|
+
* den Speicher, kein Leistungsversprechen. Begruendung:
|
|
53
|
+
* - Bei 8,3 MB liegt die gemessene Spitze bei 966 MiB und damit noch unter
|
|
54
|
+
* einem Gigabyte; darueber ist der Prozess auf einem Entwicklerrechner
|
|
55
|
+
* nicht mehr verlaesslich. Bei 33 MB kostet schon das blosse Parsen ueber
|
|
56
|
+
* 1 GiB, die volle Strecke waere weit jenseits davon.
|
|
57
|
+
* - Sie liegt UEBER der Vorgabegrenze des Scanners (5 MiB, siehe
|
|
58
|
+
* `packages/scanner/src/discovery.ts`), damit der Parser bei
|
|
59
|
+
* Standardkonfiguration NIE die engere, unausgesprochene Grenze ist. Wer
|
|
60
|
+
* hier abgewiesen wird, hat die Scannergrenze bewusst angehoben und
|
|
61
|
+
* bekommt dafuer einen benannten Grund statt eines Absturzes.
|
|
62
|
+
* - Die groesste echte Quelldatei dieses Repositorys hat 83.062 Bytes; die
|
|
63
|
+
* Grenze ist damit rund das Hundertfache des real Vorkommenden. In der
|
|
64
|
+
* Praxis reisst sie nur generierter Code oder ein gebuendeltes Artefakt.
|
|
65
|
+
*
|
|
66
|
+
* NICHT GELOEST, und hier ausdruecklich vermerkt: die sechs Sekunden je
|
|
67
|
+
* Megabyte im Baumlauf sind ein eigener Leistungsdefekt. Diese Grenze
|
|
68
|
+
* verhindert nur, dass er in einen Speicherabsturz umschlaegt.
|
|
69
|
+
*
|
|
70
|
+
* Eine Datei ueber der Grenze wird NICHT stillschweigend uebersprungen: der
|
|
71
|
+
* Adapter wirft `AdapterParseError` mit `kind: "file_too_large"` und der
|
|
72
|
+
* GEMESSENEN Groesse, woraus der Aufrufer einen Ledger-Eintrag mit genau
|
|
73
|
+
* diesem Grund baut (E4).
|
|
74
|
+
*/
|
|
75
|
+
import { AdapterParseError, classifyAdapterFailure } from "@untangle-code/domain";
|
|
76
|
+
/**
|
|
77
|
+
* Vorgabegroesse des Eingabepuffers der nativen Bindung, in Bytes.
|
|
78
|
+
* Alles darunter braucht `bufferSize` nicht — alles darueber schon.
|
|
79
|
+
* Nur dokumentarisch und fuer Tests; der Aufrufpfad uebergibt IMMER `bufferSize`.
|
|
80
|
+
*/
|
|
81
|
+
export const NATIVE_DEFAULT_BUFFER_BYTES = 32 * 1024;
|
|
82
|
+
/** Gemessene Obergrenze fuer eine einzelne Quelldatei, in Bytes (Begruendung siehe Modulkopf). */
|
|
83
|
+
export const MAX_PARSE_SOURCE_BYTES = 8 * 1024 * 1024;
|
|
84
|
+
/**
|
|
85
|
+
* Aufschlag auf die Eingabelaenge.
|
|
86
|
+
*
|
|
87
|
+
* Gemessen genuegte schon der Faktor 1,0 (`bufferSize === byteLength`) fuer
|
|
88
|
+
* jede gepruefte Groesse. Der Aufschlag von 25 % ist die Sicherheitsmarge
|
|
89
|
+
* gegen die Frage, ob die Bindung intern noch ein Terminierungszeichen oder
|
|
90
|
+
* eine Ausrichtung braucht — er kostet bei 8 MiB Eingabe 2 MiB und ist damit
|
|
91
|
+
* gegenueber den gemessenen 441 MiB Spitze nicht der bestimmende Posten.
|
|
92
|
+
*/
|
|
93
|
+
const BUFFER_HEADROOM = 1.25;
|
|
94
|
+
/** Untergrenze: nie kleiner als die native Vorgabe, sonst wird eine kleine Datei schlechter gestellt. */
|
|
95
|
+
const MIN_BUFFER_BYTES = NATIVE_DEFAULT_BUFFER_BYTES;
|
|
96
|
+
/** Laenge des Quelltexts in UTF-8-Bytes — NICHT in Zeichen: die Bindung puffert Bytes. */
|
|
97
|
+
export function sourceByteLength(source) {
|
|
98
|
+
return Buffer.byteLength(source, "utf8");
|
|
99
|
+
}
|
|
100
|
+
/** Der `bufferSize`-Wert fuer eine Eingabe dieser Bytelaenge. */
|
|
101
|
+
export function parseBufferSizeFor(byteLength) {
|
|
102
|
+
return Math.max(MIN_BUFFER_BYTES, Math.ceil(byteLength * BUFFER_HEADROOM));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* DER EINZIGE erlaubte Aufruf von `Parser#parse` in diesem Paket.
|
|
106
|
+
*
|
|
107
|
+
* Wer `parser.parse(text)` direkt aufruft, baut den 32-KiB-Defekt neu ein.
|
|
108
|
+
* Diese Funktion (a) prueft die Groessengrenze VOR dem Parsen, (b) uebergibt
|
|
109
|
+
* `bufferSize` und (c) verwandelt jede Ausnahme der Bindung in einen
|
|
110
|
+
* `AdapterParseError` mit benanntem Grund (WP-216), damit kein
|
|
111
|
+
* Bibliothekstext mehr als "Grund" durchgereicht wird.
|
|
112
|
+
*/
|
|
113
|
+
export function parseWithBuffer(parser, source) {
|
|
114
|
+
const byteLength = sourceByteLength(source);
|
|
115
|
+
if (byteLength > MAX_PARSE_SOURCE_BYTES) {
|
|
116
|
+
throw new AdapterParseError("file_too_large", `Source text with ${String(byteLength)} bytes exceeds the parser limit of ` +
|
|
117
|
+
`${String(MAX_PARSE_SOURCE_BYTES)} Bytes.`, { measurements: { sizeBytes: byteLength, limitBytes: MAX_PARSE_SOURCE_BYTES } });
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
return parser.parse(source, undefined, { bufferSize: parseBufferSizeFor(byteLength) });
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const failure = classifyAdapterFailure(error, { sizeBytes: byteLength });
|
|
124
|
+
// Weitergereicht wird der ROHE Ausnahmetext, nicht `failure.detail`: der
|
|
125
|
+
// Aufrufer klassifiziert erneut, und ein bereits ausformuliertes Detail
|
|
126
|
+
// wuerde dabei ein zweites Mal in "(Ausnahmetext: …)" eingewickelt.
|
|
127
|
+
// Der benannte `kind` ueberlebt in der Klasse, nicht im Text.
|
|
128
|
+
throw new AdapterParseError(failure.kind, failure.rawMessage, {
|
|
129
|
+
measurements: { ...failure.measurements, bufferSize: parseBufferSizeFor(byteLength) },
|
|
130
|
+
cause: error,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=parse-limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-limits.js","sourceRoot":"","sources":["../../../src/languages/shared/parse-limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AACH,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAIlF;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,IAAI,CAAC;AAErD,kGAAkG;AAClG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,yGAAyG;AACzG,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB,EAAE,MAAc;IAC9D,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,UAAU,GAAG,sBAAsB,EAAE,CAAC;QACxC,MAAM,IAAI,iBAAiB,CACzB,gBAAgB,EAChB,oBAAoB,MAAM,CAAC,UAAU,CAAC,qCAAqC;YACzE,GAAG,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAC5C,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,sBAAsB,EAAE,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QACzE,yEAAyE;QACzE,wEAAwE;QACxE,oEAAoE;QACpE,8DAA8D;QAC9D,MAAM,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE;YAC5D,YAAY,EAAE,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,kBAAkB,CAAC,UAAU,CAAC,EAAE;YACrF,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|