cgraphx 2.0.1 → 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 (701) hide show
  1. package/dist/.claude-template/FLOW-MAP.md +7 -5
  2. package/dist/.claude-template/commands/end.md +1 -1
  3. package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +2 -1
  4. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +4 -2
  5. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +5 -2
  6. package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
  7. package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
  8. package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
  9. package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
  10. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
  11. package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
  12. package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
  13. package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
  14. package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
  15. package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
  16. package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
  17. package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
  18. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  19. package/dist/core/code/engine/cli/analyze.js +1086 -0
  20. package/dist/core/code/engine/cli/cli-message.js +83 -0
  21. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  22. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  23. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  24. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  25. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  26. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  27. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  28. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  29. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  30. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  31. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  32. package/dist/core/code/engine/cli/status.js +156 -0
  33. package/dist/core/code/engine/cli/tool.js +384 -0
  34. package/dist/core/code/engine/config/ignore-service.js +511 -0
  35. package/dist/core/code/engine/config/supported-languages.js +17 -0
  36. package/dist/core/code/engine/core/analysis-features.js +64 -0
  37. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  38. package/dist/core/code/engine/core/git-staleness.js +180 -0
  39. package/dist/core/code/engine/core/graph/graph.js +180 -0
  40. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  41. package/dist/core/code/engine/core/graph/types.js +2 -0
  42. package/dist/core/code/engine/core/index-freshness.js +12 -0
  43. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  44. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  45. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  46. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  47. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  48. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  49. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  50. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  51. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  52. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  53. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  54. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  55. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  56. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  57. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  58. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  81. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  82. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  83. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  84. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  85. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  86. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  87. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  88. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  89. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  90. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  91. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  92. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  93. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  94. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  95. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  96. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  97. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  98. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  99. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  100. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  101. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  102. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  103. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  104. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  105. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  106. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  107. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  108. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  109. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  110. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  111. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  112. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  113. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  114. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  115. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  116. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  117. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  118. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  119. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  120. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  121. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  122. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  123. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  124. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  125. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  126. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  127. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  128. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  129. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  130. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  131. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  132. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  133. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  134. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  135. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  136. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  137. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  138. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  139. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  140. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  141. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  142. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  143. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  144. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  145. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  146. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  147. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  148. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  149. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  150. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  151. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  157. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  158. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  159. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  160. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  161. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  162. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  163. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  164. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  165. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  166. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  167. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  168. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  169. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  170. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  171. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  172. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  173. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  174. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  175. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  176. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  177. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  178. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  179. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  180. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  181. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  182. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  183. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  184. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  185. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  186. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  187. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  188. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  189. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  190. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  191. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  199. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  200. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  201. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  202. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  203. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  204. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  205. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  206. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  207. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  208. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  209. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  210. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  211. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  212. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  213. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  214. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  215. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  217. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  218. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  219. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  220. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  221. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  222. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  223. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  224. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  225. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  226. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  227. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  228. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  229. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  230. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  231. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  232. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  233. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  234. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  235. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  236. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  237. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  238. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  239. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  240. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  241. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  242. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  243. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  244. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  245. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  246. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  247. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  248. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  249. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  250. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  257. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  258. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  259. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  260. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  261. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  262. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  263. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  264. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  265. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  266. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  267. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  268. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  269. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  270. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  271. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  272. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  273. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  274. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  281. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  282. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  283. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  284. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  285. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  286. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  287. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  288. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  289. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  290. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  291. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  292. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  293. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  294. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  295. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  296. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  297. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  298. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  299. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  300. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  301. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  302. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  303. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  304. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  305. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  306. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  307. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  308. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  315. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  316. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  317. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  318. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  319. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  320. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  321. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  322. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  323. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  324. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  325. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  326. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  327. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  328. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  329. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  330. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  331. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  332. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  333. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  334. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  335. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  336. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  337. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  338. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  339. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  340. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  341. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  342. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  343. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  344. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  345. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  346. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  347. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  348. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  349. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  350. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  351. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  352. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  353. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  354. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  355. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  356. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  357. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  358. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  359. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  360. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  361. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  362. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  363. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  364. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  365. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  366. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  367. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  368. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  369. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  370. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  371. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  372. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  373. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  374. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  375. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  376. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  377. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  378. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  379. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  380. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  381. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  382. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  383. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  384. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  385. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  386. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  387. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  388. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  389. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  390. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  391. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  396. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  397. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  398. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  399. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  400. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  401. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  402. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  403. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  404. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  405. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  406. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  407. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  408. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  409. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  410. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  411. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  412. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  414. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  415. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  416. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  417. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  418. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  419. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  420. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  421. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  422. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  423. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  424. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  425. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  426. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  427. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  428. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  429. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  430. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  431. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  432. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  433. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  434. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  435. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  436. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  437. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  438. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  439. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  440. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  442. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  443. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  444. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  445. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  446. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  447. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  448. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  449. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  450. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  451. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  452. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  453. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  454. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  455. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  456. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  457. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  458. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  459. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  460. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  461. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  468. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  469. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  470. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  471. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  472. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  473. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  474. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  475. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  476. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  477. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  478. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  479. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  480. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  481. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  482. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  483. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  484. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  485. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  486. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  487. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  488. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  489. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  490. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  491. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  492. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  493. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  494. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  495. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  496. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  497. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  498. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  499. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  500. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  501. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  502. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  513. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  514. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  515. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  516. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  517. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  518. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  519. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  520. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  521. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  522. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  523. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  524. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  525. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  526. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  527. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  528. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  529. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  530. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  531. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  532. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  533. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  534. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  535. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  536. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  537. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  538. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  539. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  540. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  541. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  542. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  543. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  544. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  545. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  546. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  547. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  548. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  549. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  550. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  551. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  552. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  553. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  554. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  555. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  556. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  557. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  558. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  559. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  560. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  561. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  562. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  563. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  564. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  565. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  566. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  567. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  568. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  569. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  570. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  571. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  572. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  573. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  574. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  575. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  576. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  577. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  578. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  579. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  580. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  581. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  582. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  583. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  584. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  585. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  586. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  587. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  588. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  589. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  590. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  591. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  592. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  593. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  594. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  595. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  596. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  597. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  598. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  599. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  600. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  601. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  602. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  603. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  604. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  605. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  606. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  607. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  608. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  609. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  610. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  611. package/dist/core/code/engine/core/logger.js +339 -0
  612. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  613. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  614. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  615. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  616. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  617. package/dist/core/code/engine/lib/utils.js +121 -0
  618. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  619. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  620. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  621. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  622. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  623. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  624. package/dist/core/code/engine/storage/branch-index.js +72 -0
  625. package/dist/core/code/engine/storage/file-hash.js +95 -0
  626. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  627. package/dist/core/code/engine/storage/git.js +555 -0
  628. package/dist/core/code/engine/storage/index-lock.js +664 -0
  629. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  630. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  631. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  632. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  633. package/dist/core/code/engine/types/pipeline.js +2 -0
  634. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  635. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  636. package/dist/core/code/shared/graph/types.js +8 -0
  637. package/dist/core/code/shared/index.js +105 -0
  638. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  639. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  640. package/dist/core/code/shared/integrations/retry.js +70 -0
  641. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  642. package/dist/core/code/shared/language-detection.js +162 -0
  643. package/dist/core/code/shared/languages.js +27 -0
  644. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  645. package/dist/core/code/shared/mro-strategy.js +2 -0
  646. package/dist/core/code/shared/pipeline.js +5 -0
  647. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  648. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  649. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  650. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  651. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  652. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  653. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  654. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  655. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  656. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  657. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  658. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  659. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  660. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  661. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  662. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  663. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  664. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  665. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  666. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  667. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  668. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  669. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  670. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  671. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  672. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  673. package/dist/core/code/shared/test-helpers.js +17 -0
  674. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  675. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  676. package/dist/core/features/scanner.d.ts +2 -0
  677. package/dist/core/features/scanner.d.ts.map +1 -1
  678. package/dist/core/features/scanner.js +27 -6
  679. package/dist/core/features/scanner.js.map +1 -1
  680. package/dist/core/timeline/cli.d.ts.map +1 -1
  681. package/dist/core/timeline/cli.js +13 -6
  682. package/dist/core/timeline/cli.js.map +1 -1
  683. package/dist/core/timeline/debris.d.ts +20 -0
  684. package/dist/core/timeline/debris.d.ts.map +1 -0
  685. package/dist/core/timeline/debris.js +124 -0
  686. package/dist/core/timeline/debris.js.map +1 -0
  687. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  688. package/dist/core/timeline/hook-runner.js +3 -1
  689. package/dist/core/timeline/hook-runner.js.map +1 -1
  690. package/dist/core/timeline/hooks.d.ts.map +1 -1
  691. package/dist/core/timeline/hooks.js +13 -5
  692. package/dist/core/timeline/hooks.js.map +1 -1
  693. package/dist/core/timeline/installer.d.ts +2 -0
  694. package/dist/core/timeline/installer.d.ts.map +1 -1
  695. package/dist/core/timeline/installer.js +12 -0
  696. package/dist/core/timeline/installer.js.map +1 -1
  697. package/dist/core/timeline/project-root.d.ts +21 -0
  698. package/dist/core/timeline/project-root.d.ts.map +1 -0
  699. package/dist/core/timeline/project-root.js +83 -0
  700. package/dist/core/timeline/project-root.js.map +1 -0
  701. package/package.json +1 -1
@@ -0,0 +1,840 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DART_SIGNATURE_TYPES = void 0;
4
+ exports.createDartCfgVisitor = createDartCfgVisitor;
5
+ const cfg_builder_js_1 = require("../cfg-builder.js");
6
+ const control_flow_context_js_1 = require("../control-flow-context.js");
7
+ const dart_harvest_js_1 = require("./dart-harvest.js");
8
+ /** Signature node types whose SIBLING `function_body` owns a CFG-bearing body. */
9
+ const DART_SIGNATURE_TYPES = new Set([
10
+ 'function_signature',
11
+ 'method_signature',
12
+ 'getter_signature',
13
+ 'setter_signature',
14
+ 'constructor_signature',
15
+ 'factory_constructor_signature',
16
+ ]);
17
+ exports.DART_SIGNATURE_TYPES = DART_SIGNATURE_TYPES;
18
+ /** Statement node types that break a basic block (everything else coalesces). */
19
+ const CONTROL_FLOW_TYPES = new Set([
20
+ 'if_statement',
21
+ 'for_statement',
22
+ 'while_statement',
23
+ 'do_statement',
24
+ 'switch_statement',
25
+ 'try_statement',
26
+ 'return_statement',
27
+ 'break_statement',
28
+ 'continue_statement',
29
+ 'assert_statement',
30
+ ]);
31
+ /** Comment node types tree-sitter-dart surfaces. */
32
+ const COMMENT_TYPES = new Set(['comment', 'documentation_comment']);
33
+ const startLineOf = (n) => n.startPosition.row + 1;
34
+ const endLineOf = (n) => n.endPosition.row + 1;
35
+ const isComment = (n) => COMMENT_TYPES.has(n.type);
36
+ /** Whether an `expression_statement` is a bare `throw …;`. */
37
+ const isThrowStatement = (n) => n.type === 'expression_statement' && n.namedChildren.some((c) => c.type === 'throw_expression');
38
+ /** Whether an `expression_statement` is a bare `rethrow;`. */
39
+ const isRethrowStatement = (n) => n.type === 'expression_statement' && n.namedChildren.some((c) => c.type === 'rethrow_expression');
40
+ /**
41
+ * Whether a node is a LABELED `continue LABEL;` (a switch fallthrough-spill),
42
+ * vs a bare `continue;` (which targets the enclosing loop). Only the labeled form
43
+ * is stripped from a case body and handled via {@link caseContinueLabel}.
44
+ */
45
+ const isLabeledContinue = (n) => n.type === 'continue_statement' && n.namedChildren.some((c) => c.type === 'identifier');
46
+ /**
47
+ * Per-function Dart walk state. One instance per function so the
48
+ * {@link ControlFlowContext}, exception-handler stack, and labeled-frame
49
+ * bookkeeping are scoped to that function and never leak across functions.
50
+ */
51
+ class DartCfgWalk {
52
+ builder;
53
+ harvest;
54
+ cfc = new control_flow_context_js_1.ControlFlowContext();
55
+ /** Stack of exception-handler entry blocks (catch/finally) a `throw` jumps to. */
56
+ handlers = [];
57
+ /** Label(s) pending attachment to the NEXT pushed loop/switch frame. */
58
+ pendingLabels = [];
59
+ constructor(builder, harvest) {
60
+ this.builder = builder;
61
+ this.harvest = harvest;
62
+ }
63
+ /** Named statements of a `block`, ignoring comments. */
64
+ statementsOf(block) {
65
+ return block.namedChildren.filter((c) => !isComment(c));
66
+ }
67
+ /** Unwrap a body STMT: a `block` yields its statements; a bare statement is itself. */
68
+ visitBody(node) {
69
+ return this.builder.withNesting(() => {
70
+ if (!node)
71
+ return null;
72
+ if (node.type === 'block')
73
+ return this.visitSeq(this.statementsOf(node));
74
+ if (isComment(node))
75
+ return null;
76
+ return this.visitStmt(node);
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
+ /** Whether a statement node breaks the current straight-line block. */
118
+ isControlFlow(stmt) {
119
+ if (this.isLabelError(stmt))
120
+ return true; // a stray label sibling — queue it
121
+ if (isThrowStatement(stmt) || isRethrowStatement(stmt))
122
+ return true;
123
+ // `var x = switch (v) { … }` (#2207): a value-position switch breaks so
124
+ // `visitStmt` models the arms as control flow instead of coalescing.
125
+ if (stmt.type === 'local_variable_declaration') {
126
+ const v = this.directValue(stmt);
127
+ return v !== undefined && this.isModelableValueBranch(v);
128
+ }
129
+ return CONTROL_FLOW_TYPES.has(stmt.type);
130
+ }
131
+ /**
132
+ * A labeled LOOP outside a switch (`outer: for …`) is mis-parsed by
133
+ * tree-sitter-dart as a stray `ERROR [identifier :]` SIBLING preceding the
134
+ * loop. Recognize that exact shape so the label still resolves a `break outer`.
135
+ */
136
+ isLabelError(stmt) {
137
+ if (stmt.type !== 'ERROR')
138
+ return false;
139
+ const id = stmt.namedChildren.find((c) => c.type === 'identifier');
140
+ return id !== undefined && stmt.children.some((c) => c.type === ':');
141
+ }
142
+ /** Dispatch one statement to its handler. Non-null except for empty / label-only. */
143
+ visitStmt(stmt) {
144
+ if (this.isLabelError(stmt)) {
145
+ const id = stmt.namedChildren.find((c) => c.type === 'identifier');
146
+ if (id?.text)
147
+ this.pendingLabels = [...this.pendingLabels, id.text];
148
+ return null; // emits no block of its own
149
+ }
150
+ if (isThrowStatement(stmt))
151
+ return this.visitThrow(stmt);
152
+ if (isRethrowStatement(stmt))
153
+ return this.visitRethrow(stmt);
154
+ switch (stmt.type) {
155
+ case 'local_variable_declaration': {
156
+ // `var x = switch (v) { … }` (#2207): the value is a value-position
157
+ // branch — model it as control flow and bind the result on the rejoin.
158
+ const value = this.directValue(stmt);
159
+ if (value && this.isModelableValueBranch(value))
160
+ return this.visitBindBranch(stmt, value);
161
+ return this.visitSimple(stmt);
162
+ }
163
+ case 'if_statement':
164
+ return this.visitIf(stmt);
165
+ case 'for_statement':
166
+ return this.visitFor(stmt);
167
+ case 'while_statement':
168
+ return this.visitWhile(stmt);
169
+ case 'do_statement':
170
+ return this.visitDoWhile(stmt);
171
+ case 'switch_statement':
172
+ return this.visitSwitch(stmt);
173
+ case 'try_statement':
174
+ return this.visitTry(stmt);
175
+ case 'return_statement':
176
+ return this.visitReturn(stmt);
177
+ case 'break_statement':
178
+ return this.visitBreak(stmt);
179
+ case 'continue_statement':
180
+ return this.visitContinue(stmt);
181
+ case 'assert_statement':
182
+ return this.visitAssert(stmt);
183
+ case 'block':
184
+ return this.visitSeq(this.statementsOf(stmt));
185
+ default:
186
+ return this.visitSimple(stmt);
187
+ }
188
+ }
189
+ visitSimple(stmt) {
190
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
191
+ return { entry: idx, exits: [idx] };
192
+ }
193
+ /** Take and clear the labels queued by a preceding label sibling. */
194
+ takeLabels() {
195
+ const labels = this.pendingLabels;
196
+ this.pendingLabels = [];
197
+ return labels;
198
+ }
199
+ // ── jumps (return / throw / rethrow / break / continue / assert) ──────────
200
+ /** `return [expr];` — threads through every active finalizer before EXIT. */
201
+ visitReturn(stmt) {
202
+ // `return switch (v) { … };` (#2207): the returned value is a value-position
203
+ // branch — model it as control flow, with each arm returning (its value IS
204
+ // the function result), threading every active finalizer per arm.
205
+ const branch = stmt.namedChildren.find((c) => !isComment(c));
206
+ if (branch && this.isModelableValueBranch(branch)) {
207
+ const res = this.visitBranchExpr(branch);
208
+ const finalizers = this.cfc.finalizersForReturn();
209
+ for (const ex of res.exits) {
210
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, ex, finalizers, this.builder.exitIndex, 'return');
211
+ }
212
+ return { entry: res.entry, exits: [] };
213
+ }
214
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
215
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, idx, this.cfc.finalizersForReturn(), this.builder.exitIndex, 'return');
216
+ return { entry: idx, exits: [] };
217
+ }
218
+ /** `throw e;` — routes to the nearest enclosing handler (catch/finally), else EXIT. */
219
+ visitThrow(stmt) {
220
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
221
+ this.builder.edge(idx, this.currentHandler(), 'throw');
222
+ return { entry: idx, exits: [] };
223
+ }
224
+ /**
225
+ * `rethrow;` — re-raises the current exception. Inside a handler it propagates
226
+ * past the CURRENT catch to the next-outer handler / EXIT, which is exactly
227
+ * what `currentHandler()` resolves to (the in-flight catch is not on the
228
+ * handler stack while its own body is walked). Terminates its block.
229
+ */
230
+ visitRethrow(stmt) {
231
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
232
+ this.builder.edge(idx, this.currentHandler(), 'throw');
233
+ return { entry: idx, exits: [] };
234
+ }
235
+ visitBreak(stmt) {
236
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text);
237
+ const label = this.jumpLabel(stmt);
238
+ const res = this.cfc.resolveBreak(label);
239
+ const { target, finalizers } = res ?? {
240
+ target: this.builder.exitIndex,
241
+ finalizers: this.cfc.finalizersForReturn(),
242
+ };
243
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, idx, finalizers, target, 'break');
244
+ return { entry: idx, exits: [] };
245
+ }
246
+ visitContinue(stmt) {
247
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text);
248
+ const label = this.jumpLabel(stmt);
249
+ const res = this.cfc.resolveContinue(label);
250
+ const { target, finalizers } = res ?? {
251
+ target: this.builder.exitIndex,
252
+ finalizers: this.cfc.finalizersForReturn(),
253
+ };
254
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, idx, finalizers, target, 'continue');
255
+ return { entry: idx, exits: [] };
256
+ }
257
+ /**
258
+ * `assert ( cond [, msg] );` — may throw an `AssertionError`. Modeled as a
259
+ * straight-line block that ALSO edges to the current handler (the assertion
260
+ * may fire), so the error path stays represented while the success path falls
261
+ * through. Conservative; deduped by the builder.
262
+ */
263
+ visitAssert(stmt) {
264
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
265
+ this.builder.edge(idx, this.currentHandler(), 'throw');
266
+ return { entry: idx, exits: [idx] };
267
+ }
268
+ /** The `identifier` label of a `break outer;` / `continue outer;`, if any. */
269
+ jumpLabel(stmt) {
270
+ const id = stmt.namedChildren.find((c) => c.type === 'identifier');
271
+ return id?.text || undefined;
272
+ }
273
+ // ── branches (if/else) ─────────────────────────────────────────────────────
274
+ /**
275
+ * `if ( COND ) consequence:STMT [ else alternative:STMT ]`. The consequence /
276
+ * alternative are a `block` or a bare statement; an `else if` is the nested
277
+ * `if_statement` in the `alternative` field.
278
+ */
279
+ visitIf(stmt) {
280
+ const cond = this.parenCondition(stmt);
281
+ const header = this.builder.newBlock(startLineOf(stmt), cond ? endLineOf(cond) : startLineOf(stmt), cond ? `if (${cond.text})` : 'if', 'normal', cond ? this.harvest.facts(cond) : undefined);
282
+ const consequence = stmt.childForFieldName('consequence');
283
+ const alternative = stmt.childForFieldName('alternative');
284
+ const exits = [];
285
+ const thenRes = this.visitBody(consequence);
286
+ if (thenRes) {
287
+ this.builder.edge(header, thenRes.entry, 'cond-true');
288
+ exits.push(...thenRes.exits);
289
+ }
290
+ else {
291
+ exits.push(header); // empty then — true path falls through
292
+ }
293
+ if (alternative) {
294
+ const elseRes = this.visitBody(alternative);
295
+ if (elseRes) {
296
+ this.builder.edge(header, elseRes.entry, 'cond-false');
297
+ exits.push(...elseRes.exits);
298
+ }
299
+ else {
300
+ exits.push(header);
301
+ }
302
+ }
303
+ else {
304
+ exits.push(header); // no else — false path falls through to the join
305
+ }
306
+ return { entry: header, exits: [...new Set(exits)] };
307
+ }
308
+ /** The condition expression of an `if` — the named child between `(` and `)`. */
309
+ parenCondition(stmt) {
310
+ let sawOpen = false;
311
+ for (let i = 0; i < stmt.childCount; i++) {
312
+ const c = stmt.child(i);
313
+ if (!c)
314
+ continue;
315
+ if (c.type === '(') {
316
+ sawOpen = true;
317
+ continue;
318
+ }
319
+ if (c.type === ')')
320
+ return undefined;
321
+ if (sawOpen && c.isNamed && !isComment(c))
322
+ return c;
323
+ }
324
+ return undefined;
325
+ }
326
+ // ── loops ───────────────────────────────────────────────────────────────
327
+ /** `for ( for_loop_parts ) body:STMT` (C-style and for-in). */
328
+ visitFor(stmt) {
329
+ const labels = this.takeLabels();
330
+ const parts = stmt.namedChildren.find((c) => c.type === 'for_loop_parts');
331
+ const header = this.builder.newBlock(startLineOf(stmt), parts ? endLineOf(parts) : startLineOf(stmt), this.forHeaderText(stmt, parts), 'normal', this.harvest.forHeadFacts(parts));
332
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
333
+ this.cfc.pushLoop(header, loopExit, labels);
334
+ const body = this.visitBody(stmt.childForFieldName('body'));
335
+ this.cfc.pop();
336
+ if (body) {
337
+ this.builder.edge(header, body.entry, 'cond-true');
338
+ this.builder.connect(body.exits, header, 'loop-back');
339
+ }
340
+ else {
341
+ this.builder.edge(header, header, 'loop-back'); // empty body re-iterates
342
+ }
343
+ // Structural exit edge — even `for (;;) {}` keeps EXIT reverse-reachable.
344
+ this.builder.edge(header, loopExit, 'cond-false');
345
+ return { entry: header, exits: [loopExit] };
346
+ }
347
+ forHeaderText(stmt, parts) {
348
+ return parts ? `for ${parts.text}` : 'for';
349
+ }
350
+ /** `while condition:parenthesized_expression body:STMT`. */
351
+ visitWhile(stmt) {
352
+ const labels = this.takeLabels();
353
+ const cond = stmt.childForFieldName('condition');
354
+ const header = this.builder.newBlock(startLineOf(stmt), cond ? endLineOf(cond) : startLineOf(stmt), cond ? `while ${cond.text}` : 'while', 'normal', cond ? this.harvest.facts(cond) : undefined);
355
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
356
+ this.cfc.pushLoop(header, loopExit, labels);
357
+ const body = this.visitBody(stmt.childForFieldName('body'));
358
+ this.cfc.pop();
359
+ if (body) {
360
+ this.builder.edge(header, body.entry, 'cond-true');
361
+ this.builder.connect(body.exits, header, 'loop-back');
362
+ }
363
+ else {
364
+ this.builder.edge(header, header, 'loop-back'); // empty body re-tests
365
+ }
366
+ // Structural exit edge — even `while (true) {}` keeps EXIT reverse-reachable.
367
+ this.builder.edge(header, loopExit, 'cond-false');
368
+ return { entry: header, exits: [loopExit] };
369
+ }
370
+ /**
371
+ * `do body:STMT while condition:… ;` — BOTTOM-TEST: the body runs at least
372
+ * once, THEN the condition decides whether to loop back.
373
+ */
374
+ visitDoWhile(stmt) {
375
+ const labels = this.takeLabels();
376
+ const cond = stmt.childForFieldName('condition');
377
+ 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);
378
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
379
+ // `continue` re-tests the condition; `break` leaves the loop.
380
+ this.cfc.pushLoop(condBlock, loopExit, labels);
381
+ const body = this.visitBody(stmt.childForFieldName('body'));
382
+ this.cfc.pop();
383
+ const backTarget = body ? body.entry : condBlock;
384
+ if (body)
385
+ this.builder.connect(body.exits, condBlock, 'seq');
386
+ this.builder.edge(condBlock, backTarget, 'loop-back'); // cond true → run body again
387
+ // Structural exit edge — even `do {} while (true)` keeps EXIT reachable.
388
+ this.builder.edge(condBlock, loopExit, 'cond-false');
389
+ return { entry: backTarget, exits: [loopExit] };
390
+ }
391
+ // ── switch (no implicit fallthrough; empty-case + continue-label spill) ─────
392
+ /**
393
+ * `switch condition:parenthesized_expression body:switch_block`. A non-empty
394
+ * case rejoins after the switch (no implicit fallthrough). An EMPTY case (no
395
+ * statements) spills into the next case (Dart empty-case fallthrough). An
396
+ * explicit `continue LABEL;` jumps to the labeled case.
397
+ */
398
+ visitSwitch(stmt) {
399
+ const labels = this.takeLabels();
400
+ // The `condition` field is a `parenthesized_expression` (verified) — unwrap it
401
+ // so the dispatch text/discriminant matches the value-position `visitSwitchExpr`
402
+ // form (`switch x`, not `switch (x)`). The harvest walks into the paren either
403
+ // way, so the def/use facts are unchanged — only the block text normalizes.
404
+ const condRaw = stmt.childForFieldName('condition');
405
+ const value = condRaw ? this.unwrapParen(condRaw) : undefined;
406
+ const dispatch = this.builder.newBlock(startLineOf(stmt), value ? endLineOf(value) : startLineOf(stmt), value ? `switch ${value.text}` : 'switch', 'normal', value ? this.harvest.facts(value) : undefined);
407
+ const switchExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
408
+ const block = stmt.childForFieldName('body');
409
+ const cases = block
410
+ ? block.namedChildren.filter((c) => c.type === 'switch_statement_case' || c.type === 'switch_statement_default')
411
+ : [];
412
+ this.cfc.pushSwitch(switchExit, labels);
413
+ // Phase 1: build each case body. Register case labels so `continue LABEL`
414
+ // can target a labeled case's entry.
415
+ const caseBodies = [];
416
+ const caseLabels = [];
417
+ for (const c of cases) {
418
+ caseLabels.push(this.caseLabel(c));
419
+ // A case-pattern test runs conditionally before the body — harvest its
420
+ // uses onto the dispatch block (a later case tests only if earlier ones
421
+ // didn't match; any def there is a may-def).
422
+ for (const pat of this.casePatterns(c)) {
423
+ this.builder.attachFacts(dispatch, this.harvest.factsConditional(pat));
424
+ }
425
+ caseBodies.push(this.visitSeq(this.caseStatements(c)));
426
+ }
427
+ // The entry block of each case (its body, or the NEXT non-empty case's entry
428
+ // for an empty fallthrough case, or switchExit when nothing follows).
429
+ const entryOf = new Array(cases.length);
430
+ let after = switchExit;
431
+ for (let i = cases.length - 1; i >= 0; i--) {
432
+ entryOf[i] = caseBodies[i]?.entry ?? after;
433
+ after = entryOf[i];
434
+ }
435
+ // Resolve a `continue LABEL` target: the entry of the case carrying LABEL.
436
+ const labelTarget = (name) => {
437
+ const idx = caseLabels.findIndex((l) => l === name);
438
+ return idx >= 0 ? entryOf[idx] : undefined;
439
+ };
440
+ const hasDefault = cases.some((c) => c.type === 'switch_statement_default');
441
+ // Dispatch edges: one per case.
442
+ for (let i = 0; i < cases.length; i++) {
443
+ this.builder.edge(dispatch, entryOf[i], 'switch-case');
444
+ }
445
+ if (!hasDefault)
446
+ this.builder.edge(dispatch, switchExit, 'switch-case'); // no-match path
447
+ // Case-body completion: a non-empty case rejoins after the switch UNLESS it
448
+ // ends in an explicit `continue LABEL` (handled as the body's own terminator)
449
+ // — and an EMPTY case spills into the next case (fallthrough edge). A bare
450
+ // `break;` inside a case is a normal break to switchExit (the jump handler).
451
+ for (let i = 0; i < cases.length; i++) {
452
+ const res = caseBodies[i];
453
+ const contLabel = this.caseContinueLabel(cases[i]);
454
+ if (!res) {
455
+ // Empty case — spill to the next case (or switchExit).
456
+ this.builder.edge(dispatch, i + 1 < cases.length ? entryOf[i + 1] : switchExit, 'fallthrough');
457
+ continue;
458
+ }
459
+ if (contLabel) {
460
+ const tgt = labelTarget(contLabel);
461
+ if (tgt !== undefined)
462
+ this.builder.connect(res.exits, tgt, 'fallthrough');
463
+ else
464
+ this.builder.connect(res.exits, switchExit, 'seq');
465
+ }
466
+ else {
467
+ this.builder.connect(res.exits, switchExit, 'seq');
468
+ }
469
+ }
470
+ this.cfc.pop();
471
+ return { entry: dispatch, exits: [switchExit] };
472
+ }
473
+ /** The `label` name of a `switch_statement_case` (`myLabel: case …`), if any. */
474
+ caseLabel(c) {
475
+ const label = c.namedChildren.find((ch) => ch.type === 'label');
476
+ const id = label?.namedChildren.find((ch) => ch.type === 'identifier');
477
+ return id?.text || undefined;
478
+ }
479
+ /**
480
+ * Case-pattern nodes of a `switch_statement_case` whose test evaluates before
481
+ * the body — the only DISTINCT pattern node tree-sitter-dart emits is
482
+ * `constant_pattern` (`case 1:` / `case 1 || 2:`); a relational guard
483
+ * (`case > 5:`) is a bare `relational_operator` + operand, not a wrapper node.
484
+ * Harvesting the `constant_pattern` uses onto the dispatch block covers the
485
+ * common case; the rest fold into the body walk.
486
+ */
487
+ casePatterns(c) {
488
+ return c.namedChildren.filter((ch) => ch.type === 'constant_pattern');
489
+ }
490
+ /** Body statements of a switch case/default (skip the case keyword/pattern/label). */
491
+ caseStatements(c) {
492
+ const NON_BODY = new Set(['case_builtin', 'label', 'constant_pattern']);
493
+ // A LABELED `continue LABEL;` at a case tail is a fallthrough-spill, handled
494
+ // via caseContinueLabel — drop it from the body. But a BARE `continue;` targets
495
+ // the ENCLOSING LOOP (valid Dart) and MUST stay in the body: dropping it
496
+ // silently removes the jump and fabricates a false case→next-statement
497
+ // fall-through path. Only drop the labeled form.
498
+ return c.namedChildren.filter((ch) => !isComment(ch) && !NON_BODY.has(ch.type) && !isLabeledContinue(ch));
499
+ }
500
+ /** A trailing `continue LABEL;` in a case spills to the labeled case. */
501
+ caseContinueLabel(c) {
502
+ const cont = c.namedChildren.find((ch) => isLabeledContinue(ch));
503
+ if (!cont)
504
+ return undefined;
505
+ const id = cont.namedChildren.find((ch) => ch.type === 'identifier');
506
+ return id?.text || undefined;
507
+ }
508
+ // ── value-position switch expression (#2207) ────────────────────────────────
509
+ /**
510
+ * The direct value of a `local_variable_declaration` with a SINGLE
511
+ * `initialized_variable_definition` (`var x = <value>`): its `value` field.
512
+ * Returns undefined for a multi-binding decl (`var a = …, b = …`) — modeling
513
+ * those arm-by-arm is out of scope, so they coalesce inline.
514
+ */
515
+ directValue(stmt) {
516
+ const defs = stmt.namedChildren.filter((c) => c.type === 'initialized_variable_definition');
517
+ if (defs.length !== 1)
518
+ return undefined;
519
+ return defs[0].childForFieldName('value') ?? undefined;
520
+ }
521
+ /**
522
+ * Whether `node` is a value-position branch worth modeling as control flow
523
+ * (#2207): a `switch_expression` (Dart 3) with ≥2 arms — a real dispatch. Dart's
524
+ * value-position `if` does not exist; the ternary `?:` is excluded by design.
525
+ */
526
+ isModelableValueBranch(node) {
527
+ if (node.type !== 'switch_expression')
528
+ return false;
529
+ return node.namedChildren.filter((c) => c.type === 'switch_expression_case').length >= 2;
530
+ }
531
+ /** Model a value-position branch as control flow (only `switch_expression`). */
532
+ visitBranchExpr(node) {
533
+ return this.visitSwitchExpr(node);
534
+ }
535
+ /**
536
+ * Model a value-position `switch (v) { p [when g] => e, _ => e }` (Dart 3) as a
537
+ * CFG dispatch: a discriminant block, each arm's value a block reached by a
538
+ * `switch-case` edge, all arms rejoining at one exit (no fallthrough). The arm
539
+ * PATTERN and any `when` GUARD are harvested as conditional uses on the dispatch
540
+ * (they evaluate before the body, only when earlier arms missed); a Dart call
541
+ * value parses as `identifier` + `selector` (multiple children), so the arm-value
542
+ * facts come from each post-`=>` child. Only an UNGUARDED `_` arm is the
543
+ * exhaustive catch-all — a guarded `_ when …` is NOT (the no-match path still
544
+ * needs the conservative edge), mirroring the C# `visitSwitchExpr`.
545
+ */
546
+ visitSwitchExpr(node) {
547
+ const condRaw = node.childForFieldName('condition');
548
+ const cond = condRaw ? this.unwrapParen(condRaw) : node;
549
+ const dispatch = this.builder.newBlock(startLineOf(node), endLineOf(cond), `switch ${cond.text}`, 'normal', this.harvest.facts(cond));
550
+ const switchExit = this.builder.newBlock(endLineOf(node), endLineOf(node), '');
551
+ const arms = node.namedChildren.filter((c) => c.type === 'switch_expression_case');
552
+ let hasCatchAll = false;
553
+ for (const arm of arms) {
554
+ const { pattern, guards, values } = this.armParts(arm);
555
+ // The pattern + `when` guard are conditional dispatch tests, NOT arm-value
556
+ // uses — harvest them onto the dispatch (mirrors casePatterns for switch_statement).
557
+ if (pattern)
558
+ this.builder.attachFacts(dispatch, this.harvest.factsConditional(pattern));
559
+ for (const g of guards)
560
+ this.builder.attachFacts(dispatch, this.harvest.factsConditional(g));
561
+ if (pattern && pattern.text === '_' && guards.length === 0)
562
+ hasCatchAll = true;
563
+ const first = values[0] ?? arm;
564
+ const last = values[values.length - 1] ?? arm;
565
+ const armBlock = this.builder.newBlock(startLineOf(first), endLineOf(last), values.map((c) => c.text).join('') || arm.text, 'normal', undefined);
566
+ for (const v of values)
567
+ this.builder.attachFacts(armBlock, this.harvest.facts(v));
568
+ this.builder.edge(dispatch, armBlock, 'switch-case');
569
+ this.builder.edge(armBlock, switchExit, 'seq');
570
+ }
571
+ // A non-exhaustive Dart switch expression throws at runtime; conservatively
572
+ // keep EXIT reachable via a no-match edge when no `_` catch-all arm exists.
573
+ if (!hasCatchAll)
574
+ this.builder.edge(dispatch, switchExit, 'switch-case');
575
+ return { entry: dispatch, exits: [switchExit] };
576
+ }
577
+ /**
578
+ * Split a `switch_expression_case` at the `=>` token: the PATTERN (first named
579
+ * child before `=>`), any `when` GUARD (named children between the pattern and
580
+ * `=>` — tree-sitter-dart parses the guard as a bare sibling, not a wrapper),
581
+ * and the VALUE expression (named children after `=>` — a Dart call is split
582
+ * across `identifier` + `selector`, hence an array).
583
+ */
584
+ armParts(arm) {
585
+ const before = [];
586
+ const values = [];
587
+ let seenArrow = false;
588
+ for (let i = 0; i < arm.childCount; i++) {
589
+ const c = arm.child(i);
590
+ if (!c)
591
+ continue;
592
+ if (!c.isNamed) {
593
+ if (c.text === '=>')
594
+ seenArrow = true;
595
+ continue;
596
+ }
597
+ if (isComment(c))
598
+ continue;
599
+ (seenArrow ? values : before).push(c);
600
+ }
601
+ return { pattern: before[0], guards: before.slice(1), values };
602
+ }
603
+ /** Strip a `parenthesized_expression` wrapper (a switch/if condition). */
604
+ unwrapParen(node) {
605
+ if (node.type === 'parenthesized_expression') {
606
+ const inner = node.namedChildren.find((c) => !isComment(c));
607
+ if (inner)
608
+ return inner;
609
+ }
610
+ return node;
611
+ }
612
+ /**
613
+ * `var x = switch (v) { … }` (#2207): visit the switch as control flow, then
614
+ * rejoin its arms at a facts-only continuation carrying ONLY the declared name's
615
+ * def (the subject + arm-value uses are already on the switch's blocks). The
616
+ * arms are now control-dependent on the dispatch — mirrors Java / Kotlin / Rust.
617
+ */
618
+ visitBindBranch(stmt, branch) {
619
+ const res = this.visitBranchExpr(branch);
620
+ const cont = this.builder.newBlock(startLineOf(stmt), startLineOf(stmt), '', 'normal', this.harvest.bindingDefFacts(stmt));
621
+ this.builder.connect(res.exits, cont, 'seq');
622
+ return { entry: res.entry, exits: [cont] };
623
+ }
624
+ // ── try / on / catch / finally ─────────────────────────────────────────────
625
+ /**
626
+ * `try body:block (on TYPE? catch_clause? block)* finally_clause?`. The handler
627
+ * groups are bare siblings: an `on type_identifier`, an optional `catch_clause`
628
+ * (→ `catch_parameters`), and the handler `block`. The `finally` runs on BOTH
629
+ * normal and exception exit — a `return`/`break`/`continue` crossing it threads
630
+ * through (`finally-*` completion edges). Mirrors the Java/Kotlin `visitTry`.
631
+ */
632
+ visitTry(stmt) {
633
+ const bodyNode = stmt.childForFieldName('body');
634
+ const finallyClause = stmt.namedChildren.find((c) => c.type === 'finally_clause');
635
+ const finallyBody = finallyClause?.namedChildren.find((c) => c.type === 'block');
636
+ const handlerGroups = this.handlerGroups(stmt);
637
+ // The explicit finally is a finalizer the whole protected region threads through.
638
+ const finallyRes = finallyBody ? this.visitSeq(this.statementsOf(finallyBody)) : null;
639
+ const finallyFrame = finallyRes ? this.cfc.pushFinalizer(finallyRes.entry) : null;
640
+ const finalizerEntry = finallyRes?.entry;
641
+ const finalizerExits = finallyRes?.exits ?? null;
642
+ // Build each catch/on handler.
643
+ const catchExits = [];
644
+ let firstCatchEntry;
645
+ for (const group of handlerGroups) {
646
+ const clauseBody = group.block;
647
+ if (finalizerEntry !== undefined)
648
+ this.handlers.push(finalizerEntry);
649
+ let res = clauseBody ? this.visitSeq(this.statementsOf(clauseBody)) : null;
650
+ if (finalizerEntry !== undefined)
651
+ this.handlers.pop();
652
+ if (res === null) {
653
+ // Empty `on T { }` / `catch (e) {}` still catches — synthesize one block
654
+ // so exception flow lands somewhere and post-try code stays reachable.
655
+ const anchor = clauseBody ?? group.catchClause ?? stmt;
656
+ const idx = this.builder.newBlock(startLineOf(anchor), endLineOf(anchor), '');
657
+ res = { entry: idx, exits: [idx] };
658
+ }
659
+ const paramFacts = this.harvest.catchParamFacts(group.catchParameters);
660
+ if (paramFacts) {
661
+ const anchor = group.catchParameters ?? group.catchClause ?? stmt;
662
+ const paramBlock = this.builder.newBlock(startLineOf(anchor), startLineOf(anchor), '', 'normal', paramFacts);
663
+ this.builder.edge(paramBlock, res.entry, 'seq');
664
+ res = { entry: paramBlock, exits: res.exits };
665
+ }
666
+ catchExits.push(...res.exits);
667
+ if (firstCatchEntry === undefined)
668
+ firstCatchEntry = res.entry;
669
+ }
670
+ // Handler for the try body: first catch if present, else the finally, else outer.
671
+ const tryHandler = firstCatchEntry ?? finalizerEntry ?? this.currentHandler();
672
+ const protectedStart = this.builder.blockCount;
673
+ this.handlers.push(tryHandler);
674
+ const bodyRes = bodyNode ? this.visitSeq(this.statementsOf(bodyNode)) : null;
675
+ this.handlers.pop();
676
+ if (handlerGroups.length > 0 || finalizerEntry !== undefined) {
677
+ for (let b = protectedStart; b < this.builder.blockCount; b++) {
678
+ this.builder.edge(b, tryHandler, 'throw');
679
+ }
680
+ }
681
+ // Pop the finalizer frame and drain its pending completion legs.
682
+ if (finallyFrame && finallyRes) {
683
+ this.cfc.pop();
684
+ (0, control_flow_context_js_1.drainFinalizerPending)(this.builder, finallyFrame, finallyRes.exits);
685
+ }
686
+ const exits = [];
687
+ if (finalizerEntry !== undefined) {
688
+ if (bodyRes)
689
+ this.builder.connect(bodyRes.exits, finalizerEntry, 'seq');
690
+ for (const e of catchExits)
691
+ this.builder.edge(e, finalizerEntry, 'seq');
692
+ if (finalizerExits)
693
+ exits.push(...finalizerExits);
694
+ // No catch → an exception re-propagates out after the finally runs.
695
+ if (handlerGroups.length === 0 && finalizerExits) {
696
+ this.builder.connect(finalizerExits, this.currentHandler(), 'throw');
697
+ }
698
+ }
699
+ else {
700
+ if (bodyRes)
701
+ exits.push(...bodyRes.exits);
702
+ exits.push(...catchExits);
703
+ }
704
+ const entry = bodyRes?.entry ?? finalizerEntry ?? firstCatchEntry;
705
+ if (entry === undefined)
706
+ return null;
707
+ return { entry, exits: [...new Set(exits)] };
708
+ }
709
+ /**
710
+ * The handler groups of a `try_statement`: each is an `on TYPE` and/or
711
+ * `catch (params)` plus the handler `block` that follows it. The `on`/`type`/
712
+ * `catch_clause`/`block` are bare children in source order, so a group is a
713
+ * `catch_clause` (or an `on` keyword + `type_identifier`) followed by a `block`.
714
+ */
715
+ handlerGroups(stmt) {
716
+ const groups = [];
717
+ const bodyNode = stmt.childForFieldName('body');
718
+ let pendingCatch;
719
+ let sawOn = false;
720
+ for (let i = 0; i < stmt.childCount; i++) {
721
+ const c = stmt.child(i);
722
+ if (!c)
723
+ continue;
724
+ if (c.type === 'finally_clause')
725
+ break; // finally is separate
726
+ if (c.type === 'on') {
727
+ sawOn = true;
728
+ continue;
729
+ }
730
+ if (c.type === 'catch_clause') {
731
+ pendingCatch = c;
732
+ continue;
733
+ }
734
+ if (c.type === 'block' && c !== bodyNode) {
735
+ const catchParameters = pendingCatch?.namedChildren.find((ch) => ch.type === 'catch_parameters');
736
+ groups.push({ catchClause: pendingCatch, catchParameters, block: c });
737
+ pendingCatch = undefined;
738
+ sawOn = false;
739
+ }
740
+ }
741
+ // A trailing `on T catch (e)` with no `{}` body is malformed; ignore here.
742
+ void sawOn;
743
+ return groups;
744
+ }
745
+ /** Nearest enclosing exception handler, or the function EXIT. */
746
+ currentHandler() {
747
+ return this.handlers.length ? this.handlers[this.handlers.length - 1] : this.builder.exitIndex;
748
+ }
749
+ }
750
+ /** The signature node that precedes a `function_body` (params live there). */
751
+ function signatureFor(fnNode) {
752
+ if (fnNode.type !== 'function_body')
753
+ return undefined;
754
+ const prev = fnNode.previousSibling;
755
+ if (!prev)
756
+ return undefined;
757
+ if (DART_SIGNATURE_TYPES.has(prev.type))
758
+ return prev;
759
+ // A `method_signature` wraps a `function_signature` / getter / setter — the
760
+ // params live on the wrapped signature for a plain method but the wrapper still
761
+ // carries them transitively; return the wrapper (paramList searches its named
762
+ // children, which include the `formal_parameter_list`).
763
+ return undefined;
764
+ }
765
+ /** The body STMT of a `function_body` / `function_expression`: a `block` or an arrow expr. */
766
+ function bodyAndArrow(fnNode) {
767
+ let container = fnNode;
768
+ if (fnNode.type === 'function_expression') {
769
+ container = fnNode.childForFieldName('body') ?? undefined; // function_expression_body
770
+ }
771
+ if (!container)
772
+ return {};
773
+ const block = container.namedChildren.find((c) => c.type === 'block');
774
+ if (block)
775
+ return { block };
776
+ // Arrow body `=> expr`: the expression is the first non-comment named child.
777
+ const arrowExpr = container.namedChildren.find((c) => !COMMENT_TYPES.has(c.type));
778
+ return { arrowExpr };
779
+ }
780
+ /** Build the CFG for one Dart function node, or `undefined` if not modelable. */
781
+ function buildFunctionCfg(fnNode, filePath) {
782
+ try {
783
+ if (!isFunction(fnNode))
784
+ return undefined;
785
+ const signature = signatureFor(fnNode);
786
+ // Anchor the span/column to the signature when present (so same-line
787
+ // functions `void a(){} void b(){}` get distinct start columns from the
788
+ // signature, and the span covers the declaration head), else the body node.
789
+ const anchor = signature ?? fnNode;
790
+ const startLine = startLineOf(anchor);
791
+ const endLine = endLineOf(fnNode);
792
+ const startColumn = anchor.startPosition.column;
793
+ const { block, arrowExpr } = bodyAndArrow(fnNode);
794
+ const builder = new cfg_builder_js_1.CfgBuilder(filePath, startLine, endLine, startColumn);
795
+ const harvest = new dart_harvest_js_1.DartHarvester(fnNode, signature);
796
+ const paramFacts = harvest.paramFacts();
797
+ if (paramFacts)
798
+ builder.attachFacts(builder.entryIndex, paramFacts);
799
+ // Arrow body (`=> expr`): one block whose value is returned.
800
+ if (!block && arrowExpr) {
801
+ const blk = builder.newBlock(startLineOf(arrowExpr), endLineOf(arrowExpr), arrowExpr.text, 'normal', harvest.facts(arrowExpr));
802
+ builder.edge(builder.entryIndex, blk, 'seq');
803
+ builder.edge(blk, builder.exitIndex, 'return');
804
+ return builder.finish(harvest.bindingTable());
805
+ }
806
+ const walk = new DartCfgWalk(builder, harvest);
807
+ const res = block ? walk.visitSeq(block.namedChildren.filter((c) => !isComment(c))) : null;
808
+ if (!res) {
809
+ builder.edge(builder.entryIndex, builder.exitIndex, 'seq'); // empty body
810
+ return builder.finish(harvest.bindingTable());
811
+ }
812
+ builder.edge(builder.entryIndex, res.entry, 'seq');
813
+ builder.connect(res.exits, builder.exitIndex, 'seq'); // normal fall-off → EXIT
814
+ return builder.finish(harvest.bindingTable());
815
+ }
816
+ catch (err) {
817
+ // Never throw out of buildFunctionCfg — a malformed AST shape must skip only
818
+ // this one function's CFG, never drop the whole file's language group (R4).
819
+ // eslint-disable-next-line no-console
820
+ console.warn(`[cfg] Dart buildFunctionCfg skipped a function in ${filePath}: ${String(err)}`);
821
+ return undefined;
822
+ }
823
+ }
824
+ /**
825
+ * Whether a node is a Dart function this visitor builds a CFG for: a
826
+ * `function_body` whose previous sibling is a signature (top-level fn / method /
827
+ * getter / setter / constructor), or a `function_expression` (a closure).
828
+ */
829
+ function isFunction(node) {
830
+ if (node.type === 'function_expression')
831
+ return true;
832
+ if (node.type !== 'function_body')
833
+ return false;
834
+ const prev = node.previousSibling;
835
+ return prev !== null && DART_SIGNATURE_TYPES.has(prev.type);
836
+ }
837
+ /** The Dart CFG visitor. */
838
+ function createDartCfgVisitor() {
839
+ return { buildFunctionCfg, isFunction };
840
+ }