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