@untangle-code/parser-registry 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,153 @@
1
+ /**
2
+ * tree-sitter node `.type` string constants shared by the JS/TS grammar
3
+ * family (tree-sitter-javascript, tree-sitter-typescript `typescript` and
4
+ * `tsx` dialects). Verified against each grammar's `src/node-types.json`
5
+ * (see package README, "Grammatik-Wahl").
6
+ *
7
+ * A set may list a node kind that a particular dialect's grammar never
8
+ * actually produces (e.g. `public_field_definition` never appears in a
9
+ * plain JavaScript tree) — that is harmless: `Set#has` on a type string the
10
+ * grammar never emits simply never matches.
11
+ */
12
+
13
+ /**
14
+ * Nodes whose entire subtree collapses to ONE operand/literal token (do not
15
+ * recurse into children). `template_string` is deliberately EXCLUDED here
16
+ * even though it is a literal: `${expr}` interpolations can contain calls,
17
+ * identifiers and decisions that must still be walked (verified against the
18
+ * grammar: a `template_string` node's children are `` ` ``, `string_fragment`,
19
+ * `escape_sequence` and `template_substitution` — see `TEMPLATE_TEXT_LEAF_TYPES`
20
+ * below, and the `` ` ``/`${` delimiters folded into `IGNORED_PUNCTUATION_TYPES`,
21
+ * for how its non-substitution parts are classified instead).
22
+ */
23
+ export const LITERAL_CONTAINER_STOP_TYPES: ReadonlySet<string> = new Set(["string", "regex"]);
24
+
25
+ /** Static-text leaves inside a `template_string` (its non-`${}` content) — operands. */
26
+ export const TEMPLATE_TEXT_LEAF_TYPES: ReadonlySet<string> = new Set([
27
+ "string_fragment",
28
+ "escape_sequence",
29
+ ]);
30
+
31
+ /** Leaf node types that are identifier occurrences (operands). */
32
+ export const IDENTIFIER_LEAF_TYPES: ReadonlySet<string> = new Set([
33
+ "identifier",
34
+ "property_identifier",
35
+ "type_identifier",
36
+ "private_property_identifier",
37
+ "shorthand_property_identifier",
38
+ "shorthand_property_identifier_pattern",
39
+ "statement_identifier",
40
+ "this",
41
+ "super",
42
+ ]);
43
+
44
+ /** Leaf node types that are simple (non-container) literals. */
45
+ export const SIMPLE_LITERAL_LEAF_TYPES: ReadonlySet<string> = new Set([
46
+ "number",
47
+ "true",
48
+ "false",
49
+ "null",
50
+ "undefined",
51
+ ]);
52
+
53
+ /** Punctuation leaves that count neither as operator nor operand (pure structure). */
54
+ export const IGNORED_PUNCTUATION_TYPES: ReadonlySet<string> = new Set([
55
+ "(",
56
+ ")",
57
+ "{",
58
+ "}",
59
+ "[",
60
+ "]",
61
+ ",",
62
+ ";",
63
+ ".",
64
+ "`",
65
+ "${",
66
+ ]);
67
+
68
+ /** Function-shaped scope node types (produce ExtractedSymbol kind "function"). */
69
+ export const FUNCTION_LIKE_TYPES: ReadonlySet<string> = new Set([
70
+ "function_declaration",
71
+ "generator_function_declaration",
72
+ "function_expression",
73
+ "generator_function",
74
+ "arrow_function",
75
+ ]);
76
+
77
+ export const METHOD_TYPE = "method_definition";
78
+ export const CLASS_TYPES: ReadonlySet<string> = new Set([
79
+ "class_declaration",
80
+ "abstract_class_declaration",
81
+ "class",
82
+ ]);
83
+ export const INTERFACE_TYPE = "interface_declaration";
84
+ export const TYPE_ALIAS_TYPE = "type_alias_declaration";
85
+ export const ENUM_TYPE = "enum_declaration";
86
+ export const NAMESPACE_TYPE = "internal_module";
87
+ export const FIELD_TYPES: ReadonlySet<string> = new Set([
88
+ "field_definition",
89
+ "public_field_definition",
90
+ ]);
91
+
92
+ /**
93
+ * `static { ... }` initialization block inside a class body. NOT a scope
94
+ * opener (it declares no symbol and has no name to build a stable scope id
95
+ * from) — but it carries executable content, so `chunks.ts` models it as an
96
+ * explicit child region of its class so its bytes become a real content
97
+ * chunk instead of falling through the chunker's member walk (spec.md §8.4:
98
+ * no silent data loss).
99
+ */
100
+ export const CLASS_STATIC_BLOCK_TYPE = "class_static_block";
101
+
102
+ /** All node types that open a new symbol scope (superset across dialects). */
103
+ export const SCOPE_OPENING_TYPES: ReadonlySet<string> = new Set([
104
+ ...FUNCTION_LIKE_TYPES,
105
+ METHOD_TYPE,
106
+ ...CLASS_TYPES,
107
+ INTERFACE_TYPE,
108
+ TYPE_ALIAS_TYPE,
109
+ ENUM_TYPE,
110
+ NAMESPACE_TYPE,
111
+ ...FIELD_TYPES,
112
+ ]);
113
+
114
+ /** Decision-bearing node types (spec.md §16.2-16.3). */
115
+ export const IF_STATEMENT = "if_statement";
116
+ export const LOOP_TYPES: ReadonlySet<string> = new Set([
117
+ "for_statement",
118
+ "for_in_statement",
119
+ "while_statement",
120
+ "do_statement",
121
+ ]);
122
+ export const CATCH_CLAUSE = "catch_clause";
123
+ export const TERNARY_EXPRESSION = "ternary_expression";
124
+ export const SWITCH_CASE = "switch_case";
125
+ export const SWITCH_STATEMENT = "switch_statement";
126
+ export const BINARY_EXPRESSION = "binary_expression";
127
+ export const AUGMENTED_ASSIGNMENT = "augmented_assignment_expression";
128
+
129
+ /** Jump statements used by the guard-clause heuristic. */
130
+ export const JUMP_STATEMENT_TYPES: ReadonlySet<string> = new Set([
131
+ "return_statement",
132
+ "throw_statement",
133
+ "break_statement",
134
+ "continue_statement",
135
+ ]);
136
+
137
+ export const COMMENT_TYPE = "comment";
138
+ export const DECORATOR_TYPE = "decorator";
139
+
140
+ /** Import/export related node types (architecture.md §6.5, spec.md §14.2). */
141
+ export const IMPORT_STATEMENT = "import_statement";
142
+ export const IMPORT_CLAUSE = "import_clause";
143
+ export const IMPORT_REQUIRE_CLAUSE = "import_require_clause"; // TS only: `import x = require(...)`
144
+ export const NAMED_IMPORTS = "named_imports";
145
+ export const NAMESPACE_IMPORT = "namespace_import";
146
+ export const IMPORT_SPECIFIER = "import_specifier";
147
+ export const EXPORT_STATEMENT = "export_statement";
148
+ export const EXPORT_CLAUSE = "export_clause";
149
+ export const EXPORT_SPECIFIER = "export_specifier";
150
+ export const CALL_EXPRESSION = "call_expression";
151
+ export const NEW_EXPRESSION = "new_expression";
152
+ export const MEMBER_EXPRESSION = "member_expression";
153
+ export const IMPORT_KEYWORD_NODE = "import"; // the bare `import` token used in `import(...)` dynamic import
@@ -0,0 +1,120 @@
1
+ import type { SourceRange } from "@untangle-code/domain";
2
+
3
+ import type { ByteOffsetTable } from "../../text/byte-offset-table.js";
4
+
5
+ import type { SyntaxNode, SyntaxCursor } from "./syntax.js";
6
+
7
+ /** Per-file context threaded through the analysis walk. */
8
+ export interface FileTextContext {
9
+ sourceText: string;
10
+ byteTable: ByteOffsetTable;
11
+ }
12
+
13
+ export function rangeOf(node: SyntaxNode, ctx: FileTextContext): SourceRange {
14
+ return {
15
+ startLine: node.startPosition.row + 1,
16
+ endLine: node.endPosition.row + 1,
17
+ startByte: ctx.byteTable.toByteOffset(node.startIndex),
18
+ endByte: ctx.byteTable.toByteOffset(node.endIndex),
19
+ };
20
+ }
21
+
22
+ /**
23
+ * `rangeOf` for a cursor position — identical result, but WITHOUT
24
+ * materializing a `SyntaxNode` wrapper. `TreeCursor` exposes the same four
25
+ * values (`startPosition`, `endPosition`, `startIndex`, `endIndex`) with the
26
+ * same UTF-16 index convention as `SyntaxNode`, so the two functions are
27
+ * interchangeable per node (WP-95).
28
+ */
29
+ export function rangeOfCursor(cursor: SyntaxCursor, ctx: FileTextContext): SourceRange {
30
+ return {
31
+ startLine: cursor.startPosition.row + 1,
32
+ endLine: cursor.endPosition.row + 1,
33
+ startByte: ctx.byteTable.toByteOffset(cursor.startIndex),
34
+ endByte: ctx.byteTable.toByteOffset(cursor.endIndex),
35
+ };
36
+ }
37
+
38
+ /**
39
+ * Kommentarknoten enden semantisch vor dem Zeilenumbruch. Manche Grammatiken
40
+ * halten sich daran nicht: Rusts `///` und `//!` reichen bis zum Anfang der
41
+ * Folgezeile. Da `SourceRange.endLine` INKLUSIV ist, wuerde diese Codezeile
42
+ * sonst als Kommentar gelten und aus SLOC herausfallen (WP-236).
43
+ */
44
+ function withoutTrailingLineBreak(
45
+ range: SourceRange,
46
+ text: string,
47
+ endIndex: number,
48
+ ctx: FileTextContext,
49
+ ): SourceRange {
50
+ const suffixLength = text.endsWith("\r\n")
51
+ ? 2
52
+ : text.endsWith("\n") || text.endsWith("\r")
53
+ ? 1
54
+ : 0;
55
+ if (suffixLength === 0) return range;
56
+ return {
57
+ ...range,
58
+ endLine: Math.max(range.startLine, range.endLine - 1),
59
+ endByte: ctx.byteTable.toByteOffset(endIndex - suffixLength),
60
+ };
61
+ }
62
+
63
+ /** `rangeOf`, mit der sprachuebergreifenden Zeilenkommentar-Normalisierung. */
64
+ export function commentRangeOf(node: SyntaxNode, ctx: FileTextContext): SourceRange {
65
+ return withoutTrailingLineBreak(rangeOf(node, ctx), node.text, node.endIndex, ctx);
66
+ }
67
+
68
+ /** Cursor-Fassung von {@link commentRangeOf}, ohne einen Knotenwrapper zu bauen. */
69
+ export function commentRangeOfCursor(cursor: SyntaxCursor, ctx: FileTextContext): SourceRange {
70
+ return withoutTrailingLineBreak(
71
+ rangeOfCursor(cursor, ctx),
72
+ cursor.nodeText,
73
+ cursor.endIndex,
74
+ ctx,
75
+ );
76
+ }
77
+
78
+ /** Union of two ranges — the smallest range containing both. */
79
+ export function unionRange(a: SourceRange, b: SourceRange): SourceRange {
80
+ return {
81
+ startLine: Math.min(a.startLine, b.startLine),
82
+ endLine: Math.max(a.endLine, b.endLine),
83
+ startByte: Math.min(a.startByte, b.startByte),
84
+ endByte: Math.max(a.endByte, b.endByte),
85
+ };
86
+ }
87
+
88
+ /** Strips surrounding string quotes (`"`, `'`, `` ` ``) from raw source text, when present. */
89
+ export function unquote(text: string): string {
90
+ if (text.length >= 2) {
91
+ const first = text[0];
92
+ const last = text[text.length - 1];
93
+ if ((first === '"' || first === "'" || first === "`") && first === last) {
94
+ return text.slice(1, -1);
95
+ }
96
+ }
97
+ return text;
98
+ }
99
+
100
+ /** Finds the nearest ancestor (excluding `node` itself) whose type is in `types`. */
101
+ export function closestAncestorOfType(
102
+ node: SyntaxNode,
103
+ types: ReadonlySet<string>,
104
+ ): SyntaxNode | null {
105
+ let current = node.parent;
106
+ while (current !== null) {
107
+ if (types.has(current.type)) return current;
108
+ current = current.parent;
109
+ }
110
+ return null;
111
+ }
112
+
113
+ /** All direct children of `node` whose type equals `type` (named or anonymous). */
114
+ export function directChildrenOfType(node: SyntaxNode, type: string): SyntaxNode[] {
115
+ return node.children.filter((child) => child.type === type);
116
+ }
117
+
118
+ export function hasDirectChildOfType(node: SyntaxNode, type: string): boolean {
119
+ return node.children.some((child) => child.type === type);
120
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Parse-quality diagnostics (spec.md §7.3): counts and reports tree-sitter
3
+ * `ERROR` and "missing" nodes, and classifies overall `ParseQuality`.
4
+ *
5
+ * Threshold choice (documented WP-06 decision, no normative value given by
6
+ * spec.md/architecture.md): `failed` is reserved for trees where at least
7
+ * half of all nodes are broken — tree-sitter's error recovery almost always
8
+ * produces SOME usable tree, even for badly broken input, so a small
9
+ * absolute count of error/missing nodes is treated as `partial`
10
+ * (spec.md §7.3: "AST nutzbar, aber mit Fehlerknoten"), while a
11
+ * majority-broken tree is treated as unusable (`failed`, `ast: null` per
12
+ * domain `ParseResult` doc).
13
+ *
14
+ * TRAVERSIERUNG (WP-95): ueber die Cursor-API statt ueber `node.children` —
15
+ * derselbe Grund wie in `engine.ts` und `fingerprint.ts`. Die
16
+ * BESUCHSREIHENFOLGE ist absichtlich unveraendert geblieben: der fruehere
17
+ * Stapel (`stack.pop()` nach `push` aller Kinder) lief Vorordnung mit
18
+ * UMGEKEHRTER Kindfolge, und genau die stellen `gotoLastChild` /
19
+ * `gotoPreviousSibling` nach. Wer hier auf die natuerliche Kindfolge
20
+ * umstellt, aendert die Reihenfolge von `ParseDiagnostic[]` — sichtbar in
21
+ * jedem Bericht, der die erste Diagnose zeigt.
22
+ */
23
+ import type { ParseDiagnostic, ParseQuality } from "@untangle-code/domain";
24
+
25
+ import type { FileTextContext } from "./node-utils.js";
26
+ import { rangeOfCursor } from "./node-utils.js";
27
+ import type { SyntaxNode } from "./syntax.js";
28
+
29
+ const ERROR_NODE_TYPE = "ERROR";
30
+ const FAILED_RATIO_THRESHOLD = 0.5;
31
+
32
+ /**
33
+ * Woher die Angabe "fehlender Knoten" stammt.
34
+ *
35
+ * `measured` — tree-sitter meldet `ts_node_is_missing`, ein Messwert der
36
+ * Fehlerkorrektur. `heuristic` — ast-grep hat dazu kein Gegenstueck; dort ist
37
+ * es ein Blatt der Breite null (siehe `languages/astgrep-backend/syntax.ts`).
38
+ * Der Unterschied gehoert in die DIAGNOSE, nicht in eine Fussnote: wer
39
+ * `missing_node_count` liest, muss wissen, ob die Zahl gemessen oder
40
+ * geschaetzt ist (E4).
41
+ */
42
+ export type MissingNodeEvidence = "measured" | "heuristic";
43
+
44
+ export interface ParseDiagnosticsResult {
45
+ parseQuality: ParseQuality;
46
+ diagnostics: ParseDiagnostic[];
47
+ errorNodeCount: number;
48
+ missingNodeCount: number;
49
+ }
50
+
51
+ export function collectParseDiagnostics(
52
+ root: SyntaxNode,
53
+ ctx: FileTextContext,
54
+ missingNodeEvidence: MissingNodeEvidence = "measured",
55
+ ): ParseDiagnosticsResult {
56
+ const diagnostics: ParseDiagnostic[] = [];
57
+ let errorNodeCount = 0;
58
+ let missingNodeCount = 0;
59
+ let totalNodeCount = 0;
60
+
61
+ // Iterativ, nicht rekursiv: ein Syntaxbaum kann tausende Ebenen tief sein
62
+ // (eine lange `a || b || c ...`-Kette genuegt), und ein Aufrufstapel darf
63
+ // daran nicht zerbrechen.
64
+ const cursor = root.walk();
65
+ let depth = 0;
66
+ for (;;) {
67
+ totalNodeCount += 1;
68
+ const nodeType = cursor.nodeType;
69
+
70
+ if (cursor.nodeIsMissing) {
71
+ missingNodeCount += 1;
72
+ diagnostics.push({
73
+ severity: "error",
74
+ kind: "missing_node",
75
+ message:
76
+ missingNodeEvidence === "measured"
77
+ ? `Missing "${nodeType}" node`
78
+ : `Missing "${nodeType}" node (heuristically detected as a zero-width node; ` +
79
+ `ast-grep has no nodeIsMissing API)`,
80
+ range: rangeOfCursor(cursor, ctx),
81
+ });
82
+ } else if (nodeType === ERROR_NODE_TYPE) {
83
+ // Frueher stand hier zusaetzlich `|| node.isError`. Das ist dieselbe
84
+ // Bedingung: `ts_node_is_error` prueft auf das eingebaute Fehlersymbol,
85
+ // und dessen Typname IST "ERROR" — ein eingebautes Symbol wird nie
86
+ // aliasiert. Der Cursor bietet kein `nodeIsError`, wohl aber `nodeType`.
87
+ errorNodeCount += 1;
88
+ diagnostics.push({
89
+ severity: "error",
90
+ kind: "error_node",
91
+ message: `Unexpected syntax near "${cursor.nodeText.slice(0, 40)}"`,
92
+ range: rangeOfCursor(cursor, ctx),
93
+ });
94
+ }
95
+
96
+ if (cursor.gotoLastChild()) {
97
+ depth += 1;
98
+ continue;
99
+ }
100
+ while (!cursor.gotoPreviousSibling()) {
101
+ if (depth === 0) {
102
+ return finish(diagnostics, errorNodeCount, missingNodeCount, totalNodeCount);
103
+ }
104
+ cursor.gotoParent();
105
+ depth -= 1;
106
+ }
107
+ }
108
+ }
109
+
110
+ function finish(
111
+ diagnostics: ParseDiagnostic[],
112
+ errorNodeCount: number,
113
+ missingNodeCount: number,
114
+ totalNodeCount: number,
115
+ ): ParseDiagnosticsResult {
116
+ const brokenRatio = totalNodeCount > 0 ? (errorNodeCount + missingNodeCount) / totalNodeCount : 0;
117
+ const parseQuality: ParseQuality =
118
+ errorNodeCount === 0 && missingNodeCount === 0
119
+ ? "complete"
120
+ : brokenRatio >= FAILED_RATIO_THRESHOLD
121
+ ? "failed"
122
+ : "partial";
123
+
124
+ return { parseQuality, diagnostics, errorNodeCount, missingNodeCount };
125
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Eingabepuffer und Groessengrenze fuer die native tree-sitter-Bindung
3
+ * (WP-215).
4
+ *
5
+ * DER DEFEKT: `Parser#parse(text)` reicht den Quelltext ueber eine
6
+ * Rueckruffunktion an die native Seite; die Bindung kopiert den
7
+ * zurueckgegebenen Abschnitt in einen Puffer FESTER Groesse. Ohne
8
+ * `options.bufferSize` ist dieser Puffer 32 KiB gross (`tree-sitter@0.21.1`,
9
+ * `binding.cc`). Eine Datei ueber 32 KiB passt nicht hinein und die Bindung
10
+ * wirft `Invalid argument` — ohne Zeile, ohne Spalte, ohne Hinweis auf die
11
+ * Groesse. Auf dem eigenen Repository scheiterten daran ACHT Dateien:
12
+ * `packages/complexity/src/scope-aggregate.ts` (31.246 B) wurde noch
13
+ * gerechnet, `packages/search/src/regex-safety.ts` (33.871 B) nicht mehr.
14
+ *
15
+ * DIE GEGENMASSNAHME: `bufferSize` proportional zur Eingabelaenge uebergeben.
16
+ * Gemessen im Paketkontext an `regex-safety.ts` (33.806 Zeichen / 33.871 Bytes):
17
+ *
18
+ * ohne bufferSize: FEHLER — Invalid argument
19
+ * mit bufferSize: OK, root program | Kinder 66 | hasError false
20
+ *
21
+ * WARUM EINE OBERGRENZE NOETIG IST: `bufferSize` waechst mit der Datei, der
22
+ * Syntaxbaum ebenfalls — nur schneller. Gemessen in ISOLIERTEN Prozessen
23
+ * (`maxRSS` aus `process.resourceUsage()`, tree-sitter-typescript, Node 26.7.0,
24
+ * darwin/arm64), erst das reine `parse()`:
25
+ *
26
+ * Bytes parse Spitzen-RSS
27
+ * 1.082.765 62 ms 112 MiB
28
+ * 4.213.735 268 ms 252 MiB
29
+ * 8.396.927 495 ms 441 MiB
30
+ * 16.803.534 964 ms 683 MiB
31
+ * 33.576.525 3136 ms 1087 MiB
32
+ * 67.141.068 3814 ms 1545 MiB
33
+ *
34
+ * `parse()` allein ist aber NICHT, was der Aufrufer bezahlt. Der Adapter legt
35
+ * anschliessend `analyzeTree` darueber und materialisiert JS-Wrapper fuer jeden
36
+ * Knoten (bei 1 MiB Quelltext sind das 216.406 Knoten). Dieselbe Messung ueber
37
+ * die VOLLE Strecke `parse()` + `computeComplexity()`:
38
+ *
39
+ * Bytes gesamt Spitzen-RSS Scopes
40
+ * 1.082.765 8.899 ms 276 MiB 1.162
41
+ * 2.126.275 13.227 ms 389 MiB 2.280
42
+ * 4.213.735 22.990 ms 585 MiB 4.516
43
+ * 5.259.533 32.394 ms 673 MiB 5.634
44
+ * 8.316.481 50.179 ms 966 MiB 8.902
45
+ *
46
+ * Der bestimmende Posten ist also der BAUMLAUF, nicht das Parsen — rund sechs
47
+ * Sekunden je Megabyte. Wer diese Tabelle liest, soll die Grenze nicht fuer
48
+ * billig halten: eine Datei DICHT an der Grenze kostet eine knappe Minute und
49
+ * fast ein Gigabyte.
50
+ *
51
+ * DIE GRENZE: {@link MAX_PARSE_SOURCE_BYTES} = 8 MiB. Sie ist eine MAUER gegen
52
+ * den Speicher, kein Leistungsversprechen. Begruendung:
53
+ * - Bei 8,3 MB liegt die gemessene Spitze bei 966 MiB und damit noch unter
54
+ * einem Gigabyte; darueber ist der Prozess auf einem Entwicklerrechner
55
+ * nicht mehr verlaesslich. Bei 33 MB kostet schon das blosse Parsen ueber
56
+ * 1 GiB, die volle Strecke waere weit jenseits davon.
57
+ * - Sie liegt UEBER der Vorgabegrenze des Scanners (5 MiB, siehe
58
+ * `packages/scanner/src/discovery.ts`), damit der Parser bei
59
+ * Standardkonfiguration NIE die engere, unausgesprochene Grenze ist. Wer
60
+ * hier abgewiesen wird, hat die Scannergrenze bewusst angehoben und
61
+ * bekommt dafuer einen benannten Grund statt eines Absturzes.
62
+ * - Die groesste echte Quelldatei dieses Repositorys hat 83.062 Bytes; die
63
+ * Grenze ist damit rund das Hundertfache des real Vorkommenden. In der
64
+ * Praxis reisst sie nur generierter Code oder ein gebuendeltes Artefakt.
65
+ *
66
+ * NICHT GELOEST, und hier ausdruecklich vermerkt: die sechs Sekunden je
67
+ * Megabyte im Baumlauf sind ein eigener Leistungsdefekt. Diese Grenze
68
+ * verhindert nur, dass er in einen Speicherabsturz umschlaegt.
69
+ *
70
+ * Eine Datei ueber der Grenze wird NICHT stillschweigend uebersprungen: der
71
+ * Adapter wirft `AdapterParseError` mit `kind: "file_too_large"` und der
72
+ * GEMESSENEN Groesse, woraus der Aufrufer einen Ledger-Eintrag mit genau
73
+ * diesem Grund baut (E4).
74
+ */
75
+ import { AdapterParseError, classifyAdapterFailure } from "@untangle-code/domain";
76
+
77
+ import type { TsParser, TsTree } from "./tree-sitter-types.js";
78
+
79
+ /**
80
+ * Vorgabegroesse des Eingabepuffers der nativen Bindung, in Bytes.
81
+ * Alles darunter braucht `bufferSize` nicht — alles darueber schon.
82
+ * Nur dokumentarisch und fuer Tests; der Aufrufpfad uebergibt IMMER `bufferSize`.
83
+ */
84
+ export const NATIVE_DEFAULT_BUFFER_BYTES = 32 * 1024;
85
+
86
+ /** Gemessene Obergrenze fuer eine einzelne Quelldatei, in Bytes (Begruendung siehe Modulkopf). */
87
+ export const MAX_PARSE_SOURCE_BYTES = 8 * 1024 * 1024;
88
+
89
+ /**
90
+ * Aufschlag auf die Eingabelaenge.
91
+ *
92
+ * Gemessen genuegte schon der Faktor 1,0 (`bufferSize === byteLength`) fuer
93
+ * jede gepruefte Groesse. Der Aufschlag von 25 % ist die Sicherheitsmarge
94
+ * gegen die Frage, ob die Bindung intern noch ein Terminierungszeichen oder
95
+ * eine Ausrichtung braucht — er kostet bei 8 MiB Eingabe 2 MiB und ist damit
96
+ * gegenueber den gemessenen 441 MiB Spitze nicht der bestimmende Posten.
97
+ */
98
+ const BUFFER_HEADROOM = 1.25;
99
+
100
+ /** Untergrenze: nie kleiner als die native Vorgabe, sonst wird eine kleine Datei schlechter gestellt. */
101
+ const MIN_BUFFER_BYTES = NATIVE_DEFAULT_BUFFER_BYTES;
102
+
103
+ /** Laenge des Quelltexts in UTF-8-Bytes — NICHT in Zeichen: die Bindung puffert Bytes. */
104
+ export function sourceByteLength(source: string): number {
105
+ return Buffer.byteLength(source, "utf8");
106
+ }
107
+
108
+ /** Der `bufferSize`-Wert fuer eine Eingabe dieser Bytelaenge. */
109
+ export function parseBufferSizeFor(byteLength: number): number {
110
+ return Math.max(MIN_BUFFER_BYTES, Math.ceil(byteLength * BUFFER_HEADROOM));
111
+ }
112
+
113
+ /**
114
+ * DER EINZIGE erlaubte Aufruf von `Parser#parse` in diesem Paket.
115
+ *
116
+ * Wer `parser.parse(text)` direkt aufruft, baut den 32-KiB-Defekt neu ein.
117
+ * Diese Funktion (a) prueft die Groessengrenze VOR dem Parsen, (b) uebergibt
118
+ * `bufferSize` und (c) verwandelt jede Ausnahme der Bindung in einen
119
+ * `AdapterParseError` mit benanntem Grund (WP-216), damit kein
120
+ * Bibliothekstext mehr als "Grund" durchgereicht wird.
121
+ */
122
+ export function parseWithBuffer(parser: TsParser, source: string): TsTree {
123
+ const byteLength = sourceByteLength(source);
124
+
125
+ if (byteLength > MAX_PARSE_SOURCE_BYTES) {
126
+ throw new AdapterParseError(
127
+ "file_too_large",
128
+ `Source text with ${String(byteLength)} bytes exceeds the parser limit of ` +
129
+ `${String(MAX_PARSE_SOURCE_BYTES)} Bytes.`,
130
+ { measurements: { sizeBytes: byteLength, limitBytes: MAX_PARSE_SOURCE_BYTES } },
131
+ );
132
+ }
133
+
134
+ try {
135
+ return parser.parse(source, undefined, { bufferSize: parseBufferSizeFor(byteLength) });
136
+ } catch (error) {
137
+ const failure = classifyAdapterFailure(error, { sizeBytes: byteLength });
138
+ // Weitergereicht wird der ROHE Ausnahmetext, nicht `failure.detail`: der
139
+ // Aufrufer klassifiziert erneut, und ein bereits ausformuliertes Detail
140
+ // wuerde dabei ein zweites Mal in "(Ausnahmetext: …)" eingewickelt.
141
+ // Der benannte `kind` ueberlebt in der Klasse, nicht im Text.
142
+ throw new AdapterParseError(failure.kind, failure.rawMessage, {
143
+ measurements: { ...failure.measurements, bufferSize: parseBufferSizeFor(byteLength) },
144
+ cause: error,
145
+ });
146
+ }
147
+ }