cgraphx 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (680) hide show
  1. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  2. package/dist/core/code/engine/cli/analyze.js +1086 -0
  3. package/dist/core/code/engine/cli/cli-message.js +83 -0
  4. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  5. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  6. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  7. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  8. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  9. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  10. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  11. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  12. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  13. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  14. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  15. package/dist/core/code/engine/cli/status.js +156 -0
  16. package/dist/core/code/engine/cli/tool.js +384 -0
  17. package/dist/core/code/engine/config/ignore-service.js +511 -0
  18. package/dist/core/code/engine/config/supported-languages.js +17 -0
  19. package/dist/core/code/engine/core/analysis-features.js +64 -0
  20. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  21. package/dist/core/code/engine/core/git-staleness.js +180 -0
  22. package/dist/core/code/engine/core/graph/graph.js +180 -0
  23. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  24. package/dist/core/code/engine/core/graph/types.js +2 -0
  25. package/dist/core/code/engine/core/index-freshness.js +12 -0
  26. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  27. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  28. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  29. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  30. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  31. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  32. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  33. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  34. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  35. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  36. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  37. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  38. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  39. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  40. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  41. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  42. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  43. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  44. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  45. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  46. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  47. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  48. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  49. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  50. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  51. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  52. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  53. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  54. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  55. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  56. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  57. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  58. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  81. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  82. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  83. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  84. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  85. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  86. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  87. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  88. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  89. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  90. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  91. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  92. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  93. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  94. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  95. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  96. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  97. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  98. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  99. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  100. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  101. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  102. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  103. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  104. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  105. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  106. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  107. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  108. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  109. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  110. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  111. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  112. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  113. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  114. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  115. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  116. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  117. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  118. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  119. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  120. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  121. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  122. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  123. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  124. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  125. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  126. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  127. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  128. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  129. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  130. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  131. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  132. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  133. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  134. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  135. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  136. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  137. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  138. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  139. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  140. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  141. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  142. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  143. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  144. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  145. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  146. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  147. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  148. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  149. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  150. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  151. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  157. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  158. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  159. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  160. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  161. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  162. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  163. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  164. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  165. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  166. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  167. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  168. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  169. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  170. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  171. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  172. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  173. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  174. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  175. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  176. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  177. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  178. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  179. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  180. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  181. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  182. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  183. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  184. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  185. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  186. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  187. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  188. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  189. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  190. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  191. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  199. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  200. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  201. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  202. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  203. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  204. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  205. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  206. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  207. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  208. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  209. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  210. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  211. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  212. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  213. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  214. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  215. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  217. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  218. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  219. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  220. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  221. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  222. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  223. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  224. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  225. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  226. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  227. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  228. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  229. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  230. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  231. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  232. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  233. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  234. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  235. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  236. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  237. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  238. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  239. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  240. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  241. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  242. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  243. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  244. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  245. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  246. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  247. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  248. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  249. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  250. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  257. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  258. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  259. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  260. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  261. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  262. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  263. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  264. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  265. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  266. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  267. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  268. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  269. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  270. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  271. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  272. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  273. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  274. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  281. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  282. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  283. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  284. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  285. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  286. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  287. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  288. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  289. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  290. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  291. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  292. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  293. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  294. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  295. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  296. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  297. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  298. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  299. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  300. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  301. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  302. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  303. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  304. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  305. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  306. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  307. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  308. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  315. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  316. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  317. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  318. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  319. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  320. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  321. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  322. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  323. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  324. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  325. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  326. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  327. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  328. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  329. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  330. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  331. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  332. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  333. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  334. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  335. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  336. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  337. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  338. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  339. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  340. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  341. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  342. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  343. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  344. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  345. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  346. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  347. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  348. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  349. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  350. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  351. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  352. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  353. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  354. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  355. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  356. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  357. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  358. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  359. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  360. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  361. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  362. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  363. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  364. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  365. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  366. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  367. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  368. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  369. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  370. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  371. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  372. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  373. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  374. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  375. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  376. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  377. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  378. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  379. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  380. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  381. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  382. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  383. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  384. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  385. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  386. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  387. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  388. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  389. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  390. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  391. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  396. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  397. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  398. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  399. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  400. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  401. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  402. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  403. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  404. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  405. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  406. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  407. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  408. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  409. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  410. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  411. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  412. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  414. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  415. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  416. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  417. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  418. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  419. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  420. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  421. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  422. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  423. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  424. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  425. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  426. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  427. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  428. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  429. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  430. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  431. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  432. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  433. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  434. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  435. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  436. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  437. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  438. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  439. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  440. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  442. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  443. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  444. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  445. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  446. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  447. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  448. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  449. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  450. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  451. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  452. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  453. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  454. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  455. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  456. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  457. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  458. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  459. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  460. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  461. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  468. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  469. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  470. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  471. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  472. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  473. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  474. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  475. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  476. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  477. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  478. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  479. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  480. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  481. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  482. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  483. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  484. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  485. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  486. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  487. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  488. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  489. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  490. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  491. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  492. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  493. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  494. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  495. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  496. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  497. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  498. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  499. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  500. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  501. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  502. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  513. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  514. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  515. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  516. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  517. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  518. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  519. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  520. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  521. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  522. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  523. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  524. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  525. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  526. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  527. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  528. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  529. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  530. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  531. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  532. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  533. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  534. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  535. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  536. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  537. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  538. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  539. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  540. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  541. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  542. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  543. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  544. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  545. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  546. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  547. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  548. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  549. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  550. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  551. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  552. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  553. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  554. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  555. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  556. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  557. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  558. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  559. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  560. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  561. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  562. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  563. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  564. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  565. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  566. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  567. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  568. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  569. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  570. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  571. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  572. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  573. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  574. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  575. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  576. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  577. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  578. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  579. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  580. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  581. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  582. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  583. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  584. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  585. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  586. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  587. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  588. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  589. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  590. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  591. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  592. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  593. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  594. package/dist/core/code/engine/core/logger.js +339 -0
  595. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  596. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  597. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  598. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  599. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  600. package/dist/core/code/engine/lib/utils.js +121 -0
  601. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  602. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  603. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  604. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  605. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  606. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  607. package/dist/core/code/engine/storage/branch-index.js +72 -0
  608. package/dist/core/code/engine/storage/file-hash.js +95 -0
  609. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  610. package/dist/core/code/engine/storage/git.js +555 -0
  611. package/dist/core/code/engine/storage/index-lock.js +664 -0
  612. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  613. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  614. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  615. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  616. package/dist/core/code/engine/types/pipeline.js +2 -0
  617. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  618. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  619. package/dist/core/code/shared/graph/types.js +8 -0
  620. package/dist/core/code/shared/index.js +105 -0
  621. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  622. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  623. package/dist/core/code/shared/integrations/retry.js +70 -0
  624. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  625. package/dist/core/code/shared/language-detection.js +162 -0
  626. package/dist/core/code/shared/languages.js +27 -0
  627. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  628. package/dist/core/code/shared/mro-strategy.js +2 -0
  629. package/dist/core/code/shared/pipeline.js +5 -0
  630. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  631. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  632. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  633. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  634. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  635. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  636. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  637. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  638. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  639. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  640. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  641. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  642. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  643. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  644. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  645. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  646. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  647. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  648. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  649. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  650. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  651. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  652. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  653. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  654. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  655. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  656. package/dist/core/code/shared/test-helpers.js +17 -0
  657. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  658. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  659. package/dist/core/timeline/cli.d.ts.map +1 -1
  660. package/dist/core/timeline/cli.js +13 -6
  661. package/dist/core/timeline/cli.js.map +1 -1
  662. package/dist/core/timeline/debris.d.ts +20 -0
  663. package/dist/core/timeline/debris.d.ts.map +1 -0
  664. package/dist/core/timeline/debris.js +124 -0
  665. package/dist/core/timeline/debris.js.map +1 -0
  666. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  667. package/dist/core/timeline/hook-runner.js +3 -1
  668. package/dist/core/timeline/hook-runner.js.map +1 -1
  669. package/dist/core/timeline/hooks.d.ts.map +1 -1
  670. package/dist/core/timeline/hooks.js +13 -5
  671. package/dist/core/timeline/hooks.js.map +1 -1
  672. package/dist/core/timeline/installer.d.ts +2 -0
  673. package/dist/core/timeline/installer.d.ts.map +1 -1
  674. package/dist/core/timeline/installer.js +12 -0
  675. package/dist/core/timeline/installer.js.map +1 -1
  676. package/dist/core/timeline/project-root.d.ts +21 -0
  677. package/dist/core/timeline/project-root.d.ts.map +1 -0
  678. package/dist/core/timeline/project-root.js +83 -0
  679. package/dist/core/timeline/project-root.js.map +1 -0
  680. package/package.json +1 -1
@@ -0,0 +1,1096 @@
1
+ "use strict";
2
+ /**
3
+ * `emitDartScopeCaptures` — the Dart scope-capture orchestrator (mirror of
4
+ * `languages/swift/captures.ts`, adapted for tree-sitter-dart's grammar).
5
+ *
6
+ * It runs `DART_SCOPE_QUERY` for the constructs that map cleanly to a single
7
+ * node (module/class scopes, type/method/field declarations, imports), then
8
+ * synthesizes the Dart-specific streams the grammar can't express as a single
9
+ * query node:
10
+ *
11
+ * 1. Function/method/constructor SCOPES — `function_signature`/`function_body`
12
+ * are SIBLINGS, so each Function scope is synthesized to span
13
+ * `signature.start .. body.end` (composed range); a constructor's body is
14
+ * a sibling of the wrapping `method_signature`.
15
+ * 2. Receiver (`this`/`super`) + parameter + return type bindings, anchored
16
+ * inside the body so they land in the Function scope.
17
+ * 3. Arity metadata on function-like declarations.
18
+ * 4. Field type bindings (for receiver-chain resolution).
19
+ * 5. References — calls (free/member/cascade) and member reads — from Dart's
20
+ * postfix `identifier (selector …)` chains, which have no
21
+ * `call_expression` node.
22
+ * 6. Local-variable constructor/call-result type inference.
23
+ * 7. Heritage — `extends` → `@reference.inherits` (the generic
24
+ * EXTENDS-by-target-kind pre-pass); `implements`/`with` → side-effect
25
+ * `__heritage__:` import markers consumed by `emitDartHeritageEdges`
26
+ * (Dart `implements <class>` must be IMPLEMENTS regardless of the
27
+ * target's symbol kind).
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.dartScopeOwnsReceivers = dartScopeOwnsReceivers;
31
+ exports.emitDartScopeCaptures = emitDartScopeCaptures;
32
+ const ast_helpers_js_1 = require("../../utils/ast-helpers.js");
33
+ const arity_metadata_js_1 = require("./arity-metadata.js");
34
+ const receiver_binding_js_1 = require("./receiver-binding.js");
35
+ const signature_bindings_js_1 = require("./signature-bindings.js");
36
+ const query_js_1 = require("./query.js");
37
+ const extension_type_preprocess_js_1 = require("./extension-type-preprocess.js");
38
+ const cache_stats_js_1 = require("./cache-stats.js");
39
+ const constants_js_1 = require("../../constants.js");
40
+ const safe_parse_js_1 = require("../../../tree-sitter/safe-parse.js");
41
+ const heritage_marker_js_1 = require("../../utils/heritage-marker.js");
42
+ const built_ins_js_1 = require("./built-ins.js");
43
+ const callable_flow_captures_js_1 = require("../../utils/callable-flow-captures.js");
44
+ const receiver_chain_captures_js_1 = require("../../utils/receiver-chain-captures.js");
45
+ const helpers_js_1 = require("../../field-extractors/configs/helpers.js");
46
+ /**
47
+ * `LanguageProvider.scopeOwnsReceivers` for Dart — the read side of
48
+ * `dartShadowedFieldsCapture`, which is where the full rationale lives.
49
+ *
50
+ * Reads the marker rather than re-deriving anything: the names were computed at
51
+ * capture time, where the AST is, and a `CaptureMatch` carries only
52
+ * name/range/text. Kept beside the emitter so the tag string has exactly one
53
+ * producer and one consumer, both in this file's line of sight.
54
+ */
55
+ function dartScopeOwnsReceivers(match) {
56
+ const raw = match['@receiver-owner.shadowed-fields']?.text;
57
+ if (raw === undefined)
58
+ return undefined;
59
+ let parsed;
60
+ try {
61
+ parsed = JSON.parse(raw);
62
+ }
63
+ catch {
64
+ return undefined;
65
+ }
66
+ if (!Array.isArray(parsed))
67
+ return undefined;
68
+ const names = parsed.filter((name) => typeof name === 'string' && name.length > 0);
69
+ return names.length > 0 ? new Set(names) : undefined;
70
+ }
71
+ const FUNCTION_DECL_TAGS = [
72
+ '@declaration.function',
73
+ '@declaration.method',
74
+ '@declaration.constructor',
75
+ ];
76
+ const DART_CALLABLE_CAPTURE_OPTIONS = {
77
+ functionNodeTypes: new Set(['function_signature', 'function_expression']),
78
+ callNodeTypes: new Set(['selector']),
79
+ parameterListNodeTypes: new Set(['formal_parameter_list', 'arguments']),
80
+ parameterNodeTypes: new Set(['formal_parameter']),
81
+ // `initialized_identifier` covers TOP-LEVEL `var` bindings and the second and
82
+ // later declarators of a multi-name local; `static_final_declaration` covers
83
+ // top-level `final`/`const`, which parse into a different list node entirely.
84
+ // Dart wraps only the FIRST local declarator in `initialized_variable_
85
+ // definition`, so without the other two a top-level `var f = (x) => x;`, a
86
+ // `final f = …`, and the `g` of `var f = …, g = …;` all emitted no flow
87
+ // captures at all and never resolved (#2693).
88
+ bindingNodeTypes: new Set([
89
+ 'initialized_variable_definition',
90
+ 'initialized_identifier',
91
+ 'static_final_declaration',
92
+ ]),
93
+ assignmentNodeTypes: new Set(['assignment_expression']),
94
+ identifierNodeTypes: new Set(['identifier', 'type_identifier']),
95
+ // `initialized_identifier` and `static_final_declaration` are FIELDLESS, so
96
+ // the shared field-based fallback (`left`/`name`/`value`/…) decomposes
97
+ // nothing and those bindings produced no flow facts at all — the same shape
98
+ // as Kotlin's fieldless `assignment` node. Positional: first named child is
99
+ // the bound name, last is the initializer.
100
+ // `initialized_variable_definition` carries real `name:` / `value:` fields,
101
+ // so it is left to the shared path by returning undefined.
102
+ extractAssignment: (node) => {
103
+ if (node.type !== 'initialized_identifier' && node.type !== 'static_final_declaration') {
104
+ return undefined;
105
+ }
106
+ const named = node.namedChildren.filter((child) => child !== null);
107
+ if (named.length < 2)
108
+ return undefined;
109
+ return { destination: named[0], source: named[named.length - 1] };
110
+ },
111
+ lexicalFunctionOwner: (node) => dartLexicalFunctionOwner(node),
112
+ isCallNode: (node) => node.namedChild(0)?.type === 'argument_part',
113
+ extractCallCallee: (node) => dartCallableCallee(node) ?? undefined,
114
+ callSiteNode: (node) => dartCallableCallee(node) ?? undefined,
115
+ callableProtocolMethods: new Set(['call']),
116
+ };
117
+ function dartLexicalFunctionOwner(input) {
118
+ let node = input;
119
+ while (node !== null) {
120
+ if (node.type === 'function_signature' || node.type === 'function_expression')
121
+ return node;
122
+ if (node.type === 'function_body') {
123
+ const signature = node.previousNamedSibling;
124
+ if (signature?.type === 'function_signature')
125
+ return signature;
126
+ }
127
+ node = node.parent;
128
+ }
129
+ return undefined;
130
+ }
131
+ function emitDartScopeCaptures(sourceText, _filePath, cachedTree) {
132
+ // Idempotent re-application: `extractParsedFile` already preprocesses, but
133
+ // direct emitter callers (benchmarks, capture goldens) must see the same
134
+ // program the pipeline does.
135
+ const parseText = (0, extension_type_preprocess_js_1.preprocessDartExtensionTypes)(sourceText);
136
+ let tree;
137
+ if (cachedTree !== undefined && cachedTree !== null) {
138
+ tree = cachedTree;
139
+ (0, cache_stats_js_1.recordCacheHit)();
140
+ }
141
+ else {
142
+ tree = (0, safe_parse_js_1.parseSourceSafe)((0, query_js_1.getDartParser)(), parseText, undefined, {
143
+ bufferSize: (0, constants_js_1.getTreeSitterBufferSize)(parseText),
144
+ });
145
+ (0, cache_stats_js_1.recordCacheMiss)();
146
+ }
147
+ const root = tree.rootNode;
148
+ const out = [];
149
+ // A named constructor (`A.named()`) parses as ONE `constructor_signature`
150
+ // carrying multiple `name:` fields, so the `@declaration.constructor` query
151
+ // pattern matches it more than once. Each match would synthesize an
152
+ // identical-range `@scope.function`, producing duplicate scope ids that make
153
+ // `buildScopeTree` throw and the whole file get dropped. Dedup function-like
154
+ // declarations by their statement node so each is emitted exactly once.
155
+ const seenFnDeclNodes = new Set();
156
+ // Shared, per-file. Pass A (the receiver mask below) and Pass B
157
+ // (`emitDartFieldAssignmentBindings`) ask the SAME two questions of the same
158
+ // nodes — "what does this class declare as a field" and "what does this
159
+ // member body bind" — so the memo makes each answer cost one walk per node
160
+ // for the whole file instead of one per consumer.
161
+ const memo = { fieldsByClassBody: new Map(), shadowsByBody: new Map() };
162
+ // ── Pass A: query-driven scopes / declarations / imports ────────────────
163
+ for (const match of (0, query_js_1.getDartScopeQuery)().matches(root)) {
164
+ const grouped = {};
165
+ const nodeMap = {};
166
+ for (const c of match.captures) {
167
+ const tag = '@' + c.name;
168
+ grouped[tag] = (0, ast_helpers_js_1.nodeToCapture)(tag, c.node);
169
+ nodeMap[tag] = c.node;
170
+ }
171
+ if (Object.keys(grouped).length === 0)
172
+ continue;
173
+ const declTag = FUNCTION_DECL_TAGS.find((t) => grouped[t] !== undefined);
174
+ if (declTag !== undefined) {
175
+ const declNode = nodeMap[declTag];
176
+ const declKey = `${declNode.startIndex}:${declNode.endIndex}`;
177
+ if (seenFnDeclNodes.has(declKey))
178
+ continue; // dedup named-ctor double-match
179
+ seenFnDeclNodes.add(declKey);
180
+ const bodyNode = findFunctionBody(declNode);
181
+ attachArityMetadata(grouped, declNode);
182
+ // Structural receiver chain for a call whose receiver is itself an
183
+ // expression, so resolution can type it by folding over structure
184
+ // instead of re-parsing the receiver's source text. Self-gating: a
185
+ // non-call match, an absent receiver, or a chain with no nameable base
186
+ // all leave `grouped` untouched.
187
+ (0, receiver_chain_captures_js_1.synthesizeReceiverChainCapture)(grouped, nodeMap['@reference.receiver']);
188
+ out.push(grouped);
189
+ if (bodyNode !== null) {
190
+ // The READ-side half of the bare-name field discipline (#2807 review).
191
+ // Rides the SAME synthesized match as `@scope.function` so the mask
192
+ // lands on this member's Function scope; outside the `@scope.`
193
+ // namespace so `anchorCaptureFor` cannot mistake it for the anchor.
194
+ const mask = dartShadowedFieldsCapture(bodyNode, memo);
195
+ out.push({
196
+ '@scope.function': spanCapture('@scope.function', declNode, bodyNode),
197
+ ...(mask === undefined ? {} : { '@receiver-owner.shadowed-fields': mask }),
198
+ });
199
+ for (const cm of (0, receiver_binding_js_1.synthesizeDartReceiverBinding)(declNode, bodyNode))
200
+ out.push(cm);
201
+ }
202
+ for (const cm of (0, signature_bindings_js_1.synthesizeDartSignatureBindings)(declNode, bodyNode))
203
+ out.push(cm);
204
+ continue;
205
+ }
206
+ // Class fields: emit the Property declaration AND a class-scope type
207
+ // binding (so `receiver.field.method()` chains resolve the field type).
208
+ if (grouped['@declaration.property'] !== undefined &&
209
+ grouped['@declaration.name'] !== undefined) {
210
+ const propNode = nodeMap['@declaration.property'];
211
+ const fieldType = extractFieldType(propNode);
212
+ const fieldName = grouped['@declaration.name'].text;
213
+ if (fieldType !== null) {
214
+ grouped['@declaration.field-type'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.field-type', propNode, fieldType);
215
+ }
216
+ // Structural receiver chain for a call whose receiver is itself an
217
+ // expression, so resolution can type it by folding over structure
218
+ // instead of re-parsing the receiver's source text. Self-gating: a
219
+ // non-call match, an absent receiver, or a chain with no nameable base
220
+ // all leave `grouped` untouched.
221
+ (0, receiver_chain_captures_js_1.synthesizeReceiverChainCapture)(grouped, nodeMap['@reference.receiver']);
222
+ out.push(grouped);
223
+ if (fieldType !== null) {
224
+ out.push({
225
+ '@type-binding.annotation': (0, ast_helpers_js_1.nodeToCapture)('@type-binding.annotation', propNode),
226
+ '@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', propNode, fieldName),
227
+ '@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', propNode, fieldType),
228
+ });
229
+ }
230
+ else {
231
+ // No written type, so the field's type comes from the constructor its
232
+ // initializer calls (#2807). `constructor-inferred` is the weakest
233
+ // source, and the annotated branch above already returned, so an
234
+ // annotated field is untouched either way.
235
+ const callee = dartFieldConstructorCallee(nodeMap['@declaration.name']);
236
+ if (callee !== null) {
237
+ out.push({
238
+ '@type-binding.constructor': (0, ast_helpers_js_1.nodeToCapture)('@type-binding.constructor', propNode),
239
+ '@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', propNode, fieldName),
240
+ '@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', propNode, callee.text),
241
+ });
242
+ }
243
+ }
244
+ continue;
245
+ }
246
+ // Structural receiver chain for a call whose receiver is itself an
247
+ // expression, so resolution can type it by folding over structure
248
+ // instead of re-parsing the receiver's source text. Self-gating: a
249
+ // non-call match, an absent receiver, or a chain with no nameable base
250
+ // all leave `grouped` untouched.
251
+ (0, receiver_chain_captures_js_1.synthesizeReceiverChainCapture)(grouped, nodeMap['@reference.receiver']);
252
+ out.push(grouped);
253
+ }
254
+ // ── Pass B: tree-walked references, type inference, heritage ────────────
255
+ const seenReadSpans = new Set();
256
+ (0, ast_helpers_js_1.walkNamedTree)(root, (node) => {
257
+ if (node.type === 'selector') {
258
+ emitSelectorReference(node, out, seenReadSpans);
259
+ return;
260
+ }
261
+ if (node.type === 'cascade_section') {
262
+ emitCascadeReference(node, out);
263
+ return;
264
+ }
265
+ if (node.type === 'initialized_variable_definition') {
266
+ emitVarTypeBinding(node, out);
267
+ return;
268
+ }
269
+ if (node.type === 'class_definition') {
270
+ emitHeritage(node, out);
271
+ emitDartFieldAssignmentBindings(node, out, memo);
272
+ return;
273
+ }
274
+ if (node.type === 'extension_declaration') {
275
+ emitExtensionImplementsHeritage(node, out);
276
+ return;
277
+ }
278
+ });
279
+ out.push(...(0, callable_flow_captures_js_1.synthesizeCallableFlowCaptures)(root, DART_CALLABLE_CAPTURE_OPTIONS));
280
+ return out;
281
+ }
282
+ function dartCallableCallee(selector) {
283
+ if (selector.namedChild(0)?.type !== 'argument_part')
284
+ return null;
285
+ const previous = selector.previousNamedSibling;
286
+ if (previous?.type === 'identifier')
287
+ return previous;
288
+ if (previous?.type !== 'selector')
289
+ return null;
290
+ const inner = previous.namedChild(0);
291
+ return inner !== null && ASSIGNABLE_SELECTORS.has(inner.type) ? selectorName(inner) : null;
292
+ }
293
+ // ─── Function scope synthesis ───────────────────────────────────────────────
294
+ /**
295
+ * The sibling `function_body` of a declaration, or null (abstract/bodyless).
296
+ *
297
+ * The body is the next named sibling of the declaration's *statement-level*
298
+ * node. For methods/operators the `@declaration` anchor IS the `method_signature`
299
+ * (body is its sibling). For a constructor the anchor is the INNER
300
+ * `constructor_signature`, whose body is a sibling of the WRAPPING
301
+ * `method_signature` (AST: `class_body > method_signature > constructor_signature`,
302
+ * then `function_body`) — so walk up to the `method_signature` wrapper first.
303
+ * Top-level `function_signature` (parent `program`) and abstract `declaration`
304
+ * nodes are unaffected.
305
+ */
306
+ function findFunctionBody(declNode) {
307
+ // A closure literal carries its body as a CHILD (function_expression_body),
308
+ // unlike a Dart declaration whose body is the next named SIBLING. Without
309
+ // this branch the caller synthesizes no @scope.function for a closure at all,
310
+ // so a closure binding has no scope to own its callable def and can never be
311
+ // a call SOURCE (#2699 S4 — this is why Dart alone showed zero child scopes).
312
+ if (declNode.type === 'function_expression') {
313
+ const body = declNode.namedChildren.find((c) => c.type === 'function_expression_body');
314
+ return body ?? null;
315
+ }
316
+ const node = declNode.parent !== null && declNode.parent.type === 'method_signature'
317
+ ? declNode.parent
318
+ : declNode;
319
+ const next = node.nextNamedSibling;
320
+ return next !== null && next.type === 'function_body' ? next : null;
321
+ }
322
+ /** A capture whose range spans two nodes (Dart has no node wrapping both a
323
+ * signature and its sibling body). */
324
+ function spanCapture(name, startNode, endNode) {
325
+ return {
326
+ name,
327
+ range: {
328
+ startLine: startNode.startPosition.row + 1,
329
+ startCol: startNode.startPosition.column,
330
+ endLine: endNode.endPosition.row + 1,
331
+ endCol: endNode.endPosition.column,
332
+ },
333
+ text: '',
334
+ };
335
+ }
336
+ function attachArityMetadata(grouped, declNode) {
337
+ const meta = (0, arity_metadata_js_1.computeDartArityMetadata)(declNode);
338
+ if (meta.parameterCount !== undefined) {
339
+ grouped['@declaration.parameter-count'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.parameter-count', declNode, String(meta.parameterCount));
340
+ }
341
+ if (meta.requiredParameterCount !== undefined) {
342
+ grouped['@declaration.required-parameter-count'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.required-parameter-count', declNode, String(meta.requiredParameterCount));
343
+ }
344
+ if (meta.parameterTypes !== undefined) {
345
+ grouped['@declaration.parameter-types'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.parameter-types', declNode, JSON.stringify(meta.parameterTypes));
346
+ }
347
+ }
348
+ /** The declared type of a class field (`Address address = …` → `Address`). */
349
+ function extractFieldType(declNode) {
350
+ for (let i = 0; i < declNode.namedChildCount; i++) {
351
+ const c = declNode.namedChild(i);
352
+ if (c !== null && (c.type === 'type_identifier' || c.type === 'nullable_type')) {
353
+ return c.text.replace(/\?+$/, '');
354
+ }
355
+ }
356
+ return null;
357
+ }
358
+ // ─── References: calls + member reads (postfix chains) ──────────────────────
359
+ const ASSIGNABLE_SELECTORS = new Set([
360
+ 'unconditional_assignable_selector',
361
+ 'conditional_assignable_selector',
362
+ ]);
363
+ /** Last named `identifier` child of an assignable/cascade selector. */
364
+ function selectorName(inner) {
365
+ for (let i = inner.namedChildCount - 1; i >= 0; i--) {
366
+ const c = inner.namedChild(i);
367
+ if (c !== null && c.type === 'identifier')
368
+ return c;
369
+ }
370
+ return null;
371
+ }
372
+ /** Count call arguments under a `selector(argument_part(arguments(…)))`. */
373
+ function countArgs(argPart) {
374
+ const args = argPart.namedChild(0);
375
+ if (args === null)
376
+ return 0;
377
+ let n = 0;
378
+ for (let i = 0; i < args.namedChildCount; i++) {
379
+ const c = args.namedChild(i);
380
+ if (c !== null && (c.type === 'argument' || c.type === 'named_argument'))
381
+ n++;
382
+ }
383
+ return n;
384
+ }
385
+ /** Receiver text preceding a member-call/read selector (the postfix chain
386
+ * head plus any intermediate selectors): `user.address.save()` → `user.address`. */
387
+ function computeReceiverText(nameSelector) {
388
+ const selectors = [];
389
+ let cur = nameSelector.previousNamedSibling;
390
+ let head = null;
391
+ while (cur !== null) {
392
+ if (cur.type === 'selector') {
393
+ selectors.push(cur);
394
+ cur = cur.previousNamedSibling;
395
+ continue;
396
+ }
397
+ head = cur;
398
+ break;
399
+ }
400
+ if (head === null)
401
+ return null;
402
+ if (head.type !== 'identifier' && head.type !== 'this' && head.type !== 'super')
403
+ return null;
404
+ selectors.reverse();
405
+ let text = head.text;
406
+ for (const s of selectors)
407
+ text += s.text;
408
+ return text;
409
+ }
410
+ function emitSelectorReference(selector, out, seenReadSpans) {
411
+ const inner = selector.namedChild(0);
412
+ if (inner === null)
413
+ return;
414
+ // A `selector(argument_part)` is the call marker; the callee is the
415
+ // immediately-preceding sibling.
416
+ if (inner.type === 'argument_part') {
417
+ const prev = selector.previousNamedSibling;
418
+ if (prev === null)
419
+ return;
420
+ const arity = countArgs(inner);
421
+ if (prev.type === 'identifier') {
422
+ const name = prev.text;
423
+ if (built_ins_js_1.DART_BUILT_INS.has(name))
424
+ return; // legacy suppresses built-in-named calls
425
+ // Dart has no `new`: an UpperCamelCase callee is a constructor call by
426
+ // convention (types are UpperCamelCase) — tag it so `constructorCallTargetsClass`
427
+ // links `Foo()` to the Class node (the legacy DAG emits that edge even for an
428
+ // implicit constructor). A lowercase callee is an ordinary free function call.
429
+ const tag = /^[A-Z]/.test(name) ? '@reference.call.constructor' : '@reference.call.free';
430
+ out.push({
431
+ [tag]: (0, ast_helpers_js_1.nodeToCapture)(tag, prev),
432
+ '@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', prev),
433
+ '@reference.arity': (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', prev, String(arity)),
434
+ });
435
+ return;
436
+ }
437
+ if (prev.type === 'selector') {
438
+ const prevInner = prev.namedChild(0);
439
+ if (prevInner === null)
440
+ return;
441
+ if (ASSIGNABLE_SELECTORS.has(prevInner.type)) {
442
+ const nameId = selectorName(prevInner);
443
+ if (nameId === null)
444
+ return;
445
+ if (built_ins_js_1.DART_BUILT_INS.has(nameId.text))
446
+ return; // legacy suppresses built-in-named calls
447
+ const recv = computeReceiverText(prev);
448
+ const cm = {
449
+ '@reference.call.member': (0, ast_helpers_js_1.nodeToCapture)('@reference.call.member', nameId),
450
+ '@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', nameId),
451
+ '@reference.arity': (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', nameId, String(arity)),
452
+ ...(recv !== null
453
+ ? { '@reference.receiver': (0, ast_helpers_js_1.syntheticCapture)('@reference.receiver', prev, recv) }
454
+ : {}),
455
+ };
456
+ out.push(cm);
457
+ }
458
+ }
459
+ return;
460
+ }
461
+ // A member access selector that is NOT immediately followed by a call is a
462
+ // field read (`user.address` in `user.address.save()`).
463
+ if (ASSIGNABLE_SELECTORS.has(inner.type)) {
464
+ const next = selector.nextNamedSibling;
465
+ const isCall = next !== null && next.type === 'selector' && next.namedChild(0)?.type === 'argument_part';
466
+ if (isCall)
467
+ return;
468
+ const nameId = selectorName(inner);
469
+ if (nameId === null)
470
+ return;
471
+ const recv = computeReceiverText(selector);
472
+ if (recv === null)
473
+ return;
474
+ const spanKey = `${nameId.startIndex}-${nameId.endIndex}`;
475
+ if (seenReadSpans.has(spanKey))
476
+ return;
477
+ seenReadSpans.add(spanKey);
478
+ out.push({
479
+ '@reference.read.member': (0, ast_helpers_js_1.nodeToCapture)('@reference.read.member', nameId),
480
+ '@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', nameId),
481
+ '@reference.receiver': (0, ast_helpers_js_1.syntheticCapture)('@reference.receiver', selector, recv),
482
+ });
483
+ }
484
+ }
485
+ /**
486
+ * Cascade call `receiver..method(args)` — Dart's `cascade_section` holds a
487
+ * `cascade_selector` + `argument_part` as DIRECT children (no `selector`
488
+ * wrapper, so `emitSelectorReference` never sees it). The legacy DAG matches
489
+ * `(cascade_section (cascade_selector (identifier)) (argument_part))` and
490
+ * classifies cascade calls as FREE calls — mirror that for parity. A property
491
+ * cascade (`..field = x`, no `argument_part`) is not a call and is skipped.
492
+ */
493
+ function emitCascadeReference(cascade, out) {
494
+ let selectorNode = null;
495
+ let argPart = null;
496
+ for (let i = 0; i < cascade.namedChildCount; i++) {
497
+ const c = cascade.namedChild(i);
498
+ if (c === null)
499
+ continue;
500
+ if (c.type === 'cascade_selector')
501
+ selectorNode = c;
502
+ else if (c.type === 'argument_part')
503
+ argPart = c;
504
+ }
505
+ if (selectorNode === null || argPart === null)
506
+ return;
507
+ const nameId = selectorName(selectorNode);
508
+ if (nameId === null || built_ins_js_1.DART_BUILT_INS.has(nameId.text))
509
+ return;
510
+ const arity = countArgs(argPart);
511
+ out.push({
512
+ '@reference.call.free': (0, ast_helpers_js_1.nodeToCapture)('@reference.call.free', nameId),
513
+ '@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', nameId),
514
+ '@reference.arity': (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', nameId, String(arity)),
515
+ });
516
+ }
517
+ // ─── Local-variable constructor / call-result type inference ────────────────
518
+ /**
519
+ * Is `node` the callee of a construction / free call written directly at this
520
+ * position — a bare identifier whose next named sibling is a `selector`
521
+ * carrying an `argument_part` (`Outer()`)?
522
+ *
523
+ * Dart has no `new` keyword, so a constructor call and a free call are the same
524
+ * shape; the resolver decides which by looking the name up. Anything else — a
525
+ * literal, a member call, an index — is NOT this shape and is left alone rather
526
+ * than guessed at.
527
+ */
528
+ function isDirectConstruction(node) {
529
+ if (node === null || node.type !== 'identifier')
530
+ return false;
531
+ const next = node.nextNamedSibling;
532
+ return next !== null && next.type === 'selector' && next.namedChild(0)?.type === 'argument_part';
533
+ }
534
+ /** Find the callee identifier of a `var x = Callee(…)` / `await Callee(…)`
535
+ * initializer (a direct free-call / constructor); returns null for member
536
+ * calls or non-call values. */
537
+ function findDirectCallValue(initVarDef) {
538
+ const firstValue = initVarDef.childForFieldName('value');
539
+ if (firstValue === null)
540
+ return null;
541
+ if (firstValue.type === 'identifier') {
542
+ return isDirectConstruction(firstValue) ? firstValue : null;
543
+ }
544
+ if (firstValue.type === 'unary_expression' || firstValue.type === 'await_expression') {
545
+ let aw = firstValue;
546
+ if (aw.type === 'unary_expression') {
547
+ const inner = aw.namedChild(0);
548
+ if (inner === null)
549
+ return null;
550
+ aw = inner;
551
+ }
552
+ if (aw.type === 'await_expression') {
553
+ // `namedChild(0)` is the awaited callee; its next named sibling is
554
+ // `namedChild(1)`, so `isDirectConstruction` asks exactly the same
555
+ // question this branch used to spell out.
556
+ const id = aw.namedChild(0);
557
+ if (isDirectConstruction(id))
558
+ return id;
559
+ }
560
+ }
561
+ return null;
562
+ }
563
+ /**
564
+ * Callee identifier of a class field initialized by a direct constructor call —
565
+ * `var b = Outer();` / `final b = Outer();` — or `null` for anything else.
566
+ *
567
+ * Dart spells a class field as `declaration(<keyword>, initialized_identifier_list(
568
+ * initialized_identifier))`, NOT the `initialized_variable_definition` that
569
+ * `emitVarTypeBinding` handles — that is the LOCAL form. So an unannotated field
570
+ * had no type binding and could not act as a call receiver (#2807), even though
571
+ * its annotated twin resolved fine.
572
+ *
573
+ * Takes the field's own `@declaration.name` node, whose next named sibling IS
574
+ * the initializer — `initialized_identifier(<name> <value> …)`. Deliberately NOT
575
+ * a search down from the `@declaration.property` node: one `declaration` can
576
+ * hold SEVERAL declarators (`var a = X(), b = Y();`), which the query matches
577
+ * once each with the same property node, so a first-descendant search hands
578
+ * every declarator the FIRST one's initializer and types `b` as `X`.
579
+ */
580
+ function dartFieldConstructorCallee(nameNode) {
581
+ const value = nameNode.nextNamedSibling;
582
+ return isDirectConstruction(value) ? value : null;
583
+ }
584
+ function emitVarTypeBinding(initVarDef, out) {
585
+ const nameNode = initVarDef.childForFieldName('name');
586
+ if (nameNode === null)
587
+ return;
588
+ const calleeId = findDirectCallValue(initVarDef);
589
+ if (calleeId === null)
590
+ return;
591
+ out.push({
592
+ '@type-binding.constructor': (0, ast_helpers_js_1.nodeToCapture)('@type-binding.constructor', initVarDef),
593
+ '@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', initVarDef, nameNode.text),
594
+ '@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', initVarDef, calleeId.text),
595
+ });
596
+ }
597
+ // ─── Heritage ───────────────────────────────────────────────────────────────
598
+ /**
599
+ * Type an inference-typed field from a constructor call ASSIGNED to it —
600
+ * `var r; C() { r = Outer(); }` and `this.r = Outer();` (#2807).
601
+ *
602
+ * Dart is the one language here that writes a field with NO receiver prefix, so
603
+ * `r = Outer()` is syntactically identical to assigning a constructor-local. The
604
+ * discriminator is the class's own declared field set: a bare name binds only
605
+ * when the enclosing class declares it AND the enclosing member binds no name of
606
+ * its own that would shadow it (`collectDartBodyShadows` — parameters, locals,
607
+ * closure parameters, catch bindings, loop variables), which is exactly when
608
+ * Dart itself resolves `r` to the field. A `this.`-prefixed write is unambiguous
609
+ * and needs neither test.
610
+ *
611
+ * Emitted as `constructor-inferred`, the weakest source, so a field that also
612
+ * carries an annotation keeps it. The narrow `@type-binding.dart-field` marker
613
+ * rides the name node for `dartBindingScopeFor` to hoist on — the binding has to
614
+ * land on the Class scope, since the assignment sits inside a constructor's own
615
+ * Function scope where `typeOfMemberOnClass` never looks.
616
+ */
617
+ function emitDartFieldAssignmentBindings(classNode, out, memo) {
618
+ const body = (0, ast_helpers_js_1.findChild)(classNode, 'class_body');
619
+ if (body === null)
620
+ return;
621
+ // `namedChildren` allocates a fresh wrapper array on every access
622
+ // (node-tree-sitter), and the loop below walks the same list — read it once.
623
+ const members = body.namedChildren;
624
+ const fields = dartClassFieldNames(body, memo);
625
+ if (fields.size === 0)
626
+ return;
627
+ for (const member of members) {
628
+ if (member === null || member.type !== 'function_body')
629
+ continue;
630
+ // A STATIC member's body can never write this class's INSTANCE fields.
631
+ // Dart's static scope holds only the class's static members, so a bare
632
+ // `z = Outer()` inside `static void make()` binds a LIBRARY-level `z` (or is
633
+ // a compile error) — never the same-named instance field. Binding it anyway
634
+ // did not merely add an edge: the write landed on the Class scope at the
635
+ // same `constructor-inferred` strength as the constructor's own, and the
636
+ // `>=` tie-break in `scope-extractor` let it DISPLACE the correct type, so
637
+ // `z.inner()` resolved to the wrong class (#2807 review). The instance
638
+ // static-vs-instance collision TypeScript and JavaScript allow cannot arise
639
+ // in Dart — one class may not declare a static and an instance member of the
640
+ // same name — so this is the only shape the defect takes here.
641
+ //
642
+ // Grammar: every class-member body is a `function_body` whose PREVIOUS named
643
+ // sibling is a `method_signature` (method, constructor, factory, getter,
644
+ // setter, operator, `async`), and `static` is an anonymous direct child of
645
+ // that signature, ahead of the inner `*_signature` node. Detection is the
646
+ // shared `hasKeyword` on child TEXT, never `child.type === 'static'`, which
647
+ // a grammar bump silently breaks — the same rule TypeScript's
648
+ // `isStaticMethodThis` follows.
649
+ //
650
+ // A body whose signature cannot be read at all (a null or unexpected
651
+ // previous sibling — parse recovery) DECLINES to bind: staticness is
652
+ // undecidable there, and a missed field type costs an edge while a wrong one
653
+ // destroys a correct binding.
654
+ const signature = member.previousNamedSibling;
655
+ if (signature === null || signature.type !== 'method_signature')
656
+ continue;
657
+ if ((0, helpers_js_1.hasKeyword)(signature, 'static'))
658
+ continue;
659
+ // Still lazy per assignment, but the memo is now FILE-wide and shared with
660
+ // Pass A's read-side mask, which asks the same question of the same body.
661
+ // The laziness that used to matter here (87-100% of eagerly built sets were
662
+ // discarded, ~15% of total Dart emission) no longer buys much for a class
663
+ // that declares fields — Pass A has already forced those bodies — so this
664
+ // reads the memo rather than paying a second walk. It still short-circuits
665
+ // for a body whose class declares no fields, since `fields.size === 0`
666
+ // returned above before either pass touched it.
667
+ //
668
+ // Not visible to `bench/scope-capture`, which is a RATIO gate — this work is
669
+ // linear, so a constant factor leaves the ratio at 1.0.
670
+ const shadowsOf = () => dartBodyShadows(member, memo);
671
+ (0, ast_helpers_js_1.walkNamedTree)(member, (node) => {
672
+ if (node.type !== 'assignment_expression')
673
+ return;
674
+ const target = node.namedChild(0);
675
+ if (target === null || target.type !== 'assignable_expression')
676
+ return;
677
+ const first = target.namedChild(0);
678
+ if (first === null)
679
+ return;
680
+ let fieldNameNode = null;
681
+ if (first.type === 'identifier' && target.namedChildCount === 1) {
682
+ // Bare `r = …`: a field only when declared here and not shadowed. The
683
+ // `fields` test runs FIRST so the shadow set is only ever built for a
684
+ // name the class actually declares.
685
+ if (!fields.has(first.text) || shadowsOf().has(first.text))
686
+ return;
687
+ fieldNameNode = first;
688
+ }
689
+ else if (first.type === 'this') {
690
+ const selector = target.namedChild(1);
691
+ if (selector === null || selector.type !== 'unconditional_assignable_selector')
692
+ return;
693
+ const nameNode = selector.namedChild(0);
694
+ if (nameNode === null || nameNode.type !== 'identifier')
695
+ return;
696
+ fieldNameNode = nameNode;
697
+ }
698
+ else {
699
+ return;
700
+ }
701
+ if (fieldNameNode === null)
702
+ return;
703
+ // RHS must be a direct construction; anything else is left alone rather
704
+ // than guessed at.
705
+ const callee = node.namedChild(1);
706
+ if (!isDirectConstruction(callee))
707
+ return;
708
+ out.push({
709
+ '@type-binding.constructor': (0, ast_helpers_js_1.nodeToCapture)('@type-binding.constructor', node),
710
+ '@type-binding.dart-field': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.dart-field', fieldNameNode, '1'),
711
+ '@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', fieldNameNode, fieldNameNode.text),
712
+ '@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', callee, callee.text),
713
+ });
714
+ });
715
+ }
716
+ }
717
+ const nodeSpanKey = (node) => `${node.startIndex}:${node.endIndex}`;
718
+ /**
719
+ * The names a `class_body` declares as INSTANCE-or-static fields, from
720
+ * `declaration(… initialized_identifier_list … initialized_identifier)` — the
721
+ * shape every stored Dart field takes, annotated or not.
722
+ */
723
+ function dartClassFieldNames(classBody, memo) {
724
+ const key = nodeSpanKey(classBody);
725
+ const cached = memo.fieldsByClassBody.get(key);
726
+ if (cached !== undefined)
727
+ return cached;
728
+ const fields = new Set();
729
+ for (const member of classBody.namedChildren) {
730
+ if (member === null || member.type !== 'declaration')
731
+ continue;
732
+ const list = (0, ast_helpers_js_1.findChild)(member, 'initialized_identifier_list');
733
+ if (list === null)
734
+ continue;
735
+ for (const init of list.namedChildren) {
736
+ if (init === null || init.type !== 'initialized_identifier')
737
+ continue;
738
+ const nameNode = init.namedChild(0);
739
+ if (nameNode !== null && nameNode.type === 'identifier')
740
+ fields.add(nameNode.text);
741
+ }
742
+ }
743
+ memo.fieldsByClassBody.set(key, fields);
744
+ return fields;
745
+ }
746
+ function dartBodyShadows(bodyNode, memo) {
747
+ const key = nodeSpanKey(bodyNode);
748
+ const cached = memo.shadowsByBody.get(key);
749
+ if (cached !== undefined)
750
+ return cached;
751
+ const shadows = collectDartBodyShadows(bodyNode);
752
+ memo.shadowsByBody.set(key, shadows);
753
+ return shadows;
754
+ }
755
+ /**
756
+ * The READ half of the bare-name field discipline: the field names a member
757
+ * body REBINDS, published on that member's Function scope as
758
+ * `Scope.ownsReceivers` (#2701) so the receiver walk stops there instead of
759
+ * reaching the Class scope (#2807 review).
760
+ *
761
+ * `emitDartFieldAssignmentBindings` above declines to WRITE a binding for a name
762
+ * the body shadows, but the shadow set gated writes only. A bare-name READ of a
763
+ * shadowing binder the resolver cannot type — `for (final conn in xs) {
764
+ * conn.inner(); }`, where the element type of `xs` is not modelled — therefore
765
+ * walked straight past the local and hit the class field binding this same
766
+ * feature mints, resolving `conn.inner()` to the CONSTRUCTOR's type. That turns
767
+ * "no edge" into a WRONG edge, the one failure mode
768
+ * `scope-resolution/passes/compound-receiver.ts` says must never happen, and it
769
+ * was introduced by the write side rather than pre-existing: delete the
770
+ * constructor and the same read emits nothing.
771
+ *
772
+ * `ownsReceivers` is the right primitive because the walk consults
773
+ * `typeBindings` FIRST at every scope (`scope/walkers.ts`) and only then honours
774
+ * the mask. A shadow the resolver CAN type still wins — an annotated parameter
775
+ * `void probe(Beta conn)` keeps `Beta`, because
776
+ * `synthesizeDartSignatureBindings` anchors parameter bindings on this same
777
+ * body node, so they land on this same Function scope. The mask only fires
778
+ * where the alternative was a fabricated type.
779
+ *
780
+ * ── SCOPE OF THE MASK, AND ITS ACCEPTED COSTS ────────────────────────────────
781
+ *
782
+ * `shadows ∩ fields`, and nothing wider. Three consequences are taken knowingly
783
+ * rather than hidden:
784
+ *
785
+ * 1. NOT every locally bound name is masked — only ones the enclosing class
786
+ * also declares as a field. A library-level `var logger = Logger();`
787
+ * shadowed by a loop variable of the same name still resolves against the
788
+ * library binding and can still produce the wrong edge. That is the general
789
+ * form of the same defect and arguably the more correct fix, but it changes
790
+ * resolution for code this feature never touched; it is recorded here as a
791
+ * known limitation rather than implemented.
792
+ * 2. The mask is BODY-WIDE, exactly as `collectDartBodyShadows` is on the write
793
+ * side. A member that binds `conn` anywhere — a nested closure, one `case`
794
+ * arm — masks `conn` for the whole member, so a read of the genuine field
795
+ * elsewhere in that member loses its edge. Deliberate symmetry: the write
796
+ * side already declines body-wide, and losing an edge is the error this
797
+ * whole line of work chooses over inventing one.
798
+ * 3. `fields` is EVERY field the class declares, not only the ones the
799
+ * constructor-write feature types. An ANNOTATED field shadowed by a binder
800
+ * is masked too, so this reaches resolution that predates #2807 — and it is
801
+ * meant to: which name a body's bare read refers to is a fact about Dart, not
802
+ * about how the field acquired its type. `mixin` bodies are reached for the
803
+ * same reason (the grammar gives a mixin a `class_body` as well), even though
804
+ * `emitDartFieldAssignmentBindings` mints nothing for them. `extension`
805
+ * bodies are a different node (`extension_body`) and are left alone.
806
+ *
807
+ * Returns `undefined` — not an empty marker — when nothing is masked, so the
808
+ * emitted capture set is unchanged for every body that does not shadow a field.
809
+ * Names are sorted so the capture text (and every fingerprint over it) is
810
+ * order-stable.
811
+ */
812
+ function dartShadowedFieldsCapture(bodyNode, memo) {
813
+ // Only a CLASS-MEMBER body can shadow a field: `function_body` whose parent is
814
+ // the `class_body`. A closure's `function_expression_body` and a top-level
815
+ // function are both excluded, and neither needs the mask — a closure's binders
816
+ // are already in its enclosing member's body-wide shadow set, and the walk
817
+ // passes through the enclosing member's Function scope on its way out.
818
+ if (bodyNode.type !== 'function_body')
819
+ return undefined;
820
+ const classBody = bodyNode.parent;
821
+ if (classBody === null || classBody.type !== 'class_body')
822
+ return undefined;
823
+ const fields = dartClassFieldNames(classBody, memo);
824
+ if (fields.size === 0)
825
+ return undefined;
826
+ const shadows = dartBodyShadows(bodyNode, memo);
827
+ if (shadows.size === 0)
828
+ return undefined;
829
+ const masked = [];
830
+ for (const name of fields) {
831
+ if (shadows.has(name))
832
+ masked.push(name);
833
+ }
834
+ if (masked.length === 0)
835
+ return undefined;
836
+ masked.sort();
837
+ return (0, ast_helpers_js_1.syntheticCapture)('@receiver-owner.shadowed-fields', bodyNode, JSON.stringify(masked));
838
+ }
839
+ /**
840
+ * Every name BOUND by one class-member body — the shadow set the bare-name
841
+ * branch of `emitDartFieldAssignmentBindings` tests against.
842
+ *
843
+ * A local `var` is only ONE of Dart's binders, and a bare `r = Outer()` writes
844
+ * whichever binder wins, so a set built from local declarations alone made a
845
+ * write to any OTHER binder look like a field write. `void reset(Alpha r) { r =
846
+ * Alpha(); }` in a class with a field `r` retyped the FIELD to `Alpha` —
847
+ * fabricating an edge and displacing the type the constructor had correctly
848
+ * given it. Formal parameters are the sharpest case because they are not even
849
+ * inside the body: `function_body` is a SIBLING of the `method_signature` that
850
+ * carries them, so no walk of the body can ever see one.
851
+ *
852
+ * Dart 3 patterns are the SAME defect a second time: `var (r, n) = …;`,
853
+ * `if (o case Beta r)`, `case Beta r:`, `for (var (r, _) in xs)`, list / map /
854
+ * object / rest / cast / null-check / null-assert patterns and pattern
855
+ * assignments all bind `r` through node types no earlier list named, so each of
856
+ * them let a write retype the field. `addDartBinderName` now enumerates the
857
+ * pattern family from the grammar rather than from reported shapes.
858
+ *
859
+ * Deliberately over-approximate in the shadow direction. The set is body-wide
860
+ * (a binder in a nested closure, a `case` arm or a collection-literal element
861
+ * shadows for the whole body), a parameter shape whose name cannot be read
862
+ * contributes nothing rather than being guessed at, and a bare name inside a
863
+ * pattern shadows whether it binds or merely references a constant. All err
864
+ * toward DECLINING to bind, which is the right error: a missed field type costs
865
+ * an edge, a wrong one produces an edge to the wrong class and destroys a
866
+ * correct binding — the failure mode this whole line of work exists to avoid
867
+ * (see `scope-resolution/passes/compound-receiver.ts`).
868
+ */
869
+ function collectDartBodyShadows(bodyNode) {
870
+ const shadows = new Set();
871
+ // The enclosing function's own formal parameters live OUTSIDE the body, on
872
+ // the `method_signature` sibling that precedes it — the shape every class
873
+ // member takes (method, constructor, factory, static, getter, setter,
874
+ // operator, `async`/`async*`).
875
+ const signature = bodyNode.previousNamedSibling;
876
+ if (signature !== null && signature.type === 'method_signature') {
877
+ (0, ast_helpers_js_1.walkNamedTree)(signature, (n) => addDartBinderName(n, shadows));
878
+ }
879
+ (0, ast_helpers_js_1.walkNamedTree)(bodyNode, (n) => addDartBinderName(n, shadows));
880
+ return shadows;
881
+ }
882
+ /**
883
+ * Record the name `node` binds, if it binds one.
884
+ *
885
+ * The `case` list is the whole point of this function and the reason it is
886
+ * separate: an INCOMPLETE list of binder forms is the exact defect this file has
887
+ * now shipped twice (formal parameters, then every Dart 3 pattern). It is
888
+ * enumerated against `vendor/tree-sitter-dart/grammar.js`, not against the
889
+ * shapes a bug report happened to carry.
890
+ */
891
+ function addDartBinderName(node, out) {
892
+ switch (node.type) {
893
+ // `var s;`, `final r = 1;`, and the FIRST declarator of `var a = 1, b = 2;`.
894
+ // `for_loop_parts` carries the for-IN variable on the same `name` field
895
+ // (`for (var r in xs)`); the C-style form instead nests a
896
+ // `local_variable_declaration` the walk reaches on its own.
897
+ case 'initialized_variable_definition':
898
+ case 'for_loop_parts': {
899
+ const nameNode = node.childForFieldName('name');
900
+ if (nameNode !== null)
901
+ out.add(nameNode.text);
902
+ return;
903
+ }
904
+ // Formal parameters — of the enclosing member, of a closure
905
+ // (`function_expression`), and of a nested `local_function_declaration`.
906
+ case 'formal_parameter': {
907
+ const name = dartParameterName(node);
908
+ if (name !== null)
909
+ out.add(name);
910
+ return;
911
+ }
912
+ // `on E catch (e, stack)` — every identifier in the list is a binding.
913
+ case 'catch_parameters': {
914
+ for (const child of node.namedChildren) {
915
+ if (child !== null && child.type === 'identifier')
916
+ out.add(child.text);
917
+ }
918
+ return;
919
+ }
920
+ // Second and later declarators of `var a = 1, b = 2;` — fieldless, so the
921
+ // name is the first named child. (A class field is this node type too, but
922
+ // only ever under `initialized_identifier_list`, which no body contains.)
923
+ case 'initialized_identifier': {
924
+ const first = node.namedChild(0);
925
+ if (first !== null && first.type === 'identifier')
926
+ out.add(first.text);
927
+ return;
928
+ }
929
+ // ── Dart 3 patterns ──────────────────────────────────────────────────────
930
+ //
931
+ // EVERY pattern node the grammar emits, and every one of them takes its
932
+ // DIRECT `identifier` children. The grammar rules that would carry a binder
933
+ // are `_pattern_field`, `_map_pattern_entry`, `_list_pattern_element`,
934
+ // `_parenthesized_pattern`, `_outer_pattern`, `_guarded_pattern` and the
935
+ // logical/relational tiers — ALL hidden (`_`-prefixed), so they emit no node
936
+ // of their own and inline their children onto whichever visible pattern node
937
+ // encloses them. Reading direct children is therefore what actually sees a
938
+ // binder; there is no field to ask for (`variable_pattern`,
939
+ // `pattern_variable_declaration` and `constant_pattern` declare none).
940
+ //
941
+ // The first two are where a binder truly lands, and are alone sufficient:
942
+ // `variable_pattern` — `Beta s` / `final s` / `var s`.
943
+ // `constant_pattern` — a BARE name (`(s, n)`, `[s, t]`, `{'k': s}`,
944
+ // `Point(:s)`, `...s`, `(s)`). Dart itself decides bare-name-binds-vs-
945
+ // references-a-constant from the enclosing `final`/`var`, and
946
+ // tree-sitter gives both the same node, so `case kLimit:` shadows too.
947
+ // Over-shadowing a constant reference costs an edge; the other
948
+ // direction fabricates one.
949
+ // The containers after them are DEFENCE, not routing — the walk reaches
950
+ // nested patterns on its own. They matter because the hidden `_pattern_field`
951
+ // already drops a NON-binder label identifier straight onto `record_pattern`
952
+ // / `object_pattern` (and a key onto `map_pattern`), which is proof that this
953
+ // grammar inlines identifiers onto containers. If a grammar revision ever
954
+ // inlines a real binder the same way, it is shadowed here on arrival instead
955
+ // of becoming the third instance of this bug.
956
+ //
957
+ // DELIBERATELY EXCLUDED — `pattern_variable_declaration`, `pattern_assignment`
958
+ // and `for_loop_parts` hold the pattern and the `=`/`in` RHS at the SAME
959
+ // child level (`var [s, t] = xs` → `identifier xs` is a direct child), so
960
+ // taking their direct identifiers would shadow the SOURCE expression's name,
961
+ // which binds nothing. Their pattern child is a case below. Also excluded:
962
+ // `type_identifier` (never an `identifier`, so `Beta` in `Beta s` and `Point`
963
+ // in `Point(…)` cannot be mistaken for binders), `qualified` inside a
964
+ // `constant_pattern` (`Colors.red` nests one level deeper — a qualified name
965
+ // is always a constant reference), and relational/equality operands
966
+ // (`case > kLimit`), which the hidden tier drops onto the enclosing
967
+ // STATEMENT rather than any pattern node.
968
+ case 'variable_pattern':
969
+ case 'constant_pattern':
970
+ case 'record_pattern':
971
+ case 'list_pattern':
972
+ case 'map_pattern':
973
+ case 'object_pattern':
974
+ case 'rest_pattern':
975
+ case 'cast_pattern':
976
+ case 'null_check_pattern':
977
+ case 'null_assert_pattern': {
978
+ for (const child of node.namedChildren) {
979
+ if (child !== null && child.type === 'identifier')
980
+ out.add(child.text);
981
+ }
982
+ return;
983
+ }
984
+ default:
985
+ return;
986
+ }
987
+ }
988
+ /** The name a `formal_parameter` binds, across every shape the grammar gives it. */
989
+ function dartParameterName(param) {
990
+ // `Alpha r`, `final Alpha r`, `void Function(int) r`, `{required Beta r}`,
991
+ // `[Delta r]` — all carry an explicit `name` field.
992
+ const named = param.childForFieldName('name');
993
+ if (named !== null)
994
+ return named.text;
995
+ const only = param.namedChild(0);
996
+ if (only === null)
997
+ return null;
998
+ // An untyped closure parameter (`(r) { … }`) is a bare identifier with no
999
+ // field to read it from.
1000
+ if (only.type === 'identifier')
1001
+ return only.text;
1002
+ // `this.r` / `super.r` bind a parameter NAMED `r` that is initialized from
1003
+ // the field — a later bare `r = …` writes that parameter, not the field, so
1004
+ // these shadow exactly like any other.
1005
+ if (only.type === 'constructor_param' || only.type === 'super_formal_parameter') {
1006
+ for (let i = only.namedChildCount - 1; i >= 0; i--) {
1007
+ const child = only.namedChild(i);
1008
+ if (child !== null && child.type === 'identifier')
1009
+ return child.text;
1010
+ }
1011
+ }
1012
+ return null;
1013
+ }
1014
+ function emitHeritage(classNode, out) {
1015
+ const nameNode = classNode.childForFieldName('name');
1016
+ if (nameNode === null)
1017
+ return;
1018
+ const className = nameNode.text;
1019
+ const superclass = classNode.childForFieldName('superclass');
1020
+ if (superclass !== null) {
1021
+ // `extends Base` — the direct `type_identifier` child of `superclass`
1022
+ // (the `mixins` node, if present, nests separately). Routed through the
1023
+ // generic inherits pre-pass → EXTENDS (the base resolves to a class).
1024
+ for (let i = 0; i < superclass.namedChildCount; i++) {
1025
+ const c = superclass.namedChild(i);
1026
+ if (c !== null && c.type === 'type_identifier') {
1027
+ out.push({
1028
+ '@reference.inherits': (0, ast_helpers_js_1.nodeToCapture)('@reference.inherits', c),
1029
+ '@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', c),
1030
+ });
1031
+ break;
1032
+ }
1033
+ }
1034
+ // `with M1, M2` — mixin application → IMPLEMENTS (Dart mixin dispatch).
1035
+ const mixins = (0, ast_helpers_js_1.findChild)(superclass, 'mixins');
1036
+ if (mixins !== null) {
1037
+ emitHeritageMarkers(mixins, 'with', className, out);
1038
+ }
1039
+ }
1040
+ // `implements I1, I2` — Dart `implements <class>` is IMPLEMENTS regardless
1041
+ // of the target's symbol kind, so it cannot use the target-kind pre-pass.
1042
+ const interfaces = classNode.childForFieldName('interfaces');
1043
+ if (interfaces !== null) {
1044
+ emitHeritageMarkers(interfaces, 'implements', className, out);
1045
+ }
1046
+ }
1047
+ function emitExtensionImplementsHeritage(extensionNode, out) {
1048
+ const nameNode = extensionNode.childForFieldName('name');
1049
+ if (nameNode === null)
1050
+ return;
1051
+ const bodyStart = extensionNode.text.indexOf('{');
1052
+ const header = bodyStart === -1 ? extensionNode.text : extensionNode.text.slice(0, bodyStart);
1053
+ const implementsIndex = header.indexOf('implements');
1054
+ if (implementsIndex === -1)
1055
+ return;
1056
+ const className = nameNode.text;
1057
+ const interfaces = header.slice(implementsIndex + 'implements'.length);
1058
+ for (const rawInterface of splitTopLevelCommaList(interfaces)) {
1059
+ const target = /^[ \t]*([A-Za-z_$][A-Za-z0-9_$]*)/.exec(rawInterface)?.[1];
1060
+ if (target === undefined)
1061
+ continue;
1062
+ const payload = (0, heritage_marker_js_1.encodeMarker)('heritage', ['implements', target, className]);
1063
+ out.push({ '@import.heritage': (0, ast_helpers_js_1.syntheticCapture)('@import.heritage', nameNode, payload) });
1064
+ }
1065
+ }
1066
+ function splitTopLevelCommaList(text) {
1067
+ const parts = [];
1068
+ let start = 0;
1069
+ let angleDepth = 0;
1070
+ for (let i = 0; i < text.length; i++) {
1071
+ const ch = text[i];
1072
+ if (ch === '<') {
1073
+ angleDepth++;
1074
+ continue;
1075
+ }
1076
+ if (ch === '>' && angleDepth > 0) {
1077
+ angleDepth--;
1078
+ continue;
1079
+ }
1080
+ if (ch === ',' && angleDepth === 0) {
1081
+ parts.push(text.slice(start, i));
1082
+ start = i + 1;
1083
+ }
1084
+ }
1085
+ parts.push(text.slice(start));
1086
+ return parts;
1087
+ }
1088
+ function emitHeritageMarkers(container, kind, className, out) {
1089
+ for (let i = 0; i < container.namedChildCount; i++) {
1090
+ const c = container.namedChild(i);
1091
+ if (c === null || c.type !== 'type_identifier')
1092
+ continue;
1093
+ const payload = (0, heritage_marker_js_1.encodeMarker)('heritage', [kind, c.text, className]);
1094
+ out.push({ '@import.heritage': (0, ast_helpers_js_1.syntheticCapture)('@import.heritage', c, payload) });
1095
+ }
1096
+ }