@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,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C# (WP-86).
|
|
3
|
+
*
|
|
4
|
+
* ABBILDUNGEN: `struct` und `record` -> `class`, `namespace` -> `namespace`.
|
|
5
|
+
* Eine `property_declaration` (`public string Name { get; set; }`) ist eine
|
|
6
|
+
* `property`, keine Methode — die Zugriffsmethoden gehoeren zu ihr.
|
|
7
|
+
*
|
|
8
|
+
* ENTSCHEIDUNGSPUNKTE (spec.md §16.2/§16.3):
|
|
9
|
+
* - `case_switch_label` zaehlt; `default_switch_label` ist eine EIGENE
|
|
10
|
+
* Knotenart und steht deshalb gar nicht erst in `caseKinds`.
|
|
11
|
+
* - `switch_expression_arm` (C# 8, `x switch { ... }`) zaehlt ebenfalls als
|
|
12
|
+
* `case`.
|
|
13
|
+
* - `catch_clause` zaehlt, `finally_clause` nicht.
|
|
14
|
+
* - `??` zaehlt als `short_circuit`, also NUR erweitert.
|
|
15
|
+
* - `?.` (`conditional_access_expression`) zaehlt NICHT. Es verzweigt zwar,
|
|
16
|
+
* ist aber in idiomatischem C# die normale Null-Absicherung; klassisch
|
|
17
|
+
* mitgezaehlt bekaeme jede defensive Kette dieselbe Zahl wie eine echte
|
|
18
|
+
* Fallunterscheidung. Konservative Auslegung, hier benannt.
|
|
19
|
+
*/
|
|
20
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
21
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
22
|
+
|
|
23
|
+
export const CSHARP_SOURCE: AstGrepLanguageSource = {
|
|
24
|
+
languageName: "csharp",
|
|
25
|
+
moduleName: "@ast-grep/lang-csharp",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const CSHARP_TABLE: LanguageKindTable = {
|
|
29
|
+
languageId: "csharp",
|
|
30
|
+
extensions: [".cs"],
|
|
31
|
+
supportLevel: "deep",
|
|
32
|
+
commentKinds: ["comment"],
|
|
33
|
+
stringContainerKinds: [
|
|
34
|
+
"string_literal",
|
|
35
|
+
"verbatim_string_literal",
|
|
36
|
+
"raw_string_literal",
|
|
37
|
+
"character_literal",
|
|
38
|
+
"interpolated_string_expression",
|
|
39
|
+
],
|
|
40
|
+
identifierLeafKinds: ["identifier", "predefined_type", "this", "base"],
|
|
41
|
+
numberLeafKinds: ["integer_literal", "real_literal"],
|
|
42
|
+
booleanLeafKinds: ["boolean_literal"],
|
|
43
|
+
nullLeafKinds: ["null_literal"],
|
|
44
|
+
scopes: [
|
|
45
|
+
{
|
|
46
|
+
kinds: ["namespace_declaration", "file_scoped_namespace_declaration"],
|
|
47
|
+
scopeKind: "namespace",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
kinds: ["class_declaration", "struct_declaration", "record_declaration"],
|
|
51
|
+
scopeKind: "class",
|
|
52
|
+
},
|
|
53
|
+
{ kinds: ["interface_declaration"], scopeKind: "interface" },
|
|
54
|
+
{ kinds: ["enum_declaration"], scopeKind: "enum" },
|
|
55
|
+
{ kinds: ["method_declaration"], scopeKind: "method" },
|
|
56
|
+
{ kinds: ["constructor_declaration"], scopeKind: "constructor" },
|
|
57
|
+
{ kinds: ["property_declaration"], scopeKind: "property" },
|
|
58
|
+
// `field_declaration` hat kein Namensfeld: der Name steht unter
|
|
59
|
+
// `variable_declaration` -> `variable_declarator`.
|
|
60
|
+
{
|
|
61
|
+
kinds: ["field_declaration"],
|
|
62
|
+
scopeKind: "property",
|
|
63
|
+
// `field_declaration > variable_declaration > variable_declarator.name`
|
|
64
|
+
nameKindPath: ["variable_declaration", "variable_declarator"],
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
decisions: {
|
|
68
|
+
ifKinds: ["if_statement"],
|
|
69
|
+
elseIfParentKinds: ["if_statement"],
|
|
70
|
+
loopKinds: ["for_statement", "foreach_statement", "while_statement", "do_statement"],
|
|
71
|
+
catchKinds: ["catch_clause"],
|
|
72
|
+
ternaryKinds: ["conditional_expression"],
|
|
73
|
+
switchKinds: ["switch_statement", "switch_expression"],
|
|
74
|
+
// Die C#-Grammatik gibt der Marke KEINE eigene Knotenart: `case "a":` und
|
|
75
|
+
// `default:` sind beide ein `switch_section`, unterschieden nur durch das
|
|
76
|
+
// Schluesselwortkind. Nachgesehen am Baum von `__golden__/csharp-basic.cs`.
|
|
77
|
+
caseKinds: ["switch_section", "switch_expression_arm"],
|
|
78
|
+
caseExcludeChildKinds: ["default"],
|
|
79
|
+
binaryKinds: ["binary_expression"],
|
|
80
|
+
operatorField: "operator",
|
|
81
|
+
logicalAndOperators: ["&&"],
|
|
82
|
+
logicalOrOperators: ["||"],
|
|
83
|
+
shortCircuitOperators: ["??"],
|
|
84
|
+
jumpKinds: ["return_statement", "throw_statement", "break_statement", "continue_statement"],
|
|
85
|
+
blockKinds: ["block"],
|
|
86
|
+
consequenceField: "consequence",
|
|
87
|
+
alternativeField: "alternative",
|
|
88
|
+
},
|
|
89
|
+
imports: {
|
|
90
|
+
kinds: ["using_directive"],
|
|
91
|
+
// NICHT `name_equals`: bei `using Sys = System.Text;` steht dort der
|
|
92
|
+
// ALIAS, nicht der Pfad — der Pfad ist der `qualified_name` daneben.
|
|
93
|
+
pathKinds: ["qualified_name", "identifier"],
|
|
94
|
+
aliasField: "name",
|
|
95
|
+
},
|
|
96
|
+
calls: {
|
|
97
|
+
kinds: ["invocation_expression"],
|
|
98
|
+
functionField: "function",
|
|
99
|
+
argumentsField: "arguments",
|
|
100
|
+
memberKinds: ["member_access_expression", "qualified_name"],
|
|
101
|
+
constructionKinds: ["object_creation_expression"],
|
|
102
|
+
constructedTypeField: "type",
|
|
103
|
+
},
|
|
104
|
+
declarationParentKinds: [
|
|
105
|
+
"class_declaration",
|
|
106
|
+
"struct_declaration",
|
|
107
|
+
"record_declaration",
|
|
108
|
+
"interface_declaration",
|
|
109
|
+
"enum_declaration",
|
|
110
|
+
"method_declaration",
|
|
111
|
+
"constructor_declaration",
|
|
112
|
+
"property_declaration",
|
|
113
|
+
"variable_declarator",
|
|
114
|
+
"parameter",
|
|
115
|
+
"type_parameter",
|
|
116
|
+
"catch_declaration",
|
|
117
|
+
"enum_member_declaration",
|
|
118
|
+
],
|
|
119
|
+
visibilityKinds: ["modifier"],
|
|
120
|
+
visibilityWords: ["public", "protected", "private", "internal"],
|
|
121
|
+
bodyField: "body",
|
|
122
|
+
isExported: (_name, node) =>
|
|
123
|
+
node.children.some((child) => child.type === "modifier" && child.text === "public"),
|
|
124
|
+
fieldNames: ["name"],
|
|
125
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Die Sprachen aus WP-86: je EINE Tabelle, kein Motor (vision.md §1b).
|
|
3
|
+
*
|
|
4
|
+
* WIE VIEL EINE SPRACHE GEKOSTET HAT, steht in `README.md` neben diesem
|
|
5
|
+
* Verzeichnis — Zeile fuer Zeile nachgezaehlt. Das ist die Gegenprobe zur
|
|
6
|
+
* Ratsche: eine Sprache, die 800 Zeilen kostet, waere kein Gewinn gewesen.
|
|
7
|
+
*
|
|
8
|
+
* REIHENFOLGE = VERBREITUNG. Sie ist zugleich die Reihenfolge, in der die
|
|
9
|
+
* Grammatiken registriert werden (`napi.ts`: EIN Aufruf fuer alle).
|
|
10
|
+
*/
|
|
11
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
12
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
13
|
+
|
|
14
|
+
import { BASH_SOURCE, BASH_TABLE } from "./bash.js";
|
|
15
|
+
import { C_SOURCE, C_TABLE } from "./c.js";
|
|
16
|
+
import { CPP_SOURCE, CPP_TABLE } from "./cpp.js";
|
|
17
|
+
import { CSHARP_SOURCE, CSHARP_TABLE } from "./csharp.js";
|
|
18
|
+
import { JAVA_SOURCE, JAVA_TABLE } from "./java.js";
|
|
19
|
+
import { KOTLIN_SOURCE, KOTLIN_TABLE } from "./kotlin.js";
|
|
20
|
+
import { PHP_SOURCE, PHP_TABLE } from "./php.js";
|
|
21
|
+
import { RUBY_SOURCE, RUBY_TABLE } from "./ruby.js";
|
|
22
|
+
import { SWIFT_SOURCE, SWIFT_TABLE } from "./swift.js";
|
|
23
|
+
|
|
24
|
+
/** Eine Sprache: ihre Tabelle und das Paket, aus dem ihre Grammatik kommt. */
|
|
25
|
+
export interface AstGrepLanguage {
|
|
26
|
+
table: LanguageKindTable;
|
|
27
|
+
source: AstGrepLanguageSource;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const AST_GREP_LANGUAGES: readonly AstGrepLanguage[] = [
|
|
31
|
+
{ table: JAVA_TABLE, source: JAVA_SOURCE },
|
|
32
|
+
{ table: CSHARP_TABLE, source: CSHARP_SOURCE },
|
|
33
|
+
{ table: RUBY_TABLE, source: RUBY_SOURCE },
|
|
34
|
+
{ table: PHP_TABLE, source: PHP_SOURCE },
|
|
35
|
+
{ table: KOTLIN_TABLE, source: KOTLIN_SOURCE },
|
|
36
|
+
{ table: C_TABLE, source: C_SOURCE },
|
|
37
|
+
{ table: CPP_TABLE, source: CPP_SOURCE },
|
|
38
|
+
{ table: SWIFT_TABLE, source: SWIFT_SOURCE },
|
|
39
|
+
{ table: BASH_TABLE, source: BASH_SOURCE },
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
BASH_SOURCE,
|
|
44
|
+
BASH_TABLE,
|
|
45
|
+
CPP_SOURCE,
|
|
46
|
+
CPP_TABLE,
|
|
47
|
+
CSHARP_SOURCE,
|
|
48
|
+
CSHARP_TABLE,
|
|
49
|
+
C_SOURCE,
|
|
50
|
+
C_TABLE,
|
|
51
|
+
JAVA_SOURCE,
|
|
52
|
+
JAVA_TABLE,
|
|
53
|
+
KOTLIN_SOURCE,
|
|
54
|
+
KOTLIN_TABLE,
|
|
55
|
+
PHP_SOURCE,
|
|
56
|
+
PHP_TABLE,
|
|
57
|
+
RUBY_SOURCE,
|
|
58
|
+
RUBY_TABLE,
|
|
59
|
+
SWIFT_SOURCE,
|
|
60
|
+
SWIFT_TABLE,
|
|
61
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Java (WP-86).
|
|
3
|
+
*
|
|
4
|
+
* ABBILDUNGEN auf die Symbolarten aus `shared/scope-model.ts`:
|
|
5
|
+
* `record` -> `class` (ein benannter Verbund mit Feldern; `ChunkKind` kennt
|
|
6
|
+
* kein "record"), `@interface` -> `interface`.
|
|
7
|
+
*
|
|
8
|
+
* ENTSCHEIDUNGSPUNKTE — die Auslegung, ausdruecklich (spec.md §16.2/§16.3):
|
|
9
|
+
* - `switch_label` traegt in DERSELBEN Knotenart sowohl `case X:` als auch
|
|
10
|
+
* `default:`. Nur die `case`-Form zaehlt (`caseExcludeChildKinds`). Ein
|
|
11
|
+
* `switch` mit drei `case` und einem `default` hat DREI Entscheidungen —
|
|
12
|
+
* der Auffangzweig eroeffnet keinen zusaetzlichen unabhaengigen Pfad.
|
|
13
|
+
* - `catch_clause` zaehlt als `catch`. `finally_clause` NICHT: es laeuft
|
|
14
|
+
* immer und verzweigt nichts.
|
|
15
|
+
* - `&&`/`||` zaehlen nur ERWEITERT (§16.3), nie klassisch.
|
|
16
|
+
* - `else if` ist in Java ein `if_statement` DIREKT unter einem
|
|
17
|
+
* `if_statement` (kein `else_clause`) — `elseIfParentKinds` sagt das.
|
|
18
|
+
*
|
|
19
|
+
* NACHGESEHEN, NICHT GERATEN: jede Knotenart hier stammt aus dem Baum von
|
|
20
|
+
* `__golden__/java-basic.java`, und `golden.test.ts` erzeugt ihn wieder.
|
|
21
|
+
*/
|
|
22
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
23
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
24
|
+
|
|
25
|
+
export const JAVA_SOURCE: AstGrepLanguageSource = {
|
|
26
|
+
languageName: "java",
|
|
27
|
+
moduleName: "@ast-grep/lang-java",
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const VISIBILITY_WORDS = ["public", "protected", "private"] as const;
|
|
31
|
+
|
|
32
|
+
export const JAVA_TABLE: LanguageKindTable = {
|
|
33
|
+
languageId: "java",
|
|
34
|
+
extensions: [".java"],
|
|
35
|
+
supportLevel: "deep",
|
|
36
|
+
commentKinds: ["line_comment", "block_comment"],
|
|
37
|
+
stringContainerKinds: ["string_literal", "character_literal", "text_block"],
|
|
38
|
+
identifierLeafKinds: ["identifier", "type_identifier", "this", "super"],
|
|
39
|
+
numberLeafKinds: [
|
|
40
|
+
"decimal_integer_literal",
|
|
41
|
+
"hex_integer_literal",
|
|
42
|
+
"octal_integer_literal",
|
|
43
|
+
"binary_integer_literal",
|
|
44
|
+
"decimal_floating_point_literal",
|
|
45
|
+
"hex_floating_point_literal",
|
|
46
|
+
],
|
|
47
|
+
booleanLeafKinds: ["true", "false"],
|
|
48
|
+
nullLeafKinds: ["null_literal"],
|
|
49
|
+
scopes: [
|
|
50
|
+
{ kinds: ["class_declaration", "record_declaration"], scopeKind: "class" },
|
|
51
|
+
{
|
|
52
|
+
kinds: ["interface_declaration", "annotation_type_declaration"],
|
|
53
|
+
scopeKind: "interface",
|
|
54
|
+
},
|
|
55
|
+
{ kinds: ["enum_declaration"], scopeKind: "enum" },
|
|
56
|
+
{ kinds: ["method_declaration"], scopeKind: "method" },
|
|
57
|
+
{ kinds: ["constructor_declaration"], scopeKind: "constructor" },
|
|
58
|
+
// Der Name eines Feldes steht zwei Ebenen tief:
|
|
59
|
+
// `field_declaration.declarator` -> `variable_declarator.name`.
|
|
60
|
+
{ kinds: ["field_declaration"], scopeKind: "property", nameField: "declarator.name" },
|
|
61
|
+
],
|
|
62
|
+
decisions: {
|
|
63
|
+
ifKinds: ["if_statement"],
|
|
64
|
+
elseIfParentKinds: ["if_statement"],
|
|
65
|
+
loopKinds: ["for_statement", "enhanced_for_statement", "while_statement", "do_statement"],
|
|
66
|
+
catchKinds: ["catch_clause"],
|
|
67
|
+
ternaryKinds: ["ternary_expression"],
|
|
68
|
+
switchKinds: ["switch_statement", "switch_expression"],
|
|
69
|
+
caseKinds: ["switch_label"],
|
|
70
|
+
caseExcludeChildKinds: ["default"],
|
|
71
|
+
binaryKinds: ["binary_expression"],
|
|
72
|
+
operatorField: "operator",
|
|
73
|
+
logicalAndOperators: ["&&"],
|
|
74
|
+
logicalOrOperators: ["||"],
|
|
75
|
+
jumpKinds: ["return_statement", "throw_statement", "break_statement", "continue_statement"],
|
|
76
|
+
blockKinds: ["block"],
|
|
77
|
+
consequenceField: "consequence",
|
|
78
|
+
alternativeField: "alternative",
|
|
79
|
+
},
|
|
80
|
+
imports: {
|
|
81
|
+
kinds: ["import_declaration"],
|
|
82
|
+
// `import_declaration` vergibt keine Feldnamen; der Pfad ist der
|
|
83
|
+
// `scoped_identifier` darin (bei `import a.*` ein `asterisk` daneben).
|
|
84
|
+
pathKinds: ["scoped_identifier", "identifier"],
|
|
85
|
+
},
|
|
86
|
+
calls: {
|
|
87
|
+
kinds: ["method_invocation"],
|
|
88
|
+
functionField: "name",
|
|
89
|
+
receiverField: "object",
|
|
90
|
+
argumentsField: "arguments",
|
|
91
|
+
constructionKinds: ["object_creation_expression"],
|
|
92
|
+
constructedTypeField: "type",
|
|
93
|
+
},
|
|
94
|
+
declarationParentKinds: [
|
|
95
|
+
"class_declaration",
|
|
96
|
+
"record_declaration",
|
|
97
|
+
"interface_declaration",
|
|
98
|
+
"annotation_type_declaration",
|
|
99
|
+
"enum_declaration",
|
|
100
|
+
"method_declaration",
|
|
101
|
+
"constructor_declaration",
|
|
102
|
+
"variable_declarator",
|
|
103
|
+
"formal_parameter",
|
|
104
|
+
"catch_formal_parameter",
|
|
105
|
+
"type_parameter",
|
|
106
|
+
"enum_constant",
|
|
107
|
+
],
|
|
108
|
+
visibilityKinds: ["modifiers"],
|
|
109
|
+
visibilityWords: [...VISIBILITY_WORDS],
|
|
110
|
+
bodyField: "body",
|
|
111
|
+
// Java sagt es mit einem Schluesselwort: `public` in den Modifikatoren.
|
|
112
|
+
isExported: (_name, node) =>
|
|
113
|
+
node.children.some((child) => child.type === "modifiers" && /\bpublic\b/.test(child.text)),
|
|
114
|
+
fieldNames: ["name", "declarator"],
|
|
115
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kotlin (WP-86).
|
|
3
|
+
*
|
|
4
|
+
* DIE BESONDERHEIT, und der Grund fuer jede Eigenart dieser Tabelle: die
|
|
5
|
+
* Kotlin-Grammatik VERGIBT KEINE FELDNAMEN. Kein `name`, kein `body`, kein
|
|
6
|
+
* `condition` — nachgesehen an einer echten Datei mit Klasse, Objekt,
|
|
7
|
+
* Companion, `when`, `try` und Lambda: `node.field(...)` liefert durchweg
|
|
8
|
+
* `null`. Alles laeuft deshalb ueber `nameKinds`, also ueber die ART des
|
|
9
|
+
* ersten passenden Kindes.
|
|
10
|
+
*
|
|
11
|
+
* ZWEI FOLGEN, die in der Ausgabe sichtbar sind und deshalb hier stehen:
|
|
12
|
+
*
|
|
13
|
+
* 1. `normalizedSignature` ist die ERSTE ZEILE des Knotens, nicht der Kopf
|
|
14
|
+
* bis zum Rumpf: ohne `body`-Feld gibt es keinen Punkt, an dem der Rumpf
|
|
15
|
+
* beginnt (`table-profile.ts#scopeSignature` faellt genau darauf zurueck).
|
|
16
|
+
* 2. `IdentifierFact.role` ist IMMER `reference`. Die Rolle haengt am
|
|
17
|
+
* Feldnamen `name` (`identifierRole`), und den gibt es hier nicht. Eine
|
|
18
|
+
* Deklaration von einem Verweis zu unterscheiden waere also geraten —
|
|
19
|
+
* lieber eine ehrlich schwaechere Angabe als eine erfundene.
|
|
20
|
+
*
|
|
21
|
+
* ABBILDUNGEN: `class_declaration` traegt in Kotlin AUCH `interface`,
|
|
22
|
+
* `enum class` und `data class`; unterschieden wird ueber das
|
|
23
|
+
* Schluesselwortkind (`refine`). `object` und `companion object` ->
|
|
24
|
+
* `namespace` (benannte Singletons, keine Typen).
|
|
25
|
+
*
|
|
26
|
+
* ENTSCHEIDUNGSPUNKTE (spec.md §16.2/§16.3):
|
|
27
|
+
* - `if_expression` ist Verzweigung UND Ausdruck (Kotlin hat keinen
|
|
28
|
+
* Ternaeroperator). Gezaehlt als `if` — dieselbe Zahl unabhaengiger Pfade.
|
|
29
|
+
* - `when_entry` ist ein `case`; der `else`-Arm zaehlt nicht
|
|
30
|
+
* (`caseExcludeChildKinds: ["else"]`).
|
|
31
|
+
* - `catch_block` zaehlt, `finally_block` nicht.
|
|
32
|
+
* - `conjunction_expression`/`disjunction_expression` tragen den Operator
|
|
33
|
+
* als anonymes Kind statt in einem Feld — `anonymousOperatorKinds`.
|
|
34
|
+
* - `elvis_expression` (`a ?: b`) zaehlt als `short_circuit`, nur erweitert.
|
|
35
|
+
* - `else if` liegt unter einem `control_structure_body`. Dessen unmittelbar
|
|
36
|
+
* vorangehendes anonymes `else`-Geschwister unterscheidet die Fortsetzung
|
|
37
|
+
* von einem ungekammerten `if` im Dann-Rumpf (WP-243). Damit bekommt eine
|
|
38
|
+
* Kotlin-Kette dieselbe kognitive Verschachtelung wie Java.
|
|
39
|
+
*/
|
|
40
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
41
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
42
|
+
|
|
43
|
+
export const KOTLIN_SOURCE: AstGrepLanguageSource = {
|
|
44
|
+
languageName: "kotlin",
|
|
45
|
+
moduleName: "@ast-grep/lang-kotlin",
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const KOTLIN_TABLE: LanguageKindTable = {
|
|
49
|
+
languageId: "kotlin",
|
|
50
|
+
extensions: [".kt", ".kts"],
|
|
51
|
+
supportLevel: "deep",
|
|
52
|
+
commentKinds: ["line_comment", "multiline_comment"],
|
|
53
|
+
stringContainerKinds: ["string_literal", "character_literal"],
|
|
54
|
+
identifierLeafKinds: ["simple_identifier", "type_identifier", "this", "super"],
|
|
55
|
+
numberLeafKinds: [
|
|
56
|
+
"integer_literal",
|
|
57
|
+
"real_literal",
|
|
58
|
+
"hex_literal",
|
|
59
|
+
"bin_literal",
|
|
60
|
+
"long_literal",
|
|
61
|
+
],
|
|
62
|
+
booleanLeafKinds: ["boolean_literal"],
|
|
63
|
+
nullLeafKinds: ["null"],
|
|
64
|
+
scopes: [
|
|
65
|
+
{
|
|
66
|
+
kinds: ["class_declaration"],
|
|
67
|
+
scopeKind: "class",
|
|
68
|
+
nameKinds: ["type_identifier", "simple_identifier"],
|
|
69
|
+
refine: [
|
|
70
|
+
// Reihenfolge zaehlt: `enum class` traegt BEIDE Schluesselwoerter.
|
|
71
|
+
{ childKinds: ["enum"], scopeKind: "enum" },
|
|
72
|
+
{ childKinds: ["interface"], scopeKind: "interface" },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
kinds: ["object_declaration"],
|
|
77
|
+
scopeKind: "namespace",
|
|
78
|
+
nameKinds: ["type_identifier", "simple_identifier"],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
kinds: ["function_declaration"],
|
|
82
|
+
scopeKind: "function",
|
|
83
|
+
nameKinds: ["simple_identifier"],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
kinds: ["property_declaration"],
|
|
87
|
+
scopeKind: "property",
|
|
88
|
+
// `property_declaration > variable_declaration > simple_identifier`;
|
|
89
|
+
// ohne den letzten Schritt stuende `name: String` (mit Typangabe) im
|
|
90
|
+
// Namen.
|
|
91
|
+
nameKindPath: ["variable_declaration"],
|
|
92
|
+
nameKinds: ["simple_identifier"],
|
|
93
|
+
// NUR auf Klassen-/Dateiebene: `var i = 0` in einem Funktionsrumpf ist
|
|
94
|
+
// eine lokale Variable und kein Symbol.
|
|
95
|
+
parentKinds: ["class_body", "enum_class_body", "source_file"],
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
decisions: {
|
|
99
|
+
ifKinds: ["if_expression"],
|
|
100
|
+
elseIfWrapperKinds: ["control_structure_body"],
|
|
101
|
+
// kotlin-tree-sitter 0.0.7 zerlegt ausgerechnet
|
|
102
|
+
// `else /* Blockkommentar */ if` in Geschwister und verliert das anonyme
|
|
103
|
+
// `else` aus dem Baum. Der Detektor prueft dafuer den exakt begrenzten
|
|
104
|
+
// Token-Spalt zwischen diesen Geschwistern; andere Sprachen bleiben aus.
|
|
105
|
+
recoverDetachedElseIfAfterComments: true,
|
|
106
|
+
loopKinds: ["for_statement", "while_statement", "do_while_statement"],
|
|
107
|
+
catchKinds: ["catch_block"],
|
|
108
|
+
switchKinds: ["when_expression"],
|
|
109
|
+
caseKinds: ["when_entry"],
|
|
110
|
+
caseExcludeChildKinds: ["else"],
|
|
111
|
+
anonymousOperatorKinds: [
|
|
112
|
+
"conjunction_expression",
|
|
113
|
+
"disjunction_expression",
|
|
114
|
+
"elvis_expression",
|
|
115
|
+
],
|
|
116
|
+
logicalAndOperators: ["&&"],
|
|
117
|
+
logicalOrOperators: ["||"],
|
|
118
|
+
shortCircuitOperators: ["?:"],
|
|
119
|
+
jumpKinds: ["jump_expression"],
|
|
120
|
+
blockKinds: ["control_structure_body", "statements"],
|
|
121
|
+
},
|
|
122
|
+
// Kotlin: `import kotlin.math.max` / `import a.b.C as D`. Der Pfad ist das
|
|
123
|
+
// `identifier`-Kind; der Alias steht in einem `import_alias` daneben.
|
|
124
|
+
imports: {
|
|
125
|
+
kinds: ["import_header"],
|
|
126
|
+
pathKinds: ["identifier"],
|
|
127
|
+
},
|
|
128
|
+
calls: {
|
|
129
|
+
kinds: ["call_expression"],
|
|
130
|
+
memberKinds: ["navigation_expression"],
|
|
131
|
+
},
|
|
132
|
+
declarationParentKinds: [],
|
|
133
|
+
visibilityKinds: ["modifiers"],
|
|
134
|
+
visibilityWords: ["public", "internal", "protected", "private"],
|
|
135
|
+
fieldNames: ["name"],
|
|
136
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PHP (WP-86).
|
|
3
|
+
*
|
|
4
|
+
* ABBILDUNGEN: `trait` -> `interface` (ein benannter, wiederverwendbarer Satz
|
|
5
|
+
* von Methoden ohne eigene Instanz — naeher an einer Schnittstelle als an
|
|
6
|
+
* einer Klasse), `namespace` -> `namespace`.
|
|
7
|
+
*
|
|
8
|
+
* ENTSCHEIDUNGSPUNKTE (spec.md §16.2/§16.3):
|
|
9
|
+
* - `else_if_clause` (`elseif`) ist eine EIGENE Knotenart und damit direkt
|
|
10
|
+
* ein `else_if`.
|
|
11
|
+
* - `case_statement` zaehlt; `default_statement` ist eine eigene Knotenart
|
|
12
|
+
* und steht nicht in `caseKinds`.
|
|
13
|
+
* - `match_conditional_expression` (PHP 8 `match`) zaehlt als `case`;
|
|
14
|
+
* `match_default_expression` nicht.
|
|
15
|
+
* - `catch_clause` zaehlt, `finally_clause` nicht.
|
|
16
|
+
* - `??` zaehlt als `short_circuit`, nur erweitert. `and`/`or` (die
|
|
17
|
+
* niedrigpriorisierten Wortformen) zaehlen wie `&&`/`||`.
|
|
18
|
+
*/
|
|
19
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
20
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
21
|
+
|
|
22
|
+
export const PHP_SOURCE: AstGrepLanguageSource = {
|
|
23
|
+
languageName: "php",
|
|
24
|
+
moduleName: "@ast-grep/lang-php",
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const PHP_TABLE: LanguageKindTable = {
|
|
28
|
+
languageId: "php",
|
|
29
|
+
extensions: [".php", ".phtml"],
|
|
30
|
+
supportLevel: "deep",
|
|
31
|
+
commentKinds: ["comment"],
|
|
32
|
+
stringContainerKinds: ["string", "encapsed_string", "heredoc", "nowdoc"],
|
|
33
|
+
identifierLeafKinds: ["name", "variable_name", "qualified_name", "self", "parent"],
|
|
34
|
+
numberLeafKinds: ["integer", "float"],
|
|
35
|
+
booleanLeafKinds: ["boolean"],
|
|
36
|
+
nullLeafKinds: ["null"],
|
|
37
|
+
scopes: [
|
|
38
|
+
{ kinds: ["namespace_definition"], scopeKind: "namespace" },
|
|
39
|
+
{ kinds: ["class_declaration"], scopeKind: "class" },
|
|
40
|
+
{ kinds: ["interface_declaration", "trait_declaration"], scopeKind: "interface" },
|
|
41
|
+
{ kinds: ["enum_declaration"], scopeKind: "enum" },
|
|
42
|
+
{
|
|
43
|
+
kinds: ["method_declaration"],
|
|
44
|
+
scopeKind: "method",
|
|
45
|
+
constructorNames: ["__construct"],
|
|
46
|
+
},
|
|
47
|
+
{ kinds: ["function_definition"], scopeKind: "function" },
|
|
48
|
+
{
|
|
49
|
+
kinds: ["property_declaration"],
|
|
50
|
+
scopeKind: "property",
|
|
51
|
+
// `property_declaration > property_element.name`
|
|
52
|
+
nameKindPath: ["property_element"],
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
decisions: {
|
|
56
|
+
ifKinds: ["if_statement"],
|
|
57
|
+
elseIfKinds: ["else_if_clause"],
|
|
58
|
+
loopKinds: ["for_statement", "foreach_statement", "while_statement", "do_statement"],
|
|
59
|
+
catchKinds: ["catch_clause"],
|
|
60
|
+
ternaryKinds: ["conditional_expression"],
|
|
61
|
+
switchKinds: ["switch_statement", "match_expression"],
|
|
62
|
+
caseKinds: ["case_statement", "match_conditional_expression"],
|
|
63
|
+
binaryKinds: ["binary_expression"],
|
|
64
|
+
operatorField: "operator",
|
|
65
|
+
logicalAndOperators: ["&&", "and"],
|
|
66
|
+
logicalOrOperators: ["||", "or"],
|
|
67
|
+
shortCircuitOperators: ["??"],
|
|
68
|
+
jumpKinds: ["return_statement", "break_statement", "continue_statement", "throw_expression"],
|
|
69
|
+
blockKinds: ["compound_statement"],
|
|
70
|
+
consequenceField: "body",
|
|
71
|
+
alternativeField: "alternative",
|
|
72
|
+
},
|
|
73
|
+
imports: {
|
|
74
|
+
kinds: ["namespace_use_declaration"],
|
|
75
|
+
specKinds: ["namespace_use_clause"],
|
|
76
|
+
pathKinds: ["qualified_name", "name"],
|
|
77
|
+
},
|
|
78
|
+
calls: {
|
|
79
|
+
kinds: ["function_call_expression", "member_call_expression", "scoped_call_expression"],
|
|
80
|
+
functionField: "name",
|
|
81
|
+
receiverField: "object",
|
|
82
|
+
argumentsField: "arguments",
|
|
83
|
+
constructionKinds: ["object_creation_expression"],
|
|
84
|
+
},
|
|
85
|
+
declarationParentKinds: [
|
|
86
|
+
"class_declaration",
|
|
87
|
+
"interface_declaration",
|
|
88
|
+
"trait_declaration",
|
|
89
|
+
"enum_declaration",
|
|
90
|
+
"method_declaration",
|
|
91
|
+
"function_definition",
|
|
92
|
+
"simple_parameter",
|
|
93
|
+
"property_element",
|
|
94
|
+
"const_element",
|
|
95
|
+
],
|
|
96
|
+
visibilityKinds: ["visibility_modifier"],
|
|
97
|
+
bodyField: "body",
|
|
98
|
+
isExported: (_name, node) =>
|
|
99
|
+
!node.children.some(
|
|
100
|
+
(child) =>
|
|
101
|
+
child.type === "visibility_modifier" &&
|
|
102
|
+
(child.text === "private" || child.text === "protected"),
|
|
103
|
+
),
|
|
104
|
+
fieldNames: ["name"],
|
|
105
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ruby (WP-86).
|
|
3
|
+
*
|
|
4
|
+
* ABBILDUNGEN: `module` -> `namespace`, `class` -> `class`, `def` und
|
|
5
|
+
* `def self.x` -> `method`.
|
|
6
|
+
*
|
|
7
|
+
* KEINE SICHTBARKEIT. Rubys `private`/`public` sind AUFRUFE, die den Rest des
|
|
8
|
+
* Klassenrumpfes umschalten — sie stehen nicht am Symbol. Ohne Datenflussblick
|
|
9
|
+
* ist die Sichtbarkeit eines `def` aus dem Syntaxbaum nicht ablesbar, also
|
|
10
|
+
* meldet dieser Adapter KEINE statt einer geratenen. Dasselbe gilt fuer
|
|
11
|
+
* `exportedNames`.
|
|
12
|
+
*
|
|
13
|
+
* ENTSCHEIDUNGSPUNKTE (spec.md §16.2/§16.3):
|
|
14
|
+
* - Die NACHSTELLFORMEN zaehlen mit: `return x if y` (`if_modifier`) hat
|
|
15
|
+
* genau die zwei Pfade, die `if y then return x end` auch haette. Ebenso
|
|
16
|
+
* `unless_modifier`, `while_modifier`, `until_modifier`.
|
|
17
|
+
* - `elsif` ist eine EIGENE Knotenart und damit direkt ein `else_if`
|
|
18
|
+
* (Fortsetzung, kein voller Nesting-Zuwachs).
|
|
19
|
+
* - `when` und `in_clause` (Ruby 3 `case/in`) sind `case`-Zweige. Der
|
|
20
|
+
* `else`-Zweig eines `case` ist die Knotenart `else` und steht nicht in
|
|
21
|
+
* `caseKinds` — er zaehlt also nicht.
|
|
22
|
+
* - `rescue` zaehlt als `catch`; `ensure` nicht (laeuft immer).
|
|
23
|
+
* - `and`/`or` sind Rubys Wortformen und zaehlen wie `&&`/`||`.
|
|
24
|
+
* - `&.` zaehlt NICHT: es ist das `operator`-Feld eines gewoehnlichen
|
|
25
|
+
* `call`, und jede Kette wuerde sonst zur Verzweigung.
|
|
26
|
+
*
|
|
27
|
+
* IMPORTE: Ruby hat keine. `require`/`require_relative` sind gewoehnliche
|
|
28
|
+
* Methodenaufrufe — hier NICHT als Import gemeldet, weil die Tabelle sie nicht
|
|
29
|
+
* vom gleichnamigen Aufruf einer eigenen Methode unterscheiden koennte. Die
|
|
30
|
+
* Datei meldet also KEINE Importe statt moeglicherweise falscher. Wer sie
|
|
31
|
+
* braucht, sieht sie in `extractCalls` als Aufrufe von `require`.
|
|
32
|
+
*/
|
|
33
|
+
import type { LanguageKindTable } from "../../shared/table-profile.js";
|
|
34
|
+
import type { AstGrepLanguageSource } from "../adapter.js";
|
|
35
|
+
|
|
36
|
+
export const RUBY_SOURCE: AstGrepLanguageSource = {
|
|
37
|
+
languageName: "ruby",
|
|
38
|
+
moduleName: "@ast-grep/lang-ruby",
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const RUBY_TABLE: LanguageKindTable = {
|
|
42
|
+
languageId: "ruby",
|
|
43
|
+
extensions: [".rb", ".rake", ".gemspec"],
|
|
44
|
+
supportLevel: "deep",
|
|
45
|
+
commentKinds: ["comment"],
|
|
46
|
+
stringContainerKinds: ["string", "string_array", "symbol_array", "regex", "heredoc_body"],
|
|
47
|
+
identifierLeafKinds: [
|
|
48
|
+
"identifier",
|
|
49
|
+
"constant",
|
|
50
|
+
"instance_variable",
|
|
51
|
+
"class_variable",
|
|
52
|
+
"global_variable",
|
|
53
|
+
"simple_symbol",
|
|
54
|
+
"hash_key_symbol",
|
|
55
|
+
"self",
|
|
56
|
+
],
|
|
57
|
+
numberLeafKinds: ["integer", "float"],
|
|
58
|
+
booleanLeafKinds: ["true", "false"],
|
|
59
|
+
nullLeafKinds: ["nil"],
|
|
60
|
+
scopes: [
|
|
61
|
+
{ kinds: ["module"], scopeKind: "namespace" },
|
|
62
|
+
{ kinds: ["class", "singleton_class"], scopeKind: "class" },
|
|
63
|
+
{
|
|
64
|
+
kinds: ["method", "singleton_method"],
|
|
65
|
+
scopeKind: "method",
|
|
66
|
+
constructorNames: ["initialize"],
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
decisions: {
|
|
70
|
+
ifKinds: ["if", "unless", "if_modifier", "unless_modifier"],
|
|
71
|
+
elseIfKinds: ["elsif"],
|
|
72
|
+
loopKinds: ["while", "until", "while_modifier", "until_modifier", "for"],
|
|
73
|
+
catchKinds: ["rescue", "rescue_modifier"],
|
|
74
|
+
ternaryKinds: ["ternary"],
|
|
75
|
+
switchKinds: ["case", "case_match"],
|
|
76
|
+
caseKinds: ["when", "in_clause"],
|
|
77
|
+
binaryKinds: ["binary"],
|
|
78
|
+
operatorField: "operator",
|
|
79
|
+
logicalAndOperators: ["&&", "and"],
|
|
80
|
+
logicalOrOperators: ["||", "or"],
|
|
81
|
+
jumpKinds: ["return", "break", "next", "redo", "retry"],
|
|
82
|
+
blockKinds: ["then", "body_statement"],
|
|
83
|
+
consequenceField: "consequence",
|
|
84
|
+
alternativeField: "alternative",
|
|
85
|
+
},
|
|
86
|
+
// Ruby hat keine Importanweisung — siehe Modulkopf.
|
|
87
|
+
imports: { kinds: [] },
|
|
88
|
+
calls: {
|
|
89
|
+
kinds: ["call"],
|
|
90
|
+
functionField: "method",
|
|
91
|
+
receiverField: "receiver",
|
|
92
|
+
argumentsField: "arguments",
|
|
93
|
+
},
|
|
94
|
+
declarationParentKinds: [
|
|
95
|
+
"method",
|
|
96
|
+
"singleton_method",
|
|
97
|
+
"class",
|
|
98
|
+
"module",
|
|
99
|
+
"optional_parameter",
|
|
100
|
+
"keyword_parameter",
|
|
101
|
+
"block_parameter",
|
|
102
|
+
],
|
|
103
|
+
bodyField: "body",
|
|
104
|
+
fieldNames: ["name"],
|
|
105
|
+
};
|