cgraphx 2.0.2 → 2.0.6

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 (754) hide show
  1. package/dist/.claude-template/FLOW-MAP.md +13 -3
  2. package/dist/.claude-template/agents/task-history.md +186 -0
  3. package/dist/.claude-template/commands/end.md +1 -0
  4. package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +5 -3
  5. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +8 -8
  6. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +8 -8
  7. package/dist/.claude-template/skills/clarify-requirements/SKILL.md +13 -9
  8. package/dist/.claude-template/skills/db-query/SKILL.md +19 -2
  9. package/dist/.claude-template/skills/iboc-check/SKILL.md +51 -23
  10. package/dist/.claude-template/skills/iboc-check/filler-prompt.md +3 -4
  11. package/dist/.claude-template/skills/run-api-test/SKILL.md +15 -15
  12. package/dist/.claude-template/skills/run-api-test/assets/{template-test-report.md → template-/346/216/245/345/217/243/346/265/213/350/257/225/346/212/245/345/221/212.md} +4 -4
  13. package/dist/.claude-template/skills/run-api-test/references/bru-run.md +1 -1
  14. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
  15. package/dist/.claude-template/skills/run-api-test/references/report-format.md +6 -6
  16. package/dist/.claude-template/skills/run-api-test/references/service-readiness.md +1 -1
  17. package/dist/.claude-template/skills/run-api-test/references/test-scope.md +6 -6
  18. package/dist/.claude-template/skills/run-ui-test/SKILL.md +186 -0
  19. package/dist/.claude-template/skills/run-ui-test/references/report-format.md +77 -0
  20. package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
  21. package/dist/.claude-template/skills/write-api/SKILL.md +18 -18
  22. package/dist/.claude-template/skills/write-api/assets/{template-api-spec.md → template-/346/216/245/345/217/243/346/265/213/350/257/225-spec.md} +1 -1
  23. package/dist/.claude-template/skills/write-api/references/{api-spec-format.md → /346/216/245/345/217/243/346/265/213/350/257/225-spec-format.md} +3 -3
  24. package/dist/.claude-template/skills/write-plan/SKILL.md +4 -2
  25. package/dist/.claude-template/skills/write-ui-test/SKILL.md +125 -0
  26. package/dist/.claude-template/skills/write-ui-test/references//347/224/250/344/276/213/350/247/204/346/240/274-format.md +94 -0
  27. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  28. package/dist/core/code/engine/cli/analyze.js +1086 -0
  29. package/dist/core/code/engine/cli/cli-message.js +83 -0
  30. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  31. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  32. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  33. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  34. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  35. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  36. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  37. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  38. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  39. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  40. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  41. package/dist/core/code/engine/cli/status.js +156 -0
  42. package/dist/core/code/engine/cli/tool.js +384 -0
  43. package/dist/core/code/engine/config/ignore-service.js +511 -0
  44. package/dist/core/code/engine/config/supported-languages.js +17 -0
  45. package/dist/core/code/engine/core/analysis-features.js +64 -0
  46. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  47. package/dist/core/code/engine/core/git-staleness.js +180 -0
  48. package/dist/core/code/engine/core/graph/graph.js +180 -0
  49. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  50. package/dist/core/code/engine/core/graph/types.js +2 -0
  51. package/dist/core/code/engine/core/index-freshness.js +12 -0
  52. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  53. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  54. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  55. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  56. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  57. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  58. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  59. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  60. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  61. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  62. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  63. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  64. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  65. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  66. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  67. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  81. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  82. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  83. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  84. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  85. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  86. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  87. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  88. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  89. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  90. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  91. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  92. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  93. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  94. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  95. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  96. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  97. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  98. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  99. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  100. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  101. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  102. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  103. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  104. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  105. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  106. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  107. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  108. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  109. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  110. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  111. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  112. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  113. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  114. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  115. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  116. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  117. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  118. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  119. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  120. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  121. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  122. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  123. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  124. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  125. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  126. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  127. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  128. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  129. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  130. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  131. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  132. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  133. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  134. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  135. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  136. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  137. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  138. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  139. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  140. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  141. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  142. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  143. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  144. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  145. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  146. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  147. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  148. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  149. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  150. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  151. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  152. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  153. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  154. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  155. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  156. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  157. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  158. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  159. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  160. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  161. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  162. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  163. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  164. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  165. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  166. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  167. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  168. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  169. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  170. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  171. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  172. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  173. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  174. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  175. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  176. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  177. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  178. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  179. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  180. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  181. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  182. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  183. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  184. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  185. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  186. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  187. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  188. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  189. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  190. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  191. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  192. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  193. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  194. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  195. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  196. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  197. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  198. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  199. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  200. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  201. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  202. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  203. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  204. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  205. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  206. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  207. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  208. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  209. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  210. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  211. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  212. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  213. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  214. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  215. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  216. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  217. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  218. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  219. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  220. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  221. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  222. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  223. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  224. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  225. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  226. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  227. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  228. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  229. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  230. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  231. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  232. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  233. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  234. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  235. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  236. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  237. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  238. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  239. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  240. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  241. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  242. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  243. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  244. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  245. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  246. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  247. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  248. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  249. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  250. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  251. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  252. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  253. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  254. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  255. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  256. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  257. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  258. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  259. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  260. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  261. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  262. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  263. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  264. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  265. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  266. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  267. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  268. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  269. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  270. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  271. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  272. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  273. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  274. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  275. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  276. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  277. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  278. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  279. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  280. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  281. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  282. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  283. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  284. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  285. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  286. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  287. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  288. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  289. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  290. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  291. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  292. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  293. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  294. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  295. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  296. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  297. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  298. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  299. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  300. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  301. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  302. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  303. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  304. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  305. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  306. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  307. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  308. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  309. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  310. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  311. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  312. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  313. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  314. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  315. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  316. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  317. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  318. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  319. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  320. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  321. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  322. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  323. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  324. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  325. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  326. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  327. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  328. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  329. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  330. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  331. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  332. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  333. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  334. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  335. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  336. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  337. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  338. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  339. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  340. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  341. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  342. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  343. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  344. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  345. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  346. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  347. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  348. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  349. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  350. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  351. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  352. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  353. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  354. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  355. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  356. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  357. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  358. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  359. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  360. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  361. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  362. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  363. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  364. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  365. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  366. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  367. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  368. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  369. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  370. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  371. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  372. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  373. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  374. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  375. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  376. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  377. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  378. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  379. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  380. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  381. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  382. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  383. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  384. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  385. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  386. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  387. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  388. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  389. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  390. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  391. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  392. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  393. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  394. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  395. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  396. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  397. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  398. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  399. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  400. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  401. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  402. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  403. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  404. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  405. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  406. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  407. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  408. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  409. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  410. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  411. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  412. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  413. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  414. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  415. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  416. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  417. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  418. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  419. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  420. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  421. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  422. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  423. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  424. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  425. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  426. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  427. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  428. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  429. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  430. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  431. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  432. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  433. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  434. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  435. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  436. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  437. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  438. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  439. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  440. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  441. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  442. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  443. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  444. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  445. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  446. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  447. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  448. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  449. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  450. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  451. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  452. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  453. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  454. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  455. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  456. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  457. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  458. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  459. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  460. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  461. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  462. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  463. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  464. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  465. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  466. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  467. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  468. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  469. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  470. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  471. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  472. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  473. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  474. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  475. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  476. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  477. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  478. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  479. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  480. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  481. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  482. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  483. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  484. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  485. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  486. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  487. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  488. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  489. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  490. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  491. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  492. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  493. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  494. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  495. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  496. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  497. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  498. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  499. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  500. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  501. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  502. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  503. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  504. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  505. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  506. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  507. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  508. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  509. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  510. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  511. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  513. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  514. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  515. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  516. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  517. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  518. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  519. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  520. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  521. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  522. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  523. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  524. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  525. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  526. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  527. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  528. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  529. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  530. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  531. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  532. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  533. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  534. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  535. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  536. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  537. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  538. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  539. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  540. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  541. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  542. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  543. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  544. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  545. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  546. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  547. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  548. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  549. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  550. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  551. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  552. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  553. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  554. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  555. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  556. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  557. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  558. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  559. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  560. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  561. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  562. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  563. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  564. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  565. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  566. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  567. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  568. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  569. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  570. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  571. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  572. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  573. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  574. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  575. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  576. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  577. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  578. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  579. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  580. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  581. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  582. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  583. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  584. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  585. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  586. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  587. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  588. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  589. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  590. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  591. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  592. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  593. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  594. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  595. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  596. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  597. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  598. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  599. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  600. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  601. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  602. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  603. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  604. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  605. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  606. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  607. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  608. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  609. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  610. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  611. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  612. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  613. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  614. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  615. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  616. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  617. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  618. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  619. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  620. package/dist/core/code/engine/core/logger.js +339 -0
  621. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  622. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  623. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  624. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  625. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  626. package/dist/core/code/engine/lib/utils.js +121 -0
  627. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  628. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  629. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  630. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  631. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  632. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  633. package/dist/core/code/engine/storage/branch-index.js +72 -0
  634. package/dist/core/code/engine/storage/file-hash.js +95 -0
  635. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  636. package/dist/core/code/engine/storage/git.js +555 -0
  637. package/dist/core/code/engine/storage/index-lock.js +664 -0
  638. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  639. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  640. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  641. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  642. package/dist/core/code/engine/types/pipeline.js +2 -0
  643. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  644. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  645. package/dist/core/code/shared/graph/types.js +8 -0
  646. package/dist/core/code/shared/index.js +105 -0
  647. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  648. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  649. package/dist/core/code/shared/integrations/retry.js +70 -0
  650. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  651. package/dist/core/code/shared/language-detection.js +162 -0
  652. package/dist/core/code/shared/languages.js +27 -0
  653. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  654. package/dist/core/code/shared/mro-strategy.js +2 -0
  655. package/dist/core/code/shared/pipeline.js +5 -0
  656. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  657. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  658. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  659. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  660. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  661. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  662. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  663. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  664. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  665. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  666. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  667. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  668. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  669. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  670. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  671. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  672. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  673. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  674. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  675. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  676. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  677. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  678. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  679. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  680. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  681. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  682. package/dist/core/code/shared/test-helpers.js +17 -0
  683. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  684. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  685. package/dist/core/dbquery/cli.d.ts.map +1 -1
  686. package/dist/core/dbquery/cli.js +5 -4
  687. package/dist/core/dbquery/cli.js.map +1 -1
  688. package/dist/core/dbquery/config.d.ts.map +1 -1
  689. package/dist/core/dbquery/config.js +39 -3
  690. package/dist/core/dbquery/config.js.map +1 -1
  691. package/dist/core/dbquery/drivers/http.d.ts +23 -0
  692. package/dist/core/dbquery/drivers/http.d.ts.map +1 -0
  693. package/dist/core/dbquery/drivers/http.js +125 -0
  694. package/dist/core/dbquery/drivers/http.js.map +1 -0
  695. package/dist/core/dbquery/drivers/mysql.js +1 -1
  696. package/dist/core/dbquery/drivers/mysql.js.map +1 -1
  697. package/dist/core/dbquery/drivers/postgres.js +1 -1
  698. package/dist/core/dbquery/drivers/postgres.js.map +1 -1
  699. package/dist/core/dbquery/executor.d.ts.map +1 -1
  700. package/dist/core/dbquery/executor.js +46 -12
  701. package/dist/core/dbquery/executor.js.map +1 -1
  702. package/dist/core/dbquery/format.d.ts.map +1 -1
  703. package/dist/core/dbquery/format.js +2 -1
  704. package/dist/core/dbquery/format.js.map +1 -1
  705. package/dist/core/dbquery/init.d.ts.map +1 -1
  706. package/dist/core/dbquery/init.js +7 -0
  707. package/dist/core/dbquery/init.js.map +1 -1
  708. package/dist/core/dbquery/types.d.ts +55 -7
  709. package/dist/core/dbquery/types.d.ts.map +1 -1
  710. package/dist/core/directory.d.ts +17 -0
  711. package/dist/core/directory.d.ts.map +1 -1
  712. package/dist/core/directory.js +37 -0
  713. package/dist/core/directory.js.map +1 -1
  714. package/dist/core/features/cli.d.ts.map +1 -1
  715. package/dist/core/features/cli.js +3 -2
  716. package/dist/core/features/cli.js.map +1 -1
  717. package/dist/core/features/scanner.d.ts +1 -1
  718. package/dist/core/features/scanner.d.ts.map +1 -1
  719. package/dist/core/features/scanner.js +20 -4
  720. package/dist/core/features/scanner.js.map +1 -1
  721. package/dist/core/markdown/cli.d.ts.map +1 -1
  722. package/dist/core/markdown/cli.js +9 -8
  723. package/dist/core/markdown/cli.js.map +1 -1
  724. package/dist/core/timeline/cli.d.ts.map +1 -1
  725. package/dist/core/timeline/cli.js +13 -6
  726. package/dist/core/timeline/cli.js.map +1 -1
  727. package/dist/core/timeline/debris.d.ts +20 -0
  728. package/dist/core/timeline/debris.d.ts.map +1 -0
  729. package/dist/core/timeline/debris.js +124 -0
  730. package/dist/core/timeline/debris.js.map +1 -0
  731. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  732. package/dist/core/timeline/hook-runner.js +3 -1
  733. package/dist/core/timeline/hook-runner.js.map +1 -1
  734. package/dist/core/timeline/hooks.d.ts.map +1 -1
  735. package/dist/core/timeline/hooks.js +13 -5
  736. package/dist/core/timeline/hooks.js.map +1 -1
  737. package/dist/core/timeline/installer.d.ts +2 -0
  738. package/dist/core/timeline/installer.d.ts.map +1 -1
  739. package/dist/core/timeline/installer.js +12 -0
  740. package/dist/core/timeline/installer.js.map +1 -1
  741. package/dist/core/timeline/project-root.d.ts +21 -0
  742. package/dist/core/timeline/project-root.d.ts.map +1 -0
  743. package/dist/core/timeline/project-root.js +83 -0
  744. package/dist/core/timeline/project-root.js.map +1 -0
  745. package/dist/web/register.d.ts.map +1 -1
  746. package/dist/web/register.js +2 -1
  747. package/dist/web/register.js.map +1 -1
  748. package/package.json +1 -1
  749. package/dist/.claude-template/.cgraphx/timeline-current-turn.json +0 -1
  750. package/dist/.claude-template/skills/.cgraphx/timeline-current-turn.json +0 -1
  751. package/dist/.claude-template/skills/handdrawn-deck/.cgraphx/timeline-current-turn.json +0 -1
  752. package/dist/.claude-template/skills/handdrawn-deck/references/.cgraphx/timeline-current-turn.json +0 -1
  753. package/dist/.claude-template/skills/handdrawn-sketch-engine/.cgraphx/timeline-current-turn.json +0 -1
  754. /package/dist/.claude-template/skills/run-api-test/assets/{template-test-verify.jsonl → template-/346/216/245/345/217/243/346/265/213/350/257/225/351/252/214/350/257/201.jsonl"} +0 -0
@@ -0,0 +1,816 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JAVA_FUNCTION_TYPES = void 0;
4
+ exports.createJavaCfgVisitor = createJavaCfgVisitor;
5
+ const cfg_builder_js_1 = require("../cfg-builder.js");
6
+ const control_flow_context_js_1 = require("../control-flow-context.js");
7
+ const java_harvest_js_1 = require("./java-harvest.js");
8
+ /** Java node types that own a CFG-bearing function body. */
9
+ const JAVA_FUNCTION_TYPES = new Set([
10
+ 'method_declaration',
11
+ 'constructor_declaration',
12
+ 'compact_constructor_declaration',
13
+ 'lambda_expression',
14
+ ]);
15
+ exports.JAVA_FUNCTION_TYPES = JAVA_FUNCTION_TYPES;
16
+ /** Statement node types that break a basic block (everything else coalesces). */
17
+ const CONTROL_FLOW_TYPES = new Set([
18
+ 'if_statement',
19
+ 'while_statement',
20
+ 'do_statement',
21
+ 'for_statement',
22
+ 'enhanced_for_statement',
23
+ 'switch_expression',
24
+ 'try_statement',
25
+ 'try_with_resources_statement',
26
+ 'synchronized_statement',
27
+ 'return_statement',
28
+ 'break_statement',
29
+ 'continue_statement',
30
+ 'throw_statement',
31
+ 'labeled_statement',
32
+ 'yield_statement',
33
+ 'block',
34
+ ]);
35
+ /** Comment node types tree-sitter-java surfaces (NOT `comment`). */
36
+ const COMMENT_TYPES = new Set(['line_comment', 'block_comment']);
37
+ const startLineOf = (n) => n.startPosition.row + 1;
38
+ const endLineOf = (n) => n.endPosition.row + 1;
39
+ const isComment = (n) => COMMENT_TYPES.has(n.type);
40
+ /**
41
+ * Per-function Java walk state. One instance per function so the
42
+ * {@link ControlFlowContext}, exception-handler stack, and labeled-block frame
43
+ * bookkeeping are scoped to that function and never leak across functions.
44
+ */
45
+ class JavaCfgWalk {
46
+ builder;
47
+ harvest;
48
+ cfc = new control_flow_context_js_1.ControlFlowContext();
49
+ /** Stack of exception-handler entry blocks (catch/finally) a `throw` jumps to. */
50
+ handlers = [];
51
+ /** Label(s) pending attachment to the NEXT pushed loop/switch frame. */
52
+ pendingLabels = [];
53
+ constructor(builder, harvest) {
54
+ this.builder = builder;
55
+ this.harvest = harvest;
56
+ }
57
+ /** Statements of a block node, ignoring comments. */
58
+ statementsOf(block) {
59
+ return block.namedChildren.filter((c) => !isComment(c));
60
+ }
61
+ /** The `body` block of a node (field, or the first `block` child). */
62
+ bodyBlockOf(node) {
63
+ return node.childForFieldName('body') ?? node.namedChildren.find((c) => c.type === 'block');
64
+ }
65
+ /** Strip a `parenthesized_expression` wrapper (Java `if`/`while` conditions). */
66
+ unwrapParen(node) {
67
+ if (node.type === 'parenthesized_expression') {
68
+ const inner = node.namedChildren.find((c) => !isComment(c));
69
+ if (inner)
70
+ return inner;
71
+ }
72
+ return node;
73
+ }
74
+ /** Visit a body that may be a `block` or a single statement. */
75
+ visitBody(node) {
76
+ return this.builder.withNesting(() => {
77
+ if (!node)
78
+ return null;
79
+ if (node.type === 'block')
80
+ return this.visitSeq(this.statementsOf(node));
81
+ return this.visitStmt(node);
82
+ });
83
+ }
84
+ /** Wire a sequence of statements, coalescing straight-line runs into blocks. */
85
+ visitSeq(stmts) {
86
+ return this.builder.withNesting(() => {
87
+ let entry;
88
+ let dangling = [];
89
+ let openSimple;
90
+ for (const stmt of stmts) {
91
+ if (this.breaksBlock(stmt)) {
92
+ openSimple = undefined; // close any open straight-line block
93
+ const res = this.visitStmt(stmt);
94
+ if (res === null)
95
+ continue; // transparent (empty nested block)
96
+ if (entry === undefined)
97
+ entry = res.entry;
98
+ else
99
+ this.builder.connect(dangling, res.entry, 'seq');
100
+ dangling = [...res.exits];
101
+ }
102
+ else {
103
+ if (openSimple === undefined) {
104
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
105
+ if (entry === undefined)
106
+ entry = idx;
107
+ else
108
+ this.builder.connect(dangling, idx, 'seq');
109
+ openSimple = idx;
110
+ dangling = [idx];
111
+ }
112
+ else {
113
+ this.builder.extendBlock(openSimple, endLineOf(stmt), stmt.text, this.harvest.facts(stmt));
114
+ }
115
+ }
116
+ }
117
+ if (entry === undefined)
118
+ return null;
119
+ return { entry, exits: dangling };
120
+ });
121
+ }
122
+ /**
123
+ * Whether a statement breaks the current straight-line block. A
124
+ * `switch_expression` breaks only when it is a STATEMENT switch (a value-
125
+ * position switch used directly inside a `block` coalesces). A
126
+ * `local_variable_declaration` whose value is a modelable value-position switch
127
+ * (`var x = switch (…) {…}`, #2207) also breaks — `visitStmt` then models the
128
+ * arms as control flow instead of collapsing the decl to one inline block.
129
+ */
130
+ breaksBlock(stmt) {
131
+ if (stmt.type === 'local_variable_declaration') {
132
+ const v = this.directValue(stmt);
133
+ return v !== undefined && this.isModelableValueBranch(v);
134
+ }
135
+ if (!CONTROL_FLOW_TYPES.has(stmt.type))
136
+ return false;
137
+ if (stmt.type === 'switch_expression')
138
+ return this.isStatementSwitch(stmt);
139
+ return true;
140
+ }
141
+ /** Dispatch one statement to its handler. Non-null except for empty blocks. */
142
+ visitStmt(stmt) {
143
+ switch (stmt.type) {
144
+ case 'local_variable_declaration': {
145
+ // `var x = switch (k) { … }` (#2207): the value is a value-position
146
+ // branch — model it as control flow and bind the result on the rejoin,
147
+ // instead of collapsing the whole decl to one block.
148
+ const value = this.directValue(stmt);
149
+ if (value && this.isModelableValueBranch(value))
150
+ return this.visitBindBranch(stmt, value);
151
+ return this.visitSimple(stmt);
152
+ }
153
+ case 'if_statement':
154
+ return this.visitIf(stmt);
155
+ case 'while_statement':
156
+ return this.visitWhile(stmt);
157
+ case 'do_statement':
158
+ return this.visitDoWhile(stmt);
159
+ case 'for_statement':
160
+ return this.visitFor(stmt);
161
+ case 'enhanced_for_statement':
162
+ return this.visitForEach(stmt);
163
+ case 'switch_expression':
164
+ return this.visitSwitch(stmt);
165
+ case 'try_statement':
166
+ case 'try_with_resources_statement':
167
+ return this.visitTry(stmt);
168
+ case 'synchronized_statement':
169
+ return this.visitSynchronized(stmt);
170
+ case 'return_statement':
171
+ return this.visitReturn(stmt);
172
+ case 'throw_statement':
173
+ return this.visitThrow(stmt);
174
+ case 'break_statement':
175
+ return this.visitBreak(stmt);
176
+ case 'continue_statement':
177
+ return this.visitContinue(stmt);
178
+ case 'labeled_statement':
179
+ return this.visitLabeled(stmt);
180
+ case 'yield_statement':
181
+ return this.visitYield(stmt);
182
+ case 'block':
183
+ return this.visitSeq(this.statementsOf(stmt));
184
+ default:
185
+ return this.visitSimple(stmt);
186
+ }
187
+ }
188
+ visitSimple(stmt) {
189
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
190
+ return { entry: idx, exits: [idx] };
191
+ }
192
+ visitReturn(stmt) {
193
+ // `return switch (k) { … };` (#2207): the returned value is a value-position
194
+ // branch — model it as control flow, with each arm returning (its value IS
195
+ // the function result), threading every active finalizer per arm.
196
+ const branch = stmt.namedChildren.find((c) => !isComment(c));
197
+ if (branch && this.isModelableValueBranch(branch)) {
198
+ const res = this.visitBranchExpr(branch);
199
+ const finalizers = this.cfc.finalizersForReturn();
200
+ for (const ex of res.exits) {
201
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, ex, finalizers, this.builder.exitIndex, 'return');
202
+ }
203
+ return { entry: res.entry, exits: [] };
204
+ }
205
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
206
+ // A return crosses EVERY active finalizer (finally / try-with-resources /
207
+ // synchronized) before EXIT.
208
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, idx, this.cfc.finalizersForReturn(), this.builder.exitIndex, 'return');
209
+ return { entry: idx, exits: [] };
210
+ }
211
+ visitThrow(stmt) {
212
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
213
+ this.builder.edge(idx, this.currentHandler(), 'throw');
214
+ return { entry: idx, exits: [] };
215
+ }
216
+ /**
217
+ * `yield e;` (switch-expression arm value) — produces the switch-expression's
218
+ * value and EXITS the enclosing switch (it does NOT fall through to the next
219
+ * colon group). Modeled as a terminator that jumps to the switch exit, threading
220
+ * any finalizer it crosses — exactly like a `break` out of the switch but
221
+ * carrying the yielded value's def/use facts. (Reusing the statement `visitSwitch`
222
+ * for a value-position colon switch would otherwise wire a spurious `fallthrough`
223
+ * edge between yield-terminated arms — #2211 review.)
224
+ */
225
+ visitYield(stmt) {
226
+ const idx = this.builder.newBlock(startLineOf(stmt), endLineOf(stmt), stmt.text, 'normal', this.harvest.facts(stmt));
227
+ const res = this.cfc.resolveYield();
228
+ const { target, finalizers } = res ?? {
229
+ target: this.builder.exitIndex,
230
+ finalizers: this.cfc.finalizersForReturn(),
231
+ };
232
+ (0, control_flow_context_js_1.wireJumpThroughFinalizers)(this.builder, idx, finalizers, target, 'break');
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
+ /** The trailing label `identifier` of a `break`/`continue`, if any. */
258
+ jumpLabel(stmt) {
259
+ const id = stmt.namedChildren.find((c) => c.type === 'identifier');
260
+ return id?.text;
261
+ }
262
+ /**
263
+ * `label: <statement>` — the label names the construct it directly wraps. For a
264
+ * loop/switch we forward the label so its pushed frame carries it (`break
265
+ * outer;` then resolves to it); for any other labeled statement we push a
266
+ * labeled-block frame around its body so `break label;` reaches the join after.
267
+ */
268
+ visitLabeled(stmt) {
269
+ const labelNode = stmt.namedChildren.find((c) => c.type === 'identifier');
270
+ const label = labelNode?.text;
271
+ const body = stmt.namedChildren.find((c) => c.id !== labelNode?.id && !isComment(c)) ?? null;
272
+ if (!body || label === undefined)
273
+ return this.visitBody(body);
274
+ if (this.isLoopOrSwitchStatement(body)) {
275
+ // Forward the label to the loop/switch frame this statement pushes.
276
+ this.pendingLabels = [...this.pendingLabels, label];
277
+ return this.visitStmt(body);
278
+ }
279
+ // Labeled non-loop (`blk: { … break blk; … }`) — a break-to-label join after
280
+ // the body; an unlabeled break never matches it.
281
+ const joinBlock = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
282
+ this.cfc.pushLabeledBlock(joinBlock, [label]);
283
+ const res = this.visitBody(body);
284
+ this.cfc.pop();
285
+ if (res)
286
+ this.builder.connect(res.exits, joinBlock, 'seq');
287
+ const entry = res?.entry ?? joinBlock;
288
+ return { entry, exits: [joinBlock] };
289
+ }
290
+ isLoopOrSwitchStatement(node) {
291
+ return (node.type === 'for_statement' ||
292
+ node.type === 'enhanced_for_statement' ||
293
+ node.type === 'while_statement' ||
294
+ node.type === 'do_statement' ||
295
+ (node.type === 'switch_expression' && this.isStatementSwitch(node)));
296
+ }
297
+ /** Take and clear the labels queued by an enclosing `labeled_statement`. */
298
+ takeLabels() {
299
+ const labels = this.pendingLabels;
300
+ this.pendingLabels = [];
301
+ return labels;
302
+ }
303
+ visitIf(stmt) {
304
+ const cond = this.condOf(stmt) ?? stmt;
305
+ const condBlock = this.builder.newBlock(startLineOf(stmt), endLineOf(cond), cond.text, 'normal', this.harvest.facts(cond));
306
+ const exits = [];
307
+ const thenRes = this.visitBody(stmt.childForFieldName('consequence'));
308
+ if (thenRes) {
309
+ this.builder.edge(condBlock, thenRes.entry, 'cond-true');
310
+ exits.push(...thenRes.exits);
311
+ }
312
+ else {
313
+ exits.push(condBlock); // empty then — true path falls through
314
+ }
315
+ // No `else_clause` wrapper in Java: `alternative` is the else body or the
316
+ // nested `if_statement` of an `else if` chain directly.
317
+ const elseNode = stmt.childForFieldName('alternative');
318
+ if (elseNode) {
319
+ const elseRes = this.visitBody(elseNode);
320
+ if (elseRes) {
321
+ this.builder.edge(condBlock, elseRes.entry, 'cond-false');
322
+ exits.push(...elseRes.exits);
323
+ }
324
+ else {
325
+ exits.push(condBlock);
326
+ }
327
+ }
328
+ else {
329
+ exits.push(condBlock); // no else — false path falls through to the join
330
+ }
331
+ return { entry: condBlock, exits: [...new Set(exits)] };
332
+ }
333
+ /** The (paren-unwrapped) condition expression of an if/while/do/synchronized. */
334
+ condOf(stmt) {
335
+ const cond = stmt.childForFieldName('condition');
336
+ return cond ? this.unwrapParen(cond) : undefined;
337
+ }
338
+ visitWhile(stmt) {
339
+ const labels = this.takeLabels();
340
+ const cond = this.condOf(stmt) ?? stmt;
341
+ const header = this.builder.newBlock(startLineOf(stmt), endLineOf(cond), cond.text, 'normal', this.harvest.facts(cond));
342
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
343
+ this.cfc.pushLoop(header, loopExit, labels);
344
+ const body = this.visitBody(this.bodyBlockOf(stmt));
345
+ this.cfc.pop();
346
+ if (body) {
347
+ this.builder.edge(header, body.entry, 'cond-true');
348
+ this.builder.connect(body.exits, header, 'loop-back');
349
+ }
350
+ else {
351
+ this.builder.edge(header, header, 'loop-back'); // empty body re-tests
352
+ }
353
+ // Always emit the structural exit edge — even `while (true)` keeps EXIT
354
+ // reverse-reachable for the post-dominator / CDG pass.
355
+ this.builder.edge(header, loopExit, 'cond-false');
356
+ return { entry: header, exits: [loopExit] };
357
+ }
358
+ visitDoWhile(stmt) {
359
+ const labels = this.takeLabels();
360
+ const cond = this.condOf(stmt) ?? stmt;
361
+ const condBlock = this.builder.newBlock(startLineOf(cond), endLineOf(cond), cond.text, 'normal', this.harvest.facts(cond));
362
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
363
+ this.cfc.pushLoop(condBlock, loopExit, labels);
364
+ const body = this.visitBody(this.bodyBlockOf(stmt));
365
+ this.cfc.pop();
366
+ const backTarget = body ? body.entry : condBlock;
367
+ if (body)
368
+ this.builder.connect(body.exits, condBlock, 'seq');
369
+ this.builder.edge(condBlock, backTarget, 'loop-back'); // cond true → run body again
370
+ this.builder.edge(condBlock, loopExit, 'cond-false');
371
+ return { entry: backTarget, exits: [loopExit] };
372
+ }
373
+ visitFor(stmt) {
374
+ const labels = this.takeLabels();
375
+ const init = stmt.childForFieldName('init');
376
+ const cond = stmt.childForFieldName('condition');
377
+ const incr = stmt.childForFieldName('update');
378
+ const header = this.builder.newBlock(startLineOf(stmt), cond ? endLineOf(cond) : startLineOf(stmt), cond ? cond.text : 'for(;;)', 'normal', cond ? this.harvest.facts(cond) : undefined);
379
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
380
+ let incrBlock = header;
381
+ if (incr) {
382
+ incrBlock = this.builder.newBlock(startLineOf(incr), endLineOf(incr), incr.text, 'normal', this.harvest.facts(incr));
383
+ this.builder.edge(incrBlock, header, 'loop-back');
384
+ }
385
+ this.cfc.pushLoop(incrBlock, loopExit, labels);
386
+ const body = this.visitBody(this.bodyBlockOf(stmt));
387
+ this.cfc.pop();
388
+ if (body) {
389
+ this.builder.edge(header, body.entry, 'cond-true');
390
+ this.builder.connect(body.exits, incrBlock, incr ? 'seq' : 'loop-back');
391
+ }
392
+ else {
393
+ this.builder.edge(header, incrBlock, 'cond-true');
394
+ if (!incr)
395
+ this.builder.edge(header, header, 'loop-back');
396
+ }
397
+ // Structural exit edge — `for (;;) {}` (no condition) still keeps EXIT
398
+ // reverse-reachable so CDG is not silently skipped for the function.
399
+ this.builder.edge(header, loopExit, 'cond-false');
400
+ let entry = header;
401
+ if (init) {
402
+ const initBlock = this.builder.newBlock(startLineOf(init), endLineOf(init), init.text, 'normal', this.harvest.facts(init));
403
+ this.builder.edge(initBlock, header, 'seq');
404
+ entry = initBlock;
405
+ }
406
+ return { entry, exits: [loopExit] };
407
+ }
408
+ visitForEach(stmt) {
409
+ const labels = this.takeLabels();
410
+ // Header text is SYNTHESIZED, so facts come from the name/value nodes
411
+ // directly (the loop variable is a def, the iterated expression a use).
412
+ const header = this.builder.newBlock(startLineOf(stmt), startLineOf(stmt), this.forEachHeaderText(stmt), 'normal', this.harvest.forEachHeadFacts(stmt));
413
+ const loopExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
414
+ this.cfc.pushLoop(header, loopExit, labels);
415
+ const body = this.visitBody(this.bodyBlockOf(stmt));
416
+ this.cfc.pop();
417
+ if (body) {
418
+ this.builder.edge(header, body.entry, 'cond-true');
419
+ this.builder.connect(body.exits, header, 'loop-back');
420
+ }
421
+ else {
422
+ this.builder.edge(header, header, 'loop-back');
423
+ }
424
+ this.builder.edge(header, loopExit, 'cond-false');
425
+ return { entry: header, exits: [loopExit] };
426
+ }
427
+ forEachHeaderText(stmt) {
428
+ const name = stmt.childForFieldName('name')?.text ?? '';
429
+ const value = stmt.childForFieldName('value')?.text ?? '';
430
+ return name || value ? `for(${name} : ${value})` : 'for(… : …)';
431
+ }
432
+ /**
433
+ * `synchronized (obj) body` — the monitor release runs on BOTH normal AND
434
+ * exception exit (deterministic finalizer), exactly like a `finally`. Modeled
435
+ * as a synthesized finalizer block so a `return`/`break`/`continue` crossing it
436
+ * threads through and gets a `finally-*` completion edge.
437
+ */
438
+ visitSynchronized(stmt) {
439
+ const bodyNode = this.bodyBlockOf(stmt) ?? null;
440
+ const lockExpr = this.synchronizedLock(stmt);
441
+ const releaseFacts = lockExpr ? this.harvest.facts(lockExpr) : undefined;
442
+ return this.buildProtectedSynthetic(bodyNode, stmt, 'release', releaseFacts);
443
+ }
444
+ /** The locked expression of a `synchronized (expr) {…}` (paren-unwrapped). */
445
+ synchronizedLock(stmt) {
446
+ const body = stmt.childForFieldName('body');
447
+ const expr = stmt.namedChildren.find((c) => c.id !== body?.id && !isComment(c));
448
+ return expr ? this.unwrapParen(expr) : undefined;
449
+ }
450
+ /** Whether a `switch_expression` is used as a STATEMENT (vs an expression value). */
451
+ isStatementSwitch(node) {
452
+ const p = node.parent;
453
+ if (!p)
454
+ return false;
455
+ // A statement-position switch is a direct child of a `block`, a classic
456
+ // group, or an arrow rule body; an expression-value switch is nested under a
457
+ // declaration / return / assignment / argument and is NOT one of these.
458
+ return (p.type === 'block' ||
459
+ p.type === 'switch_block_statement_group' ||
460
+ p.type === 'switch_rule' ||
461
+ p.type === 'labeled_statement');
462
+ }
463
+ visitSwitch(stmt) {
464
+ const labels = this.takeLabels();
465
+ const value = this.condOf(stmt) ?? stmt;
466
+ const dispatch = this.builder.newBlock(startLineOf(stmt), endLineOf(value), value.text, 'normal', this.harvest.facts(value));
467
+ const switchExit = this.builder.newBlock(endLineOf(stmt), endLineOf(stmt), '');
468
+ this.cfc.pushSwitch(switchExit, labels);
469
+ const body = stmt.childForFieldName('body');
470
+ // A `switch_block` holds `switch_block_statement_group`s (classic, fall
471
+ // through) OR `switch_rule`s (arrow, no fallthrough); never both.
472
+ const groups = body
473
+ ? body.namedChildren.filter((c) => c.type === 'switch_block_statement_group' || c.type === 'switch_rule')
474
+ : [];
475
+ // Each group's case-test expression(s) evaluate before the body runs —
476
+ // harvest their uses (and any pattern binding as a may-def) onto the dispatch
477
+ // block, one record per test, CONDITIONALLY (a later case test only runs when
478
+ // earlier cases didn't match).
479
+ for (const g of groups) {
480
+ for (const test of this.caseTests(g)) {
481
+ this.builder.attachFacts(dispatch, this.harvest.factsConditional(test));
482
+ }
483
+ }
484
+ const groupResults = groups.map((g) => this.visitSeq(this.caseStatements(g)));
485
+ const hasDefault = groups.some((g) => this.caseIsDefault(g));
486
+ const arrowForm = groups.some((g) => g.type === 'switch_rule');
487
+ const entryOf = new Array(groups.length);
488
+ let after = switchExit;
489
+ for (let i = groups.length - 1; i >= 0; i--) {
490
+ entryOf[i] = groupResults[i]?.entry ?? after;
491
+ after = entryOf[i];
492
+ }
493
+ for (let i = 0; i < groups.length; i++) {
494
+ this.builder.edge(dispatch, entryOf[i], 'switch-case');
495
+ }
496
+ if (!hasDefault)
497
+ this.builder.edge(dispatch, switchExit, 'switch-case'); // no-match path
498
+ // Classic colon groups FALL THROUGH to the next group when not break/return-
499
+ // terminated; arrow rules NEVER fall through (each body rejoins after).
500
+ for (let i = 0; i < groups.length; i++) {
501
+ const res = groupResults[i];
502
+ if (!res)
503
+ continue;
504
+ if (groups[i].type === 'switch_rule') {
505
+ this.builder.connect(res.exits, switchExit, 'seq');
506
+ }
507
+ else {
508
+ const fallTarget = i + 1 < groups.length ? entryOf[i + 1] : switchExit;
509
+ this.builder.connect(res.exits, fallTarget, 'fallthrough');
510
+ }
511
+ }
512
+ void arrowForm;
513
+ this.cfc.pop();
514
+ return { entry: dispatch, exits: [switchExit] };
515
+ }
516
+ /** A switch group/rule's body statements (everything but its `switch_label`). */
517
+ caseStatements(group) {
518
+ return group.namedChildren.filter((c) => c.type !== 'switch_label' && !isComment(c));
519
+ }
520
+ /** The case-test value expressions of a group (a `switch_label`'s values). */
521
+ caseTests(group) {
522
+ const label = group.namedChildren.find((c) => c.type === 'switch_label');
523
+ if (!label)
524
+ return [];
525
+ return label.namedChildren.filter((c) => !isComment(c));
526
+ }
527
+ /** A `default:` group has a `switch_label` with no value children. */
528
+ caseIsDefault(group) {
529
+ const label = group.namedChildren.find((c) => c.type === 'switch_label');
530
+ if (!label)
531
+ return false;
532
+ return label.namedChildren.filter((c) => !isComment(c)).length === 0;
533
+ }
534
+ // ── value-position branches (#2207) ─────────────────────────────────────────
535
+ /**
536
+ * The direct value of a `local_variable_declaration` with a SINGLE declarator:
537
+ * its `variable_declarator`'s `value` field (`var x = <value>`). Returns
538
+ * undefined for a multi-declarator decl (`int a = …, b = …;`) — modeling those
539
+ * arm-by-arm is out of scope, so they coalesce inline. The DIRECT value only:
540
+ * `var x = f(switch …)` yields the call, not the nested switch, so an
541
+ * argument-position switch stays inline.
542
+ */
543
+ directValue(stmt) {
544
+ const declarators = stmt.namedChildren.filter((c) => c.type === 'variable_declarator');
545
+ if (declarators.length !== 1)
546
+ return undefined;
547
+ return declarators[0].childForFieldName('value') ?? undefined;
548
+ }
549
+ /**
550
+ * Whether `node` is a value-position branch worth modeling as control flow
551
+ * (#2207): a `switch_expression` with ≥2 case groups (a real dispatch). Java has
552
+ * no value-position `if` (the ternary `?:` is deliberately excluded, like elvis
553
+ * in Kotlin), so `switch` is the only carrier.
554
+ */
555
+ isModelableValueBranch(node) {
556
+ if (node.type !== 'switch_expression')
557
+ return false;
558
+ const body = node.childForFieldName('body');
559
+ if (!body)
560
+ return false;
561
+ const groups = body.namedChildren.filter((c) => c.type === 'switch_block_statement_group' || c.type === 'switch_rule');
562
+ return groups.length >= 2;
563
+ }
564
+ /**
565
+ * Model a value-position `switch` as control flow regardless of position —
566
+ * {@link visitSeq}'s `isStatementSwitch` gate keeps value-position switches
567
+ * inline, so call {@link visitSwitch} directly here.
568
+ */
569
+ visitBranchExpr(node) {
570
+ return this.visitSwitch(node);
571
+ }
572
+ /**
573
+ * `var x = switch (k) { … }` (#2207): visit the switch as control flow, then
574
+ * rejoin its arms at a facts-only continuation carrying ONLY the bound name's
575
+ * def (the subject + arm-value uses are already harvested onto the switch's
576
+ * blocks). The arms are now control-dependent on the dispatch, and `x` is
577
+ * defined at the join — mirrors the Kotlin / Rust value-position binding.
578
+ */
579
+ visitBindBranch(stmt, branch) {
580
+ const res = this.visitBranchExpr(branch);
581
+ const cont = this.builder.newBlock(startLineOf(stmt), startLineOf(stmt), '', 'normal', this.harvest.bindingDefFacts(stmt));
582
+ this.builder.connect(res.exits, cont, 'seq');
583
+ return { entry: res.entry, exits: [cont] };
584
+ }
585
+ /**
586
+ * try / catch / finally / try-with-resources. The `resources` of a
587
+ * try-with-resources auto-close on BOTH normal and exception exit — exactly
588
+ * `finally`-shaped — so we synthesize a close finalizer that wraps an explicit
589
+ * `finally` (if any).
590
+ */
591
+ visitTry(stmt) {
592
+ const bodyNode = stmt.childForFieldName('body');
593
+ const catchClauses = [];
594
+ let finallyClause;
595
+ for (let i = 0; i < stmt.namedChildCount; i++) {
596
+ const c = stmt.namedChild(i);
597
+ if (c?.type === 'catch_clause')
598
+ catchClauses.push(c);
599
+ else if (c?.type === 'finally_clause')
600
+ finallyClause = c;
601
+ }
602
+ const finallyBody = finallyClause?.namedChildren.find((c) => c.type === 'block');
603
+ // try-with-resources: the resource close is a deterministic finalizer that
604
+ // runs after the body and (if present) before the explicit finally. Model it
605
+ // as a synthesized close block prepended to the finalizer chain.
606
+ const resources = this.tryResources(stmt);
607
+ return this.buildProtected(bodyNode ?? null, catchClauses, finallyBody ?? null, resources, stmt);
608
+ }
609
+ /** The `resource` nodes of a try-with-resources, or [] for a plain try. */
610
+ tryResources(stmt) {
611
+ const spec = stmt.childForFieldName('resources');
612
+ if (!spec)
613
+ return [];
614
+ return spec.namedChildren.filter((c) => c.type === 'resource');
615
+ }
616
+ /**
617
+ * Shared try/catch/finally builder. `catchClauses` may be empty; `finallyBody`
618
+ * is the explicit finally's `block` (or null); `resources` are try-with-
619
+ * resources resources (auto-close = an implicit finally that runs first).
620
+ *
621
+ * Models the TS/C# `visitTry` semantics: normal completion of try AND catch
622
+ * flow through the finalizers; a throw in the protected region routes to the
623
+ * handler; early exits crossing a finalizer thread through it (`finally-*`
624
+ * completion edges). The resource close finalizer (synthesized) and the
625
+ * explicit finally are chained so a crossing jump threads BOTH.
626
+ */
627
+ buildProtected(bodyNode, catchClauses, finallyBody, resources, span) {
628
+ // Innermost finalizer first on the active stack = outermost lexically. The
629
+ // resource close runs BEFORE the explicit finally, so push the explicit
630
+ // finally first (deeper) then the close (shallower / nearer the jump).
631
+ const explicitFinRes = finallyBody ? this.visitSeq(this.statementsOf(finallyBody)) : null;
632
+ const explicitFrame = explicitFinRes ? this.cfc.pushFinalizer(explicitFinRes.entry) : null;
633
+ // Synthesized resource-close finalizer (a single block; close()/AutoCloseable
634
+ // has no AST node), carrying the resource bindings' facts as uses.
635
+ let closeRes = null;
636
+ let closeFrame = null;
637
+ if (resources.length > 0) {
638
+ const closeFacts = this.harvest.resourceCloseFacts(resources);
639
+ const closeBlock = this.builder.newBlock(endLineOf(span), endLineOf(span), 'close', 'normal', closeFacts);
640
+ closeRes = { entry: closeBlock, exits: [closeBlock] };
641
+ // The close's normal exit flows into the explicit finally (if any).
642
+ if (explicitFinRes)
643
+ this.builder.edge(closeBlock, explicitFinRes.entry, 'seq');
644
+ closeFrame = this.cfc.pushFinalizer(closeRes.entry);
645
+ }
646
+ // The entry of the finalizer chain (what normal/exception completion runs
647
+ // first): close (if any) else explicit finally.
648
+ const finalizerEntry = closeRes?.entry ?? explicitFinRes?.entry;
649
+ // The set of normal exits AFTER the whole finalizer chain runs.
650
+ const finalizerExits = explicitFinRes?.exits ?? closeRes?.exits ?? null;
651
+ // Build each catch handler.
652
+ const catchEntries = [];
653
+ const catchExits = [];
654
+ let firstCatchEntry;
655
+ for (const clause of catchClauses) {
656
+ const clauseBody = clause.childForFieldName('body');
657
+ if (finalizerEntry !== undefined)
658
+ this.handlers.push(finalizerEntry);
659
+ let res = clauseBody ? this.visitSeq(this.statementsOf(clauseBody)) : null;
660
+ if (finalizerEntry !== undefined)
661
+ this.handlers.pop();
662
+ if (res === null) {
663
+ // Empty `catch {}` still catches — synthesize one block so exception flow
664
+ // lands somewhere and the post-try code stays reachable.
665
+ const idx = this.builder.newBlock(startLineOf(clause), endLineOf(clause), '');
666
+ res = { entry: idx, exits: [idx] };
667
+ }
668
+ const paramFacts = this.harvest.catchParamFacts(clause);
669
+ if (paramFacts) {
670
+ const paramBlock = this.builder.newBlock(startLineOf(clause), startLineOf(clause), '', 'normal', paramFacts);
671
+ this.builder.edge(paramBlock, res.entry, 'seq');
672
+ res = { entry: paramBlock, exits: res.exits };
673
+ }
674
+ catchEntries.push(res.entry);
675
+ catchExits.push(...res.exits);
676
+ if (firstCatchEntry === undefined)
677
+ firstCatchEntry = res.entry;
678
+ }
679
+ // Handler for the try body: first catch if present, else the finalizer
680
+ // chain, else the outer handler.
681
+ const tryHandler = firstCatchEntry ?? finalizerEntry ?? this.currentHandler();
682
+ const protectedStart = this.builder.blockCount;
683
+ this.handlers.push(tryHandler);
684
+ const bodyRes = bodyNode
685
+ ? bodyNode.type === 'block'
686
+ ? this.visitSeq(this.statementsOf(bodyNode))
687
+ : this.visitStmt(bodyNode)
688
+ : null;
689
+ this.handlers.pop();
690
+ if (catchClauses.length > 0 || finalizerEntry !== undefined) {
691
+ for (let b = protectedStart; b < this.builder.blockCount; b++) {
692
+ this.builder.edge(b, tryHandler, 'throw');
693
+ }
694
+ }
695
+ // Pop the finalizer frames (inner→outer) and drain their pending legs.
696
+ if (closeFrame && closeRes) {
697
+ this.cfc.pop();
698
+ (0, control_flow_context_js_1.drainFinalizerPending)(this.builder, closeFrame, closeRes.exits);
699
+ }
700
+ if (explicitFrame && explicitFinRes) {
701
+ this.cfc.pop();
702
+ (0, control_flow_context_js_1.drainFinalizerPending)(this.builder, explicitFrame, explicitFinRes.exits);
703
+ }
704
+ const exits = [];
705
+ if (finalizerEntry !== undefined) {
706
+ if (bodyRes)
707
+ this.builder.connect(bodyRes.exits, finalizerEntry, 'seq');
708
+ for (const e of catchExits)
709
+ this.builder.edge(e, finalizerEntry, 'seq');
710
+ if (finalizerExits)
711
+ exits.push(...finalizerExits);
712
+ // No catch → an exception re-propagates out after the finalizers run.
713
+ if (catchClauses.length === 0 && finalizerExits) {
714
+ this.builder.connect(finalizerExits, this.currentHandler(), 'throw');
715
+ }
716
+ }
717
+ else {
718
+ if (bodyRes)
719
+ exits.push(...bodyRes.exits);
720
+ exits.push(...catchExits);
721
+ }
722
+ const entry = bodyRes?.entry ?? finalizerEntry ?? catchEntries[0];
723
+ if (entry === undefined) {
724
+ void span;
725
+ return null;
726
+ }
727
+ return { entry, exits: [...new Set(exits)] };
728
+ }
729
+ /**
730
+ * `synchronized`: a protected body whose finalizer is a SYNTHESIZED single
731
+ * block (Monitor exit has no AST node). The finalizer runs on both normal and
732
+ * exception exit, and crossing jumps thread through it.
733
+ */
734
+ buildProtectedSynthetic(bodyNode, span, text, finalizerFacts) {
735
+ const finalizerBlock = this.builder.newBlock(endLineOf(span), endLineOf(span), text, 'normal', finalizerFacts ?? undefined);
736
+ const finRes = { entry: finalizerBlock, exits: [finalizerBlock] };
737
+ const finFrame = this.cfc.pushFinalizer(finRes.entry);
738
+ const protectedStart = this.builder.blockCount;
739
+ // The finalizer IS the handler — an exception in the body still runs the
740
+ // release, which then re-propagates to the outer handler.
741
+ this.handlers.push(finRes.entry);
742
+ const bodyRes = bodyNode
743
+ ? bodyNode.type === 'block'
744
+ ? this.visitSeq(this.statementsOf(bodyNode))
745
+ : this.visitStmt(bodyNode)
746
+ : null;
747
+ this.handlers.pop();
748
+ for (let b = protectedStart; b < this.builder.blockCount; b++) {
749
+ this.builder.edge(b, finRes.entry, 'throw');
750
+ }
751
+ this.cfc.pop();
752
+ (0, control_flow_context_js_1.drainFinalizerPending)(this.builder, finFrame, finRes.exits);
753
+ // Normal completion of the body flows through the finalizer; the finalizer's
754
+ // exit re-propagates an exception to the outer handler (it had no catch).
755
+ if (bodyRes)
756
+ this.builder.connect(bodyRes.exits, finRes.entry, 'seq');
757
+ this.builder.connect(finRes.exits, this.currentHandler(), 'throw');
758
+ const entry = bodyRes?.entry ?? finRes.entry;
759
+ return { entry, exits: [...finRes.exits] };
760
+ }
761
+ /** Nearest enclosing exception handler, or the function EXIT. */
762
+ currentHandler() {
763
+ return this.handlers.length ? this.handlers[this.handlers.length - 1] : this.builder.exitIndex;
764
+ }
765
+ }
766
+ /** Build the CFG for one Java function node, or `undefined` if not modelable. */
767
+ function buildFunctionCfg(fnNode, filePath) {
768
+ try {
769
+ if (!JAVA_FUNCTION_TYPES.has(fnNode.type))
770
+ return undefined;
771
+ const startLine = startLineOf(fnNode);
772
+ const endLine = endLineOf(fnNode);
773
+ const startColumn = fnNode.startPosition.column;
774
+ // The body is a `block` (field `body`) OR an expression (single-expression
775
+ // lambda `x -> expr`).
776
+ const body = fnNode.childForFieldName('body') ?? fnNode.namedChildren.find((c) => c.type === 'block');
777
+ if (!body)
778
+ return undefined; // abstract / interface method — no body
779
+ const builder = new cfg_builder_js_1.CfgBuilder(filePath, startLine, endLine, startColumn);
780
+ const harvest = new java_harvest_js_1.JavaHarvester(fnNode);
781
+ const paramFacts = harvest.paramFacts();
782
+ if (paramFacts)
783
+ builder.attachFacts(builder.entryIndex, paramFacts);
784
+ if (body.type !== 'block') {
785
+ // Single-expression lambda (`x -> expr`): one block whose value is returned.
786
+ const blk = builder.newBlock(startLineOf(body), endLineOf(body), body.text, 'normal', harvest.facts(body));
787
+ builder.edge(builder.entryIndex, blk, 'seq');
788
+ builder.edge(blk, builder.exitIndex, 'return');
789
+ return builder.finish(harvest.bindingTable());
790
+ }
791
+ const walk = new JavaCfgWalk(builder, harvest);
792
+ const res = walk.visitSeq(body.namedChildren.filter((c) => !isComment(c)));
793
+ if (!res) {
794
+ builder.edge(builder.entryIndex, builder.exitIndex, 'seq'); // empty body
795
+ return builder.finish(harvest.bindingTable());
796
+ }
797
+ builder.edge(builder.entryIndex, res.entry, 'seq');
798
+ builder.connect(res.exits, builder.exitIndex, 'seq'); // normal fall-off → EXIT
799
+ return builder.finish(harvest.bindingTable());
800
+ }
801
+ catch (err) {
802
+ // Never throw out of buildFunctionCfg — a malformed AST shape must skip only
803
+ // this one function's CFG, never drop the whole file's language group (R4).
804
+ // eslint-disable-next-line no-console
805
+ console.warn(`[cfg] Java buildFunctionCfg skipped a function in ${filePath}: ${String(err)}`);
806
+ return undefined;
807
+ }
808
+ }
809
+ /** Whether a node is a Java function this visitor builds a CFG for. */
810
+ function isFunction(node) {
811
+ return JAVA_FUNCTION_TYPES.has(node.type);
812
+ }
813
+ /** The Java CFG visitor. */
814
+ function createJavaCfgVisitor() {
815
+ return { buildFunctionCfg, isFunction };
816
+ }