@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.
Files changed (345) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +352 -2
  4. package/THIRD_PARTY_LICENSES.md +91 -0
  5. package/dist/boundaries/expression.d.ts +10 -0
  6. package/dist/boundaries/expression.d.ts.map +1 -0
  7. package/dist/boundaries/expression.js +95 -0
  8. package/dist/boundaries/expression.js.map +1 -0
  9. package/dist/boundaries/extract.d.ts +12 -0
  10. package/dist/boundaries/extract.d.ts.map +1 -0
  11. package/dist/boundaries/extract.js +259 -0
  12. package/dist/boundaries/extract.js.map +1 -0
  13. package/dist/boundaries/python.d.ts +6 -0
  14. package/dist/boundaries/python.d.ts.map +1 -0
  15. package/dist/boundaries/python.js +154 -0
  16. package/dist/boundaries/python.js.map +1 -0
  17. package/dist/index.d.ts +26 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +19 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/languages/astgrep-backend/adapter.d.ts +101 -0
  22. package/dist/languages/astgrep-backend/adapter.d.ts.map +1 -0
  23. package/dist/languages/astgrep-backend/adapter.js +130 -0
  24. package/dist/languages/astgrep-backend/adapter.js.map +1 -0
  25. package/dist/languages/astgrep-backend/index.d.ts +29 -0
  26. package/dist/languages/astgrep-backend/index.d.ts.map +1 -0
  27. package/dist/languages/astgrep-backend/index.js +28 -0
  28. package/dist/languages/astgrep-backend/index.js.map +1 -0
  29. package/dist/languages/astgrep-backend/lang/bash.d.ts +38 -0
  30. package/dist/languages/astgrep-backend/lang/bash.d.ts.map +1 -0
  31. package/dist/languages/astgrep-backend/lang/bash.js +42 -0
  32. package/dist/languages/astgrep-backend/lang/bash.js.map +1 -0
  33. package/dist/languages/astgrep-backend/lang/c.d.ts +33 -0
  34. package/dist/languages/astgrep-backend/lang/c.d.ts.map +1 -0
  35. package/dist/languages/astgrep-backend/lang/c.js +85 -0
  36. package/dist/languages/astgrep-backend/lang/c.js.map +1 -0
  37. package/dist/languages/astgrep-backend/lang/cpp.d.ts +27 -0
  38. package/dist/languages/astgrep-backend/lang/cpp.d.ts.map +1 -0
  39. package/dist/languages/astgrep-backend/lang/cpp.js +38 -0
  40. package/dist/languages/astgrep-backend/lang/cpp.js.map +1 -0
  41. package/dist/languages/astgrep-backend/lang/csharp.d.ts +24 -0
  42. package/dist/languages/astgrep-backend/lang/csharp.d.ts.map +1 -0
  43. package/dist/languages/astgrep-backend/lang/csharp.js +102 -0
  44. package/dist/languages/astgrep-backend/lang/csharp.js.map +1 -0
  45. package/dist/languages/astgrep-backend/lang/index.d.ts +29 -0
  46. package/dist/languages/astgrep-backend/lang/index.d.ts.map +1 -0
  47. package/dist/languages/astgrep-backend/lang/index.js +22 -0
  48. package/dist/languages/astgrep-backend/lang/index.js.map +1 -0
  49. package/dist/languages/astgrep-backend/lang/java.d.ts +26 -0
  50. package/dist/languages/astgrep-backend/lang/java.d.ts.map +1 -0
  51. package/dist/languages/astgrep-backend/lang/java.js +89 -0
  52. package/dist/languages/astgrep-backend/lang/java.js.map +1 -0
  53. package/dist/languages/astgrep-backend/lang/kotlin.d.ts +44 -0
  54. package/dist/languages/astgrep-backend/lang/kotlin.d.ts.map +1 -0
  55. package/dist/languages/astgrep-backend/lang/kotlin.js +94 -0
  56. package/dist/languages/astgrep-backend/lang/kotlin.js.map +1 -0
  57. package/dist/languages/astgrep-backend/lang/php.d.ts +23 -0
  58. package/dist/languages/astgrep-backend/lang/php.d.ts.map +1 -0
  59. package/dist/languages/astgrep-backend/lang/php.js +80 -0
  60. package/dist/languages/astgrep-backend/lang/php.js.map +1 -0
  61. package/dist/languages/astgrep-backend/lang/ruby.d.ts +37 -0
  62. package/dist/languages/astgrep-backend/lang/ruby.d.ts.map +1 -0
  63. package/dist/languages/astgrep-backend/lang/ruby.js +70 -0
  64. package/dist/languages/astgrep-backend/lang/ruby.js.map +1 -0
  65. package/dist/languages/astgrep-backend/lang/swift.d.ts +34 -0
  66. package/dist/languages/astgrep-backend/lang/swift.d.ts.map +1 -0
  67. package/dist/languages/astgrep-backend/lang/swift.js +86 -0
  68. package/dist/languages/astgrep-backend/lang/swift.js.map +1 -0
  69. package/dist/languages/astgrep-backend/languages.d.ts +55 -0
  70. package/dist/languages/astgrep-backend/languages.d.ts.map +1 -0
  71. package/dist/languages/astgrep-backend/languages.js +214 -0
  72. package/dist/languages/astgrep-backend/languages.js.map +1 -0
  73. package/dist/languages/astgrep-backend/napi.d.ts +71 -0
  74. package/dist/languages/astgrep-backend/napi.d.ts.map +1 -0
  75. package/dist/languages/astgrep-backend/napi.js +176 -0
  76. package/dist/languages/astgrep-backend/napi.js.map +1 -0
  77. package/dist/languages/astgrep-backend/syntax.d.ts +88 -0
  78. package/dist/languages/astgrep-backend/syntax.d.ts.map +1 -0
  79. package/dist/languages/astgrep-backend/syntax.js +180 -0
  80. package/dist/languages/astgrep-backend/syntax.js.map +1 -0
  81. package/dist/languages/index.d.ts +14 -0
  82. package/dist/languages/index.d.ts.map +1 -0
  83. package/dist/languages/index.js +37 -0
  84. package/dist/languages/index.js.map +1 -0
  85. package/dist/languages/javascript/index.d.ts +4 -0
  86. package/dist/languages/javascript/index.d.ts.map +1 -0
  87. package/dist/languages/javascript/index.js +7 -0
  88. package/dist/languages/javascript/index.js.map +1 -0
  89. package/dist/languages/jsx/index.d.ts +4 -0
  90. package/dist/languages/jsx/index.d.ts.map +1 -0
  91. package/dist/languages/jsx/index.js +7 -0
  92. package/dist/languages/jsx/index.js.map +1 -0
  93. package/dist/languages/prose/index.d.ts +53 -0
  94. package/dist/languages/prose/index.d.ts.map +1 -0
  95. package/dist/languages/prose/index.js +172 -0
  96. package/dist/languages/prose/index.js.map +1 -0
  97. package/dist/languages/prose/line-bytes.d.ts +31 -0
  98. package/dist/languages/prose/line-bytes.d.ts.map +1 -0
  99. package/dist/languages/prose/line-bytes.js +39 -0
  100. package/dist/languages/prose/line-bytes.js.map +1 -0
  101. package/dist/languages/python/create-adapter.d.ts +20 -0
  102. package/dist/languages/python/create-adapter.d.ts.map +1 -0
  103. package/dist/languages/python/create-adapter.js +9 -0
  104. package/dist/languages/python/create-adapter.js.map +1 -0
  105. package/dist/languages/python/index.d.ts +4 -0
  106. package/dist/languages/python/index.d.ts.map +1 -0
  107. package/dist/languages/python/index.js +6 -0
  108. package/dist/languages/python/index.js.map +1 -0
  109. package/dist/languages/python/profile.d.ts +36 -0
  110. package/dist/languages/python/profile.d.ts.map +1 -0
  111. package/dist/languages/python/profile.js +282 -0
  112. package/dist/languages/python/profile.js.map +1 -0
  113. package/dist/languages/python/signature.d.ts +53 -0
  114. package/dist/languages/python/signature.d.ts.map +1 -0
  115. package/dist/languages/python/signature.js +188 -0
  116. package/dist/languages/python/signature.js.map +1 -0
  117. package/dist/languages/python/table.d.ts +46 -0
  118. package/dist/languages/python/table.d.ts.map +1 -0
  119. package/dist/languages/python/table.js +88 -0
  120. package/dist/languages/python/table.js.map +1 -0
  121. package/dist/languages/shared/call-detection.d.ts +17 -0
  122. package/dist/languages/shared/call-detection.d.ts.map +1 -0
  123. package/dist/languages/shared/call-detection.js +86 -0
  124. package/dist/languages/shared/call-detection.js.map +1 -0
  125. package/dist/languages/shared/chunks.d.ts +28 -0
  126. package/dist/languages/shared/chunks.d.ts.map +1 -0
  127. package/dist/languages/shared/chunks.js +181 -0
  128. package/dist/languages/shared/chunks.js.map +1 -0
  129. package/dist/languages/shared/create-adapter.d.ts +11 -0
  130. package/dist/languages/shared/create-adapter.d.ts.map +1 -0
  131. package/dist/languages/shared/create-adapter.js +90 -0
  132. package/dist/languages/shared/create-adapter.js.map +1 -0
  133. package/dist/languages/shared/decisions.d.ts +45 -0
  134. package/dist/languages/shared/decisions.d.ts.map +1 -0
  135. package/dist/languages/shared/decisions.js +141 -0
  136. package/dist/languages/shared/decisions.js.map +1 -0
  137. package/dist/languages/shared/dialect.d.ts +18 -0
  138. package/dist/languages/shared/dialect.d.ts.map +1 -0
  139. package/dist/languages/shared/dialect.js +37 -0
  140. package/dist/languages/shared/dialect.js.map +1 -0
  141. package/dist/languages/shared/doc-binding.d.ts +26 -0
  142. package/dist/languages/shared/doc-binding.d.ts.map +1 -0
  143. package/dist/languages/shared/doc-binding.js +50 -0
  144. package/dist/languages/shared/doc-binding.js.map +1 -0
  145. package/dist/languages/shared/engine.d.ts +49 -0
  146. package/dist/languages/shared/engine.d.ts.map +1 -0
  147. package/dist/languages/shared/engine.js +317 -0
  148. package/dist/languages/shared/engine.js.map +1 -0
  149. package/dist/languages/shared/extract-symbols.d.ts +5 -0
  150. package/dist/languages/shared/extract-symbols.d.ts.map +1 -0
  151. package/dist/languages/shared/extract-symbols.js +31 -0
  152. package/dist/languages/shared/extract-symbols.js.map +1 -0
  153. package/dist/languages/shared/fingerprint.d.ts +7 -0
  154. package/dist/languages/shared/fingerprint.d.ts.map +1 -0
  155. package/dist/languages/shared/fingerprint.js +95 -0
  156. package/dist/languages/shared/fingerprint.js.map +1 -0
  157. package/dist/languages/shared/grammar-loader.d.ts +15 -0
  158. package/dist/languages/shared/grammar-loader.d.ts.map +1 -0
  159. package/dist/languages/shared/grammar-loader.js +48 -0
  160. package/dist/languages/shared/grammar-loader.js.map +1 -0
  161. package/dist/languages/shared/import-detection.d.ts +24 -0
  162. package/dist/languages/shared/import-detection.d.ts.map +1 -0
  163. package/dist/languages/shared/import-detection.js +138 -0
  164. package/dist/languages/shared/import-detection.js.map +1 -0
  165. package/dist/languages/shared/js-family-profile.d.ts +5 -0
  166. package/dist/languages/shared/js-family-profile.d.ts.map +1 -0
  167. package/dist/languages/shared/js-family-profile.js +179 -0
  168. package/dist/languages/shared/js-family-profile.js.map +1 -0
  169. package/dist/languages/shared/node-kinds.d.ts +78 -0
  170. package/dist/languages/shared/node-kinds.d.ts.map +1 -0
  171. package/dist/languages/shared/node-kinds.js +141 -0
  172. package/dist/languages/shared/node-kinds.js.map +1 -0
  173. package/dist/languages/shared/node-utils.d.ts +31 -0
  174. package/dist/languages/shared/node-utils.d.ts.map +1 -0
  175. package/dist/languages/shared/node-utils.js +89 -0
  176. package/dist/languages/shared/node-utils.js.map +1 -0
  177. package/dist/languages/shared/parse-diagnostics.d.ts +44 -0
  178. package/dist/languages/shared/parse-diagnostics.d.ts.map +1 -0
  179. package/dist/languages/shared/parse-diagnostics.js +64 -0
  180. package/dist/languages/shared/parse-diagnostics.js.map +1 -0
  181. package/dist/languages/shared/parse-limits.d.ts +24 -0
  182. package/dist/languages/shared/parse-limits.d.ts.map +1 -0
  183. package/dist/languages/shared/parse-limits.js +134 -0
  184. package/dist/languages/shared/parse-limits.js.map +1 -0
  185. package/dist/languages/shared/profile.d.ts +149 -0
  186. package/dist/languages/shared/profile.d.ts.map +1 -0
  187. package/dist/languages/shared/profile.js +9 -0
  188. package/dist/languages/shared/profile.js.map +1 -0
  189. package/dist/languages/shared/scope-model.d.ts +32 -0
  190. package/dist/languages/shared/scope-model.d.ts.map +1 -0
  191. package/dist/languages/shared/scope-model.js +2 -0
  192. package/dist/languages/shared/scope-model.js.map +1 -0
  193. package/dist/languages/shared/scope-naming.d.ts +20 -0
  194. package/dist/languages/shared/scope-naming.d.ts.map +1 -0
  195. package/dist/languages/shared/scope-naming.js +118 -0
  196. package/dist/languages/shared/scope-naming.js.map +1 -0
  197. package/dist/languages/shared/scope-signature.d.ts +14 -0
  198. package/dist/languages/shared/scope-signature.d.ts.map +1 -0
  199. package/dist/languages/shared/scope-signature.js +82 -0
  200. package/dist/languages/shared/scope-signature.js.map +1 -0
  201. package/dist/languages/shared/signature.d.ts +55 -0
  202. package/dist/languages/shared/signature.d.ts.map +1 -0
  203. package/dist/languages/shared/signature.js +147 -0
  204. package/dist/languages/shared/signature.js.map +1 -0
  205. package/dist/languages/shared/syntax.d.ts +115 -0
  206. package/dist/languages/shared/syntax.d.ts.map +1 -0
  207. package/dist/languages/shared/syntax.js +2 -0
  208. package/dist/languages/shared/syntax.js.map +1 -0
  209. package/dist/languages/shared/table-profile-decisions.d.ts +54 -0
  210. package/dist/languages/shared/table-profile-decisions.d.ts.map +1 -0
  211. package/dist/languages/shared/table-profile-decisions.js +245 -0
  212. package/dist/languages/shared/table-profile-decisions.js.map +1 -0
  213. package/dist/languages/shared/table-profile-module-facts.d.ts +29 -0
  214. package/dist/languages/shared/table-profile-module-facts.d.ts.map +1 -0
  215. package/dist/languages/shared/table-profile-module-facts.js +139 -0
  216. package/dist/languages/shared/table-profile-module-facts.js.map +1 -0
  217. package/dist/languages/shared/table-profile-queries.d.ts +27 -0
  218. package/dist/languages/shared/table-profile-queries.d.ts.map +1 -0
  219. package/dist/languages/shared/table-profile-queries.js +70 -0
  220. package/dist/languages/shared/table-profile-queries.js.map +1 -0
  221. package/dist/languages/shared/table-profile-scopes.d.ts +46 -0
  222. package/dist/languages/shared/table-profile-scopes.d.ts.map +1 -0
  223. package/dist/languages/shared/table-profile-scopes.js +180 -0
  224. package/dist/languages/shared/table-profile-scopes.js.map +1 -0
  225. package/dist/languages/shared/table-profile.d.ts +302 -0
  226. package/dist/languages/shared/table-profile.d.ts.map +1 -0
  227. package/dist/languages/shared/table-profile.js +125 -0
  228. package/dist/languages/shared/table-profile.js.map +1 -0
  229. package/dist/languages/shared/tree-sitter-types.d.ts +44 -0
  230. package/dist/languages/shared/tree-sitter-types.d.ts.map +1 -0
  231. package/dist/languages/shared/tree-sitter-types.js +2 -0
  232. package/dist/languages/shared/tree-sitter-types.js.map +1 -0
  233. package/dist/languages/structured-text/index.d.ts +48 -0
  234. package/dist/languages/structured-text/index.d.ts.map +1 -0
  235. package/dist/languages/structured-text/index.js +120 -0
  236. package/dist/languages/structured-text/index.js.map +1 -0
  237. package/dist/languages/tsx/index.d.ts +4 -0
  238. package/dist/languages/tsx/index.d.ts.map +1 -0
  239. package/dist/languages/tsx/index.js +7 -0
  240. package/dist/languages/tsx/index.js.map +1 -0
  241. package/dist/languages/typescript/index.d.ts +4 -0
  242. package/dist/languages/typescript/index.d.ts.map +1 -0
  243. package/dist/languages/typescript/index.js +7 -0
  244. package/dist/languages/typescript/index.js.map +1 -0
  245. package/dist/languages/vue/index.d.ts +21 -0
  246. package/dist/languages/vue/index.d.ts.map +1 -0
  247. package/dist/languages/vue/index.js +234 -0
  248. package/dist/languages/vue/index.js.map +1 -0
  249. package/dist/languages/vue/mapping.d.ts +11 -0
  250. package/dist/languages/vue/mapping.d.ts.map +1 -0
  251. package/dist/languages/vue/mapping.js +77 -0
  252. package/dist/languages/vue/mapping.js.map +1 -0
  253. package/dist/registry.d.ts +24 -0
  254. package/dist/registry.d.ts.map +1 -0
  255. package/dist/registry.js +42 -0
  256. package/dist/registry.js.map +1 -0
  257. package/dist/text/byte-offset-table.d.ts +27 -0
  258. package/dist/text/byte-offset-table.d.ts.map +1 -0
  259. package/dist/text/byte-offset-table.js +39 -0
  260. package/dist/text/byte-offset-table.js.map +1 -0
  261. package/package.json +125 -3
  262. package/src/boundaries/expression.ts +95 -0
  263. package/src/boundaries/extract.ts +307 -0
  264. package/src/boundaries/python.ts +181 -0
  265. package/src/index.ts +51 -0
  266. package/src/languages/__golden__/javascript-basic.json +32 -0
  267. package/src/languages/__golden__/tsx-basic.json +19 -0
  268. package/src/languages/__golden__/typescript-basic.json +37 -0
  269. package/src/languages/astgrep-backend/GRAMMARS.md +86 -0
  270. package/src/languages/astgrep-backend/README.md +112 -0
  271. package/src/languages/astgrep-backend/__golden__/bash-basic.sh +53 -0
  272. package/src/languages/astgrep-backend/__golden__/c-basic.c +64 -0
  273. package/src/languages/astgrep-backend/__golden__/cpp-basic.cpp +65 -0
  274. package/src/languages/astgrep-backend/__golden__/csharp-basic.cs +73 -0
  275. package/src/languages/astgrep-backend/__golden__/go-basic.go +93 -0
  276. package/src/languages/astgrep-backend/__golden__/java-basic.java +62 -0
  277. package/src/languages/astgrep-backend/__golden__/kotlin-basic.kt +58 -0
  278. package/src/languages/astgrep-backend/__golden__/php-basic.php +72 -0
  279. package/src/languages/astgrep-backend/__golden__/ruby-basic.rb +62 -0
  280. package/src/languages/astgrep-backend/__golden__/rust-basic.rs +82 -0
  281. package/src/languages/astgrep-backend/__golden__/swift-basic.swift +73 -0
  282. package/src/languages/astgrep-backend/adapter.ts +240 -0
  283. package/src/languages/astgrep-backend/index.ts +44 -0
  284. package/src/languages/astgrep-backend/lang/README.md +115 -0
  285. package/src/languages/astgrep-backend/lang/bash.ts +78 -0
  286. package/src/languages/astgrep-backend/lang/c.ts +119 -0
  287. package/src/languages/astgrep-backend/lang/cpp.ts +65 -0
  288. package/src/languages/astgrep-backend/lang/csharp.ts +125 -0
  289. package/src/languages/astgrep-backend/lang/index.ts +61 -0
  290. package/src/languages/astgrep-backend/lang/java.ts +115 -0
  291. package/src/languages/astgrep-backend/lang/kotlin.ts +136 -0
  292. package/src/languages/astgrep-backend/lang/php.ts +105 -0
  293. package/src/languages/astgrep-backend/lang/ruby.ts +105 -0
  294. package/src/languages/astgrep-backend/lang/swift.ts +118 -0
  295. package/src/languages/astgrep-backend/languages.ts +238 -0
  296. package/src/languages/astgrep-backend/napi.ts +261 -0
  297. package/src/languages/astgrep-backend/syntax.ts +242 -0
  298. package/src/languages/index.ts +53 -0
  299. package/src/languages/javascript/index.ts +9 -0
  300. package/src/languages/jsx/index.ts +9 -0
  301. package/src/languages/prose/index.ts +270 -0
  302. package/src/languages/prose/line-bytes.ts +52 -0
  303. package/src/languages/python/README.md +246 -0
  304. package/src/languages/python/__golden__/python-basic.json +44 -0
  305. package/src/languages/python/create-adapter.ts +29 -0
  306. package/src/languages/python/index.ts +8 -0
  307. package/src/languages/python/profile.ts +341 -0
  308. package/src/languages/python/signature.ts +183 -0
  309. package/src/languages/python/table.ts +135 -0
  310. package/src/languages/shared/__fixtures__/large-over-32kib.ts.txt +1207 -0
  311. package/src/languages/shared/call-detection.ts +112 -0
  312. package/src/languages/shared/chunks.ts +255 -0
  313. package/src/languages/shared/create-adapter.ts +136 -0
  314. package/src/languages/shared/decisions.ts +204 -0
  315. package/src/languages/shared/dialect.ts +55 -0
  316. package/src/languages/shared/doc-binding.ts +78 -0
  317. package/src/languages/shared/engine.ts +461 -0
  318. package/src/languages/shared/extract-symbols.ts +35 -0
  319. package/src/languages/shared/fingerprint.ts +99 -0
  320. package/src/languages/shared/grammar-loader.ts +67 -0
  321. package/src/languages/shared/import-detection.ts +154 -0
  322. package/src/languages/shared/js-family-profile.ts +246 -0
  323. package/src/languages/shared/node-kinds.ts +153 -0
  324. package/src/languages/shared/node-utils.ts +120 -0
  325. package/src/languages/shared/parse-diagnostics.ts +125 -0
  326. package/src/languages/shared/parse-limits.ts +147 -0
  327. package/src/languages/shared/profile.ts +184 -0
  328. package/src/languages/shared/scope-model.ts +43 -0
  329. package/src/languages/shared/scope-naming.ts +124 -0
  330. package/src/languages/shared/scope-signature.ts +108 -0
  331. package/src/languages/shared/signature.ts +149 -0
  332. package/src/languages/shared/syntax.ts +116 -0
  333. package/src/languages/shared/table-profile-decisions.ts +251 -0
  334. package/src/languages/shared/table-profile-module-facts.ts +177 -0
  335. package/src/languages/shared/table-profile-queries.ts +85 -0
  336. package/src/languages/shared/table-profile-scopes.ts +198 -0
  337. package/src/languages/shared/table-profile.ts +427 -0
  338. package/src/languages/shared/tree-sitter-types.ts +46 -0
  339. package/src/languages/structured-text/index.ts +192 -0
  340. package/src/languages/tsx/index.ts +9 -0
  341. package/src/languages/typescript/index.ts +9 -0
  342. package/src/languages/vue/index.ts +312 -0
  343. package/src/languages/vue/mapping.ts +93 -0
  344. package/src/registry.ts +61 -0
  345. 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
+ };