@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,99 @@
|
|
|
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
|
+
import type { LanguageProfile } from "./profile.js";
|
|
43
|
+
import type { SyntaxCursor } from "./syntax.js";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Baut die Formzeichenkette fuer den Knoten, auf dem der Cursor steht, und
|
|
47
|
+
* laesst den Cursor GENAU DORT zurueck: jede `gotoFirstChild`-Bewegung wird
|
|
48
|
+
* von einem `gotoParent` aufgewogen. Wer das verletzt, verschiebt die
|
|
49
|
+
* Traversierung des Aufrufers.
|
|
50
|
+
*/
|
|
51
|
+
function structuralShapeAt(cursor: SyntaxCursor, profile: LanguageProfile): string {
|
|
52
|
+
const type = cursor.nodeType;
|
|
53
|
+
if (profile.commentKinds.has(type)) return "";
|
|
54
|
+
if (profile.literalContainerKinds.has(type)) return type;
|
|
55
|
+
if (!cursor.gotoFirstChild()) return type; // entspricht node.childCount === 0
|
|
56
|
+
|
|
57
|
+
const childShapes: string[] = [];
|
|
58
|
+
do {
|
|
59
|
+
// Kommentarkinder werden AUSGELASSEN, nicht als "" aufgenommen — genau
|
|
60
|
+
// das tat das frueher vorgeschaltete
|
|
61
|
+
// `.filter((child) => child.type !== "comment")`.
|
|
62
|
+
if (!profile.commentKinds.has(cursor.nodeType)) {
|
|
63
|
+
childShapes.push(structuralShapeAt(cursor, profile));
|
|
64
|
+
}
|
|
65
|
+
} while (cursor.gotoNextSibling());
|
|
66
|
+
cursor.gotoParent();
|
|
67
|
+
|
|
68
|
+
return `${type}(${childShapes.join(",")})`;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
|
|
72
|
+
export function computeAstHash(cursor: SyntaxCursor, profile: LanguageProfile): string {
|
|
73
|
+
return sha256Hex(structuralShapeAt(cursor, profile));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Sammelt die Blatttexte; laesst den Cursor auf dem Ausgangsknoten zurueck. */
|
|
77
|
+
function collectLeafTextsAt(cursor: SyntaxCursor, profile: LanguageProfile, out: string[]): void {
|
|
78
|
+
const type = cursor.nodeType;
|
|
79
|
+
if (profile.commentKinds.has(type)) return;
|
|
80
|
+
if (profile.literalContainerKinds.has(type)) {
|
|
81
|
+
out.push(cursor.nodeText);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (!cursor.gotoFirstChild()) {
|
|
85
|
+
out.push(cursor.nodeText); // entspricht node.childCount === 0
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
do {
|
|
89
|
+
collectLeafTextsAt(cursor, profile, out);
|
|
90
|
+
} while (cursor.gotoNextSibling());
|
|
91
|
+
cursor.gotoParent();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
|
|
95
|
+
export function computeTokenFingerprint(cursor: SyntaxCursor, profile: LanguageProfile): string {
|
|
96
|
+
const tokens: string[] = [];
|
|
97
|
+
collectLeafTextsAt(cursor, profile, tokens);
|
|
98
|
+
return sha256Hex(tokens.join("\u001f"));
|
|
99
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy loader for the native `tree-sitter` runtime and its grammars.
|
|
3
|
+
*
|
|
4
|
+
* architecture.md §6.5 / the WP-06 mandate require that the CLI NOT load
|
|
5
|
+
* every grammar at startup. We satisfy that with plain lazy `require`
|
|
6
|
+
* (via `node:module#createRequire`, since this package is ESM and the
|
|
7
|
+
* native bindings are CommonJS) cached in module-level maps: nothing here
|
|
8
|
+
* runs until `getParser()`/`loadGrammar()` is first called for a given
|
|
9
|
+
* language, and each grammar is required at most once per process.
|
|
10
|
+
*
|
|
11
|
+
* `require` (not dynamic `import()`) is deliberate: `LanguageAdapter.parse`
|
|
12
|
+
* (domain `analysis.ts`) is a SYNCHRONOUS method, so grammar acquisition on
|
|
13
|
+
* first use must be synchronous too. `createRequire` gives us a synchronous
|
|
14
|
+
* CJS `require` from inside an ESM module without violating
|
|
15
|
+
* `verbatimModuleSyntax`.
|
|
16
|
+
*/
|
|
17
|
+
import { createRequire } from "node:module";
|
|
18
|
+
|
|
19
|
+
import type { TsLanguage, TsParserCtor } from "./tree-sitter-types.js";
|
|
20
|
+
|
|
21
|
+
const require = createRequire(import.meta.url);
|
|
22
|
+
|
|
23
|
+
let cachedParserCtor: TsParserCtor | undefined;
|
|
24
|
+
|
|
25
|
+
/** Lazily requires the native `tree-sitter` Parser constructor (once per process). */
|
|
26
|
+
export function loadParserCtor(): TsParserCtor {
|
|
27
|
+
if (cachedParserCtor === undefined) {
|
|
28
|
+
cachedParserCtor = require("tree-sitter") as TsParserCtor;
|
|
29
|
+
}
|
|
30
|
+
return cachedParserCtor;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Which grammar module a dialect is loaded from, and how to reach the language export. */
|
|
34
|
+
export interface GrammarSource {
|
|
35
|
+
/** npm module to `require` lazily. */
|
|
36
|
+
moduleName: "tree-sitter-typescript" | "tree-sitter-javascript";
|
|
37
|
+
/** Property on the required module holding the `Language`, or `undefined` for the module's default export itself. */
|
|
38
|
+
exportName?: "typescript" | "tsx";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const grammarCache = new Map<string, TsLanguage>();
|
|
42
|
+
|
|
43
|
+
function grammarCacheKey(source: GrammarSource): string {
|
|
44
|
+
return `${source.moduleName}::${source.exportName ?? "default"}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Lazily requires and caches a single grammar `Language` handle. */
|
|
48
|
+
export function loadGrammar(source: GrammarSource): TsLanguage {
|
|
49
|
+
const key = grammarCacheKey(source);
|
|
50
|
+
const cached = grammarCache.get(key);
|
|
51
|
+
if (cached !== undefined) {
|
|
52
|
+
return cached;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const loadedModule = require(source.moduleName) as Record<string, unknown>;
|
|
56
|
+
const language = (
|
|
57
|
+
source.exportName === undefined ? loadedModule : loadedModule[source.exportName]
|
|
58
|
+
) as TsLanguage;
|
|
59
|
+
grammarCache.set(key, language);
|
|
60
|
+
return language;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Test-only: clears caches so grammar-loading behavior can be re-exercised. */
|
|
64
|
+
export function resetGrammarCachesForTests(): void {
|
|
65
|
+
cachedParserCtor = undefined;
|
|
66
|
+
grammarCache.clear();
|
|
67
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import/re-export/require/dynamic-import detection (spec.md §14.2).
|
|
3
|
+
*
|
|
4
|
+
* `RawImportKind` (domain `analysis.ts`) has exactly four members: `import`,
|
|
5
|
+
* `re_export`, `dynamic_import`, `package_dependency`. CommonJS
|
|
6
|
+
* `require("x")` has no dedicated member — it is mapped to `"import"`
|
|
7
|
+
* (documented WP-06 decision, README "Entscheidungen"): a `require` call is
|
|
8
|
+
* functionally a synchronous import of the same specifier space, and
|
|
9
|
+
* `"package_dependency"` is reserved for a resolved (not source-level)
|
|
10
|
+
* cross-package edge produced downstream by the import resolver / file
|
|
11
|
+
* graph, not by this adapter.
|
|
12
|
+
*/
|
|
13
|
+
import type { RawImport, RawImportBinding } from "@untangle-code/domain";
|
|
14
|
+
|
|
15
|
+
import type { FileTextContext } from "./node-utils.js";
|
|
16
|
+
import { unquote, rangeOf } from "./node-utils.js";
|
|
17
|
+
import type { SyntaxNode } from "./syntax.js";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Zerlegt eine Importklausel in ihre BINDUNGEN — lokaler Name UND Name im
|
|
21
|
+
* Zielmodul. Der lokale Name allein genuegt nicht: bei
|
|
22
|
+
* `import { run as go } from "./lib"` ist `go` lokal und `run` der Export.
|
|
23
|
+
* Wer die Zuordnung hier wegwirft, kann sie nirgends mehr herstellen
|
|
24
|
+
* (`RawImportBinding` in domain `analysis.ts`).
|
|
25
|
+
*/
|
|
26
|
+
function extractImportBindings(clauseOrSpecifierHolder: SyntaxNode): RawImportBinding[] {
|
|
27
|
+
const bindings: RawImportBinding[] = [];
|
|
28
|
+
for (const child of clauseOrSpecifierHolder.children) {
|
|
29
|
+
if (child.type === "identifier") {
|
|
30
|
+
// Direkter Bezeichner der Importklausel: der Vorgabeexport.
|
|
31
|
+
bindings.push({ localName: child.text, importedName: "default", kind: "default" });
|
|
32
|
+
} else if (child.type === "namespace_import") {
|
|
33
|
+
const inner = child.children.find((c) => c.type === "identifier");
|
|
34
|
+
if (inner !== undefined) bindings.push({ localName: inner.text, kind: "namespace" });
|
|
35
|
+
} else if (child.type === "named_imports") {
|
|
36
|
+
for (const specifier of child.children) {
|
|
37
|
+
if (specifier.type !== "import_specifier") continue;
|
|
38
|
+
const alias = specifier.childForFieldName("alias");
|
|
39
|
+
const name = specifier.childForFieldName("name");
|
|
40
|
+
if (name === null) continue;
|
|
41
|
+
const importedName = unquote(name.text);
|
|
42
|
+
bindings.push({
|
|
43
|
+
localName: alias === null ? importedName : unquote(alias.text),
|
|
44
|
+
importedName,
|
|
45
|
+
kind: importedName === "default" ? "default" : "named",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return bindings;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Lokale Namen der Bindungen, in Quelltextreihenfolge. */
|
|
54
|
+
function localNamesOf(bindings: readonly RawImportBinding[]): string[] {
|
|
55
|
+
return bindings.map((binding) => binding.localName);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function hasDirectTypeModifier(node: SyntaxNode): boolean {
|
|
59
|
+
return node.children.some((child) => child.type === "type");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Detects a static `import ...` / TS `import x = require(...)` statement. */
|
|
63
|
+
export function detectStaticImport(node: SyntaxNode, ctx: FileTextContext): RawImport | null {
|
|
64
|
+
const range = rangeOf(node, ctx);
|
|
65
|
+
const requireClause = node.children.find((child) => child.type === "import_require_clause");
|
|
66
|
+
if (requireClause !== undefined) {
|
|
67
|
+
const source = requireClause.childForFieldName("source");
|
|
68
|
+
if (source === null) return null;
|
|
69
|
+
return {
|
|
70
|
+
specifier: unquote(source.text),
|
|
71
|
+
importKind: "import",
|
|
72
|
+
range,
|
|
73
|
+
typeOnly: hasDirectTypeModifier(node),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const source = node.childForFieldName("source");
|
|
78
|
+
if (source === null) return null;
|
|
79
|
+
const importClause = node.children.find((child) => child.type === "import_clause");
|
|
80
|
+
const bindings = importClause !== undefined ? extractImportBindings(importClause) : [];
|
|
81
|
+
const importedNames = localNamesOf(bindings);
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
specifier: unquote(source.text),
|
|
85
|
+
importKind: "import",
|
|
86
|
+
range,
|
|
87
|
+
...(importedNames.length > 0 ? { importedNames, bindings } : {}),
|
|
88
|
+
typeOnly: hasDirectTypeModifier(node),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Detects a re-export (`export { x } from "y"`, `export * from "y"`, `export * as ns from "y"`). */
|
|
93
|
+
export function detectReExport(node: SyntaxNode, ctx: FileTextContext): RawImport | null {
|
|
94
|
+
const source = node.childForFieldName("source");
|
|
95
|
+
if (source === null) return null;
|
|
96
|
+
const exportClause = node.children.find((child) => child.type === "export_clause");
|
|
97
|
+
const bindings: RawImportBinding[] = [];
|
|
98
|
+
if (exportClause !== undefined) {
|
|
99
|
+
for (const specifier of exportClause.children) {
|
|
100
|
+
if (specifier.type !== "export_specifier") continue;
|
|
101
|
+
const alias = specifier.childForFieldName("alias");
|
|
102
|
+
const name = specifier.childForFieldName("name");
|
|
103
|
+
if (name === null) continue;
|
|
104
|
+
// Bei `export { run as go } from "m"` ist `run` der Name IM Zielmodul
|
|
105
|
+
// und `go` der hier weitergereichte Name.
|
|
106
|
+
const importedName = unquote(name.text);
|
|
107
|
+
bindings.push({
|
|
108
|
+
localName: alias === null ? importedName : unquote(alias.text),
|
|
109
|
+
importedName,
|
|
110
|
+
kind: importedName === "default" ? "default" : "named",
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const importedNames = localNamesOf(bindings);
|
|
115
|
+
return {
|
|
116
|
+
specifier: unquote(source.text),
|
|
117
|
+
importKind: "re_export",
|
|
118
|
+
range: rangeOf(node, ctx),
|
|
119
|
+
...(importedNames.length > 0 ? { importedNames, bindings } : {}),
|
|
120
|
+
typeOnly: hasDirectTypeModifier(node),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Detects `import("specifier")` (dynamic import) given its enclosing `call_expression`. */
|
|
125
|
+
export function detectDynamicImport(callNode: SyntaxNode, ctx: FileTextContext): RawImport | null {
|
|
126
|
+
const args = callNode.childForFieldName("arguments");
|
|
127
|
+
const firstArg = args?.namedChild(0) ?? null;
|
|
128
|
+
const specifier =
|
|
129
|
+
firstArg !== null && firstArg.type === "string"
|
|
130
|
+
? unquote(firstArg.text)
|
|
131
|
+
: (firstArg?.text ?? "");
|
|
132
|
+
return {
|
|
133
|
+
specifier,
|
|
134
|
+
importKind: "dynamic_import",
|
|
135
|
+
range: rangeOf(callNode, ctx),
|
|
136
|
+
typeOnly: false,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Detects `require("specifier")` given its enclosing `call_expression`. Mapped to `importKind: "import"` (see file doc). */
|
|
141
|
+
export function detectRequireCall(callNode: SyntaxNode, ctx: FileTextContext): RawImport | null {
|
|
142
|
+
const args = callNode.childForFieldName("arguments");
|
|
143
|
+
const firstArg = args?.namedChild(0) ?? null;
|
|
144
|
+
const specifier =
|
|
145
|
+
firstArg !== null && firstArg.type === "string"
|
|
146
|
+
? unquote(firstArg.text)
|
|
147
|
+
: (firstArg?.text ?? "");
|
|
148
|
+
return {
|
|
149
|
+
specifier,
|
|
150
|
+
importKind: "import",
|
|
151
|
+
range: rangeOf(callNode, ctx),
|
|
152
|
+
typeOnly: false,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Das Sprachprofil der JS/TS-Familie (TypeScript, JavaScript, TSX, JSX).
|
|
3
|
+
*
|
|
4
|
+
* Diese Datei fuegt zusammen, was vorher fest in `engine.ts`, `chunks.ts` und
|
|
5
|
+
* `fingerprint.ts` stand: die Knotenarten aus `node-kinds.ts` und die
|
|
6
|
+
* handgeschriebenen Detektoren aus `decisions.ts`, `import-detection.ts`,
|
|
7
|
+
* `call-detection.ts`, `scope-naming.ts`, `scope-signature.ts` und
|
|
8
|
+
* `doc-binding.ts`. Es ist eine reine UMSTELLUNG, keine Verhaltensaenderung —
|
|
9
|
+
* jede Verzweigung steht hier in derselben Reihenfolge und mit derselben
|
|
10
|
+
* Bedingung wie vorher im Motor. Die Golden-Tests (`languages/golden.test.ts`)
|
|
11
|
+
* und `cursor-walk.test.ts` sind der Beleg, dass sie es geblieben ist.
|
|
12
|
+
*
|
|
13
|
+
* WARUM DIE DETEKTOREN NICHT MITGEZOGEN SIND: sie sind nicht generisch, und
|
|
14
|
+
* das sollen sie auch nicht sein. `detectStaticImport` kennt `import_clause`,
|
|
15
|
+
* `named_imports`, `namespace_import` — Formen der ECMAScript-Grammatik. Eine
|
|
16
|
+
* tabellengetriebene Fassung davon waere eine Tabelle mit genau einem Eintrag
|
|
17
|
+
* und einer Menge Ausreden. Andere Sprachen bekommen ihre eigene, kleine
|
|
18
|
+
* Fassung ueber `table-profile.ts`.
|
|
19
|
+
*/
|
|
20
|
+
import type { LiteralFact, SupportLevel } from "@untangle-code/domain";
|
|
21
|
+
|
|
22
|
+
import { detectCallExpression, detectNewExpression } from "./call-detection.js";
|
|
23
|
+
import { detectDecisionAndNesting, mayCarryDecisionOrNesting } from "./decisions.js";
|
|
24
|
+
import type { Dialect } from "./dialect.js";
|
|
25
|
+
import { resolveDocRange } from "./doc-binding.js";
|
|
26
|
+
import {
|
|
27
|
+
detectDynamicImport,
|
|
28
|
+
detectReExport,
|
|
29
|
+
detectRequireCall,
|
|
30
|
+
detectStaticImport,
|
|
31
|
+
} from "./import-detection.js";
|
|
32
|
+
import {
|
|
33
|
+
CALL_EXPRESSION,
|
|
34
|
+
CLASS_STATIC_BLOCK_TYPE,
|
|
35
|
+
CLASS_TYPES,
|
|
36
|
+
COMMENT_TYPE,
|
|
37
|
+
ENUM_TYPE,
|
|
38
|
+
EXPORT_STATEMENT,
|
|
39
|
+
FIELD_TYPES,
|
|
40
|
+
FUNCTION_LIKE_TYPES,
|
|
41
|
+
IDENTIFIER_LEAF_TYPES,
|
|
42
|
+
IGNORED_PUNCTUATION_TYPES,
|
|
43
|
+
IMPORT_STATEMENT,
|
|
44
|
+
INTERFACE_TYPE,
|
|
45
|
+
LITERAL_CONTAINER_STOP_TYPES,
|
|
46
|
+
METHOD_TYPE,
|
|
47
|
+
NAMESPACE_TYPE,
|
|
48
|
+
NEW_EXPRESSION,
|
|
49
|
+
SCOPE_OPENING_TYPES,
|
|
50
|
+
SIMPLE_LITERAL_LEAF_TYPES,
|
|
51
|
+
TEMPLATE_TEXT_LEAF_TYPES,
|
|
52
|
+
TYPE_ALIAS_TYPE,
|
|
53
|
+
} from "./node-kinds.js";
|
|
54
|
+
import { rangeOf } from "./node-utils.js";
|
|
55
|
+
import type { LanguageProfile, MemberRegion, ModuleFactSink, ScopeSignature } from "./profile.js";
|
|
56
|
+
import type { ScopeNode } from "./scope-model.js";
|
|
57
|
+
import {
|
|
58
|
+
fieldDelegatesToFunctionValue,
|
|
59
|
+
resolveExportedNames,
|
|
60
|
+
resolveScopeName,
|
|
61
|
+
resolveVisibility,
|
|
62
|
+
} from "./scope-naming.js";
|
|
63
|
+
import {
|
|
64
|
+
buildFunctionSignature,
|
|
65
|
+
buildHeaderSignature,
|
|
66
|
+
buildPropertySignature,
|
|
67
|
+
isFunctionLikeScope,
|
|
68
|
+
} from "./scope-signature.js";
|
|
69
|
+
import type { SyntaxNode } from "./syntax.js";
|
|
70
|
+
|
|
71
|
+
/** Der TS-Knoten, dessen Blaetter reine Typsyntax sind (`string`, `number`, `void`, ...). */
|
|
72
|
+
const PREDEFINED_TYPE = "predefined_type";
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Die Knotenarten, fuer die der Walk einen Knotenwrapper braucht: Scopeoeffner,
|
|
76
|
+
* Entscheidungstraeger, Import/Export, Aufruf. Fuer alles andere bleibt der
|
|
77
|
+
* Cursor unter sich (WP-95).
|
|
78
|
+
*/
|
|
79
|
+
function needsNodeFor(kind: string): boolean {
|
|
80
|
+
return (
|
|
81
|
+
SCOPE_OPENING_TYPES.has(kind) ||
|
|
82
|
+
mayCarryDecisionOrNesting(kind) ||
|
|
83
|
+
kind === IMPORT_STATEMENT ||
|
|
84
|
+
kind === EXPORT_STATEMENT ||
|
|
85
|
+
kind === CALL_EXPRESSION ||
|
|
86
|
+
kind === NEW_EXPRESSION
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function simpleLiteralKind(kind: string): LiteralFact["literalKind"] {
|
|
91
|
+
switch (kind) {
|
|
92
|
+
case "number":
|
|
93
|
+
return "number";
|
|
94
|
+
case "true":
|
|
95
|
+
case "false":
|
|
96
|
+
return "boolean";
|
|
97
|
+
case "null":
|
|
98
|
+
return "null";
|
|
99
|
+
default:
|
|
100
|
+
return "other";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Deklaration oder Verweis? Aus `cursor.currentFieldName` und der Elternart —
|
|
106
|
+
* unveraendert aus `engine.ts` uebernommen.
|
|
107
|
+
*/
|
|
108
|
+
function identifierRole(
|
|
109
|
+
fieldName: string | undefined,
|
|
110
|
+
parentKind: string,
|
|
111
|
+
): "declaration" | "reference" {
|
|
112
|
+
if (fieldName === "name") {
|
|
113
|
+
if (
|
|
114
|
+
parentKind === "variable_declarator" ||
|
|
115
|
+
parentKind === "function_declaration" ||
|
|
116
|
+
parentKind === "class_declaration" ||
|
|
117
|
+
parentKind === "abstract_class_declaration" ||
|
|
118
|
+
parentKind === "interface_declaration" ||
|
|
119
|
+
parentKind === "type_alias_declaration" ||
|
|
120
|
+
parentKind === "enum_declaration" ||
|
|
121
|
+
parentKind === "method_definition" ||
|
|
122
|
+
parentKind === "required_parameter" ||
|
|
123
|
+
parentKind === "optional_parameter" ||
|
|
124
|
+
parentKind === "import_specifier" ||
|
|
125
|
+
parentKind === "namespace_import"
|
|
126
|
+
) {
|
|
127
|
+
return "declaration";
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (
|
|
131
|
+
fieldName === "property" &&
|
|
132
|
+
(parentKind === "field_definition" || parentKind === "public_field_definition")
|
|
133
|
+
) {
|
|
134
|
+
return "declaration";
|
|
135
|
+
}
|
|
136
|
+
return "reference";
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Baut das Profil einer der vier JS/TS-Dialekte. */
|
|
140
|
+
export function createJsFamilyProfile(dialect: Dialect): LanguageProfile {
|
|
141
|
+
const supportLevel: SupportLevel = dialect.supportLevel;
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
languageId: dialect.languageId,
|
|
145
|
+
extensions: dialect.extensions,
|
|
146
|
+
supportLevel,
|
|
147
|
+
|
|
148
|
+
commentKinds: new Set([COMMENT_TYPE]),
|
|
149
|
+
literalContainerKinds: LITERAL_CONTAINER_STOP_TYPES,
|
|
150
|
+
identifierLeafKinds: IDENTIFIER_LEAF_TYPES,
|
|
151
|
+
simpleLiteralLeafKinds: SIMPLE_LITERAL_LEAF_TYPES,
|
|
152
|
+
templateTextLeafKinds: TEMPLATE_TEXT_LEAF_TYPES,
|
|
153
|
+
ignoredPunctuationKinds: IGNORED_PUNCTUATION_TYPES,
|
|
154
|
+
typeKeywordParentKinds: new Set([PREDEFINED_TYPE]),
|
|
155
|
+
functionLikeKinds: FUNCTION_LIKE_TYPES,
|
|
156
|
+
exportWrapperKinds: new Set([EXPORT_STATEMENT]),
|
|
157
|
+
|
|
158
|
+
containerLiteralKind: (kind) => (kind === "regex" ? "regex" : "string"),
|
|
159
|
+
simpleLiteralKind,
|
|
160
|
+
identifierRole,
|
|
161
|
+
needsNode: needsNodeFor,
|
|
162
|
+
|
|
163
|
+
scopeKindOf(node: SyntaxNode): ScopeNode["kind"] | null {
|
|
164
|
+
if (FUNCTION_LIKE_TYPES.has(node.type)) return "function";
|
|
165
|
+
if (node.type === METHOD_TYPE) {
|
|
166
|
+
return resolveScopeName(node) === "constructor" ? "constructor" : "method";
|
|
167
|
+
}
|
|
168
|
+
if (CLASS_TYPES.has(node.type)) return "class";
|
|
169
|
+
if (node.type === INTERFACE_TYPE) return "interface";
|
|
170
|
+
if (node.type === TYPE_ALIAS_TYPE) return "type";
|
|
171
|
+
if (node.type === ENUM_TYPE) return "enum";
|
|
172
|
+
if (node.type === NAMESPACE_TYPE) return "namespace";
|
|
173
|
+
if (node.type === dialect.fieldDefinitionKind) return "property";
|
|
174
|
+
return null;
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
suppressesScope(node: SyntaxNode): boolean {
|
|
178
|
+
return FIELD_TYPES.has(node.type) && fieldDelegatesToFunctionValue(node);
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
scopeName: resolveScopeName,
|
|
182
|
+
|
|
183
|
+
scopeSignature(node: SyntaxNode, kind: ScopeNode["kind"], name: string): ScopeSignature {
|
|
184
|
+
return isFunctionLikeScope(node.type)
|
|
185
|
+
? buildFunctionSignature(node, name)
|
|
186
|
+
: kind === "property"
|
|
187
|
+
? buildPropertySignature(node, name)
|
|
188
|
+
: buildHeaderSignature(node);
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
docRange: resolveDocRange,
|
|
192
|
+
visibility: resolveVisibility,
|
|
193
|
+
exportedNames: resolveExportedNames,
|
|
194
|
+
detectDecisionAndNesting,
|
|
195
|
+
|
|
196
|
+
collectModuleFacts(node, kind, callerScopeId, ctx, sink: ModuleFactSink): void {
|
|
197
|
+
if (kind === IMPORT_STATEMENT) {
|
|
198
|
+
const detectedImport = detectStaticImport(node, ctx);
|
|
199
|
+
if (detectedImport !== null) sink.imports.push(detectedImport);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (kind === EXPORT_STATEMENT) {
|
|
203
|
+
if (node.childForFieldName("source") !== null) {
|
|
204
|
+
const reExport = detectReExport(node, ctx);
|
|
205
|
+
if (reExport !== null) sink.imports.push(reExport);
|
|
206
|
+
}
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (kind === CALL_EXPRESSION) {
|
|
210
|
+
const functionNode = node.childForFieldName("function");
|
|
211
|
+
if (functionNode?.type === "import") {
|
|
212
|
+
const dynamicImport = detectDynamicImport(node, ctx);
|
|
213
|
+
if (dynamicImport !== null) sink.imports.push(dynamicImport);
|
|
214
|
+
} else if (functionNode?.type === "identifier" && functionNode.text === "require") {
|
|
215
|
+
const requireImport = detectRequireCall(node, ctx);
|
|
216
|
+
if (requireImport !== null) sink.imports.push(requireImport);
|
|
217
|
+
} else {
|
|
218
|
+
const call = detectCallExpression(node, callerScopeId, ctx);
|
|
219
|
+
if (call !== null) sink.calls.push(call);
|
|
220
|
+
}
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (kind === NEW_EXPRESSION) {
|
|
224
|
+
const call = detectNewExpression(node, callerScopeId, ctx);
|
|
225
|
+
if (call !== null) sink.calls.push(call);
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
|
|
229
|
+
memberRegions(node: SyntaxNode, parentScopeId, ctx): MemberRegion[] {
|
|
230
|
+
const body = node.childForFieldName("body");
|
|
231
|
+
if (body === null) return [];
|
|
232
|
+
const regions: MemberRegion[] = [];
|
|
233
|
+
let ordinal = 0;
|
|
234
|
+
for (const child of body.children) {
|
|
235
|
+
if (child.type !== CLASS_STATIC_BLOCK_TYPE) continue;
|
|
236
|
+
regions.push({
|
|
237
|
+
range: rangeOf(child, ctx),
|
|
238
|
+
scopeId: `${parentScopeId}#static_block#${String(ordinal)}`,
|
|
239
|
+
headerText: "static initialization block",
|
|
240
|
+
});
|
|
241
|
+
ordinal += 1;
|
|
242
|
+
}
|
|
243
|
+
return regions;
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
}
|