@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,99 @@
1
+ /**
2
+ * Symbol fingerprints for change matching (spec.md §17.3).
3
+ *
4
+ * `astHash` — a structural fingerprint: the SHA-256 of a parenthesized
5
+ * `kind(child,child,...)` shape string built from node TYPES only (never
6
+ * identifier/literal text, never whitespace/positions). Two symbols with the
7
+ * same shape but renamed identifiers or reformatted whitespace hash
8
+ * identically — this is `spec.md §17.3` step 3 ("identischer
9
+ * AST-Fingerprint").
10
+ *
11
+ * `tokenFingerprint` — a lexical fingerprint: the SHA-256 of every leaf
12
+ * token's literal TEXT, in source order, joined by U+001F. Unlike
13
+ * `astHash`, a rename DOES change this fingerprint, but formatting
14
+ * (whitespace-only changes) does not, matching `spec.md §17.3` step 4's
15
+ * "Token-/MinHash-Ähnlichkeit" input.
16
+ *
17
+ * Both exclude comments (a doc-comment edit must not look like a structural
18
+ * or lexical change to the symbol it documents).
19
+ *
20
+ * TRAVERSIERUNG (WP-95): beide Funktionen bekommen den CURSOR des laufenden
21
+ * Walks und laufen den Teilbaum ab der aktuellen Position ab; sie geben ihn
22
+ * an genau dieser Position zurueck. Zwei Gruende, keiner davon Geschmack:
23
+ *
24
+ * 1) Tempo. Sie laufen nicht einmal je Datei, sondern einmal je Scope UND
25
+ * einmal je Wurzel — der Teilbaum eines verschachtelten Symbols wird also
26
+ * so oft durchlaufen, wie er Scopes ueber sich hat. Ueber `.children`
27
+ * hiesse das ein Wrapper-Array je Knoten und Durchlauf.
28
+ *
29
+ * 2) RICHTIGKEIT, und das wiegt schwerer. `tree-sitter@0.21.1` meldet den
30
+ * Typ eines Knotens NUR dann verlaesslich, wenn der Cursor von der Wurzel
31
+ * her abgestiegen ist. Weder `node.children` noch ein auf einen Teilbaum
32
+ * zurueckgesetzter Cursor (`node.walk()`) haben den Alias-Zusammenhang
33
+ * des Elternknotens; in diesem Repository meldeten beide 1.411
34
+ * Kommentarknoten in 207 Dateien als `interface_body`. Genau diese
35
+ * Knoten hat der frueher hier stehende `.children`-Lauf NICHT als
36
+ * Kommentar erkannt und ihren Text in beide Fingerabdruecke geschrieben —
37
+ * entgegen der Zusage zwei Absaetze weiter oben. Wer diese Funktionen
38
+ * wieder auf `node.walk()` umstellt, baut den Defekt neu ein.
39
+ */
40
+ import { sha256Hex } from "@untangle-code/domain";
41
+
42
+ import type { LanguageProfile } from "./profile.js";
43
+ import type { SyntaxCursor } from "./syntax.js";
44
+
45
+ /**
46
+ * Baut die Formzeichenkette fuer den Knoten, auf dem der Cursor steht, und
47
+ * laesst den Cursor GENAU DORT zurueck: jede `gotoFirstChild`-Bewegung wird
48
+ * von einem `gotoParent` aufgewogen. Wer das verletzt, verschiebt die
49
+ * Traversierung des Aufrufers.
50
+ */
51
+ function structuralShapeAt(cursor: SyntaxCursor, profile: LanguageProfile): string {
52
+ const type = cursor.nodeType;
53
+ if (profile.commentKinds.has(type)) return "";
54
+ if (profile.literalContainerKinds.has(type)) return type;
55
+ if (!cursor.gotoFirstChild()) return type; // entspricht node.childCount === 0
56
+
57
+ const childShapes: string[] = [];
58
+ do {
59
+ // Kommentarkinder werden AUSGELASSEN, nicht als "" aufgenommen — genau
60
+ // das tat das frueher vorgeschaltete
61
+ // `.filter((child) => child.type !== "comment")`.
62
+ if (!profile.commentKinds.has(cursor.nodeType)) {
63
+ childShapes.push(structuralShapeAt(cursor, profile));
64
+ }
65
+ } while (cursor.gotoNextSibling());
66
+ cursor.gotoParent();
67
+
68
+ return `${type}(${childShapes.join(",")})`;
69
+ }
70
+
71
+ /** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
72
+ export function computeAstHash(cursor: SyntaxCursor, profile: LanguageProfile): string {
73
+ return sha256Hex(structuralShapeAt(cursor, profile));
74
+ }
75
+
76
+ /** Sammelt die Blatttexte; laesst den Cursor auf dem Ausgangsknoten zurueck. */
77
+ function collectLeafTextsAt(cursor: SyntaxCursor, profile: LanguageProfile, out: string[]): void {
78
+ const type = cursor.nodeType;
79
+ if (profile.commentKinds.has(type)) return;
80
+ if (profile.literalContainerKinds.has(type)) {
81
+ out.push(cursor.nodeText);
82
+ return;
83
+ }
84
+ if (!cursor.gotoFirstChild()) {
85
+ out.push(cursor.nodeText); // entspricht node.childCount === 0
86
+ return;
87
+ }
88
+ do {
89
+ collectLeafTextsAt(cursor, profile, out);
90
+ } while (cursor.gotoNextSibling());
91
+ cursor.gotoParent();
92
+ }
93
+
94
+ /** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
95
+ export function computeTokenFingerprint(cursor: SyntaxCursor, profile: LanguageProfile): string {
96
+ const tokens: string[] = [];
97
+ collectLeafTextsAt(cursor, profile, tokens);
98
+ return sha256Hex(tokens.join("\u001f"));
99
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Lazy loader for the native `tree-sitter` runtime and its grammars.
3
+ *
4
+ * architecture.md §6.5 / the WP-06 mandate require that the CLI NOT load
5
+ * every grammar at startup. We satisfy that with plain lazy `require`
6
+ * (via `node:module#createRequire`, since this package is ESM and the
7
+ * native bindings are CommonJS) cached in module-level maps: nothing here
8
+ * runs until `getParser()`/`loadGrammar()` is first called for a given
9
+ * language, and each grammar is required at most once per process.
10
+ *
11
+ * `require` (not dynamic `import()`) is deliberate: `LanguageAdapter.parse`
12
+ * (domain `analysis.ts`) is a SYNCHRONOUS method, so grammar acquisition on
13
+ * first use must be synchronous too. `createRequire` gives us a synchronous
14
+ * CJS `require` from inside an ESM module without violating
15
+ * `verbatimModuleSyntax`.
16
+ */
17
+ import { createRequire } from "node:module";
18
+
19
+ import type { TsLanguage, TsParserCtor } from "./tree-sitter-types.js";
20
+
21
+ const require = createRequire(import.meta.url);
22
+
23
+ let cachedParserCtor: TsParserCtor | undefined;
24
+
25
+ /** Lazily requires the native `tree-sitter` Parser constructor (once per process). */
26
+ export function loadParserCtor(): TsParserCtor {
27
+ if (cachedParserCtor === undefined) {
28
+ cachedParserCtor = require("tree-sitter") as TsParserCtor;
29
+ }
30
+ return cachedParserCtor;
31
+ }
32
+
33
+ /** Which grammar module a dialect is loaded from, and how to reach the language export. */
34
+ export interface GrammarSource {
35
+ /** npm module to `require` lazily. */
36
+ moduleName: "tree-sitter-typescript" | "tree-sitter-javascript";
37
+ /** Property on the required module holding the `Language`, or `undefined` for the module's default export itself. */
38
+ exportName?: "typescript" | "tsx";
39
+ }
40
+
41
+ const grammarCache = new Map<string, TsLanguage>();
42
+
43
+ function grammarCacheKey(source: GrammarSource): string {
44
+ return `${source.moduleName}::${source.exportName ?? "default"}`;
45
+ }
46
+
47
+ /** Lazily requires and caches a single grammar `Language` handle. */
48
+ export function loadGrammar(source: GrammarSource): TsLanguage {
49
+ const key = grammarCacheKey(source);
50
+ const cached = grammarCache.get(key);
51
+ if (cached !== undefined) {
52
+ return cached;
53
+ }
54
+
55
+ const loadedModule = require(source.moduleName) as Record<string, unknown>;
56
+ const language = (
57
+ source.exportName === undefined ? loadedModule : loadedModule[source.exportName]
58
+ ) as TsLanguage;
59
+ grammarCache.set(key, language);
60
+ return language;
61
+ }
62
+
63
+ /** Test-only: clears caches so grammar-loading behavior can be re-exercised. */
64
+ export function resetGrammarCachesForTests(): void {
65
+ cachedParserCtor = undefined;
66
+ grammarCache.clear();
67
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Import/re-export/require/dynamic-import detection (spec.md §14.2).
3
+ *
4
+ * `RawImportKind` (domain `analysis.ts`) has exactly four members: `import`,
5
+ * `re_export`, `dynamic_import`, `package_dependency`. CommonJS
6
+ * `require("x")` has no dedicated member — it is mapped to `"import"`
7
+ * (documented WP-06 decision, README "Entscheidungen"): a `require` call is
8
+ * functionally a synchronous import of the same specifier space, and
9
+ * `"package_dependency"` is reserved for a resolved (not source-level)
10
+ * cross-package edge produced downstream by the import resolver / file
11
+ * graph, not by this adapter.
12
+ */
13
+ import type { RawImport, RawImportBinding } from "@untangle-code/domain";
14
+
15
+ import type { FileTextContext } from "./node-utils.js";
16
+ import { unquote, rangeOf } from "./node-utils.js";
17
+ import type { SyntaxNode } from "./syntax.js";
18
+
19
+ /**
20
+ * Zerlegt eine Importklausel in ihre BINDUNGEN — lokaler Name UND Name im
21
+ * Zielmodul. Der lokale Name allein genuegt nicht: bei
22
+ * `import { run as go } from "./lib"` ist `go` lokal und `run` der Export.
23
+ * Wer die Zuordnung hier wegwirft, kann sie nirgends mehr herstellen
24
+ * (`RawImportBinding` in domain `analysis.ts`).
25
+ */
26
+ function extractImportBindings(clauseOrSpecifierHolder: SyntaxNode): RawImportBinding[] {
27
+ const bindings: RawImportBinding[] = [];
28
+ for (const child of clauseOrSpecifierHolder.children) {
29
+ if (child.type === "identifier") {
30
+ // Direkter Bezeichner der Importklausel: der Vorgabeexport.
31
+ bindings.push({ localName: child.text, importedName: "default", kind: "default" });
32
+ } else if (child.type === "namespace_import") {
33
+ const inner = child.children.find((c) => c.type === "identifier");
34
+ if (inner !== undefined) bindings.push({ localName: inner.text, kind: "namespace" });
35
+ } else if (child.type === "named_imports") {
36
+ for (const specifier of child.children) {
37
+ if (specifier.type !== "import_specifier") continue;
38
+ const alias = specifier.childForFieldName("alias");
39
+ const name = specifier.childForFieldName("name");
40
+ if (name === null) continue;
41
+ const importedName = unquote(name.text);
42
+ bindings.push({
43
+ localName: alias === null ? importedName : unquote(alias.text),
44
+ importedName,
45
+ kind: importedName === "default" ? "default" : "named",
46
+ });
47
+ }
48
+ }
49
+ }
50
+ return bindings;
51
+ }
52
+
53
+ /** Lokale Namen der Bindungen, in Quelltextreihenfolge. */
54
+ function localNamesOf(bindings: readonly RawImportBinding[]): string[] {
55
+ return bindings.map((binding) => binding.localName);
56
+ }
57
+
58
+ function hasDirectTypeModifier(node: SyntaxNode): boolean {
59
+ return node.children.some((child) => child.type === "type");
60
+ }
61
+
62
+ /** Detects a static `import ...` / TS `import x = require(...)` statement. */
63
+ export function detectStaticImport(node: SyntaxNode, ctx: FileTextContext): RawImport | null {
64
+ const range = rangeOf(node, ctx);
65
+ const requireClause = node.children.find((child) => child.type === "import_require_clause");
66
+ if (requireClause !== undefined) {
67
+ const source = requireClause.childForFieldName("source");
68
+ if (source === null) return null;
69
+ return {
70
+ specifier: unquote(source.text),
71
+ importKind: "import",
72
+ range,
73
+ typeOnly: hasDirectTypeModifier(node),
74
+ };
75
+ }
76
+
77
+ const source = node.childForFieldName("source");
78
+ if (source === null) return null;
79
+ const importClause = node.children.find((child) => child.type === "import_clause");
80
+ const bindings = importClause !== undefined ? extractImportBindings(importClause) : [];
81
+ const importedNames = localNamesOf(bindings);
82
+
83
+ return {
84
+ specifier: unquote(source.text),
85
+ importKind: "import",
86
+ range,
87
+ ...(importedNames.length > 0 ? { importedNames, bindings } : {}),
88
+ typeOnly: hasDirectTypeModifier(node),
89
+ };
90
+ }
91
+
92
+ /** Detects a re-export (`export { x } from "y"`, `export * from "y"`, `export * as ns from "y"`). */
93
+ export function detectReExport(node: SyntaxNode, ctx: FileTextContext): RawImport | null {
94
+ const source = node.childForFieldName("source");
95
+ if (source === null) return null;
96
+ const exportClause = node.children.find((child) => child.type === "export_clause");
97
+ const bindings: RawImportBinding[] = [];
98
+ if (exportClause !== undefined) {
99
+ for (const specifier of exportClause.children) {
100
+ if (specifier.type !== "export_specifier") continue;
101
+ const alias = specifier.childForFieldName("alias");
102
+ const name = specifier.childForFieldName("name");
103
+ if (name === null) continue;
104
+ // Bei `export { run as go } from "m"` ist `run` der Name IM Zielmodul
105
+ // und `go` der hier weitergereichte Name.
106
+ const importedName = unquote(name.text);
107
+ bindings.push({
108
+ localName: alias === null ? importedName : unquote(alias.text),
109
+ importedName,
110
+ kind: importedName === "default" ? "default" : "named",
111
+ });
112
+ }
113
+ }
114
+ const importedNames = localNamesOf(bindings);
115
+ return {
116
+ specifier: unquote(source.text),
117
+ importKind: "re_export",
118
+ range: rangeOf(node, ctx),
119
+ ...(importedNames.length > 0 ? { importedNames, bindings } : {}),
120
+ typeOnly: hasDirectTypeModifier(node),
121
+ };
122
+ }
123
+
124
+ /** Detects `import("specifier")` (dynamic import) given its enclosing `call_expression`. */
125
+ export function detectDynamicImport(callNode: SyntaxNode, ctx: FileTextContext): RawImport | null {
126
+ const args = callNode.childForFieldName("arguments");
127
+ const firstArg = args?.namedChild(0) ?? null;
128
+ const specifier =
129
+ firstArg !== null && firstArg.type === "string"
130
+ ? unquote(firstArg.text)
131
+ : (firstArg?.text ?? "");
132
+ return {
133
+ specifier,
134
+ importKind: "dynamic_import",
135
+ range: rangeOf(callNode, ctx),
136
+ typeOnly: false,
137
+ };
138
+ }
139
+
140
+ /** Detects `require("specifier")` given its enclosing `call_expression`. Mapped to `importKind: "import"` (see file doc). */
141
+ export function detectRequireCall(callNode: SyntaxNode, ctx: FileTextContext): RawImport | null {
142
+ const args = callNode.childForFieldName("arguments");
143
+ const firstArg = args?.namedChild(0) ?? null;
144
+ const specifier =
145
+ firstArg !== null && firstArg.type === "string"
146
+ ? unquote(firstArg.text)
147
+ : (firstArg?.text ?? "");
148
+ return {
149
+ specifier,
150
+ importKind: "import",
151
+ range: rangeOf(callNode, ctx),
152
+ typeOnly: false,
153
+ };
154
+ }
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Das Sprachprofil der JS/TS-Familie (TypeScript, JavaScript, TSX, JSX).
3
+ *
4
+ * Diese Datei fuegt zusammen, was vorher fest in `engine.ts`, `chunks.ts` und
5
+ * `fingerprint.ts` stand: die Knotenarten aus `node-kinds.ts` und die
6
+ * handgeschriebenen Detektoren aus `decisions.ts`, `import-detection.ts`,
7
+ * `call-detection.ts`, `scope-naming.ts`, `scope-signature.ts` und
8
+ * `doc-binding.ts`. Es ist eine reine UMSTELLUNG, keine Verhaltensaenderung —
9
+ * jede Verzweigung steht hier in derselben Reihenfolge und mit derselben
10
+ * Bedingung wie vorher im Motor. Die Golden-Tests (`languages/golden.test.ts`)
11
+ * und `cursor-walk.test.ts` sind der Beleg, dass sie es geblieben ist.
12
+ *
13
+ * WARUM DIE DETEKTOREN NICHT MITGEZOGEN SIND: sie sind nicht generisch, und
14
+ * das sollen sie auch nicht sein. `detectStaticImport` kennt `import_clause`,
15
+ * `named_imports`, `namespace_import` — Formen der ECMAScript-Grammatik. Eine
16
+ * tabellengetriebene Fassung davon waere eine Tabelle mit genau einem Eintrag
17
+ * und einer Menge Ausreden. Andere Sprachen bekommen ihre eigene, kleine
18
+ * Fassung ueber `table-profile.ts`.
19
+ */
20
+ import type { LiteralFact, SupportLevel } from "@untangle-code/domain";
21
+
22
+ import { detectCallExpression, detectNewExpression } from "./call-detection.js";
23
+ import { detectDecisionAndNesting, mayCarryDecisionOrNesting } from "./decisions.js";
24
+ import type { Dialect } from "./dialect.js";
25
+ import { resolveDocRange } from "./doc-binding.js";
26
+ import {
27
+ detectDynamicImport,
28
+ detectReExport,
29
+ detectRequireCall,
30
+ detectStaticImport,
31
+ } from "./import-detection.js";
32
+ import {
33
+ CALL_EXPRESSION,
34
+ CLASS_STATIC_BLOCK_TYPE,
35
+ CLASS_TYPES,
36
+ COMMENT_TYPE,
37
+ ENUM_TYPE,
38
+ EXPORT_STATEMENT,
39
+ FIELD_TYPES,
40
+ FUNCTION_LIKE_TYPES,
41
+ IDENTIFIER_LEAF_TYPES,
42
+ IGNORED_PUNCTUATION_TYPES,
43
+ IMPORT_STATEMENT,
44
+ INTERFACE_TYPE,
45
+ LITERAL_CONTAINER_STOP_TYPES,
46
+ METHOD_TYPE,
47
+ NAMESPACE_TYPE,
48
+ NEW_EXPRESSION,
49
+ SCOPE_OPENING_TYPES,
50
+ SIMPLE_LITERAL_LEAF_TYPES,
51
+ TEMPLATE_TEXT_LEAF_TYPES,
52
+ TYPE_ALIAS_TYPE,
53
+ } from "./node-kinds.js";
54
+ import { rangeOf } from "./node-utils.js";
55
+ import type { LanguageProfile, MemberRegion, ModuleFactSink, ScopeSignature } from "./profile.js";
56
+ import type { ScopeNode } from "./scope-model.js";
57
+ import {
58
+ fieldDelegatesToFunctionValue,
59
+ resolveExportedNames,
60
+ resolveScopeName,
61
+ resolveVisibility,
62
+ } from "./scope-naming.js";
63
+ import {
64
+ buildFunctionSignature,
65
+ buildHeaderSignature,
66
+ buildPropertySignature,
67
+ isFunctionLikeScope,
68
+ } from "./scope-signature.js";
69
+ import type { SyntaxNode } from "./syntax.js";
70
+
71
+ /** Der TS-Knoten, dessen Blaetter reine Typsyntax sind (`string`, `number`, `void`, ...). */
72
+ const PREDEFINED_TYPE = "predefined_type";
73
+
74
+ /**
75
+ * Die Knotenarten, fuer die der Walk einen Knotenwrapper braucht: Scopeoeffner,
76
+ * Entscheidungstraeger, Import/Export, Aufruf. Fuer alles andere bleibt der
77
+ * Cursor unter sich (WP-95).
78
+ */
79
+ function needsNodeFor(kind: string): boolean {
80
+ return (
81
+ SCOPE_OPENING_TYPES.has(kind) ||
82
+ mayCarryDecisionOrNesting(kind) ||
83
+ kind === IMPORT_STATEMENT ||
84
+ kind === EXPORT_STATEMENT ||
85
+ kind === CALL_EXPRESSION ||
86
+ kind === NEW_EXPRESSION
87
+ );
88
+ }
89
+
90
+ function simpleLiteralKind(kind: string): LiteralFact["literalKind"] {
91
+ switch (kind) {
92
+ case "number":
93
+ return "number";
94
+ case "true":
95
+ case "false":
96
+ return "boolean";
97
+ case "null":
98
+ return "null";
99
+ default:
100
+ return "other";
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Deklaration oder Verweis? Aus `cursor.currentFieldName` und der Elternart —
106
+ * unveraendert aus `engine.ts` uebernommen.
107
+ */
108
+ function identifierRole(
109
+ fieldName: string | undefined,
110
+ parentKind: string,
111
+ ): "declaration" | "reference" {
112
+ if (fieldName === "name") {
113
+ if (
114
+ parentKind === "variable_declarator" ||
115
+ parentKind === "function_declaration" ||
116
+ parentKind === "class_declaration" ||
117
+ parentKind === "abstract_class_declaration" ||
118
+ parentKind === "interface_declaration" ||
119
+ parentKind === "type_alias_declaration" ||
120
+ parentKind === "enum_declaration" ||
121
+ parentKind === "method_definition" ||
122
+ parentKind === "required_parameter" ||
123
+ parentKind === "optional_parameter" ||
124
+ parentKind === "import_specifier" ||
125
+ parentKind === "namespace_import"
126
+ ) {
127
+ return "declaration";
128
+ }
129
+ }
130
+ if (
131
+ fieldName === "property" &&
132
+ (parentKind === "field_definition" || parentKind === "public_field_definition")
133
+ ) {
134
+ return "declaration";
135
+ }
136
+ return "reference";
137
+ }
138
+
139
+ /** Baut das Profil einer der vier JS/TS-Dialekte. */
140
+ export function createJsFamilyProfile(dialect: Dialect): LanguageProfile {
141
+ const supportLevel: SupportLevel = dialect.supportLevel;
142
+
143
+ return {
144
+ languageId: dialect.languageId,
145
+ extensions: dialect.extensions,
146
+ supportLevel,
147
+
148
+ commentKinds: new Set([COMMENT_TYPE]),
149
+ literalContainerKinds: LITERAL_CONTAINER_STOP_TYPES,
150
+ identifierLeafKinds: IDENTIFIER_LEAF_TYPES,
151
+ simpleLiteralLeafKinds: SIMPLE_LITERAL_LEAF_TYPES,
152
+ templateTextLeafKinds: TEMPLATE_TEXT_LEAF_TYPES,
153
+ ignoredPunctuationKinds: IGNORED_PUNCTUATION_TYPES,
154
+ typeKeywordParentKinds: new Set([PREDEFINED_TYPE]),
155
+ functionLikeKinds: FUNCTION_LIKE_TYPES,
156
+ exportWrapperKinds: new Set([EXPORT_STATEMENT]),
157
+
158
+ containerLiteralKind: (kind) => (kind === "regex" ? "regex" : "string"),
159
+ simpleLiteralKind,
160
+ identifierRole,
161
+ needsNode: needsNodeFor,
162
+
163
+ scopeKindOf(node: SyntaxNode): ScopeNode["kind"] | null {
164
+ if (FUNCTION_LIKE_TYPES.has(node.type)) return "function";
165
+ if (node.type === METHOD_TYPE) {
166
+ return resolveScopeName(node) === "constructor" ? "constructor" : "method";
167
+ }
168
+ if (CLASS_TYPES.has(node.type)) return "class";
169
+ if (node.type === INTERFACE_TYPE) return "interface";
170
+ if (node.type === TYPE_ALIAS_TYPE) return "type";
171
+ if (node.type === ENUM_TYPE) return "enum";
172
+ if (node.type === NAMESPACE_TYPE) return "namespace";
173
+ if (node.type === dialect.fieldDefinitionKind) return "property";
174
+ return null;
175
+ },
176
+
177
+ suppressesScope(node: SyntaxNode): boolean {
178
+ return FIELD_TYPES.has(node.type) && fieldDelegatesToFunctionValue(node);
179
+ },
180
+
181
+ scopeName: resolveScopeName,
182
+
183
+ scopeSignature(node: SyntaxNode, kind: ScopeNode["kind"], name: string): ScopeSignature {
184
+ return isFunctionLikeScope(node.type)
185
+ ? buildFunctionSignature(node, name)
186
+ : kind === "property"
187
+ ? buildPropertySignature(node, name)
188
+ : buildHeaderSignature(node);
189
+ },
190
+
191
+ docRange: resolveDocRange,
192
+ visibility: resolveVisibility,
193
+ exportedNames: resolveExportedNames,
194
+ detectDecisionAndNesting,
195
+
196
+ collectModuleFacts(node, kind, callerScopeId, ctx, sink: ModuleFactSink): void {
197
+ if (kind === IMPORT_STATEMENT) {
198
+ const detectedImport = detectStaticImport(node, ctx);
199
+ if (detectedImport !== null) sink.imports.push(detectedImport);
200
+ return;
201
+ }
202
+ if (kind === EXPORT_STATEMENT) {
203
+ if (node.childForFieldName("source") !== null) {
204
+ const reExport = detectReExport(node, ctx);
205
+ if (reExport !== null) sink.imports.push(reExport);
206
+ }
207
+ return;
208
+ }
209
+ if (kind === CALL_EXPRESSION) {
210
+ const functionNode = node.childForFieldName("function");
211
+ if (functionNode?.type === "import") {
212
+ const dynamicImport = detectDynamicImport(node, ctx);
213
+ if (dynamicImport !== null) sink.imports.push(dynamicImport);
214
+ } else if (functionNode?.type === "identifier" && functionNode.text === "require") {
215
+ const requireImport = detectRequireCall(node, ctx);
216
+ if (requireImport !== null) sink.imports.push(requireImport);
217
+ } else {
218
+ const call = detectCallExpression(node, callerScopeId, ctx);
219
+ if (call !== null) sink.calls.push(call);
220
+ }
221
+ return;
222
+ }
223
+ if (kind === NEW_EXPRESSION) {
224
+ const call = detectNewExpression(node, callerScopeId, ctx);
225
+ if (call !== null) sink.calls.push(call);
226
+ }
227
+ },
228
+
229
+ memberRegions(node: SyntaxNode, parentScopeId, ctx): MemberRegion[] {
230
+ const body = node.childForFieldName("body");
231
+ if (body === null) return [];
232
+ const regions: MemberRegion[] = [];
233
+ let ordinal = 0;
234
+ for (const child of body.children) {
235
+ if (child.type !== CLASS_STATIC_BLOCK_TYPE) continue;
236
+ regions.push({
237
+ range: rangeOf(child, ctx),
238
+ scopeId: `${parentScopeId}#static_block#${String(ordinal)}`,
239
+ headerText: "static initialization block",
240
+ });
241
+ ordinal += 1;
242
+ }
243
+ return regions;
244
+ },
245
+ };
246
+ }