@untangle-code/parser-registry 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +352 -2
- package/THIRD_PARTY_LICENSES.md +91 -0
- package/dist/boundaries/expression.d.ts +10 -0
- package/dist/boundaries/expression.d.ts.map +1 -0
- package/dist/boundaries/expression.js +95 -0
- package/dist/boundaries/expression.js.map +1 -0
- package/dist/boundaries/extract.d.ts +12 -0
- package/dist/boundaries/extract.d.ts.map +1 -0
- package/dist/boundaries/extract.js +259 -0
- package/dist/boundaries/extract.js.map +1 -0
- package/dist/boundaries/python.d.ts +6 -0
- package/dist/boundaries/python.d.ts.map +1 -0
- package/dist/boundaries/python.js +154 -0
- package/dist/boundaries/python.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/astgrep-backend/adapter.d.ts +101 -0
- package/dist/languages/astgrep-backend/adapter.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/adapter.js +130 -0
- package/dist/languages/astgrep-backend/adapter.js.map +1 -0
- package/dist/languages/astgrep-backend/index.d.ts +29 -0
- package/dist/languages/astgrep-backend/index.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/index.js +28 -0
- package/dist/languages/astgrep-backend/index.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/bash.d.ts +38 -0
- package/dist/languages/astgrep-backend/lang/bash.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/bash.js +42 -0
- package/dist/languages/astgrep-backend/lang/bash.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/c.d.ts +33 -0
- package/dist/languages/astgrep-backend/lang/c.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/c.js +85 -0
- package/dist/languages/astgrep-backend/lang/c.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/cpp.d.ts +27 -0
- package/dist/languages/astgrep-backend/lang/cpp.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/cpp.js +38 -0
- package/dist/languages/astgrep-backend/lang/cpp.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/csharp.d.ts +24 -0
- package/dist/languages/astgrep-backend/lang/csharp.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/csharp.js +102 -0
- package/dist/languages/astgrep-backend/lang/csharp.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/index.d.ts +29 -0
- package/dist/languages/astgrep-backend/lang/index.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/index.js +22 -0
- package/dist/languages/astgrep-backend/lang/index.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/java.d.ts +26 -0
- package/dist/languages/astgrep-backend/lang/java.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/java.js +89 -0
- package/dist/languages/astgrep-backend/lang/java.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/kotlin.d.ts +44 -0
- package/dist/languages/astgrep-backend/lang/kotlin.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/kotlin.js +94 -0
- package/dist/languages/astgrep-backend/lang/kotlin.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/php.d.ts +23 -0
- package/dist/languages/astgrep-backend/lang/php.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/php.js +80 -0
- package/dist/languages/astgrep-backend/lang/php.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/ruby.d.ts +37 -0
- package/dist/languages/astgrep-backend/lang/ruby.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/ruby.js +70 -0
- package/dist/languages/astgrep-backend/lang/ruby.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/swift.d.ts +34 -0
- package/dist/languages/astgrep-backend/lang/swift.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/swift.js +86 -0
- package/dist/languages/astgrep-backend/lang/swift.js.map +1 -0
- package/dist/languages/astgrep-backend/languages.d.ts +55 -0
- package/dist/languages/astgrep-backend/languages.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/languages.js +214 -0
- package/dist/languages/astgrep-backend/languages.js.map +1 -0
- package/dist/languages/astgrep-backend/napi.d.ts +71 -0
- package/dist/languages/astgrep-backend/napi.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/napi.js +176 -0
- package/dist/languages/astgrep-backend/napi.js.map +1 -0
- package/dist/languages/astgrep-backend/syntax.d.ts +88 -0
- package/dist/languages/astgrep-backend/syntax.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/syntax.js +180 -0
- package/dist/languages/astgrep-backend/syntax.js.map +1 -0
- package/dist/languages/index.d.ts +14 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +37 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/javascript/index.d.ts +4 -0
- package/dist/languages/javascript/index.d.ts.map +1 -0
- package/dist/languages/javascript/index.js +7 -0
- package/dist/languages/javascript/index.js.map +1 -0
- package/dist/languages/jsx/index.d.ts +4 -0
- package/dist/languages/jsx/index.d.ts.map +1 -0
- package/dist/languages/jsx/index.js +7 -0
- package/dist/languages/jsx/index.js.map +1 -0
- package/dist/languages/prose/index.d.ts +53 -0
- package/dist/languages/prose/index.d.ts.map +1 -0
- package/dist/languages/prose/index.js +172 -0
- package/dist/languages/prose/index.js.map +1 -0
- package/dist/languages/prose/line-bytes.d.ts +31 -0
- package/dist/languages/prose/line-bytes.d.ts.map +1 -0
- package/dist/languages/prose/line-bytes.js +39 -0
- package/dist/languages/prose/line-bytes.js.map +1 -0
- package/dist/languages/python/create-adapter.d.ts +20 -0
- package/dist/languages/python/create-adapter.d.ts.map +1 -0
- package/dist/languages/python/create-adapter.js +9 -0
- package/dist/languages/python/create-adapter.js.map +1 -0
- package/dist/languages/python/index.d.ts +4 -0
- package/dist/languages/python/index.d.ts.map +1 -0
- package/dist/languages/python/index.js +6 -0
- package/dist/languages/python/index.js.map +1 -0
- package/dist/languages/python/profile.d.ts +36 -0
- package/dist/languages/python/profile.d.ts.map +1 -0
- package/dist/languages/python/profile.js +282 -0
- package/dist/languages/python/profile.js.map +1 -0
- package/dist/languages/python/signature.d.ts +53 -0
- package/dist/languages/python/signature.d.ts.map +1 -0
- package/dist/languages/python/signature.js +188 -0
- package/dist/languages/python/signature.js.map +1 -0
- package/dist/languages/python/table.d.ts +46 -0
- package/dist/languages/python/table.d.ts.map +1 -0
- package/dist/languages/python/table.js +88 -0
- package/dist/languages/python/table.js.map +1 -0
- package/dist/languages/shared/call-detection.d.ts +17 -0
- package/dist/languages/shared/call-detection.d.ts.map +1 -0
- package/dist/languages/shared/call-detection.js +86 -0
- package/dist/languages/shared/call-detection.js.map +1 -0
- package/dist/languages/shared/chunks.d.ts +28 -0
- package/dist/languages/shared/chunks.d.ts.map +1 -0
- package/dist/languages/shared/chunks.js +181 -0
- package/dist/languages/shared/chunks.js.map +1 -0
- package/dist/languages/shared/create-adapter.d.ts +11 -0
- package/dist/languages/shared/create-adapter.d.ts.map +1 -0
- package/dist/languages/shared/create-adapter.js +90 -0
- package/dist/languages/shared/create-adapter.js.map +1 -0
- package/dist/languages/shared/decisions.d.ts +45 -0
- package/dist/languages/shared/decisions.d.ts.map +1 -0
- package/dist/languages/shared/decisions.js +141 -0
- package/dist/languages/shared/decisions.js.map +1 -0
- package/dist/languages/shared/dialect.d.ts +18 -0
- package/dist/languages/shared/dialect.d.ts.map +1 -0
- package/dist/languages/shared/dialect.js +37 -0
- package/dist/languages/shared/dialect.js.map +1 -0
- package/dist/languages/shared/doc-binding.d.ts +26 -0
- package/dist/languages/shared/doc-binding.d.ts.map +1 -0
- package/dist/languages/shared/doc-binding.js +50 -0
- package/dist/languages/shared/doc-binding.js.map +1 -0
- package/dist/languages/shared/engine.d.ts +49 -0
- package/dist/languages/shared/engine.d.ts.map +1 -0
- package/dist/languages/shared/engine.js +317 -0
- package/dist/languages/shared/engine.js.map +1 -0
- package/dist/languages/shared/extract-symbols.d.ts +5 -0
- package/dist/languages/shared/extract-symbols.d.ts.map +1 -0
- package/dist/languages/shared/extract-symbols.js +31 -0
- package/dist/languages/shared/extract-symbols.js.map +1 -0
- package/dist/languages/shared/fingerprint.d.ts +7 -0
- package/dist/languages/shared/fingerprint.d.ts.map +1 -0
- package/dist/languages/shared/fingerprint.js +95 -0
- package/dist/languages/shared/fingerprint.js.map +1 -0
- package/dist/languages/shared/grammar-loader.d.ts +15 -0
- package/dist/languages/shared/grammar-loader.d.ts.map +1 -0
- package/dist/languages/shared/grammar-loader.js +48 -0
- package/dist/languages/shared/grammar-loader.js.map +1 -0
- package/dist/languages/shared/import-detection.d.ts +24 -0
- package/dist/languages/shared/import-detection.d.ts.map +1 -0
- package/dist/languages/shared/import-detection.js +138 -0
- package/dist/languages/shared/import-detection.js.map +1 -0
- package/dist/languages/shared/js-family-profile.d.ts +5 -0
- package/dist/languages/shared/js-family-profile.d.ts.map +1 -0
- package/dist/languages/shared/js-family-profile.js +179 -0
- package/dist/languages/shared/js-family-profile.js.map +1 -0
- package/dist/languages/shared/node-kinds.d.ts +78 -0
- package/dist/languages/shared/node-kinds.d.ts.map +1 -0
- package/dist/languages/shared/node-kinds.js +141 -0
- package/dist/languages/shared/node-kinds.js.map +1 -0
- package/dist/languages/shared/node-utils.d.ts +31 -0
- package/dist/languages/shared/node-utils.d.ts.map +1 -0
- package/dist/languages/shared/node-utils.js +89 -0
- package/dist/languages/shared/node-utils.js.map +1 -0
- package/dist/languages/shared/parse-diagnostics.d.ts +44 -0
- package/dist/languages/shared/parse-diagnostics.d.ts.map +1 -0
- package/dist/languages/shared/parse-diagnostics.js +64 -0
- package/dist/languages/shared/parse-diagnostics.js.map +1 -0
- package/dist/languages/shared/parse-limits.d.ts +24 -0
- package/dist/languages/shared/parse-limits.d.ts.map +1 -0
- package/dist/languages/shared/parse-limits.js +134 -0
- package/dist/languages/shared/parse-limits.js.map +1 -0
- package/dist/languages/shared/profile.d.ts +149 -0
- package/dist/languages/shared/profile.d.ts.map +1 -0
- package/dist/languages/shared/profile.js +9 -0
- package/dist/languages/shared/profile.js.map +1 -0
- package/dist/languages/shared/scope-model.d.ts +32 -0
- package/dist/languages/shared/scope-model.d.ts.map +1 -0
- package/dist/languages/shared/scope-model.js +2 -0
- package/dist/languages/shared/scope-model.js.map +1 -0
- package/dist/languages/shared/scope-naming.d.ts +20 -0
- package/dist/languages/shared/scope-naming.d.ts.map +1 -0
- package/dist/languages/shared/scope-naming.js +118 -0
- package/dist/languages/shared/scope-naming.js.map +1 -0
- package/dist/languages/shared/scope-signature.d.ts +14 -0
- package/dist/languages/shared/scope-signature.d.ts.map +1 -0
- package/dist/languages/shared/scope-signature.js +82 -0
- package/dist/languages/shared/scope-signature.js.map +1 -0
- package/dist/languages/shared/signature.d.ts +55 -0
- package/dist/languages/shared/signature.d.ts.map +1 -0
- package/dist/languages/shared/signature.js +147 -0
- package/dist/languages/shared/signature.js.map +1 -0
- package/dist/languages/shared/syntax.d.ts +115 -0
- package/dist/languages/shared/syntax.d.ts.map +1 -0
- package/dist/languages/shared/syntax.js +2 -0
- package/dist/languages/shared/syntax.js.map +1 -0
- package/dist/languages/shared/table-profile-decisions.d.ts +54 -0
- package/dist/languages/shared/table-profile-decisions.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-decisions.js +245 -0
- package/dist/languages/shared/table-profile-decisions.js.map +1 -0
- package/dist/languages/shared/table-profile-module-facts.d.ts +29 -0
- package/dist/languages/shared/table-profile-module-facts.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-module-facts.js +139 -0
- package/dist/languages/shared/table-profile-module-facts.js.map +1 -0
- package/dist/languages/shared/table-profile-queries.d.ts +27 -0
- package/dist/languages/shared/table-profile-queries.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-queries.js +70 -0
- package/dist/languages/shared/table-profile-queries.js.map +1 -0
- package/dist/languages/shared/table-profile-scopes.d.ts +46 -0
- package/dist/languages/shared/table-profile-scopes.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-scopes.js +180 -0
- package/dist/languages/shared/table-profile-scopes.js.map +1 -0
- package/dist/languages/shared/table-profile.d.ts +302 -0
- package/dist/languages/shared/table-profile.d.ts.map +1 -0
- package/dist/languages/shared/table-profile.js +125 -0
- package/dist/languages/shared/table-profile.js.map +1 -0
- package/dist/languages/shared/tree-sitter-types.d.ts +44 -0
- package/dist/languages/shared/tree-sitter-types.d.ts.map +1 -0
- package/dist/languages/shared/tree-sitter-types.js +2 -0
- package/dist/languages/shared/tree-sitter-types.js.map +1 -0
- package/dist/languages/structured-text/index.d.ts +48 -0
- package/dist/languages/structured-text/index.d.ts.map +1 -0
- package/dist/languages/structured-text/index.js +120 -0
- package/dist/languages/structured-text/index.js.map +1 -0
- package/dist/languages/tsx/index.d.ts +4 -0
- package/dist/languages/tsx/index.d.ts.map +1 -0
- package/dist/languages/tsx/index.js +7 -0
- package/dist/languages/tsx/index.js.map +1 -0
- package/dist/languages/typescript/index.d.ts +4 -0
- package/dist/languages/typescript/index.d.ts.map +1 -0
- package/dist/languages/typescript/index.js +7 -0
- package/dist/languages/typescript/index.js.map +1 -0
- package/dist/languages/vue/index.d.ts +21 -0
- package/dist/languages/vue/index.d.ts.map +1 -0
- package/dist/languages/vue/index.js +234 -0
- package/dist/languages/vue/index.js.map +1 -0
- package/dist/languages/vue/mapping.d.ts +11 -0
- package/dist/languages/vue/mapping.d.ts.map +1 -0
- package/dist/languages/vue/mapping.js +77 -0
- package/dist/languages/vue/mapping.js.map +1 -0
- package/dist/registry.d.ts +24 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +42 -0
- package/dist/registry.js.map +1 -0
- package/dist/text/byte-offset-table.d.ts +27 -0
- package/dist/text/byte-offset-table.d.ts.map +1 -0
- package/dist/text/byte-offset-table.js +39 -0
- package/dist/text/byte-offset-table.js.map +1 -0
- package/package.json +125 -3
- package/src/boundaries/expression.ts +95 -0
- package/src/boundaries/extract.ts +307 -0
- package/src/boundaries/python.ts +181 -0
- package/src/index.ts +51 -0
- package/src/languages/__golden__/javascript-basic.json +32 -0
- package/src/languages/__golden__/tsx-basic.json +19 -0
- package/src/languages/__golden__/typescript-basic.json +37 -0
- package/src/languages/astgrep-backend/GRAMMARS.md +86 -0
- package/src/languages/astgrep-backend/README.md +112 -0
- package/src/languages/astgrep-backend/__golden__/bash-basic.sh +53 -0
- package/src/languages/astgrep-backend/__golden__/c-basic.c +64 -0
- package/src/languages/astgrep-backend/__golden__/cpp-basic.cpp +65 -0
- package/src/languages/astgrep-backend/__golden__/csharp-basic.cs +73 -0
- package/src/languages/astgrep-backend/__golden__/go-basic.go +93 -0
- package/src/languages/astgrep-backend/__golden__/java-basic.java +62 -0
- package/src/languages/astgrep-backend/__golden__/kotlin-basic.kt +58 -0
- package/src/languages/astgrep-backend/__golden__/php-basic.php +72 -0
- package/src/languages/astgrep-backend/__golden__/ruby-basic.rb +62 -0
- package/src/languages/astgrep-backend/__golden__/rust-basic.rs +82 -0
- package/src/languages/astgrep-backend/__golden__/swift-basic.swift +73 -0
- package/src/languages/astgrep-backend/adapter.ts +240 -0
- package/src/languages/astgrep-backend/index.ts +44 -0
- package/src/languages/astgrep-backend/lang/README.md +115 -0
- package/src/languages/astgrep-backend/lang/bash.ts +78 -0
- package/src/languages/astgrep-backend/lang/c.ts +119 -0
- package/src/languages/astgrep-backend/lang/cpp.ts +65 -0
- package/src/languages/astgrep-backend/lang/csharp.ts +125 -0
- package/src/languages/astgrep-backend/lang/index.ts +61 -0
- package/src/languages/astgrep-backend/lang/java.ts +115 -0
- package/src/languages/astgrep-backend/lang/kotlin.ts +136 -0
- package/src/languages/astgrep-backend/lang/php.ts +105 -0
- package/src/languages/astgrep-backend/lang/ruby.ts +105 -0
- package/src/languages/astgrep-backend/lang/swift.ts +118 -0
- package/src/languages/astgrep-backend/languages.ts +238 -0
- package/src/languages/astgrep-backend/napi.ts +261 -0
- package/src/languages/astgrep-backend/syntax.ts +242 -0
- package/src/languages/index.ts +53 -0
- package/src/languages/javascript/index.ts +9 -0
- package/src/languages/jsx/index.ts +9 -0
- package/src/languages/prose/index.ts +270 -0
- package/src/languages/prose/line-bytes.ts +52 -0
- package/src/languages/python/README.md +246 -0
- package/src/languages/python/__golden__/python-basic.json +44 -0
- package/src/languages/python/create-adapter.ts +29 -0
- package/src/languages/python/index.ts +8 -0
- package/src/languages/python/profile.ts +341 -0
- package/src/languages/python/signature.ts +183 -0
- package/src/languages/python/table.ts +135 -0
- package/src/languages/shared/__fixtures__/large-over-32kib.ts.txt +1207 -0
- package/src/languages/shared/call-detection.ts +112 -0
- package/src/languages/shared/chunks.ts +255 -0
- package/src/languages/shared/create-adapter.ts +136 -0
- package/src/languages/shared/decisions.ts +204 -0
- package/src/languages/shared/dialect.ts +55 -0
- package/src/languages/shared/doc-binding.ts +78 -0
- package/src/languages/shared/engine.ts +461 -0
- package/src/languages/shared/extract-symbols.ts +35 -0
- package/src/languages/shared/fingerprint.ts +99 -0
- package/src/languages/shared/grammar-loader.ts +67 -0
- package/src/languages/shared/import-detection.ts +154 -0
- package/src/languages/shared/js-family-profile.ts +246 -0
- package/src/languages/shared/node-kinds.ts +153 -0
- package/src/languages/shared/node-utils.ts +120 -0
- package/src/languages/shared/parse-diagnostics.ts +125 -0
- package/src/languages/shared/parse-limits.ts +147 -0
- package/src/languages/shared/profile.ts +184 -0
- package/src/languages/shared/scope-model.ts +43 -0
- package/src/languages/shared/scope-naming.ts +124 -0
- package/src/languages/shared/scope-signature.ts +108 -0
- package/src/languages/shared/signature.ts +149 -0
- package/src/languages/shared/syntax.ts +116 -0
- package/src/languages/shared/table-profile-decisions.ts +251 -0
- package/src/languages/shared/table-profile-module-facts.ts +177 -0
- package/src/languages/shared/table-profile-queries.ts +85 -0
- package/src/languages/shared/table-profile-scopes.ts +198 -0
- package/src/languages/shared/table-profile.ts +427 -0
- package/src/languages/shared/tree-sitter-types.ts +46 -0
- package/src/languages/structured-text/index.ts +192 -0
- package/src/languages/tsx/index.ts +9 -0
- package/src/languages/typescript/index.ts +9 -0
- package/src/languages/vue/index.ts +312 -0
- package/src/languages/vue/mapping.ts +93 -0
- package/src/registry.ts +61 -0
- package/src/text/byte-offset-table.ts +63 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Die Adapterfabrik des ast-grep-Backends.
|
|
3
|
+
*
|
|
4
|
+
* Sie baut aus einer Sprachtabelle (`shared/table-profile.ts`) einen
|
|
5
|
+
* vollstaendigen `LanguageAdapter` (domain `analysis.ts`) — mit DEMSELBEN
|
|
6
|
+
* Walk, DENSELBEN Diagnosen, DENSELBEN Fingerabdruecken und DEMSELBEN
|
|
7
|
+
* Regionenbau wie der tree-sitter-Weg. `chunker`, `complexity`, `file-graph`
|
|
8
|
+
* und `symbol-graph` koennen nicht erkennen, welches Backend gelaufen ist;
|
|
9
|
+
* genau das ist die Zusage.
|
|
10
|
+
*
|
|
11
|
+
* WAS SICH ZWISCHEN DEN BACKENDS UNTERSCHEIDET, und wo es steht:
|
|
12
|
+
*
|
|
13
|
+
* 1. GROESSENGRENZE. Die 32-KiB-Puffergrenze der nativen tree-sitter-Bindung
|
|
14
|
+
* (`shared/parse-limits.ts`, WP-215) gibt es hier NICHT: ast-grep nimmt
|
|
15
|
+
* 84 KB, 167 KB, 1 MB und 4 MB ohne jede Option. Dafuer kostet der Walk
|
|
16
|
+
* mehr Speicher, also gilt eine EIGENE, niedrigere Obergrenze
|
|
17
|
+
* ({@link MAX_ASTGREP_SOURCE_BYTES}) — begruendet unten.
|
|
18
|
+
*
|
|
19
|
+
* 2. FEHLENDE KNOTEN. tree-sitter misst sie (`nodeIsMissing`), ast-grep hat
|
|
20
|
+
* dafuer nichts. Der Cursor liefert hier eine Heuristik, und JEDE daraus
|
|
21
|
+
* entstehende Diagnose sagt das in ihrem Text
|
|
22
|
+
* (`collectParseDiagnostics(..., "heuristic")`). `missingNodeCount` bleibt
|
|
23
|
+
* eine Zahl — aber eine, deren Herkunft in der Ausgabe steht (E4).
|
|
24
|
+
*
|
|
25
|
+
* 3. VERSIONIERUNG. Ein anderer Parser erzeugt eine andere AST-Form und damit
|
|
26
|
+
* andere Chunk-IDs und Fingerabdruecke. Sichtbar wird das ueber
|
|
27
|
+
* `parserVersionForLanguage` (domain `versions.ts`), das fuer jede
|
|
28
|
+
* ast-grep-Sprache eine eigene `parser_version` liefert. Ohne sie lieferten
|
|
29
|
+
* die inhaltsadressierten Caches aus WP-100 stillschweigend Altes.
|
|
30
|
+
*/
|
|
31
|
+
import type {
|
|
32
|
+
AstRegion,
|
|
33
|
+
ComplexityFacts,
|
|
34
|
+
HalsteadTokens,
|
|
35
|
+
LanguageAdapter,
|
|
36
|
+
ParsedAst,
|
|
37
|
+
ParseResult,
|
|
38
|
+
RawCall,
|
|
39
|
+
RawImport,
|
|
40
|
+
SourceFile,
|
|
41
|
+
} from "@untangle-code/domain";
|
|
42
|
+
import { AdapterParseError } from "@untangle-code/domain";
|
|
43
|
+
|
|
44
|
+
import { buildByteOffsetTable } from "../../text/byte-offset-table.js";
|
|
45
|
+
import { buildFileRegion } from "../shared/chunks.js";
|
|
46
|
+
import type { AnalysisResult } from "../shared/engine.js";
|
|
47
|
+
import { analyzeTree } from "../shared/engine.js";
|
|
48
|
+
import { extractedSymbolsOf } from "../shared/extract-symbols.js";
|
|
49
|
+
import type { FileTextContext } from "../shared/node-utils.js";
|
|
50
|
+
import { collectParseDiagnostics } from "../shared/parse-diagnostics.js";
|
|
51
|
+
import type { LanguageProfile } from "../shared/profile.js";
|
|
52
|
+
import type { SyntaxNode } from "../shared/syntax.js";
|
|
53
|
+
import type { LanguageKindTable } from "../shared/table-profile.js";
|
|
54
|
+
import { createTableProfile, fieldNamesOf } from "../shared/table-profile.js";
|
|
55
|
+
|
|
56
|
+
import { astGrepParse, registerAstGrepLanguage } from "./napi.js";
|
|
57
|
+
import { AstGrepSyntaxNode } from "./syntax.js";
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Obergrenze fuer eine einzelne Quelldatei, in Bytes — 5 MiB.
|
|
61
|
+
*
|
|
62
|
+
* WARUM NIEDRIGER ALS BEIM TREE-SITTER-WEG (8 MiB, `shared/parse-limits.ts`):
|
|
63
|
+
* der Walk kostet hier mehr Speicher, weil jeder Abstieg ueber `children()`
|
|
64
|
+
* geht und dabei je Knoten JS-Wrapper entstehen. SELBST GEMESSEN ueber diesen
|
|
65
|
+
* Adapter (`parse()` + `computeComplexity()`, generierter Go-Quelltext, je
|
|
66
|
+
* Groesse ein EIGENER Prozess, `maxRSS` aus `process.resourceUsage()`,
|
|
67
|
+
* darwin/arm64, Node 26.7.0):
|
|
68
|
+
*
|
|
69
|
+
* Bytes Knoten parse walk Spitzen-RSS
|
|
70
|
+
* 1 MiB 490.959 1.897 ms 12.289 ms 1.048 MiB
|
|
71
|
+
* 2 MiB 976.521 3.087 ms 11.699 ms 2.719 MiB
|
|
72
|
+
* 4 MiB 1.937.712 5.803 ms 45.863 ms 2.098 MiB
|
|
73
|
+
*
|
|
74
|
+
* Die RSS-Spalte ist ERKENNBAR VERRAUSCHT (4 MiB unter 2 MiB), weil die
|
|
75
|
+
* napi-Finalisierer auf der Ereignisschleife laufen und ein synchroner Lauf
|
|
76
|
+
* sie nicht drankommen laesst — dieselbe Beobachtung machte die Erkundung.
|
|
77
|
+
* Verlaesslich ist nur die Groessenordnung: rund ein Gigabyte je Megabyte
|
|
78
|
+
* Quelltext, und damit rund das Vierfache des tree-sitter-Weges.
|
|
79
|
+
*
|
|
80
|
+
* DIE GRENZE IST DESHALB DIE SCANNERGRENZE: 5 MiB, genau die Vorgabe aus
|
|
81
|
+
* `packages/scanner/src/discovery.ts`. Damit ist der Parser bei
|
|
82
|
+
* Standardkonfiguration NIE die engere, unausgesprochene Grenze — jede Datei,
|
|
83
|
+
* die der Scanner durchlaesst, nimmt er auch an —, und zugleich bleibt der
|
|
84
|
+
* Speicherbedarf im messbaren Bereich. Wer die Scannergrenze bewusst anhebt,
|
|
85
|
+
* bekommt hier einen benannten Grund (`file_too_large`) statt eines Absturzes.
|
|
86
|
+
*
|
|
87
|
+
* NICHT GELOEST, und hier ausdruecklich vermerkt: 12 bis 46 Sekunden Walk je
|
|
88
|
+
* Megabyte sind ein eigener Leistungsdefekt dieses Weges (der tree-sitter-Weg
|
|
89
|
+
* misst an vergleichbarer Stelle rund sechs Sekunden je Megabyte). Diese
|
|
90
|
+
* Grenze verhindert nur, dass er in einen Speicherabsturz umschlaegt.
|
|
91
|
+
*/
|
|
92
|
+
export const MAX_ASTGREP_SOURCE_BYTES = 5 * 1024 * 1024;
|
|
93
|
+
|
|
94
|
+
/** Der undurchsichtige Inhalt von `ParsedAst.root` fuer dieses Backend. */
|
|
95
|
+
interface AstGrepAstRoot {
|
|
96
|
+
root: AstGrepSyntaxNode;
|
|
97
|
+
ctx: FileTextContext;
|
|
98
|
+
fileId: string;
|
|
99
|
+
profile: LanguageProfile;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const analysisCache = new WeakMap<ParsedAst, AnalysisResult>();
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Wie in `shared/create-adapter.ts`: `ComplexityFacts.parseDiagnostics` ist der
|
|
106
|
+
* EINZIGE Kanal, ueber den nachgelagerte Rechnungen von einem beschaedigten
|
|
107
|
+
* Baum erfahren. `analyzeTree` sieht die Diagnosen nicht — sie entstehen in
|
|
108
|
+
* `parse()` und haengen am `ParsedAst`.
|
|
109
|
+
*/
|
|
110
|
+
function getAnalysis(ast: ParsedAst): AnalysisResult {
|
|
111
|
+
const cached = analysisCache.get(ast);
|
|
112
|
+
if (cached !== undefined) return cached;
|
|
113
|
+
const root = ast.root as AstGrepAstRoot;
|
|
114
|
+
const analyzed = analyzeTree(root.root, root.ctx, root.fileId, root.profile);
|
|
115
|
+
const result: AnalysisResult = {
|
|
116
|
+
...analyzed,
|
|
117
|
+
facts: { ...analyzed.facts, parseDiagnostics: ast.diagnostics },
|
|
118
|
+
};
|
|
119
|
+
analysisCache.set(ast, result);
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Welches npm-Paket die Grammatik einer Sprache liefert. */
|
|
124
|
+
export interface AstGrepLanguageSource {
|
|
125
|
+
/** Name, unter dem ast-grep die Sprache fuehrt (`parse(name, ...)`). */
|
|
126
|
+
languageName: string;
|
|
127
|
+
/** Sprachpaket, EINZELN aufgenommen — nie eine Sammelabhaengigkeit (450 MB fuer 22 Sprachen). */
|
|
128
|
+
moduleName: string;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Haken fuer eine Sprache, deren Regeln eine Tabelle NICHT ausdrueckt.
|
|
133
|
+
*
|
|
134
|
+
* WOFUER, an einem echten Fall: Python bindet den Doc-Kommentar nicht an ein
|
|
135
|
+
* Kommentarzeichen, sondern an die erste Anweisung des Rumpfes; seine
|
|
136
|
+
* Sichtbarkeit steht in einer Namenskonvention statt in einem Modifikator;
|
|
137
|
+
* und `__all__` gilt je DATEI, nicht je Knoten. Das erste und zweite koennte
|
|
138
|
+
* eine Tabelle notfalls noch beschreiben, das dritte nicht: es braucht einen
|
|
139
|
+
* Zustand, den es erst gibt, wenn die Datei geparst ist.
|
|
140
|
+
*
|
|
141
|
+
* Deshalb DIESER Zuschnitt und kein anderer: der Haken bekommt das fertige
|
|
142
|
+
* Tabellenprofil, den Wurzelknoten und die Datei und darf daraus ein
|
|
143
|
+
* VERFEINERTES Profil bauen. Er laeuft genau einmal je Parse — nicht je
|
|
144
|
+
* Knoten —, und wer ihn nicht setzt, bezahlt nichts.
|
|
145
|
+
*/
|
|
146
|
+
export interface AstGrepAdapterHooks {
|
|
147
|
+
readonly profileForFile?: (
|
|
148
|
+
base: LanguageProfile,
|
|
149
|
+
root: SyntaxNode,
|
|
150
|
+
file: SourceFile,
|
|
151
|
+
) => LanguageProfile;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Baut einen `LanguageAdapter` ueber ast-grep. Die Anmeldung der Sprache
|
|
156
|
+
* kostet hier nichts: kein `require`, keine Grammatik, kein natives Modul —
|
|
157
|
+
* das passiert erst beim ersten `parse()` einer ast-grep-Sprache, und dann
|
|
158
|
+
* fuer alle angemeldeten auf einmal (`napi.ts`, Eigenheit 1).
|
|
159
|
+
*/
|
|
160
|
+
export function createAstGrepAdapter(
|
|
161
|
+
table: LanguageKindTable,
|
|
162
|
+
source: AstGrepLanguageSource,
|
|
163
|
+
hooks: AstGrepAdapterHooks = {},
|
|
164
|
+
): LanguageAdapter {
|
|
165
|
+
const profile = createTableProfile(table);
|
|
166
|
+
const fieldNames = fieldNamesOf(table);
|
|
167
|
+
registerAstGrepLanguage(source.languageName, source.moduleName);
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
languageId: table.languageId,
|
|
171
|
+
extensions: [...table.extensions],
|
|
172
|
+
supportLevel: table.supportLevel,
|
|
173
|
+
|
|
174
|
+
parse(file: SourceFile): ParseResult {
|
|
175
|
+
const byteLength = Buffer.byteLength(file.content, "utf8");
|
|
176
|
+
if (byteLength > MAX_ASTGREP_SOURCE_BYTES) {
|
|
177
|
+
throw new AdapterParseError(
|
|
178
|
+
"file_too_large",
|
|
179
|
+
`Source text with ${String(byteLength)} bytes exceeds the ast-grep parser limit of ` +
|
|
180
|
+
`${String(MAX_ASTGREP_SOURCE_BYTES)} Bytes.`,
|
|
181
|
+
{
|
|
182
|
+
measurements: { sizeBytes: byteLength, limitBytes: MAX_ASTGREP_SOURCE_BYTES },
|
|
183
|
+
},
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// KEIN `bufferSize` und keine 32-KiB-Grenze: die gibt es nur in der
|
|
188
|
+
// nativen tree-sitter-Bindung (`shared/parse-limits.ts`). Nachgeprueft
|
|
189
|
+
// an 84 KB, 167 KB, 1 MB und 4 MB — ast-grep nimmt sie ohne Option an.
|
|
190
|
+
const rootNode = astGrepParse(source.languageName, file.content);
|
|
191
|
+
const root = new AstGrepSyntaxNode(rootNode, fieldNames);
|
|
192
|
+
|
|
193
|
+
const byteTable = buildByteOffsetTable(file.content);
|
|
194
|
+
const ctx: FileTextContext = { sourceText: file.content, byteTable };
|
|
195
|
+
const { parseQuality, diagnostics, errorNodeCount, missingNodeCount } =
|
|
196
|
+
collectParseDiagnostics(root, ctx, "heuristic");
|
|
197
|
+
|
|
198
|
+
if (parseQuality === "failed") {
|
|
199
|
+
return { parseQuality, ast: null, diagnostics, errorNodeCount, missingNodeCount };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const fileProfile = hooks.profileForFile?.(profile, root, file) ?? profile;
|
|
203
|
+
const astRoot: AstGrepAstRoot = { root, ctx, fileId: file.fileId, profile: fileProfile };
|
|
204
|
+
return {
|
|
205
|
+
parseQuality,
|
|
206
|
+
ast: { languageId: table.languageId, parseQuality, root: astRoot, diagnostics },
|
|
207
|
+
diagnostics,
|
|
208
|
+
errorNodeCount,
|
|
209
|
+
missingNodeCount,
|
|
210
|
+
};
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
extractChunks(ast): AstRegion[] {
|
|
214
|
+
const { scopeTree } = getAnalysis(ast);
|
|
215
|
+
const root = ast.root as AstGrepAstRoot;
|
|
216
|
+
return [buildFileRegion(scopeTree, root.ctx, root.profile)];
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
extractSymbols(ast) {
|
|
220
|
+
return extractedSymbolsOf(getAnalysis(ast).scopeTree);
|
|
221
|
+
},
|
|
222
|
+
|
|
223
|
+
extractImports(ast): RawImport[] {
|
|
224
|
+
return getAnalysis(ast).imports;
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
extractCalls(ast): RawCall[] {
|
|
228
|
+
return getAnalysis(ast).calls;
|
|
229
|
+
},
|
|
230
|
+
|
|
231
|
+
computeComplexity(ast): ComplexityFacts {
|
|
232
|
+
return getAnalysis(ast).facts;
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
tokenizeForHalstead(ast): HalsteadTokens {
|
|
236
|
+
const { facts } = getAnalysis(ast);
|
|
237
|
+
return { operators: facts.operators, operands: facts.operands };
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oeffentliche Einstiegspunkte des ast-grep-Backends.
|
|
3
|
+
*
|
|
4
|
+
* WELCHE SPRACHE UEBER WELCHEN WEG LAEUFT, steht in `README.md` neben dieser
|
|
5
|
+
* Datei — mit der Messung, auf der die Aufteilung beruht.
|
|
6
|
+
*/
|
|
7
|
+
import type { LanguageAdapter } from "@untangle-code/domain";
|
|
8
|
+
|
|
9
|
+
import { createAstGrepAdapter } from "./adapter.js";
|
|
10
|
+
import { AST_GREP_LANGUAGES } from "./lang/index.js";
|
|
11
|
+
import { GO_SOURCE, GO_TABLE, RUST_SOURCE, RUST_TABLE } from "./languages.js";
|
|
12
|
+
|
|
13
|
+
export { createAstGrepAdapter, MAX_ASTGREP_SOURCE_BYTES } from "./adapter.js";
|
|
14
|
+
export type { AstGrepAdapterHooks, AstGrepLanguageSource } from "./adapter.js";
|
|
15
|
+
export { GO_SOURCE, GO_TABLE, RUST_SOURCE, RUST_TABLE } from "./languages.js";
|
|
16
|
+
export { AST_GREP_LANGUAGES } from "./lang/index.js";
|
|
17
|
+
export type { AstGrepLanguage } from "./lang/index.js";
|
|
18
|
+
export { astGrepLanguageStates, astGrepLanguageStatus } from "./napi.js";
|
|
19
|
+
export type { AstGrepLanguageStatus } from "./napi.js";
|
|
20
|
+
|
|
21
|
+
/** Go-Adapter ueber ast-grep (`@ast-grep/lang-go`). */
|
|
22
|
+
export function createGoAdapter(): LanguageAdapter {
|
|
23
|
+
return createAstGrepAdapter(GO_TABLE, GO_SOURCE);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Rust-Adapter ueber ast-grep (`@ast-grep/lang-rust`). */
|
|
27
|
+
export function createRustAdapter(): LanguageAdapter {
|
|
28
|
+
return createAstGrepAdapter(RUST_TABLE, RUST_SOURCE);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Die WEITEREN Sprachen aus WP-86 (Java, C#, Ruby, PHP, Kotlin, C, C++, Swift,
|
|
33
|
+
* Bash) — je eine Tabelle unter `lang/`, kein Motor.
|
|
34
|
+
*
|
|
35
|
+
* Sie kommen als LISTE und nicht als neun einzelne Fabriken, damit
|
|
36
|
+
* `languages/index.ts` mit EINER Schleife auskommt: wer die zehnte Sprache
|
|
37
|
+
* aufnimmt, schreibt eine Tabelle und eine Zeile in `lang/index.ts` — und
|
|
38
|
+
* faesst weder diese Datei noch die Registrierung an.
|
|
39
|
+
*/
|
|
40
|
+
export function createBreadthAdapters(): LanguageAdapter[] {
|
|
41
|
+
return AST_GREP_LANGUAGES.map((language) =>
|
|
42
|
+
createAstGrepAdapter(language.table, language.source),
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<a id="sprachbreite-über-ast-grep-wp-86"></a>
|
|
2
|
+
|
|
3
|
+
# Language breadth through ast-grep (WP-86)
|
|
4
|
+
|
|
5
|
+
Nine languages, one table each, no new engine. This file is the **countercheck for the ratchet**
|
|
6
|
+
in `vision.md` §1b: if adding a language costs 800 lines, nothing has been gained.
|
|
7
|
+
|
|
8
|
+
<a id="was-eine-sprache-gekostet-hat--nachgezählt-nicht-geschätzt"></a>
|
|
9
|
+
|
|
10
|
+
## Cost per language — counted, not estimated
|
|
11
|
+
|
|
12
|
+
`wc -l` over tables. "Code only" excludes comments and blank lines; comments explain the
|
|
13
|
+
interpretation and are intentional, not incidental.
|
|
14
|
+
|
|
15
|
+
| Language | File | Total lines | Code only |
|
|
16
|
+
|---|---|---:|---:|
|
|
17
|
+
| C++ | `cpp.ts` | 65 | 39 |
|
|
18
|
+
| Bash | `bash.ts` | 78 | 42 |
|
|
19
|
+
| Ruby | `ruby.ts` | 105 | 70 |
|
|
20
|
+
| PHP | `php.ts` | 105 | 84 |
|
|
21
|
+
| Java | `java.ts` | 115 | 86 |
|
|
22
|
+
| Swift | `swift.ts` | 118 | 83 |
|
|
23
|
+
| C | `c.ts` | 119 | 85 |
|
|
24
|
+
| C# | `csharp.ts` | 125 | 96 |
|
|
25
|
+
| Kotlin | `kotlin.ts` | 133 | 81 |
|
|
26
|
+
| **Nine-language total** | | **963** | **666** |
|
|
27
|
+
| Registration of all nine | `index.ts` | 61 | 46 |
|
|
28
|
+
|
|
29
|
+
**Median per language: 115 lines, including 84 code lines.** Exploration estimated 200–400 lines
|
|
30
|
+
per language, more than twice the measured cost.
|
|
31
|
+
|
|
32
|
+
`cpp.ts` explains why: **C++ costs 39 code lines** because its grammar extends C and the table
|
|
33
|
+
specifies only the **difference**: classes, namespaces, `try`/`catch`, lambdas. Related languages
|
|
34
|
+
must not pay twice for the same thing; doing so means the table boundary is wrong.
|
|
35
|
+
|
|
36
|
+
<a id="was-einmalig-dazukam"></a>
|
|
37
|
+
|
|
38
|
+
## One-time additions
|
|
39
|
+
|
|
40
|
+
`shared/table-profile.ts` grew from **659 to 911 lines (+252)**. Those 252 lines support **all
|
|
41
|
+
eleven** ast-grep languages, not just WP-86's nine:
|
|
42
|
+
|
|
43
|
+
| Addition | Purpose |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `caseExcludeChildKinds`, `caseExcludeFirstChildText` | Catch-all arms do not count; Java, C, C# and Bash use the SAME node kind for `case` and `default` |
|
|
46
|
+
| `elseIfKinds` | Ruby `elsif`, PHP `else_if_clause` and Bash `elif_clause` have separate node kinds |
|
|
47
|
+
| `guardKinds` | Swift `guard` is a dedicated early-return keyword |
|
|
48
|
+
| `patternAlternativeKinds`, `shortCircuitKinds` | Rust `Some(1) \| Some(2)` and `?` |
|
|
49
|
+
| `anonymousOperatorKinds` | Kotlin, Swift and Bash store `&&`/`\|\|` as anonymous children rather than fields |
|
|
50
|
+
| `nameKindPath`, `nameDescend` | C# fields (`variable_declaration > variable_declarator.name`), C declarator chains (`*ring_new`), PHP/Kotlin/Swift properties |
|
|
51
|
+
| `parentKinds` | `var i = 0` in function bodies is NOT a symbol (Kotlin, Swift) |
|
|
52
|
+
| `visibilityWords` | Java `modifiers` stores `private final static` in ONE node |
|
|
53
|
+
| `receiverField`, `acceptCall` | Separate Java/Ruby receivers; Swift `items["a"]` is indexing, not a call |
|
|
54
|
+
|
|
55
|
+
**Overall:** 963 table lines + 252 one-time extension lines = **1,215 lines for nine languages**,
|
|
56
|
+
or **135 lines per language**. For comparison, the package's handwritten Python adapter has
|
|
57
|
+
5,604 lines for **one** language.
|
|
58
|
+
|
|
59
|
+
<a id="was-gemessen-ist-und-was-nicht"></a>
|
|
60
|
+
|
|
61
|
+
## What was and was not measured
|
|
62
|
+
|
|
63
|
+
**Measured** (`golden.test.ts`, 21 tests, all passing): one real example file per language,
|
|
64
|
+
pinning parse quality (`complete`, zero error nodes), the full symbol list by qualified name and
|
|
65
|
+
kind, counts per decision kind, comments, imports and sampled calls. Eight languages additionally
|
|
66
|
+
verify that `switch`/`match`/`case` catch-all arms do **not** count; Rust `?` contributes to extended
|
|
67
|
+
but not classic complexity.
|
|
68
|
+
|
|
69
|
+
**Not measured:** none of these grammars ran against a real project in its language. Example
|
|
70
|
+
files are 53–93 lines, handwritten to expose language characteristics. They support the
|
|
71
|
+
interpretation, not robustness across 100,000 lines of external code. `@ast-grep/lang-swift` is
|
|
72
|
+
version 0.0.8 and carries the greatest risk here.
|
|
73
|
+
|
|
74
|
+
<a id="lizenzen-und-plattformen"></a>
|
|
75
|
+
|
|
76
|
+
## Licenses and platforms
|
|
77
|
+
|
|
78
|
+
Embedded tree-sitter grammars, their authors and platforms **without** prebuilds are documented in
|
|
79
|
+
`../GRAMMARS.md`, NOT `THIRD_PARTY_LICENSES.md`. That file is generated from production dependencies;
|
|
80
|
+
grammars are `devDependencies` *inside* language packages, invisible to the generator.
|
|
81
|
+
|
|
82
|
+
<a id="die-auslegung-der-entscheidungspunkte--wo-sie-nicht-gleich-ist"></a>
|
|
83
|
+
|
|
84
|
+
## Decision-point interpretation — where languages differ
|
|
85
|
+
|
|
86
|
+
Rules are **not** identical across languages. Each table's header explains deviations; overview:
|
|
87
|
+
|
|
88
|
+
| Construct | Interpretation | Rationale location |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| Catch-all arm (`default`, `_`, `else ->`, `*)`) | **Never** counts | Every table |
|
|
91
|
+
| Go `select` | Each `communication_case` counts, a real runtime branch | `../languages.ts` |
|
|
92
|
+
| Rust `match` | Each arm counts except catch-all `_` | `../languages.ts` |
|
|
93
|
+
| Rust `?` | `short_circuit`, **extended only**, never classic | `../languages.ts` |
|
|
94
|
+
| `finally`/`ensure` | Does **not** count; always runs, no branch | `java.ts`, `ruby.ts` |
|
|
95
|
+
| Ruby postfix forms (`x if y`) | Count like their long form | `ruby.ts` |
|
|
96
|
+
| C preprocessor (`#ifdef`) | Does **not** count; compilation, not runtime branching | `c.ts` |
|
|
97
|
+
| C#/Ruby `?.` and `&.` | Do **not** count; null safety, not case distinction | `csharp.ts`, `ruby.ts` |
|
|
98
|
+
| Bash pipes (`\|`) | Do **not** count; chaining, not branching | `bash.ts` |
|
|
99
|
+
| Kotlin `else if` | **Not** recognized as continuation; cognitive readings are higher | `kotlin.ts` |
|
|
100
|
+
|
|
101
|
+
<a id="bekannte-ungenauigkeiten-benannt-statt-verschwiegen"></a>
|
|
102
|
+
|
|
103
|
+
## Known inaccuracies, stated explicitly
|
|
104
|
+
|
|
105
|
+
- **Kotlin and Swift:** grammars provide no field names. `normalizedSignature` uses the first
|
|
106
|
+
line rather than the header up to the body; `IdentifierFact.role` is always `reference` because
|
|
107
|
+
a declaration classification would be guessed.
|
|
108
|
+
- **C++:** constructors have the same node kind as other methods and appear as `function`, not
|
|
109
|
+
`constructor`.
|
|
110
|
+
- **Ruby:** no visibility (`private` is a call, not a symbol modifier) and no imports (`require`
|
|
111
|
+
is an ordinary method call, appearing in `extractCalls`).
|
|
112
|
+
- **Bash:** no imports (`source` is a command); `set`, `return` and other built-ins appear as calls.
|
|
113
|
+
- **Kotlin:** `companion object` members appear flat on the class.
|
|
114
|
+
- **PHP:** with semicolon-form `namespace App\Billing;`, following classes are NOT nested under
|
|
115
|
+
the namespace because the grammar does not nest them.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bash (WP-86).
|
|
3
|
+
*
|
|
4
|
+
* WAS EINE SHELL AN SYMBOLEN HAT: Funktionen. Mehr nicht — keine Klassen,
|
|
5
|
+
* keine Typen, keine Namensraeume. Das ist kein Mangel des Adapters, sondern
|
|
6
|
+
* der Sprache, und deshalb steht hier eine kurze Tabelle statt einer
|
|
7
|
+
* erfundenen Struktur.
|
|
8
|
+
*
|
|
9
|
+
* VARIABLENZUWEISUNGEN AUF OBERSTER EBENE SIND KEINE SYMBOLE. In einer Shell
|
|
10
|
+
* ist jede Zuweisung eine Anweisung; die Grenze zwischen "Konstante" und
|
|
11
|
+
* "Zwischenwert" steht nicht im Syntaxbaum. `MAX_RETRIES=3` und
|
|
12
|
+
* `attempt=$((attempt + 1))` als gleichrangige Symbole zu fuehren waere eine
|
|
13
|
+
* falsche Aussage ueber die Datei.
|
|
14
|
+
*
|
|
15
|
+
* ENTSCHEIDUNGSPUNKTE (spec.md §16.2/§16.3):
|
|
16
|
+
* - `while_statement` deckt AUCH `until` ab — dieselbe Knotenart mit anderem
|
|
17
|
+
* Schluesselwort.
|
|
18
|
+
* - `elif_clause` ist eine eigene Knotenart und damit direkt ein `else_if`.
|
|
19
|
+
* - `case_item` zaehlt als `case`. Der Auffangzweig `*)` zaehlt NICHT: sein
|
|
20
|
+
* Muster ist genau `*` (`caseExcludeFirstChildText`).
|
|
21
|
+
* - `&&`/`||` zwischen Kommandos stehen in einem `list`-Knoten und tragen
|
|
22
|
+
* den Operator als anonymes Kind (`anonymousOperatorKinds`). Sie zaehlen
|
|
23
|
+
* nur ERWEITERT. In der Shell ist `cmd || exit 1` idiomatisch ein
|
|
24
|
+
* Fehlerpfad und kein reiner Kurzschluss; die konservative Auslegung haelt
|
|
25
|
+
* die Zahl mit den anderen zehn Sprachen vergleichbar.
|
|
26
|
+
* - PIPES (`|`) zaehlen NICHT: sie verketten, sie verzweigen nicht.
|
|
27
|
+
*
|
|
28
|
+
* IMPORTE: `source datei` und `. datei` sind gewoehnliche Kommandos, keine
|
|
29
|
+
* eigene Knotenart. Die Tabelle koennte sie nicht von einer selbstgeschriebenen
|
|
30
|
+
* Funktion gleichen Namens unterscheiden — dieser Adapter meldet deshalb KEINE
|
|
31
|
+
* Importe. Wer sie braucht, sieht sie in `extractCalls` als Aufruf von
|
|
32
|
+
* `source`.
|
|
33
|
+
*/
|
|
34
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
35
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
36
|
+
|
|
37
|
+
export const BASH_SOURCE: AstGrepLanguageSource = {
|
|
38
|
+
languageName: "bash",
|
|
39
|
+
moduleName: "@ast-grep/lang-bash",
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const BASH_TABLE: LanguageKindTable = {
|
|
43
|
+
languageId: "shell",
|
|
44
|
+
extensions: [".sh", ".bash", ".zsh", ".ksh"],
|
|
45
|
+
supportLevel: "deep",
|
|
46
|
+
commentKinds: ["comment"],
|
|
47
|
+
stringContainerKinds: ["string", "raw_string", "ansi_c_string", "heredoc_body"],
|
|
48
|
+
identifierLeafKinds: [
|
|
49
|
+
"variable_name",
|
|
50
|
+
"special_variable_name",
|
|
51
|
+
"word",
|
|
52
|
+
"extglob_pattern",
|
|
53
|
+
"simple_expansion",
|
|
54
|
+
],
|
|
55
|
+
numberLeafKinds: ["number"],
|
|
56
|
+
scopes: [{ kinds: ["function_definition"], scopeKind: "function", nameKinds: ["word"] }],
|
|
57
|
+
decisions: {
|
|
58
|
+
ifKinds: ["if_statement"],
|
|
59
|
+
elseIfKinds: ["elif_clause"],
|
|
60
|
+
loopKinds: ["while_statement", "for_statement", "c_style_for_statement"],
|
|
61
|
+
switchKinds: ["case_statement"],
|
|
62
|
+
caseKinds: ["case_item"],
|
|
63
|
+
caseExcludeFirstChildText: "*",
|
|
64
|
+
anonymousOperatorKinds: ["list"],
|
|
65
|
+
logicalAndOperators: ["&&"],
|
|
66
|
+
logicalOrOperators: ["||"],
|
|
67
|
+
jumpKinds: [],
|
|
68
|
+
blockKinds: ["compound_statement", "do_group"],
|
|
69
|
+
},
|
|
70
|
+
// Siehe Modulkopf: die Shell hat keine Importanweisung.
|
|
71
|
+
imports: { kinds: [] },
|
|
72
|
+
calls: {
|
|
73
|
+
kinds: ["command"],
|
|
74
|
+
functionField: "name",
|
|
75
|
+
},
|
|
76
|
+
declarationParentKinds: [],
|
|
77
|
+
fieldNames: ["name"],
|
|
78
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C (WP-86).
|
|
3
|
+
*
|
|
4
|
+
* DER EINE BESONDERE PUNKT: C schreibt den Namen einer Funktion nicht in ein
|
|
5
|
+
* `name`-Feld, sondern in eine Kette von Deklaratoren.
|
|
6
|
+
* `ring_t *ring_new(size_t cap)` ergibt
|
|
7
|
+
* `function_definition.declarator` -> `pointer_declarator.declarator`
|
|
8
|
+
* -> `function_declarator.declarator` -> `identifier`. Dafuer gibt es
|
|
9
|
+
* `nameDescend`: demselben Feld folgen, solange es weiterfuehrt. Ohne das
|
|
10
|
+
* hiesse jede zeigerwertige Funktion `*ring_new(size_t cap)`.
|
|
11
|
+
*
|
|
12
|
+
* ABBILDUNGEN: `struct`/`union` -> `class`, `typedef` -> `type`.
|
|
13
|
+
*
|
|
14
|
+
* ENTSCHEIDUNGSPUNKTE (spec.md §16.2/§16.3):
|
|
15
|
+
* - `case_statement` traegt `case X:` UND `default:` — nur die `case`-Form
|
|
16
|
+
* zaehlt (`caseExcludeChildKinds`).
|
|
17
|
+
* - C hat kein `try`/`catch`; die Art `catch` entsteht in C-Dateien nie.
|
|
18
|
+
* - PRAEPROZESSORZWEIGE (`#ifdef`, `#if`) zaehlen NICHT. Sie sind
|
|
19
|
+
* Uebersetzungs-, nicht Laufzeitverzweigungen: die uebersetzte Datei
|
|
20
|
+
* enthaelt genau EINEN der Zweige. Beide zu zaehlen ergaebe eine Zahl, die
|
|
21
|
+
* kein ausgefuehrter Pfad je erreicht. Das ist die konservative Auslegung;
|
|
22
|
+
* sie UNTERSCHAETZT Dateien, die schwer per `#ifdef` verzweigen, und das
|
|
23
|
+
* steht hier, damit niemand es aus der Zahl erraten muss.
|
|
24
|
+
* - Es gibt keine Sichtbarkeit im Baum: `static` ist eine Speicherklasse,
|
|
25
|
+
* kein Zugriffsmodifikator. `exportedNames` bleibt deshalb leer, ausser
|
|
26
|
+
* bei einer Funktion OHNE `static` — die ist aus der Uebersetzungseinheit
|
|
27
|
+
* heraus sichtbar, und das ist die einzige Aussage, die der Baum hergibt.
|
|
28
|
+
*/
|
|
29
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
30
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
31
|
+
|
|
32
|
+
export const C_SOURCE: AstGrepLanguageSource = {
|
|
33
|
+
languageName: "c",
|
|
34
|
+
moduleName: "@ast-grep/lang-c",
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const C_TABLE: LanguageKindTable = {
|
|
38
|
+
languageId: "c",
|
|
39
|
+
extensions: [".c", ".h"],
|
|
40
|
+
supportLevel: "deep",
|
|
41
|
+
commentKinds: ["comment"],
|
|
42
|
+
stringContainerKinds: ["string_literal", "char_literal", "system_lib_string"],
|
|
43
|
+
identifierLeafKinds: [
|
|
44
|
+
"identifier",
|
|
45
|
+
"field_identifier",
|
|
46
|
+
"type_identifier",
|
|
47
|
+
"primitive_type",
|
|
48
|
+
"statement_identifier",
|
|
49
|
+
],
|
|
50
|
+
numberLeafKinds: ["number_literal"],
|
|
51
|
+
booleanLeafKinds: ["true", "false"],
|
|
52
|
+
nullLeafKinds: ["null"],
|
|
53
|
+
scopes: [
|
|
54
|
+
{
|
|
55
|
+
kinds: ["function_definition"],
|
|
56
|
+
scopeKind: "function",
|
|
57
|
+
nameField: "declarator",
|
|
58
|
+
nameDescend: true,
|
|
59
|
+
},
|
|
60
|
+
{ kinds: ["struct_specifier", "union_specifier"], scopeKind: "class" },
|
|
61
|
+
{ kinds: ["enum_specifier"], scopeKind: "enum" },
|
|
62
|
+
{
|
|
63
|
+
kinds: ["type_definition"],
|
|
64
|
+
scopeKind: "type",
|
|
65
|
+
nameField: "declarator",
|
|
66
|
+
nameDescend: true,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
kinds: ["field_declaration"],
|
|
70
|
+
scopeKind: "property",
|
|
71
|
+
nameField: "declarator",
|
|
72
|
+
nameDescend: true,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
decisions: {
|
|
76
|
+
ifKinds: ["if_statement"],
|
|
77
|
+
elseIfParentKinds: ["else_clause"],
|
|
78
|
+
loopKinds: ["for_statement", "while_statement", "do_statement"],
|
|
79
|
+
ternaryKinds: ["conditional_expression"],
|
|
80
|
+
switchKinds: ["switch_statement"],
|
|
81
|
+
caseKinds: ["case_statement"],
|
|
82
|
+
caseExcludeChildKinds: ["default"],
|
|
83
|
+
binaryKinds: ["binary_expression"],
|
|
84
|
+
operatorField: "operator",
|
|
85
|
+
logicalAndOperators: ["&&"],
|
|
86
|
+
logicalOrOperators: ["||"],
|
|
87
|
+
jumpKinds: ["return_statement", "break_statement", "continue_statement", "goto_statement"],
|
|
88
|
+
blockKinds: ["compound_statement"],
|
|
89
|
+
consequenceField: "consequence",
|
|
90
|
+
alternativeField: "alternative",
|
|
91
|
+
},
|
|
92
|
+
imports: {
|
|
93
|
+
kinds: ["preproc_include"],
|
|
94
|
+
// Der Spezifizierer behaelt seine SPITZEN KLAMMERN: `<stdlib.h>` ist eine
|
|
95
|
+
// Systemeinbindung, `"ring.h"` eine im Projekt. Die Klammern hier zu
|
|
96
|
+
// entfernen wuerde die beiden Faelle ununterscheidbar machen — und die
|
|
97
|
+
// Aufloesung im `file-graph` haengt genau daran.
|
|
98
|
+
pathField: "path",
|
|
99
|
+
},
|
|
100
|
+
calls: {
|
|
101
|
+
kinds: ["call_expression"],
|
|
102
|
+
functionField: "function",
|
|
103
|
+
argumentsField: "arguments",
|
|
104
|
+
memberKinds: ["field_expression"],
|
|
105
|
+
},
|
|
106
|
+
declarationParentKinds: [
|
|
107
|
+
"struct_specifier",
|
|
108
|
+
"union_specifier",
|
|
109
|
+
"enum_specifier",
|
|
110
|
+
"enumerator",
|
|
111
|
+
"function_declarator",
|
|
112
|
+
],
|
|
113
|
+
bodyField: "body",
|
|
114
|
+
isExported: (_name, node) =>
|
|
115
|
+
!node.children.some(
|
|
116
|
+
(child) => child.type === "storage_class_specifier" && child.text === "static",
|
|
117
|
+
),
|
|
118
|
+
fieldNames: ["name", "declarator"],
|
|
119
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C++ (WP-86) — DER BELEG FUER DIE RATSCHE.
|
|
3
|
+
*
|
|
4
|
+
* Die C++-Grammatik ist eine ERWEITERUNG der C-Grammatik: jede Knotenart aus
|
|
5
|
+
* `c.ts` kommt in C++ genauso vor. Deshalb steht hier keine zweite Tabelle,
|
|
6
|
+
* sondern die DIFFERENZ — Klassen, Namensraeume, `try`/`catch`, Lambdas,
|
|
7
|
+
* bereichsbasierte `for`-Schleifen. Elf Sprachen ergaenzen heisst nicht elfmal
|
|
8
|
+
* dieselbe Arbeit; wo zwei Sprachen verwandt sind, muss die zweite billiger
|
|
9
|
+
* sein als die erste, sonst haben wir nichts gewonnen.
|
|
10
|
+
*
|
|
11
|
+
* ABBILDUNGEN ZUSAETZLICH ZU C: `class` -> `class`, `namespace` ->
|
|
12
|
+
* `namespace`. `template_declaration` ist KEIN eigenes Symbol: es umhuellt
|
|
13
|
+
* die Funktion oder Klasse, die es parametrisiert, und die ist der Scope.
|
|
14
|
+
*
|
|
15
|
+
* ENTSCHEIDUNGSPUNKTE ZUSAETZLICH ZU C: `catch_clause` zaehlt als `catch`,
|
|
16
|
+
* `for_range_loop` als Schleife. `co_await`/`co_yield` zaehlen NICHT — sie
|
|
17
|
+
* unterbrechen den Ablauf, verzweigen ihn aber nicht.
|
|
18
|
+
*
|
|
19
|
+
* SICHTBARKEIT: C++ fuehrt sie als ABSCHNITTSMARKE (`access_specifier`
|
|
20
|
+
* `public:`), nicht am Mitglied. Sie ist damit ohne Positionsvergleich nicht
|
|
21
|
+
* am Symbol ablesbar — der Adapter meldet deshalb keine, statt eine zu raten.
|
|
22
|
+
*/
|
|
23
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
24
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
25
|
+
|
|
26
|
+
import { C_TABLE } from "./c.js";
|
|
27
|
+
|
|
28
|
+
export const CPP_SOURCE: AstGrepLanguageSource = {
|
|
29
|
+
languageName: "cpp",
|
|
30
|
+
moduleName: "@ast-grep/lang-cpp",
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const { isExported: _cIsExported, ...C_TABLE_WITHOUT_EXPORT } = C_TABLE;
|
|
34
|
+
|
|
35
|
+
export const CPP_TABLE: LanguageKindTable = {
|
|
36
|
+
...C_TABLE_WITHOUT_EXPORT,
|
|
37
|
+
languageId: "cpp",
|
|
38
|
+
extensions: [".cpp", ".cc", ".cxx", ".hpp", ".hh", ".hxx"],
|
|
39
|
+
identifierLeafKinds: [
|
|
40
|
+
...C_TABLE.identifierLeafKinds,
|
|
41
|
+
"namespace_identifier",
|
|
42
|
+
"qualified_identifier",
|
|
43
|
+
"this",
|
|
44
|
+
"destructor_name",
|
|
45
|
+
"operator_name",
|
|
46
|
+
],
|
|
47
|
+
nullLeafKinds: [...(C_TABLE.nullLeafKinds ?? []), "nullptr"],
|
|
48
|
+
scopes: [
|
|
49
|
+
...C_TABLE.scopes,
|
|
50
|
+
{ kinds: ["class_specifier"], scopeKind: "class" },
|
|
51
|
+
{ kinds: ["namespace_definition"], scopeKind: "namespace" },
|
|
52
|
+
],
|
|
53
|
+
decisions: {
|
|
54
|
+
...C_TABLE.decisions,
|
|
55
|
+
catchKinds: ["catch_clause"],
|
|
56
|
+
loopKinds: [...C_TABLE.decisions.loopKinds, "for_range_loop"],
|
|
57
|
+
jumpKinds: [...(C_TABLE.decisions.jumpKinds ?? []), "throw_statement"],
|
|
58
|
+
},
|
|
59
|
+
declarationParentKinds: [
|
|
60
|
+
...C_TABLE.declarationParentKinds,
|
|
61
|
+
"class_specifier",
|
|
62
|
+
"namespace_definition",
|
|
63
|
+
"type_parameter_declaration",
|
|
64
|
+
],
|
|
65
|
+
};
|