@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,50 @@
1
+ import { COMMENT_TYPE, DECORATOR_TYPE } from "./node-kinds.js";
2
+ import { rangeOf, unionRange } from "./node-utils.js";
3
+ /** Climbs from a (possibly deeply nested) scope-defining node to its statement-level anchor. */
4
+ export function resolveDocAnchor(node) {
5
+ let anchor = node;
6
+ const parent = node.parent;
7
+ if (parent !== null) {
8
+ if (parent.type === "variable_declarator") {
9
+ const declarationList = parent.parent;
10
+ if (declarationList !== null &&
11
+ (declarationList.type === "lexical_declaration" ||
12
+ declarationList.type === "variable_declaration")) {
13
+ anchor = declarationList;
14
+ }
15
+ }
16
+ else if (parent.type === "assignment_expression" &&
17
+ parent.parent?.type === "expression_statement") {
18
+ anchor = parent.parent;
19
+ }
20
+ }
21
+ if (anchor.parent !== null && anchor.parent.type === "export_statement") {
22
+ anchor = anchor.parent;
23
+ }
24
+ return anchor;
25
+ }
26
+ const MAX_BLANK_LINES_BETWEEN_DOC_AND_SYMBOL = 1;
27
+ /** Resolves the bound doc-comment range for a scope-defining node, if any (spec.md §8.3 step 2). */
28
+ export function resolveDocRange(node, ctx) {
29
+ const anchor = resolveDocAnchor(node);
30
+ let cursor = anchor.previousSibling;
31
+ let boundary = anchor;
32
+ // Skip immediately-preceding decorators (they travel with the symbol's own range, not the doc range,
33
+ // but a comment further back must still be considered "immediately preceding" through them).
34
+ while (cursor !== null && cursor.type === DECORATOR_TYPE) {
35
+ boundary = cursor;
36
+ cursor = cursor.previousSibling;
37
+ }
38
+ let docRange;
39
+ while (cursor !== null && cursor.type === COMMENT_TYPE) {
40
+ const gap = boundary.startPosition.row - cursor.endPosition.row;
41
+ if (gap > MAX_BLANK_LINES_BETWEEN_DOC_AND_SYMBOL)
42
+ break;
43
+ const commentRange = rangeOf(cursor, ctx);
44
+ docRange = docRange === undefined ? commentRange : unionRange(commentRange, docRange);
45
+ boundary = cursor;
46
+ cursor = cursor.previousSibling;
47
+ }
48
+ return docRange;
49
+ }
50
+ //# sourceMappingURL=doc-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-binding.js","sourceRoot":"","sources":["../../../src/languages/shared/doc-binding.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGtD,gGAAgG;AAChG,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;YACtC,IACE,eAAe,KAAK,IAAI;gBACxB,CAAC,eAAe,CAAC,IAAI,KAAK,qBAAqB;oBAC7C,eAAe,CAAC,IAAI,KAAK,sBAAsB,CAAC,EAClD,CAAC;gBACD,MAAM,GAAG,eAAe,CAAC;YAC3B,CAAC;QACH,CAAC;aAAM,IACL,MAAM,CAAC,IAAI,KAAK,uBAAuB;YACvC,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,sBAAsB,EAC9C,CAAC;YACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACxE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,sCAAsC,GAAG,CAAC,CAAC;AAEjD,oGAAoG;AACpG,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,GAAoB;IACpE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;IACpC,IAAI,QAAQ,GAAG,MAAM,CAAC;IACtB,qGAAqG;IACrG,6FAA6F;IAC7F,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACzD,QAAQ,GAAG,MAAM,CAAC;QAClB,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;IAClC,CAAC;IAED,IAAI,QAAiC,CAAC;IACtC,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;QAChE,IAAI,GAAG,GAAG,sCAAsC;YAAE,MAAM;QACxD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1C,QAAQ,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACtF,QAAQ,GAAG,MAAM,CAAC;QAClB,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;IAClC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The single unified AST walk. Every `LanguageAdapter` extraction method
3
+ * (`extractSymbols`, `extractImports`, `extractCalls`, `computeComplexity`,
4
+ * `tokenizeForHalstead`, `extractChunks`) is a thin projection over the ONE
5
+ * `AnalysisResult` this module computes — see `create-adapter.ts`, which
6
+ * memoizes it per `ParsedAst` (via `WeakMap`) so calling multiple extract
7
+ * methods on the same parse re-walks the tree only once.
8
+ *
9
+ * Building everything in one pass is not just a performance optimization:
10
+ * it is what GUARANTEES that a `symbolScopeId` produced for a
11
+ * `SymbolScopeFact` (from `computeComplexity`) is the exact same string as
12
+ * the `callerScopeId` on a `RawCall` (from `extractCalls`) for a call
13
+ * written inside that scope — both come from the same live scope-stack
14
+ * frame during the same walk, not from two independently-reimplemented
15
+ * scope-id algorithms that could drift apart.
16
+ *
17
+ * TRAVERSIERUNG (WP-95): der Walk laeuft ueber die CURSOR-API
18
+ * (`tree.walk()` / `gotoFirstChild` / `gotoNextSibling` / `gotoParent`),
19
+ * NICHT ueber `node.children`. Gemessen an diesem Repository (716 Dateien,
20
+ * 128.219 Zeilen) kostete der `.children`-Weg 25,6 s fuer den Walk gegen
21
+ * 3,6 s fuers Parsen: jeder `.children`-Zugriff baut ein JS-Array aus
22
+ * Knotenwrappern und ueberquert die Grenze zur nativen Bibliothek einmal je
23
+ * Knoten. Der Cursor haelt die Position nativ.
24
+ *
25
+ * WAS DER CURSOR NICHT HAT, und wie es hier ersetzt wird:
26
+ * - `node.parent` -> `parentTypeAt[depth]`, waehrend des Abstiegs gefuehrt.
27
+ * - `node.childCount === 0` -> ein probeweises `gotoFirstChild()`; schlaegt
28
+ * es fehl, ist der Knoten ein Blatt (sonst bringt `gotoParent()` zurueck).
29
+ * - `parent.childForFieldName(...)` fuer die Rolle eines Bezeichners ->
30
+ * `cursor.currentFieldName`, das denselben Feldnamen ohne Wrapper liefert.
31
+ *
32
+ * Ein `SyntaxNode`-Wrapper entsteht nur noch dort, wo ein Detektor ihn
33
+ * wirklich braucht (siehe `visitInnerNode`) — wer diese Vorsiebe aufweicht,
34
+ * baut die Grenzueberquerung je Knoten wieder ein.
35
+ */
36
+ import type { ComplexityFacts, RawCall, RawImport } from "@untangle-code/domain";
37
+ import type { FileTextContext } from "./node-utils.js";
38
+ import type { LanguageProfile } from "./profile.js";
39
+ import type { ScopeNode } from "./scope-model.js";
40
+ import type { SyntaxNode } from "./syntax.js";
41
+ export interface AnalysisResult {
42
+ scopeTree: ScopeNode;
43
+ facts: ComplexityFacts;
44
+ imports: RawImport[];
45
+ calls: RawCall[];
46
+ }
47
+ /** Runs the single unified walk over a file's root node. */
48
+ export declare function analyzeTree(root: SyntaxNode, ctx: FileTextContext, fileId: string, profile: LanguageProfile): AnalysisResult;
49
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,KAAK,EACV,eAAe,EAIf,OAAO,EACP,SAAS,EAIV,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,cAAc,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAyUD,4DAA4D;AAC5D,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,GACvB,cAAc,CAgEhB"}
@@ -0,0 +1,317 @@
1
+ import { lambdaNesting } from "./decisions.js";
2
+ import { computeAstHash, computeTokenFingerprint } from "./fingerprint.js";
3
+ import { commentRangeOfCursor, rangeOf, rangeOfCursor } from "./node-utils.js";
4
+ import { isExecutableScopeKind } from "./profile.js";
5
+ /** Separates scope-id components (U+001F, unit separator) — avoids the classic "ab"+"c" == "a"+"bc" join ambiguity. */
6
+ const SCOPE_ID_SEPARATOR = "";
7
+ function toSymbolScopeFact(frame, parentScopeId) {
8
+ const { scopeNode } = frame;
9
+ return {
10
+ symbolScopeId: scopeNode.scopeId,
11
+ name: scopeNode.name,
12
+ qualifiedName: scopeNode.qualifiedName,
13
+ kind: scopeNode.kind,
14
+ range: scopeNode.range,
15
+ ...(parentScopeId !== undefined ? { parentScopeId } : {}),
16
+ executable: scopeNode.executable,
17
+ };
18
+ }
19
+ function openScope(cursor, node, parent, profile, ctx, fileId, out) {
20
+ if (profile.suppressesScope(node))
21
+ return null;
22
+ const kind = profile.scopeKindOf(node);
23
+ if (kind === null)
24
+ return null;
25
+ const name = profile.scopeName(node);
26
+ // WP-237: Sprachen, die den Traeger als FELD statt als Elternknoten fuehren
27
+ // (Gos Methodenempfaenger), liefern ihn hier nach. Der SYMBOLNAME bleibt
28
+ // unveraendert `Run` — nur der qualifizierte Name wird `A.Run`, damit zwei
29
+ // gleichnamige Methoden auf verschiedenen Typen unterscheidbar bleiben.
30
+ const qualifier = profile.scopeQualifier?.(node);
31
+ const localName = qualifier === undefined ? name : `${qualifier}.${name}`;
32
+ const qualifiedName = parent.qualifiedName.length > 0 ? `${parent.qualifiedName}.${localName}` : localName;
33
+ const counterKey = `${kind}:${qualifiedName}`;
34
+ const ordinal = parent.childOrdinalCounters.get(counterKey) ?? 0;
35
+ parent.childOrdinalCounters.set(counterKey, ordinal + 1);
36
+ const scopeId = [fileId, "scope", qualifiedName, kind, String(ordinal)].join(SCOPE_ID_SEPARATOR);
37
+ const signature = profile.scopeSignature(node, kind, name);
38
+ const docRange = profile.docRange(node, ctx);
39
+ const executable = isExecutableScopeKind(kind);
40
+ const visibility = profile.visibility(node, name);
41
+ const parentQualifiedName = parent.qualifiedName.length > 0 ? parent.qualifiedName : undefined;
42
+ const scopeNode = {
43
+ scopeId,
44
+ kind,
45
+ name,
46
+ qualifiedName,
47
+ ...(parentQualifiedName !== undefined ? { parentQualifiedName } : {}),
48
+ range: rangeOf(node, ctx),
49
+ ...(docRange !== undefined ? { docRange } : {}),
50
+ ...(signature.raw !== undefined ? { signature: signature.raw } : {}),
51
+ normalizedSignature: signature.normalized,
52
+ exportedNames: profile.exportedNames(node, name),
53
+ ...(visibility !== undefined ? { visibility } : {}),
54
+ executable,
55
+ astHash: computeAstHash(cursor, profile),
56
+ tokenFingerprint: computeTokenFingerprint(cursor, profile),
57
+ node,
58
+ children: [],
59
+ };
60
+ const frame = {
61
+ scopeId,
62
+ qualifiedName,
63
+ executable,
64
+ scopeNode,
65
+ childOrdinalCounters: new Map(),
66
+ };
67
+ out.symbolScopes.push(toSymbolScopeFact(frame, parent.scopeId));
68
+ parent.scopeNode.children.push(scopeNode);
69
+ return frame;
70
+ }
71
+ /**
72
+ * Ein Blattknoten (kein Kind) wird eingeordnet. Der Cursor steht auf ihm; ein
73
+ * `SyntaxNode`-Wrapper wird NICHT gebaut — `nodeText`, `nodeType` und
74
+ * `currentFieldName` liefern alles Noetige, `parentType` kommt aus dem Abstieg.
75
+ *
76
+ * Die frueher hier stehende `predefined_type`-Pruefung ist ENTFALLEN, nicht
77
+ * vergessen: der einzige Aufrufer (`walkWithCursor`) siebt diesen Fall bereits
78
+ * vor dem Blatt-Zweig aus (ueber `profile.typeKeywordParentKinds`), die
79
+ * Pruefung war an dieser Stelle unerreichbar.
80
+ */
81
+ function classifyAndRecordLeaf(cursor, nodeType, parentType, range, frame, profile, out) {
82
+ const scopeId = frame.scopeId;
83
+ if (profile.identifierLeafKinds.has(nodeType)) {
84
+ const text = cursor.nodeText;
85
+ out.identifiers.push({
86
+ name: text,
87
+ range,
88
+ symbolScopeId: scopeId,
89
+ role: profile.identifierRole(cursor.currentFieldName, parentType),
90
+ });
91
+ out.operands.push({ text, range, symbolScopeId: scopeId });
92
+ return;
93
+ }
94
+ if (profile.simpleLiteralLeafKinds.has(nodeType)) {
95
+ const text = cursor.nodeText;
96
+ out.literals.push({
97
+ raw: text,
98
+ literalKind: profile.simpleLiteralKind(nodeType),
99
+ range,
100
+ symbolScopeId: scopeId,
101
+ });
102
+ out.operands.push({ text, range, symbolScopeId: scopeId });
103
+ return;
104
+ }
105
+ if (profile.templateTextLeafKinds.has(nodeType)) {
106
+ const text = cursor.nodeText;
107
+ out.literals.push({ raw: text, literalKind: "template", range, symbolScopeId: scopeId });
108
+ out.operands.push({ text, range, symbolScopeId: scopeId });
109
+ return;
110
+ }
111
+ if (profile.ignoredPunctuationKinds.has(nodeType))
112
+ return;
113
+ out.operators.push({ text: cursor.nodeText, range, symbolScopeId: scopeId });
114
+ }
115
+ /**
116
+ * Alles, was ein innerer Knoten (mindestens ein Kind) beitraegt: Entscheidung,
117
+ * Nesting, Import, Aufruf, eigener Scope. Gibt den neu geoeffneten Scope-Rahmen
118
+ * zurueck, sonst `null`.
119
+ *
120
+ * HIER und nur hier entsteht ein `SyntaxNode`-Wrapper, und nur wenn das Profil
121
+ * fuer diese Knotenart ueberhaupt einen Detektor auf den Plan ruft
122
+ * (`profile.needsNode`). Fuer die grosse Mehrheit der inneren Knoten faellt die
123
+ * Grenzueberquerung damit ganz weg — beim tree-sitter-Backend spart das den
124
+ * Wrapper, beim ast-grep-Backend den weit teureren `children()`-Aufbau.
125
+ */
126
+ function visitInnerNode(cursor, nodeType, range, frame, profile, ctx, fileId, out) {
127
+ // Kein Detektor zustaendig: kein Wrapper, kein Scope. Das Lambda-Nesting
128
+ // unten kann hier nicht verloren gehen — ein funktionsartiger Knoten oeffnet
129
+ // immer auch einen Scope, also ist `needsNode` dort wahr (in
130
+ // `js-family-profile.ts` wie in `table-profile.ts` durch Konstruktion).
131
+ if (!profile.needsNode(nodeType))
132
+ return null;
133
+ const node = cursor.currentNode;
134
+ // Decision / nesting facts.
135
+ const detected = profile.detectDecisionAndNesting(node);
136
+ if (detected.decision !== undefined) {
137
+ const fact = {
138
+ kind: detected.decision.kind,
139
+ range,
140
+ symbolScopeId: frame.scopeId,
141
+ countsForClassic: detected.decision.countsForClassic,
142
+ countsForExtended: detected.decision.countsForExtended,
143
+ ...(detected.decision.logicalGroupId !== undefined
144
+ ? { logicalGroupId: detected.decision.logicalGroupId }
145
+ : {}),
146
+ };
147
+ // `repeat` (Vorgabe 1) ist die flache n-stellige Alternative — siehe
148
+ // `DetectedDecision.repeat`. Jede Wiederholung ist eine EIGENE Tatsache
149
+ // mit demselben Bereich, kein Zaehler auf einer.
150
+ for (let index = 0; index < (detected.decision.repeat ?? 1); index += 1) {
151
+ out.decisions.push({ ...fact });
152
+ }
153
+ }
154
+ if (detected.nesting !== undefined) {
155
+ out.nestingEvents.push({
156
+ construct: detected.nesting.construct,
157
+ range,
158
+ symbolScopeId: frame.scopeId,
159
+ continuation: detected.nesting.continuation,
160
+ });
161
+ }
162
+ // Importe und Aufrufe (Aufrufe dem AKTUELLEN Scope zugerechnet, also dem Rufer).
163
+ const sink = { imports: out.imports, calls: out.calls };
164
+ profile.collectModuleFacts(node, nodeType, frame.scopeId, ctx, sink);
165
+ const openedScope = openScope(cursor, node, frame, profile, ctx, fileId, out);
166
+ // A directly-nested function-like node (lambda/local function) inside an
167
+ // already-executable scope gets an extra lambda nesting event (spec.md
168
+ // §16.4: "lokale Funktionen/Lambdas verwenden einen dokumentierten
169
+ // Nesting-Kontext") in addition to becoming its own scope below. A node kind
170
+ // can be function-like only in a particular syntactic context, so a rejected
171
+ // scope must not leave behind a phantom lambda event.
172
+ if (openedScope !== null && frame.executable && profile.functionLikeKinds.has(nodeType)) {
173
+ const lambda = lambdaNesting();
174
+ out.nestingEvents.push({
175
+ construct: lambda.construct,
176
+ range,
177
+ symbolScopeId: frame.scopeId,
178
+ continuation: lambda.continuation,
179
+ });
180
+ }
181
+ return openedScope;
182
+ }
183
+ /**
184
+ * Der vereinheitlichte Walk, iterativ ueber einen Baumcursor.
185
+ *
186
+ * Der Cursor beginnt auf der Wurzel und endet wieder dort. Besuchsreihenfolge,
187
+ * `depth`-Zaehlung und die Reihenfolge JEDER Faktenliste sind identisch mit
188
+ * der frueheren Rekursion ueber `node.children` — die Gegenprobe
189
+ * (`diff-walk.mjs`, siehe README) faehrt beide Wege ueber dieses Repository
190
+ * und vergleicht Symbole, Regionen, Chunk-IDs und Metriken Datei fuer Datei.
191
+ *
192
+ * `frameAt`/`parentTypeAt` sind nach Tiefe indiziert und ersetzen zusammen den
193
+ * Aufrufstapel der Rekursion samt `node.parent`. Eintraege unterhalb der
194
+ * aktuellen Tiefe sind veraltet, werden aber vor jedem Lesen ueberschrieben.
195
+ */
196
+ function walkWithCursor(cursor, rootType, rootFrame, profile, ctx, fileId, out) {
197
+ if (!cursor.gotoFirstChild())
198
+ return;
199
+ const frameAt = [rootFrame, rootFrame];
200
+ const parentTypeAt = [rootType, rootType];
201
+ let depth = 1;
202
+ for (;;) {
203
+ const frame = frameAt[depth];
204
+ const parentType = parentTypeAt[depth];
205
+ const nodeType = cursor.nodeType;
206
+ const range = rangeOfCursor(cursor, ctx);
207
+ out.nodeKinds.push({ kind: nodeType, depth, symbolScopeId: frame.scopeId });
208
+ let descended = false;
209
+ if (profile.commentKinds.has(nodeType)) {
210
+ out.comments.push(commentRangeOfCursor(cursor, ctx));
211
+ }
212
+ else if (profile.typeKeywordParentKinds.has(parentType)) {
213
+ // Ein Typschluessselwort-Blatt (z. B. das `string`/`number`/`void`-Kind
214
+ // von `predefined_type`): dieselben Namen wie Literale, aber Typsyntax,
215
+ // kein Wert. Weiter in `nodeKinds` gezaehlt (oben), nie als
216
+ // Operator/Operand/Literal/Bezeichner. Muss VOR dem Literalcontainer
217
+ // unten stehen: das Kind fuer das Typschluesselwort `string` hat den
218
+ // Knotentyp "string" — genau denselben wie ein echtes Zeichenkettenliteral.
219
+ }
220
+ else if (profile.literalContainerKinds.has(nodeType)) {
221
+ const text = cursor.nodeText;
222
+ out.operands.push({ text, range, symbolScopeId: frame.scopeId });
223
+ out.literals.push({
224
+ raw: text,
225
+ literalKind: profile.containerLiteralKind(nodeType),
226
+ range,
227
+ symbolScopeId: frame.scopeId,
228
+ });
229
+ }
230
+ else if (!cursor.gotoFirstChild()) {
231
+ // Der Cursor kennt kein `childCount`: der fehlgeschlagene Abstieg IST
232
+ // die Blattpruefung, und er hat die Position nicht veraendert.
233
+ classifyAndRecordLeaf(cursor, nodeType, parentType, range, frame, profile, out);
234
+ }
235
+ else {
236
+ cursor.gotoParent(); // zurueck auf den inneren Knoten selbst
237
+ const childFrame = visitInnerNode(cursor, nodeType, range, frame, profile, ctx, fileId, out);
238
+ cursor.gotoFirstChild();
239
+ depth += 1;
240
+ frameAt[depth] = childFrame ?? frame;
241
+ parentTypeAt[depth] = nodeType;
242
+ descended = true;
243
+ }
244
+ if (descended)
245
+ continue;
246
+ // Aufsteigen, bis ein Geschwisterknoten da ist. Tiefe 1 ohne Geschwister
247
+ // heisst: die Kinder der Wurzel sind abgearbeitet.
248
+ while (!cursor.gotoNextSibling()) {
249
+ if (depth === 1)
250
+ return;
251
+ cursor.gotoParent();
252
+ depth -= 1;
253
+ }
254
+ }
255
+ }
256
+ /** Runs the single unified walk over a file's root node. */
257
+ export function analyzeTree(root, ctx, fileId, profile) {
258
+ const out = {
259
+ symbolScopes: [],
260
+ decisions: [],
261
+ nestingEvents: [],
262
+ operators: [],
263
+ operands: [],
264
+ nodeKinds: [],
265
+ comments: [],
266
+ identifiers: [],
267
+ literals: [],
268
+ imports: [],
269
+ calls: [],
270
+ };
271
+ // EIN Cursor fuer alles: er beginnt auf der Wurzel, und nur ein von der
272
+ // Wurzel her abgestiegener Cursor meldet Knotentypen verlaesslich (siehe
273
+ // `fingerprint.ts`, Punkt 2). Jede Hilfsfunktion, die ihn bewegt, gibt ihn
274
+ // an der Ausgangsposition zurueck.
275
+ const cursor = root.walk();
276
+ const fileScopeNode = {
277
+ scopeId: fileId,
278
+ kind: "file",
279
+ name: "",
280
+ qualifiedName: "",
281
+ range: rangeOf(root, ctx),
282
+ normalizedSignature: "",
283
+ exportedNames: [],
284
+ executable: true,
285
+ astHash: computeAstHash(cursor, profile),
286
+ tokenFingerprint: computeTokenFingerprint(cursor, profile),
287
+ node: root,
288
+ children: [],
289
+ };
290
+ const rootFrame = {
291
+ scopeId: fileId,
292
+ qualifiedName: "",
293
+ executable: true,
294
+ scopeNode: fileScopeNode,
295
+ childOrdinalCounters: new Map(),
296
+ };
297
+ out.symbolScopes.push(toSymbolScopeFact(rootFrame, undefined));
298
+ walkWithCursor(cursor, root.type, rootFrame, profile, ctx, fileId, out);
299
+ const facts = {
300
+ symbolScopes: out.symbolScopes,
301
+ decisions: out.decisions,
302
+ nestingEvents: out.nestingEvents,
303
+ operators: out.operators,
304
+ operands: out.operands,
305
+ nodeKinds: out.nodeKinds,
306
+ comments: out.comments,
307
+ identifiers: out.identifiers,
308
+ literals: out.literals,
309
+ // Leer AN DIESER STELLE mit Absicht: die Parse-Diagnosen entstehen in
310
+ // `parse()` und werden in `create-adapter.ts#getAnalysis` eingesetzt,
311
+ // bevor die Facts den Adapter verlassen. Wer diese Zeile als "sowieso
312
+ // immer leer" liest, hat den falschen Ausschnitt vor sich.
313
+ parseDiagnostics: [],
314
+ };
315
+ return { scopeTree: fileScopeNode, facts, imports: out.imports, calls: out.calls };
316
+ }
317
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/languages/shared/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ExtractedSymbol } from "@untangle-code/domain";
2
+ import type { ScopeNode } from "./scope-model.js";
3
+ /** Flattens the scope tree (excluding the synthetic file-level root) into `ExtractedSymbol[]`, document order. */
4
+ export declare function extractedSymbolsOf(fileScope: ScopeNode): ExtractedSymbol[];
5
+ //# sourceMappingURL=extract-symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-symbols.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/extract-symbols.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAqBlD,kHAAkH;AAClH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,EAAE,CAU1E"}
@@ -0,0 +1,31 @@
1
+ function toExtractedSymbol(scope) {
2
+ return {
3
+ name: scope.name,
4
+ qualifiedName: scope.qualifiedName,
5
+ kind: scope.kind,
6
+ ...(scope.signature !== undefined ? { signature: scope.signature } : {}),
7
+ normalizedSignature: scope.normalizedSignature,
8
+ range: scope.range,
9
+ ...(scope.docRange !== undefined ? { docRange: scope.docRange } : {}),
10
+ ...(scope.parentQualifiedName !== undefined
11
+ ? { parentQualifiedName: scope.parentQualifiedName }
12
+ : {}),
13
+ exportedNames: scope.exportedNames,
14
+ ...(scope.visibility !== undefined ? { visibility: scope.visibility } : {}),
15
+ astHash: scope.astHash,
16
+ tokenFingerprint: scope.tokenFingerprint,
17
+ };
18
+ }
19
+ /** Flattens the scope tree (excluding the synthetic file-level root) into `ExtractedSymbol[]`, document order. */
20
+ export function extractedSymbolsOf(fileScope) {
21
+ const symbols = [];
22
+ const visit = (scope) => {
23
+ for (const child of scope.children) {
24
+ symbols.push(toExtractedSymbol(child));
25
+ visit(child);
26
+ }
27
+ };
28
+ visit(fileScope);
29
+ return symbols;
30
+ }
31
+ //# sourceMappingURL=extract-symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-symbols.js","sourceRoot":"","sources":["../../../src/languages/shared/extract-symbols.ts"],"names":[],"mappings":"AAIA,SAAS,iBAAiB,CAAC,KAAgB;IACzC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC;AACJ,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,kBAAkB,CAAC,SAAoB;IACrD,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,KAAgB,EAAQ,EAAE;QACvC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,SAAS,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { LanguageProfile } from "./profile.js";
2
+ import type { SyntaxCursor } from "./syntax.js";
3
+ /** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
4
+ export declare function computeAstHash(cursor: SyntaxCursor, profile: LanguageProfile): string;
5
+ /** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
6
+ export declare function computeTokenFingerprint(cursor: SyntaxCursor, profile: LanguageProfile): string;
7
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/fingerprint.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA4BhD,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAErF;AAoBD,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAI9F"}
@@ -0,0 +1,95 @@
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
+ * Baut die Formzeichenkette fuer den Knoten, auf dem der Cursor steht, und
43
+ * laesst den Cursor GENAU DORT zurueck: jede `gotoFirstChild`-Bewegung wird
44
+ * von einem `gotoParent` aufgewogen. Wer das verletzt, verschiebt die
45
+ * Traversierung des Aufrufers.
46
+ */
47
+ function structuralShapeAt(cursor, profile) {
48
+ const type = cursor.nodeType;
49
+ if (profile.commentKinds.has(type))
50
+ return "";
51
+ if (profile.literalContainerKinds.has(type))
52
+ return type;
53
+ if (!cursor.gotoFirstChild())
54
+ return type; // entspricht node.childCount === 0
55
+ const childShapes = [];
56
+ do {
57
+ // Kommentarkinder werden AUSGELASSEN, nicht als "" aufgenommen — genau
58
+ // das tat das frueher vorgeschaltete
59
+ // `.filter((child) => child.type !== "comment")`.
60
+ if (!profile.commentKinds.has(cursor.nodeType)) {
61
+ childShapes.push(structuralShapeAt(cursor, profile));
62
+ }
63
+ } while (cursor.gotoNextSibling());
64
+ cursor.gotoParent();
65
+ return `${type}(${childShapes.join(",")})`;
66
+ }
67
+ /** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
68
+ export function computeAstHash(cursor, profile) {
69
+ return sha256Hex(structuralShapeAt(cursor, profile));
70
+ }
71
+ /** Sammelt die Blatttexte; laesst den Cursor auf dem Ausgangsknoten zurueck. */
72
+ function collectLeafTextsAt(cursor, profile, out) {
73
+ const type = cursor.nodeType;
74
+ if (profile.commentKinds.has(type))
75
+ return;
76
+ if (profile.literalContainerKinds.has(type)) {
77
+ out.push(cursor.nodeText);
78
+ return;
79
+ }
80
+ if (!cursor.gotoFirstChild()) {
81
+ out.push(cursor.nodeText); // entspricht node.childCount === 0
82
+ return;
83
+ }
84
+ do {
85
+ collectLeafTextsAt(cursor, profile, out);
86
+ } while (cursor.gotoNextSibling());
87
+ cursor.gotoParent();
88
+ }
89
+ /** Cursor MUSS auf dem Knoten stehen; er steht danach wieder dort. */
90
+ export function computeTokenFingerprint(cursor, profile) {
91
+ const tokens = [];
92
+ collectLeafTextsAt(cursor, profile, tokens);
93
+ return sha256Hex(tokens.join("\u001f"));
94
+ }
95
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../src/languages/shared/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,MAAoB,EAAE,OAAwB;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,IAAI,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;QAAE,OAAO,IAAI,CAAC,CAAC,mCAAmC;IAE9E,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,GAAG,CAAC;QACF,uEAAuE;QACvE,qCAAqC;QACrC,kDAAkD;QAClD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/C,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,EAAE;IACnC,MAAM,CAAC,UAAU,EAAE,CAAC;IAEpB,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,OAAwB;IAC3E,OAAO,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,gFAAgF;AAChF,SAAS,kBAAkB,CAAC,MAAoB,EAAE,OAAwB,EAAE,GAAa;IACvF,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC3C,IAAI,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,mCAAmC;QAC9D,OAAO;IACT,CAAC;IACD,GAAG,CAAC;QACF,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,EAAE;IACnC,MAAM,CAAC,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,uBAAuB,CAAC,MAAoB,EAAE,OAAwB;IACpF,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { TsLanguage, TsParserCtor } from "./tree-sitter-types.js";
2
+ /** Lazily requires the native `tree-sitter` Parser constructor (once per process). */
3
+ export declare function loadParserCtor(): TsParserCtor;
4
+ /** Which grammar module a dialect is loaded from, and how to reach the language export. */
5
+ export interface GrammarSource {
6
+ /** npm module to `require` lazily. */
7
+ moduleName: "tree-sitter-typescript" | "tree-sitter-javascript";
8
+ /** Property on the required module holding the `Language`, or `undefined` for the module's default export itself. */
9
+ exportName?: "typescript" | "tsx";
10
+ }
11
+ /** Lazily requires and caches a single grammar `Language` handle. */
12
+ export declare function loadGrammar(source: GrammarSource): TsLanguage;
13
+ /** Test-only: clears caches so grammar-loading behavior can be re-exercised. */
14
+ export declare function resetGrammarCachesForTests(): void;
15
+ //# sourceMappingURL=grammar-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar-loader.d.ts","sourceRoot":"","sources":["../../../src/languages/shared/grammar-loader.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMvE,sFAAsF;AACtF,wBAAgB,cAAc,IAAI,YAAY,CAK7C;AAED,2FAA2F;AAC3F,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,UAAU,EAAE,wBAAwB,GAAG,wBAAwB,CAAC;IAChE,qHAAqH;IACrH,UAAU,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;CACnC;AAQD,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAa7D;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD"}