cgraphx 2.0.2 → 2.0.3

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 (680) hide show
  1. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  2. package/dist/core/code/engine/cli/analyze.js +1086 -0
  3. package/dist/core/code/engine/cli/cli-message.js +83 -0
  4. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  5. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  6. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  7. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  8. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  9. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  10. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  11. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  12. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  13. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  14. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  15. package/dist/core/code/engine/cli/status.js +156 -0
  16. package/dist/core/code/engine/cli/tool.js +384 -0
  17. package/dist/core/code/engine/config/ignore-service.js +511 -0
  18. package/dist/core/code/engine/config/supported-languages.js +17 -0
  19. package/dist/core/code/engine/core/analysis-features.js +64 -0
  20. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  21. package/dist/core/code/engine/core/git-staleness.js +180 -0
  22. package/dist/core/code/engine/core/graph/graph.js +180 -0
  23. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  24. package/dist/core/code/engine/core/graph/types.js +2 -0
  25. package/dist/core/code/engine/core/index-freshness.js +12 -0
  26. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  27. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  28. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  29. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  30. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  31. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  32. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  33. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  34. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  35. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  36. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  37. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  38. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  39. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  40. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  41. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  42. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  43. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  44. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  45. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  46. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  47. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  48. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  49. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  50. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  51. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  52. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  53. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  54. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  55. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  56. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  57. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  58. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  81. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  82. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  83. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  84. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  85. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  86. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  87. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  88. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  89. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  90. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  91. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  92. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  93. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  94. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  95. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  96. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  97. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  98. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  99. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  100. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  101. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  102. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  103. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  104. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  105. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  106. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  107. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  108. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  109. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  110. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  111. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  112. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  113. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  114. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  115. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  116. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  117. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  118. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  119. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  120. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  121. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  122. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  123. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  124. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  125. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  126. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  127. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  128. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  129. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  130. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  131. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  132. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  133. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  134. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  135. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  136. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  137. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  138. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  139. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  140. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  141. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  142. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  143. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  144. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  145. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  146. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  147. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  148. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  149. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  150. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  151. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  157. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  158. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  159. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  160. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  161. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  162. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  163. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  164. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  165. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  166. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  167. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  168. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  169. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  170. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  171. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  172. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  173. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  174. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  175. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  176. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  177. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  178. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  179. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  180. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  181. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  182. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  183. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  184. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  185. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  186. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  187. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  188. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  189. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  190. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  191. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  199. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  200. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  201. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  202. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  203. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  204. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  205. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  206. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  207. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  208. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  209. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  210. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  211. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  212. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  213. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  214. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  215. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  217. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  218. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  219. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  220. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  221. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  222. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  223. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  224. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  225. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  226. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  227. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  228. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  229. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  230. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  231. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  232. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  233. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  234. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  235. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  236. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  237. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  238. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  239. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  240. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  241. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  242. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  243. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  244. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  245. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  246. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  247. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  248. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  249. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  250. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  257. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  258. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  259. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  260. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  261. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  262. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  263. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  264. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  265. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  266. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  267. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  268. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  269. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  270. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  271. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  272. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  273. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  274. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  281. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  282. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  283. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  284. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  285. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  286. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  287. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  288. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  289. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  290. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  291. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  292. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  293. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  294. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  295. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  296. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  297. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  298. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  299. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  300. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  301. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  302. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  303. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  304. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  305. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  306. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  307. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  308. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  315. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  316. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  317. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  318. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  319. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  320. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  321. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  322. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  323. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  324. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  325. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  326. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  327. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  328. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  329. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  330. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  331. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  332. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  333. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  334. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  335. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  336. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  337. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  338. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  339. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  340. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  341. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  342. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  343. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  344. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  345. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  346. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  347. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  348. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  349. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  350. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  351. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  352. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  353. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  354. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  355. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  356. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  357. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  358. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  359. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  360. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  361. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  362. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  363. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  364. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  365. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  366. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  367. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  368. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  369. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  370. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  371. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  372. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  373. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  374. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  375. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  376. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  377. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  378. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  379. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  380. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  381. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  382. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  383. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  384. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  385. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  386. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  387. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  388. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  389. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  390. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  391. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  396. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  397. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  398. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  399. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  400. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  401. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  402. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  403. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  404. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  405. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  406. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  407. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  408. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  409. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  410. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  411. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  412. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  414. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  415. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  416. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  417. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  418. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  419. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  420. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  421. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  422. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  423. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  424. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  425. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  426. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  427. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  428. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  429. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  430. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  431. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  432. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  433. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  434. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  435. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  436. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  437. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  438. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  439. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  440. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  442. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  443. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  444. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  445. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  446. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  447. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  448. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  449. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  450. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  451. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  452. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  453. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  454. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  455. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  456. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  457. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  458. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  459. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  460. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  461. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  468. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  469. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  470. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  471. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  472. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  473. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  474. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  475. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  476. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  477. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  478. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  479. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  480. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  481. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  482. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  483. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  484. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  485. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  486. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  487. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  488. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  489. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  490. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  491. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  492. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  493. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  494. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  495. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  496. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  497. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  498. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  499. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  500. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  501. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  502. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  513. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  514. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  515. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  516. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  517. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  518. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  519. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  520. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  521. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  522. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  523. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  524. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  525. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  526. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  527. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  528. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  529. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  530. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  531. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  532. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  533. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  534. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  535. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  536. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  537. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  538. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  539. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  540. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  541. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  542. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  543. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  544. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  545. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  546. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  547. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  548. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  549. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  550. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  551. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  552. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  553. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  554. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  555. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  556. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  557. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  558. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  559. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  560. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  561. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  562. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  563. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  564. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  565. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  566. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  567. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  568. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  569. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  570. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  571. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  572. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  573. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  574. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  575. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  576. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  577. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  578. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  579. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  580. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  581. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  582. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  583. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  584. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  585. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  586. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  587. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  588. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  589. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  590. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  591. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  592. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  593. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  594. package/dist/core/code/engine/core/logger.js +339 -0
  595. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  596. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  597. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  598. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  599. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  600. package/dist/core/code/engine/lib/utils.js +121 -0
  601. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  602. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  603. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  604. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  605. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  606. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  607. package/dist/core/code/engine/storage/branch-index.js +72 -0
  608. package/dist/core/code/engine/storage/file-hash.js +95 -0
  609. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  610. package/dist/core/code/engine/storage/git.js +555 -0
  611. package/dist/core/code/engine/storage/index-lock.js +664 -0
  612. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  613. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  614. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  615. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  616. package/dist/core/code/engine/types/pipeline.js +2 -0
  617. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  618. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  619. package/dist/core/code/shared/graph/types.js +8 -0
  620. package/dist/core/code/shared/index.js +105 -0
  621. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  622. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  623. package/dist/core/code/shared/integrations/retry.js +70 -0
  624. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  625. package/dist/core/code/shared/language-detection.js +162 -0
  626. package/dist/core/code/shared/languages.js +27 -0
  627. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  628. package/dist/core/code/shared/mro-strategy.js +2 -0
  629. package/dist/core/code/shared/pipeline.js +5 -0
  630. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  631. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  632. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  633. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  634. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  635. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  636. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  637. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  638. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  639. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  640. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  641. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  642. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  643. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  644. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  645. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  646. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  647. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  648. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  649. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  650. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  651. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  652. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  653. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  654. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  655. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  656. package/dist/core/code/shared/test-helpers.js +17 -0
  657. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  658. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  659. package/dist/core/timeline/cli.d.ts.map +1 -1
  660. package/dist/core/timeline/cli.js +13 -6
  661. package/dist/core/timeline/cli.js.map +1 -1
  662. package/dist/core/timeline/debris.d.ts +20 -0
  663. package/dist/core/timeline/debris.d.ts.map +1 -0
  664. package/dist/core/timeline/debris.js +124 -0
  665. package/dist/core/timeline/debris.js.map +1 -0
  666. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  667. package/dist/core/timeline/hook-runner.js +3 -1
  668. package/dist/core/timeline/hook-runner.js.map +1 -1
  669. package/dist/core/timeline/hooks.d.ts.map +1 -1
  670. package/dist/core/timeline/hooks.js +13 -5
  671. package/dist/core/timeline/hooks.js.map +1 -1
  672. package/dist/core/timeline/installer.d.ts +2 -0
  673. package/dist/core/timeline/installer.d.ts.map +1 -1
  674. package/dist/core/timeline/installer.js +12 -0
  675. package/dist/core/timeline/installer.js.map +1 -1
  676. package/dist/core/timeline/project-root.d.ts +21 -0
  677. package/dist/core/timeline/project-root.d.ts.map +1 -0
  678. package/dist/core/timeline/project-root.js +83 -0
  679. package/dist/core/timeline/project-root.js.map +1 -0
  680. package/package.json +1 -1
@@ -0,0 +1,813 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KOTLIN_FUNCTION_TYPES = void 0;
4
+ exports.createKotlinCfgVisitor = createKotlinCfgVisitor;
5
+ const cfg_builder_js_1 = require("../cfg-builder.js");
6
+ const control_flow_context_js_1 = require("../control-flow-context.js");
7
+ const kotlin_harvest_js_1 = require("./kotlin-harvest.js");
8
+ /** Kotlin node types that own a CFG-bearing function body. */
9
+ const KOTLIN_FUNCTION_TYPES = new Set([
10
+ 'function_declaration',
11
+ 'anonymous_function',
12
+ 'lambda_literal',
13
+ ]);
14
+ exports.KOTLIN_FUNCTION_TYPES = KOTLIN_FUNCTION_TYPES;
15
+ /** Statement node types that break a basic block (everything else coalesces). */
16
+ const CONTROL_FLOW_TYPES = new Set([
17
+ 'if_expression',
18
+ 'when_expression',
19
+ 'for_statement',
20
+ 'while_statement',
21
+ 'do_while_statement',
22
+ 'try_expression',
23
+ 'jump_expression',
24
+ 'label',
25
+ ]);
26
+ /** Comment / non-code node types tree-sitter-kotlin surfaces (NOT `comment`). */
27
+ const COMMENT_TYPES = new Set(['line_comment', 'multiline_comment', 'shebang_line']);
28
+ const startLineOf = (n) => n.startPosition.row + 1;
29
+ const endLineOf = (n) => n.endPosition.row + 1;
30
+ const isComment = (n) => COMMENT_TYPES.has(n.type);
31
+ /**
32
+ * Per-function Kotlin walk state. One instance per function so the
33
+ * {@link ControlFlowContext}, exception-handler stack, and labeled-frame
34
+ * bookkeeping are scoped to that function and never leak across functions.
35
+ */
36
+ class KotlinCfgWalk {
37
+ builder;
38
+ harvest;
39
+ cfc = new control_flow_context_js_1.ControlFlowContext();
40
+ /** Stack of exception-handler entry blocks (catch/finally) a `throw` jumps to. */
41
+ handlers = [];
42
+ /** Label(s) pending attachment to the NEXT pushed loop frame. */
43
+ pendingLabels = [];
44
+ constructor(builder, harvest) {
45
+ this.builder = builder;
46
+ this.harvest = harvest;
47
+ }
48
+ /** Named statements of a `statements` node, ignoring comments. */
49
+ statementsOf(block) {
50
+ return block.namedChildren.filter((c) => !isComment(c));
51
+ }
52
+ /**
53
+ * Unwrap a `control_structure_body`: a `{ statements }` block yields its
54
+ * `statements` node; a bare single statement (`if (c) a()`) yields itself.
55
+ */
56
+ bodyOf(csb) {
57
+ if (!csb)
58
+ return undefined;
59
+ if (csb.type === 'control_structure_body') {
60
+ const stmts = csb.namedChildren.find((c) => c.type === 'statements');
61
+ if (stmts)
62
+ return stmts;
63
+ const single = csb.namedChildren.find((c) => !isComment(c));
64
+ return single;
65
+ }
66
+ return csb;
67
+ }
68
+ /** Visit a `control_structure_body` (block or single statement). */
69
+ visitBody(csb) {
70
+ return this.builder.withNesting(() => {
71
+ const inner = this.bodyOf(csb);
72
+ if (!inner)
73
+ return null;
74
+ if (inner.type === 'statements')
75
+ return this.visitSeq(this.statementsOf(inner));
76
+ return this.visitStmt(inner);
77
+ });
78
+ }
79
+ /** Wire a sequence of statements, coalescing straight-line runs into blocks. */
80
+ visitSeq(stmts) {
81
+ return this.builder.withNesting(() => {
82
+ let entry;
83
+ let dangling = [];
84
+ let openSimple;
85
+ for (const stmt of stmts) {
86
+ if (this.isControlFlow(stmt)) {
87
+ openSimple = undefined; // close any open straight-line block
88
+ const res = this.visitStmt(stmt);
89
+ if (res === null)
90
+ continue; // transparent (empty nested block / label-only)
91
+ if (entry === undefined)
92
+ entry = res.entry;
93
+ else
94
+ this.builder.connect(dangling, res.entry, 'seq');
95
+ dangling = [...res.exits];
96
+ }
97
+ else {
98
+ if (openSimple === undefined) {
99
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
100
+ if (entry === undefined)
101
+ entry = idx;
102
+ else
103
+ this.builder.connect(dangling, idx, 'seq');
104
+ openSimple = idx;
105
+ dangling = [idx];
106
+ }
107
+ else {
108
+ this.builder.extendBlock(openSimple, endLineOf(stmt), stmt.text, this.harvest.facts(stmt));
109
+ }
110
+ }
111
+ }
112
+ if (entry === undefined)
113
+ return null;
114
+ return { entry, exits: dangling };
115
+ });
116
+ }
117
+ /**
118
+ * Whether a statement breaks the current straight-line block. `if` / `when` /
119
+ * `try` are EXPRESSIONS in Kotlin — they break a block when used as a STATEMENT
120
+ * (a direct child of a `statements` list), OR when they are the value of a
121
+ * `val/var x = <branch>` binding or an `x = <branch>` assignment (#2205) —
122
+ * `visitStmt`'s `property_declaration` / `assignment` case then models the arms
123
+ * as control flow. A call argument value position still coalesces (a remaining
124
+ * gap — the branch is nested in a call, harder to bind).
125
+ */
126
+ isControlFlow(stmt) {
127
+ if (stmt.type === 'label')
128
+ return true; // queue label, emit no block
129
+ if (stmt.type === 'property_declaration') {
130
+ const v = this.directValue(stmt);
131
+ return v !== undefined && this.isModelableValueBranch(v);
132
+ }
133
+ if (stmt.type === 'assignment')
134
+ return this.assignmentBranch(stmt) !== undefined;
135
+ if (!CONTROL_FLOW_TYPES.has(stmt.type))
136
+ return false;
137
+ if (this.isExpressionConstruct(stmt.type))
138
+ return this.isStatementPosition(stmt);
139
+ return true;
140
+ }
141
+ isExpressionConstruct(type) {
142
+ return type === 'if_expression' || type === 'when_expression' || type === 'try_expression';
143
+ }
144
+ /**
145
+ * Whether an expression-construct (`if`/`when`/`try`) is in STATEMENT position
146
+ * (a direct `statements` child, or a `control_structure_body` that is itself a
147
+ * bare statement) vs an expression VALUE (nested under a declaration / jump /
148
+ * assignment / argument). Statement-position constructs are modeled as
149
+ * dispatch/branch; value-position ones stay inline.
150
+ */
151
+ isStatementPosition(node) {
152
+ const p = node.parent;
153
+ if (!p)
154
+ return false;
155
+ return p.type === 'statements' || p.type === 'control_structure_body';
156
+ }
157
+ /** Dispatch one statement to its handler. Non-null except for empty / label-only. */
158
+ visitStmt(stmt) {
159
+ if (stmt.type === 'label') {
160
+ // A label preceding its loop — queue it; the loop construct picks it up.
161
+ const name = this.labelName(stmt);
162
+ if (name !== undefined)
163
+ this.pendingLabels = [...this.pendingLabels, name];
164
+ return null; // emits no block of its own
165
+ }
166
+ switch (stmt.type) {
167
+ case 'if_expression':
168
+ return this.isStatementPosition(stmt) ? this.visitIf(stmt) : this.visitSimple(stmt);
169
+ case 'when_expression':
170
+ return this.isStatementPosition(stmt) ? this.visitWhen(stmt) : this.visitSimple(stmt);
171
+ case 'try_expression':
172
+ return this.isStatementPosition(stmt) ? this.visitTry(stmt) : this.visitSimple(stmt);
173
+ case 'for_statement':
174
+ return this.visitFor(stmt);
175
+ case 'while_statement':
176
+ return this.visitWhile(stmt);
177
+ case 'do_while_statement':
178
+ return this.visitDoWhile(stmt);
179
+ case 'jump_expression':
180
+ return this.visitJump(stmt);
181
+ case 'property_declaration': {
182
+ // `val x = when (k) { … }` / `val x = if (c) a else b` (#2205): the value
183
+ // is a value-position branch — model it as control flow and bind the
184
+ // result on the rejoin, instead of collapsing the whole decl to one block.
185
+ const value = this.directValue(stmt);
186
+ if (value && this.isModelableValueBranch(value))
187
+ return this.visitBindBranch(stmt, value);
188
+ return this.visitSimple(stmt);
189
+ }
190
+ case 'assignment': {
191
+ // `x = when (k) { … }` / `x = if (c) a else b` / `x = try { … }` (#2205):
192
+ // model the RHS branch as control flow and bind the target on the rejoin.
193
+ const branch = this.assignmentBranch(stmt);
194
+ if (branch)
195
+ return this.visitBindAssign(stmt, branch);
196
+ return this.visitSimple(stmt);
197
+ }
198
+ default:
199
+ return this.visitSimple(stmt);
200
+ }
201
+ }
202
+ visitSimple(stmt) {
203
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
204
+ return { entry: idx, exits: [idx] };
205
+ }
206
+ // ── jump expressions (return / throw / break / continue) ──────────────────
207
+ /** The leading anonymous keyword of a `jump_expression` decides its kind. */
208
+ jumpKeyword(stmt) {
209
+ const first = stmt.child(0);
210
+ return first?.text ?? '';
211
+ }
212
+ visitJump(stmt) {
213
+ const kw = this.jumpKeyword(stmt);
214
+ if (kw === 'return' || kw === 'return@')
215
+ return this.visitReturn(stmt);
216
+ if (kw === 'throw')
217
+ return this.visitThrow(stmt);
218
+ if (kw === 'break' || kw === 'break@')
219
+ return this.visitBreak(stmt);
220
+ if (kw === 'continue' || kw === 'continue@')
221
+ return this.visitContinue(stmt);
222
+ // Unknown jump — straight through (defensive; the grammar emits only the above).
223
+ return this.visitSimple(stmt);
224
+ }
225
+ /** `return [expr]` / `return@label` — threads through every active finalizer. */
226
+ visitReturn(stmt) {
227
+ // `return when (k) { … }` / `return if (c) a else b` / `return try { … }`
228
+ // (#2205): the returned value is a value-position branch — model it as control
229
+ // flow, with each arm returning (its value IS the function result), threading
230
+ // finalizers per arm.
231
+ const branch = stmt.namedChildren.find((c) => c.type === 'when_expression' || c.type === 'if_expression' || c.type === 'try_expression');
232
+ if (branch && this.isModelableValueBranch(branch)) {
233
+ const res = this.visitBranchExpr(branch);
234
+ const finalizers = this.cfc.finalizersForReturn();
235
+ for (const ex of res.exits) {
236
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, ex, finalizers, this.builder.exitIndex, 'return');
237
+ }
238
+ return { entry: res.entry, exits: [] };
239
+ }
240
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
241
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, idx, this.cfc.finalizersForReturn(), this.builder.exitIndex, 'return');
242
+ return { entry: idx, exits: [] };
243
+ }
244
+ /** `throw e` — routes to the nearest enclosing handler (catch/finally), else EXIT. */
245
+ visitThrow(stmt) {
246
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
247
+ this.builder.edge(idx, this.currentHandler(), 'throw');
248
+ return { entry: idx, exits: [] };
249
+ }
250
+ visitBreak(stmt) {
251
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text);
252
+ const label = this.jumpLabel(stmt);
253
+ const res = this.cfc.resolveBreak(label);
254
+ const { target, finalizers } = res ?? {
255
+ target: this.builder.exitIndex,
256
+ finalizers: this.cfc.finalizersForReturn(),
257
+ };
258
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, idx, finalizers, target, 'break');
259
+ return { entry: idx, exits: [] };
260
+ }
261
+ visitContinue(stmt) {
262
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text);
263
+ const label = this.jumpLabel(stmt);
264
+ const res = this.cfc.resolveContinue(label);
265
+ const { target, finalizers } = res ?? {
266
+ target: this.builder.exitIndex,
267
+ finalizers: this.cfc.finalizersForReturn(),
268
+ };
269
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, idx, finalizers, target, 'continue');
270
+ return { entry: idx, exits: [] };
271
+ }
272
+ /** The target `label` of a `break@outer` / `continue@outer` / `return@x`, if any. */
273
+ jumpLabel(stmt) {
274
+ const label = stmt.namedChildren.find((c) => c.type === 'label');
275
+ return label ? this.stripLabel(label.text) : undefined;
276
+ }
277
+ /** The name of a `label` sibling (`outer@` ⇒ `outer`; jump target `outer` ⇒ `outer`). */
278
+ labelName(label) {
279
+ const id = label.namedChildren.find((c) => c.type === 'simple_identifier');
280
+ if (id?.text)
281
+ return this.stripLabel(id.text);
282
+ return this.stripLabel(label.text) || undefined;
283
+ }
284
+ stripLabel(text) {
285
+ return text.replace(/@$/, '').replace(/^@/, '').trim();
286
+ }
287
+ /** Take and clear the labels queued by a preceding `label` sibling. */
288
+ takeLabels() {
289
+ const labels = this.pendingLabels;
290
+ this.pendingLabels = [];
291
+ return labels;
292
+ }
293
+ // ── branches ──────────────────────────────────────────────────────────────
294
+ /**
295
+ * The direct value expression of a `= VALUE` carrier (`property_declaration`,
296
+ * a `function_body` expression body): the first named child after the `=`
297
+ * token. Returns the DIRECT value only — `val x = f(when …)` yields the call,
298
+ * not the nested `when`, so an argument-position branch is left inline (#2205).
299
+ */
300
+ directValue(stmt) {
301
+ let sawEq = false;
302
+ for (let i = 0; i < stmt.childCount; i++) {
303
+ const c = stmt.child(i);
304
+ if (!c)
305
+ continue;
306
+ if (c.type === '=') {
307
+ sawEq = true;
308
+ continue;
309
+ }
310
+ if (sawEq && c.isNamed && !isComment(c))
311
+ return c;
312
+ }
313
+ return undefined;
314
+ }
315
+ /**
316
+ * Whether `node` is a value-position branch worth modeling as control flow
317
+ * (#2205): a `when` with ≥2 arms, or an `if` that has an `else` (a value-position
318
+ * `if` always does). A single-arm `when` / else-less `if` carries no real
319
+ * control dependence, so it stays an inline {@link visitSimple} block.
320
+ */
321
+ isModelableValueBranch(node) {
322
+ if (node.type === 'when_expression') {
323
+ return node.namedChildren.filter((c) => c.type === 'when_entry').length >= 2;
324
+ }
325
+ if (node.type === 'if_expression')
326
+ return this.elseNodeOf(node) !== undefined;
327
+ // `val x = try { … } catch { … }` / `try { … } finally { … }` (#2205): a
328
+ // value-position `try` with a `catch` OR a `finally` is a real branch — its
329
+ // value is the body's value, a catch's value, or the body's value threaded
330
+ // through a finalizer — so model it as control flow.
331
+ if (node.type === 'try_expression') {
332
+ return node.namedChildren.some((c) => c.type === 'catch_block' || c.type === 'finally_block');
333
+ }
334
+ return false;
335
+ }
336
+ /**
337
+ * Model a value-position `when`/`if`/`try` as control flow regardless of its
338
+ * statement/value position — {@link visitStmt}'s `isStatementPosition` gate keeps
339
+ * value-position branches inline, so call the branch handlers directly here.
340
+ */
341
+ visitBranchExpr(node) {
342
+ if (node.type === 'when_expression')
343
+ return this.visitWhen(node);
344
+ if (node.type === 'try_expression')
345
+ return this.visitTry(node) ?? this.visitSimple(node);
346
+ return this.visitIf(node);
347
+ }
348
+ /**
349
+ * `val x = <branch>` (#2205): visit the branch as control flow, then rejoin its
350
+ * arms at a facts-only continuation carrying ONLY the bound name's def (the
351
+ * subject + arm-value uses are already harvested onto the branch's blocks). The
352
+ * arms are now control-dependent on the branch condition, and `x` is defined at
353
+ * the join — mirrors the Rust visitor's value-position `let` handling.
354
+ */
355
+ visitBindBranch(stmt, branch) {
356
+ const res = this.visitBranchExpr(branch);
357
+ const cont = this.builder.newBlock(startLineOf(stmt), startLineOf(stmt), '', 'normal', this.harvest.bindingDefFacts(stmt));
358
+ this.builder.connect(res.exits, cont, 'seq');
359
+ return { entry: res.entry, exits: [cont] };
360
+ }
361
+ /**
362
+ * The value-position branch on a plain `=` assignment RHS (`x = when (k) {…}` /
363
+ * `x = if (c) a else b` / `x = try {…}`, #2205), or undefined. Only a plain `=`
364
+ * (not a compound `+=`) with a modelable-branch RHS qualifies.
365
+ */
366
+ assignmentBranch(stmt) {
367
+ if (stmt.type !== 'assignment')
368
+ return undefined;
369
+ const eq = stmt.children.find((c) => !c.isNamed && c.text === '=');
370
+ if (!eq)
371
+ return undefined; // compound assignment (`+=` etc.) is not a carrier
372
+ const rhs = stmt.namedChildren.find((c) => c.type !== 'directly_assignable_expression' && !isComment(c));
373
+ return rhs && this.isModelableValueBranch(rhs) ? rhs : undefined;
374
+ }
375
+ /**
376
+ * `x = <branch>` (#2205): visit the RHS branch as control flow, then rejoin its
377
+ * arms at a facts-only continuation carrying ONLY the LHS target def (the branch
378
+ * subject + arm-value uses are already on the branch's blocks). The arms are now
379
+ * control-dependent on the branch — mirrors the Ruby value-branch assignment.
380
+ */
381
+ visitBindAssign(stmt, branch) {
382
+ const res = this.visitBranchExpr(branch);
383
+ const cont = this.builder.newBlock(startLineOf(stmt), startLineOf(stmt), '', 'normal', this.harvest.assignmentDefFacts(stmt));
384
+ this.builder.connect(res.exits, cont, 'seq');
385
+ return { entry: res.entry, exits: [cont] };
386
+ }
387
+ /**
388
+ * A `fun f() = EXPR` expression body (#2205). A value-position branch is modeled
389
+ * as control flow (each arm yields the returned function result); any other
390
+ * expression stays one block. The caller wires entry ← ENTRY and exits → EXIT
391
+ * with a `return` edge (the body's value is the function's result).
392
+ */
393
+ visitExprBody(expr) {
394
+ if (this.isModelableValueBranch(expr))
395
+ return this.visitBranchExpr(expr);
396
+ const blk = this.builder.newBlock(startLineOf(expr), endLineOf(expr), expr.text, 'normal', this.harvest.facts(expr));
397
+ return { entry: blk, exits: [blk] };
398
+ }
399
+ /**
400
+ * `if ( COND ) control_structure_body [ else (control_structure_body |
401
+ * if_expression) ]`. The else child after the `else` keyword is either the
402
+ * else body (`control_structure_body`) or a nested `if_expression` (`else if`).
403
+ */
404
+ visitIf(stmt) {
405
+ const cond = this.parenCondition(stmt);
406
+ const header = this.builder.newBlock(startLineOf(stmt), cond ? endLineOf(cond) : startLineOf(stmt), cond ? `if (${cond.text})` : 'if', 'normal', cond ? this.harvest.facts(cond) : undefined);
407
+ const bodies = stmt.namedChildren.filter((c) => c.type === 'control_structure_body');
408
+ const elseNode = this.elseNodeOf(stmt);
409
+ const exits = [];
410
+ const thenRes = this.visitBody(bodies[0]);
411
+ if (thenRes) {
412
+ this.builder.edge(header, thenRes.entry, 'cond-true');
413
+ exits.push(...thenRes.exits);
414
+ }
415
+ else {
416
+ exits.push(header); // empty then — true path falls through
417
+ }
418
+ if (elseNode) {
419
+ const elseRes = this.visitBody(elseNode);
420
+ if (elseRes) {
421
+ this.builder.edge(header, elseRes.entry, 'cond-false');
422
+ exits.push(...elseRes.exits);
423
+ }
424
+ else {
425
+ exits.push(header);
426
+ }
427
+ }
428
+ else {
429
+ exits.push(header); // no else — false path falls through to the join
430
+ }
431
+ return { entry: header, exits: [...new Set(exits)] };
432
+ }
433
+ /**
434
+ * The node after the `else` keyword: a nested `if_expression` (`else if`) or the
435
+ * else-body `control_structure_body`.
436
+ */
437
+ elseNodeOf(stmt) {
438
+ let sawElse = false;
439
+ for (let i = 0; i < stmt.childCount; i++) {
440
+ const c = stmt.child(i);
441
+ if (!c)
442
+ continue;
443
+ if (sawElse && c.isNamed)
444
+ return c;
445
+ if (c.type === 'else')
446
+ sawElse = true;
447
+ }
448
+ return undefined;
449
+ }
450
+ /** The condition expression of an `if`/`while` (the named child between `(` and `)`). */
451
+ parenCondition(stmt) {
452
+ let sawOpen = false;
453
+ for (let i = 0; i < stmt.childCount; i++) {
454
+ const c = stmt.child(i);
455
+ if (!c)
456
+ continue;
457
+ if (c.type === '(') {
458
+ sawOpen = true;
459
+ continue;
460
+ }
461
+ if (c.type === ')')
462
+ return undefined;
463
+ if (sawOpen && c.isNamed && !isComment(c))
464
+ return c;
465
+ }
466
+ return undefined;
467
+ }
468
+ // ── when (no fallthrough) ──────────────────────────────────────────────────
469
+ /**
470
+ * `when when_subject? { when_entry* }`. Arms do NOT fall through — each
471
+ * `when_entry` body rejoins after the `when`. The subject (and each entry's
472
+ * `when_condition` tests) evaluate before the body; their uses are harvested
473
+ * onto the dispatch block (a later entry's test runs only when earlier ones
474
+ * didn't match, so any binding there is a may-def).
475
+ */
476
+ visitWhen(stmt) {
477
+ const labels = this.takeLabels();
478
+ const subject = stmt.namedChildren.find((c) => c.type === 'when_subject');
479
+ const dispatch = this.builder.newBlock(startLineOf(stmt), subject ? endLineOf(subject) : startLineOf(stmt), subject ? `when ${subject.text}` : 'when', 'normal', subject ? this.harvest.whenSubjectFacts(subject) : undefined);
480
+ const whenExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
481
+ this.cfc.pushSwitch(whenExit, labels);
482
+ const entries = stmt.namedChildren.filter((c) => c.type === 'when_entry');
483
+ // Each entry's case tests evaluate conditionally before its body.
484
+ for (const entry of entries) {
485
+ for (const test of this.entryConditions(entry)) {
486
+ this.builder.attachFacts(dispatch, this.harvest.factsConditional(test));
487
+ }
488
+ }
489
+ const entryResults = entries.map((e) => this.visitBody(this.entryBody(e)));
490
+ const hasElse = entries.some((e) => this.entryIsElse(e));
491
+ for (const res of entryResults) {
492
+ // An EMPTY-body arm still dispatches — it falls straight to the join. Wiring
493
+ // it (rather than skipping) keeps the dispatch from ending up with ZERO
494
+ // successors, which would orphan whenExit and break EXIT reverse-reachability
495
+ // (so the whole function's CDG gets dropped). The canonical trigger is an
496
+ // all-empty `when` with an `else` arm — `when(k){0->{};else->{}}` — where the
497
+ // no-match edge below is suppressed. The builder dedups, so this coexists
498
+ // with the no-match edge.
499
+ this.builder.edge(dispatch, res ? res.entry : whenExit, 'switch-case');
500
+ }
501
+ // A `when` with no `else` (statement position) may match no arm — the no-match
502
+ // path falls straight to the join.
503
+ if (!hasElse)
504
+ this.builder.edge(dispatch, whenExit, 'switch-case');
505
+ const exits = [whenExit];
506
+ // Each non-empty arm rejoins after the when (no fallthrough); an empty arm's
507
+ // dispatch edge already targets whenExit above.
508
+ for (const res of entryResults) {
509
+ if (!res)
510
+ continue;
511
+ this.builder.connect(res.exits, whenExit, 'seq');
512
+ }
513
+ this.cfc.pop();
514
+ return { entry: dispatch, exits };
515
+ }
516
+ /** The `when_condition` test(s) of a `when_entry` (empty for an `else` arm). */
517
+ entryConditions(entry) {
518
+ return entry.namedChildren.filter((c) => c.type === 'when_condition');
519
+ }
520
+ /** The body `control_structure_body` of a `when_entry`. */
521
+ entryBody(entry) {
522
+ return entry.namedChildren.find((c) => c.type === 'control_structure_body');
523
+ }
524
+ /** An `else ->` arm has an `else` keyword child and no `when_condition`. */
525
+ entryIsElse(entry) {
526
+ return entry.children.some((c) => c.type === 'else');
527
+ }
528
+ // ── loops ───────────────────────────────────────────────────────────────
529
+ /** `for ( PAT in COLLECTION ) control_structure_body`. */
530
+ visitFor(stmt) {
531
+ const labels = this.takeLabels();
532
+ const collection = this.forCollection(stmt);
533
+ const header = this.builder.newBlock(startLineOf(stmt), collection ? endLineOf(collection) : startLineOf(stmt), this.forHeaderText(stmt), 'normal', this.harvest.forHeadFacts(stmt));
534
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
535
+ this.cfc.pushLoop(header, loopExit, labels);
536
+ const body = this.visitBody(this.loopBody(stmt));
537
+ this.cfc.pop();
538
+ if (body) {
539
+ this.builder.edge(header, body.entry, 'cond-true');
540
+ this.builder.connect(body.exits, header, 'loop-back');
541
+ }
542
+ else {
543
+ this.builder.edge(header, header, 'loop-back'); // empty body re-iterates
544
+ }
545
+ this.builder.edge(header, loopExit, 'cond-false');
546
+ return { entry: header, exits: [loopExit] };
547
+ }
548
+ /** The iterated collection of a `for` — the named child after `in` before `)`. */
549
+ forCollection(stmt) {
550
+ let sawIn = false;
551
+ for (let i = 0; i < stmt.childCount; i++) {
552
+ const c = stmt.child(i);
553
+ if (!c)
554
+ continue;
555
+ if (c.type === 'in') {
556
+ sawIn = true;
557
+ continue;
558
+ }
559
+ if (c.type === ')')
560
+ return undefined;
561
+ if (sawIn && c.isNamed && !isComment(c))
562
+ return c;
563
+ }
564
+ return undefined;
565
+ }
566
+ forHeaderText(stmt) {
567
+ const pat = stmt.namedChildren.find((c) => c.type === 'variable_declaration' || c.type === 'multi_variable_declaration');
568
+ const collection = this.forCollection(stmt);
569
+ const p = pat?.text ?? '';
570
+ const col = collection?.text ?? '';
571
+ return p || col ? `for (${p} in ${col})` : 'for';
572
+ }
573
+ /** The loop body `control_structure_body` (the LAST one — for/while/do). */
574
+ loopBody(stmt) {
575
+ const all = stmt.namedChildren.filter((c) => c.type === 'control_structure_body');
576
+ return all.length ? all[all.length - 1] : undefined;
577
+ }
578
+ /** `while ( COND ) control_structure_body`. */
579
+ visitWhile(stmt) {
580
+ const labels = this.takeLabels();
581
+ const cond = this.parenCondition(stmt);
582
+ const header = this.builder.newBlock(startLineOf(stmt), cond ? endLineOf(cond) : startLineOf(stmt), cond ? `while (${cond.text})` : 'while', 'normal', cond ? this.harvest.facts(cond) : undefined);
583
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
584
+ this.cfc.pushLoop(header, loopExit, labels);
585
+ const body = this.visitBody(this.loopBody(stmt));
586
+ this.cfc.pop();
587
+ if (body) {
588
+ this.builder.edge(header, body.entry, 'cond-true');
589
+ this.builder.connect(body.exits, header, 'loop-back');
590
+ }
591
+ else {
592
+ this.builder.edge(header, header, 'loop-back'); // empty body re-tests
593
+ }
594
+ // Structural exit edge — even `while (true) {}` keeps EXIT reverse-reachable.
595
+ this.builder.edge(header, loopExit, 'cond-false');
596
+ return { entry: header, exits: [loopExit] };
597
+ }
598
+ /**
599
+ * `do control_structure_body while ( COND )` — BOTTOM-TEST: the body runs at
600
+ * least once, THEN the condition decides whether to loop back.
601
+ */
602
+ visitDoWhile(stmt) {
603
+ const labels = this.takeLabels();
604
+ const cond = this.doWhileCondition(stmt);
605
+ const condBlock = this.builder.newBlock(cond ? startLineOf(cond) : endLineOf(stmt), cond ? endLineOf(cond) : endLineOf(stmt), cond ? `while (${cond.text})` : 'while', 'normal', cond ? this.harvest.facts(cond) : undefined);
606
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
607
+ // `continue` re-tests the condition; `break` leaves the loop.
608
+ this.cfc.pushLoop(condBlock, loopExit, labels);
609
+ const body = this.visitBody(this.loopBody(stmt));
610
+ this.cfc.pop();
611
+ const backTarget = body ? body.entry : condBlock;
612
+ if (body)
613
+ this.builder.connect(body.exits, condBlock, 'seq');
614
+ this.builder.edge(condBlock, backTarget, 'loop-back'); // cond true → run body again
615
+ // Structural exit edge — even `do {} while (true)` keeps EXIT reachable.
616
+ this.builder.edge(condBlock, loopExit, 'cond-false');
617
+ return { entry: backTarget, exits: [loopExit] };
618
+ }
619
+ /** The condition of a `do … while ( COND )` — the named child after the trailing `while`. */
620
+ doWhileCondition(stmt) {
621
+ let sawWhile = false;
622
+ for (let i = 0; i < stmt.childCount; i++) {
623
+ const c = stmt.child(i);
624
+ if (!c)
625
+ continue;
626
+ if (c.type === 'while') {
627
+ sawWhile = true;
628
+ continue;
629
+ }
630
+ if (sawWhile && c.type === ')')
631
+ return undefined;
632
+ if (sawWhile && c.isNamed && !isComment(c))
633
+ return c;
634
+ }
635
+ return undefined;
636
+ }
637
+ // ── try / catch / finally ──────────────────────────────────────────────────
638
+ /**
639
+ * `try { statements } catch_block* finally_block?`. The `finally` runs on BOTH
640
+ * normal and exception exit (finally semantics) — a `return`/`break`/`continue`
641
+ * crossing it threads through and gets a `finally-*` completion edge. Mirrors
642
+ * the Java `visitTry`.
643
+ */
644
+ visitTry(stmt) {
645
+ const bodyNode = stmt.namedChildren.find((c) => c.type === 'statements');
646
+ const catchBlocks = stmt.namedChildren.filter((c) => c.type === 'catch_block');
647
+ const finallyBlock = stmt.namedChildren.find((c) => c.type === 'finally_block');
648
+ const finallyBody = finallyBlock?.namedChildren.find((c) => c.type === 'statements');
649
+ // The explicit finally is a finalizer the whole protected region threads through.
650
+ const finallyRes = finallyBody ? this.visitSeq(this.statementsOf(finallyBody)) : null;
651
+ const finallyFrame = finallyRes ? this.cfc.pushFinalizer(finallyRes.entry) : null;
652
+ const finalizerEntry = finallyRes?.entry;
653
+ const finalizerExits = finallyRes?.exits ?? null;
654
+ // Build each catch handler.
655
+ const catchEntries = [];
656
+ const catchExits = [];
657
+ let firstCatchEntry;
658
+ for (const clause of catchBlocks) {
659
+ const clauseBody = clause.namedChildren.find((c) => c.type === 'statements');
660
+ if (finalizerEntry !== undefined)
661
+ this.handlers.push(finalizerEntry);
662
+ let res = clauseBody ? this.visitSeq(this.statementsOf(clauseBody)) : null;
663
+ if (finalizerEntry !== undefined)
664
+ this.handlers.pop();
665
+ if (res === null) {
666
+ // Empty `catch {}` still catches — synthesize one block so exception flow
667
+ // lands somewhere and post-try code stays reachable.
668
+ const idx = this.builder.newBlock(startLineOf(clause), endLineOf(clause), '');
669
+ res = { entry: idx, exits: [idx] };
670
+ }
671
+ const paramFacts = this.harvest.catchParamFacts(clause);
672
+ if (paramFacts) {
673
+ const paramBlock = this.builder.newBlock(startLineOf(clause), startLineOf(clause), '', 'normal', paramFacts);
674
+ this.builder.edge(paramBlock, res.entry, 'seq');
675
+ res = { entry: paramBlock, exits: res.exits };
676
+ }
677
+ catchEntries.push(res.entry);
678
+ catchExits.push(...res.exits);
679
+ if (firstCatchEntry === undefined)
680
+ firstCatchEntry = res.entry;
681
+ }
682
+ // Handler for the try body: first catch if present, else the finally, else outer.
683
+ const tryHandler = firstCatchEntry ?? finalizerEntry ?? this.currentHandler();
684
+ const protectedStart = this.builder.blockCount;
685
+ this.handlers.push(tryHandler);
686
+ let bodyRes = bodyNode ? this.visitSeq(this.statementsOf(bodyNode)) : null;
687
+ this.handlers.pop();
688
+ if (bodyRes === null && (catchBlocks.length > 0 || finalizerEntry !== undefined)) {
689
+ // An empty `try {}` body still establishes a protected region. Synthesize
690
+ // one block (like the empty-`catch` case above) so the throw-edge loop
691
+ // wires the catch handler(s) and the try's entry is the body — otherwise
692
+ // the catch handler block + its error binding are orphaned (unreachable
693
+ // from ENTRY) and control routes straight to the finally, bypassing catch.
694
+ const idx = this.builder.newBlock(startLineOf(stmt), startLineOf(stmt), '');
695
+ bodyRes = { entry: idx, exits: [idx] };
696
+ }
697
+ if (catchBlocks.length > 0 || finalizerEntry !== undefined) {
698
+ for (let b = protectedStart; b < this.builder.blockCount; b++) {
699
+ this.builder.edge(b, tryHandler, 'throw');
700
+ }
701
+ }
702
+ // Pop the finalizer frame and drain its pending completion legs.
703
+ if (finallyFrame && finallyRes) {
704
+ this.cfc.pop();
705
+ (0, control_flow_context_js_1.drainFinalizerPending)(this.builder, finallyFrame, finallyRes.exits);
706
+ }
707
+ const exits = [];
708
+ if (finalizerEntry !== undefined) {
709
+ if (bodyRes)
710
+ this.builder.connect(bodyRes.exits, finalizerEntry, 'seq');
711
+ for (const e of catchExits)
712
+ this.builder.edge(e, finalizerEntry, 'seq');
713
+ if (finalizerExits)
714
+ exits.push(...finalizerExits);
715
+ // No catch → an exception re-propagates out after the finally runs.
716
+ if (catchBlocks.length === 0 && finalizerExits) {
717
+ this.builder.connect(finalizerExits, this.currentHandler(), 'throw');
718
+ }
719
+ }
720
+ else {
721
+ if (bodyRes)
722
+ exits.push(...bodyRes.exits);
723
+ exits.push(...catchExits);
724
+ }
725
+ const entry = bodyRes?.entry ?? finalizerEntry ?? catchEntries[0];
726
+ if (entry === undefined)
727
+ return null;
728
+ return { entry, exits: [...new Set(exits)] };
729
+ }
730
+ /** Nearest enclosing exception handler, or the function EXIT. */
731
+ currentHandler() {
732
+ return this.handlers.length ? this.handlers[this.handlers.length - 1] : this.builder.exitIndex;
733
+ }
734
+ }
735
+ /** The function/lambda body `statements`, or an expression body, or undefined. */
736
+ function bodyStatementsOf(fnNode) {
737
+ if (fnNode.type === 'lambda_literal') {
738
+ return fnNode.namedChildren.find((c) => c.type === 'statements');
739
+ }
740
+ const fb = fnNode.namedChildren.find((c) => c.type === 'function_body');
741
+ if (!fb)
742
+ return undefined;
743
+ // `function_body` is `{ statements }` OR an expression body `= expr`.
744
+ const stmts = fb.namedChildren.find((c) => c.type === 'statements');
745
+ if (stmts)
746
+ return stmts;
747
+ // Expression body — return the body itself so the caller treats it as one block.
748
+ return fb;
749
+ }
750
+ /** Build the CFG for one Kotlin function node, or `undefined` if not modelable. */
751
+ function buildFunctionCfg(fnNode, filePath) {
752
+ try {
753
+ if (!KOTLIN_FUNCTION_TYPES.has(fnNode.type))
754
+ return undefined;
755
+ const startLine = startLineOf(fnNode);
756
+ const endLine = endLineOf(fnNode);
757
+ const startColumn = fnNode.startPosition.column;
758
+ // A `function_declaration` / `anonymous_function` needs a `function_body`; a
759
+ // `lambda_literal` carries its `statements` directly. Absence of a body
760
+ // container ⇒ an abstract / interface-member / signature-only declaration with
761
+ // nothing to model (return undefined).
762
+ const hasBody = fnNode.type === 'lambda_literal' ||
763
+ fnNode.namedChildren.some((c) => c.type === 'function_body');
764
+ if (!hasBody)
765
+ return undefined;
766
+ const body = bodyStatementsOf(fnNode);
767
+ const builder = new cfg_builder_js_1.CfgBuilder(filePath, startLine, endLine, startColumn);
768
+ const harvest = new kotlin_harvest_js_1.KotlinHarvester(fnNode);
769
+ const paramFacts = harvest.paramFacts();
770
+ if (paramFacts)
771
+ builder.attachFacts(builder.entryIndex, paramFacts);
772
+ // Expression body (`fun f() = expr` / a `function_body` that is `= expr`):
773
+ // the body's value is returned. A value-position branch (`= when (k) { … }`)
774
+ // is modeled as control flow so each arm is control-dependent on the
775
+ // condition (#2205); any other expression is one block.
776
+ if (body && body.type === 'function_body') {
777
+ const expr = body.namedChildren.find((c) => !isComment(c) && c.type !== 'statements');
778
+ if (expr) {
779
+ const res = new KotlinCfgWalk(builder, harvest).visitExprBody(expr);
780
+ builder.edge(builder.entryIndex, res.entry, 'seq');
781
+ builder.connect(res.exits, builder.exitIndex, 'return');
782
+ return builder.finish(harvest.bindingTable());
783
+ }
784
+ // `function_body` with neither statements nor an expression — empty.
785
+ builder.edge(builder.entryIndex, builder.exitIndex, 'seq');
786
+ return builder.finish(harvest.bindingTable());
787
+ }
788
+ const walk = new KotlinCfgWalk(builder, harvest);
789
+ const res = body ? walk.visitSeq(body.namedChildren.filter((c) => !isComment(c))) : null;
790
+ if (!res) {
791
+ builder.edge(builder.entryIndex, builder.exitIndex, 'seq'); // empty body
792
+ return builder.finish(harvest.bindingTable());
793
+ }
794
+ builder.edge(builder.entryIndex, res.entry, 'seq');
795
+ builder.connect(res.exits, builder.exitIndex, 'seq'); // normal fall-off → EXIT
796
+ return builder.finish(harvest.bindingTable());
797
+ }
798
+ catch (err) {
799
+ // Never throw out of buildFunctionCfg — a malformed AST shape must skip only
800
+ // this one function's CFG, never drop the whole file's language group (R4).
801
+ // eslint-disable-next-line no-console
802
+ console.warn(`[cfg] Kotlin buildFunctionCfg skipped a function in ${filePath}: ${String(err)}`);
803
+ return undefined;
804
+ }
805
+ }
806
+ /** Whether a node is a Kotlin function/lambda this visitor builds a CFG for. */
807
+ function isFunction(node) {
808
+ return KOTLIN_FUNCTION_TYPES.has(node.type);
809
+ }
810
+ /** The Kotlin CFG visitor. */
811
+ function createKotlinCfgVisitor() {
812
+ return { buildFunctionCfg, isFunction };
813
+ }