rigortype 0.2.7 → 0.2.8

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 (414) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/docs/manual/04-diagnostics.md +7 -4
  4. data/docs/manual/06-baseline.md +5 -2
  5. data/docs/manual/15-type-protection-coverage.md +6 -4
  6. data/lib/rigor/analysis/baseline.rb +56 -96
  7. data/lib/rigor/analysis/buffer_binding.rb +13 -20
  8. data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +29 -48
  9. data/lib/rigor/analysis/check_rules/dead_assignment_collector.rb +35 -54
  10. data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +23 -37
  11. data/lib/rigor/analysis/check_rules/main_pass_collector.rb +16 -23
  12. data/lib/rigor/analysis/check_rules/rule_walk.rb +48 -71
  13. data/lib/rigor/analysis/check_rules/self_closedness_scanner.rb +19 -28
  14. data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +48 -67
  15. data/lib/rigor/analysis/check_rules.rb +174 -274
  16. data/lib/rigor/analysis/dependency_recorder.rb +26 -38
  17. data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +13 -25
  18. data/lib/rigor/analysis/dependency_source_inference/builder.rb +17 -30
  19. data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +15 -26
  20. data/lib/rigor/analysis/dependency_source_inference/index.rb +45 -76
  21. data/lib/rigor/analysis/dependency_source_inference/return_type_heuristic.rb +23 -40
  22. data/lib/rigor/analysis/dependency_source_inference/walker.rb +50 -83
  23. data/lib/rigor/analysis/dependency_source_inference.rb +6 -10
  24. data/lib/rigor/analysis/diagnostic.rb +48 -75
  25. data/lib/rigor/analysis/erb_template_detector.rb +13 -18
  26. data/lib/rigor/analysis/fact_store.rb +12 -22
  27. data/lib/rigor/analysis/incremental.rb +47 -63
  28. data/lib/rigor/analysis/incremental_session.rb +74 -100
  29. data/lib/rigor/analysis/project_scan.rb +12 -23
  30. data/lib/rigor/analysis/result.rb +3 -5
  31. data/lib/rigor/analysis/rule_catalog.rb +67 -95
  32. data/lib/rigor/analysis/run_stats.rb +38 -61
  33. data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +101 -160
  34. data/lib/rigor/analysis/runner/pool_coordinator.rb +121 -188
  35. data/lib/rigor/analysis/runner/project_pre_passes.rb +62 -96
  36. data/lib/rigor/analysis/runner/run_snapshots.rb +12 -18
  37. data/lib/rigor/analysis/runner.rb +220 -333
  38. data/lib/rigor/analysis/self_call_resolution_recorder.rb +30 -43
  39. data/lib/rigor/analysis/worker_session.rb +64 -102
  40. data/lib/rigor/ast/type_node.rb +6 -8
  41. data/lib/rigor/ast.rb +6 -10
  42. data/lib/rigor/bleeding_edge.rb +27 -35
  43. data/lib/rigor/builtins/hkt_builtins.rb +7 -14
  44. data/lib/rigor/builtins/imported_refinements.rb +106 -149
  45. data/lib/rigor/builtins/predefined_constant_refinements.rb +51 -65
  46. data/lib/rigor/builtins/regex_refinement.rb +32 -43
  47. data/lib/rigor/builtins/static_return_refinements.rb +57 -81
  48. data/lib/rigor/cache/descriptor.rb +58 -94
  49. data/lib/rigor/cache/incremental_snapshot.rb +32 -48
  50. data/lib/rigor/cache/rbs_cache_producer.rb +10 -15
  51. data/lib/rigor/cache/rbs_class_ancestor_table.rb +10 -16
  52. data/lib/rigor/cache/rbs_class_type_param_names.rb +10 -16
  53. data/lib/rigor/cache/rbs_constant_table.rb +8 -13
  54. data/lib/rigor/cache/rbs_descriptor.rb +8 -13
  55. data/lib/rigor/cache/rbs_environment.rb +11 -19
  56. data/lib/rigor/cache/rbs_environment_marshal_patch.rb +11 -19
  57. data/lib/rigor/cache/rbs_known_class_names.rb +8 -12
  58. data/lib/rigor/cache/store.rb +96 -151
  59. data/lib/rigor/cli/annotate_command.rb +51 -88
  60. data/lib/rigor/cli/baseline_command.rb +10 -17
  61. data/lib/rigor/cli/check_command.rb +121 -199
  62. data/lib/rigor/cli/check_runner_factory.rb +8 -14
  63. data/lib/rigor/cli/ci_detector.rb +9 -14
  64. data/lib/rigor/cli/command.rb +8 -14
  65. data/lib/rigor/cli/coverage_command.rb +19 -26
  66. data/lib/rigor/cli/coverage_mutation.rb +14 -19
  67. data/lib/rigor/cli/coverage_report.rb +0 -2
  68. data/lib/rigor/cli/coverage_scan.rb +7 -11
  69. data/lib/rigor/cli/diagnostic_formats.rb +43 -62
  70. data/lib/rigor/cli/diff_command.rb +10 -20
  71. data/lib/rigor/cli/docs_command.rb +26 -40
  72. data/lib/rigor/cli/doctor_command.rb +8 -9
  73. data/lib/rigor/cli/explain_command.rb +4 -7
  74. data/lib/rigor/cli/fused_protection_renderer.rb +4 -5
  75. data/lib/rigor/cli/fused_protection_report.rb +6 -8
  76. data/lib/rigor/cli/lsp_command.rb +11 -19
  77. data/lib/rigor/cli/mcp_command.rb +4 -6
  78. data/lib/rigor/cli/mutation_protection_renderer.rb +3 -4
  79. data/lib/rigor/cli/mutation_protection_report.rb +6 -9
  80. data/lib/rigor/cli/options.rb +11 -19
  81. data/lib/rigor/cli/plugin_command.rb +18 -30
  82. data/lib/rigor/cli/plugins_command.rb +29 -51
  83. data/lib/rigor/cli/plugins_renderer.rb +12 -20
  84. data/lib/rigor/cli/prism_colorizer.rb +13 -19
  85. data/lib/rigor/cli/protection_renderer.rb +5 -7
  86. data/lib/rigor/cli/protection_report.rb +27 -17
  87. data/lib/rigor/cli/renderable.rb +4 -6
  88. data/lib/rigor/cli/show_bleedingedge_command.rb +5 -8
  89. data/lib/rigor/cli/sig_gen_command.rb +14 -26
  90. data/lib/rigor/cli/skill_command.rb +30 -47
  91. data/lib/rigor/cli/skill_describe.rb +40 -64
  92. data/lib/rigor/cli/trace_command.rb +9 -16
  93. data/lib/rigor/cli/trace_renderer.rb +35 -51
  94. data/lib/rigor/cli/triage_command.rb +6 -10
  95. data/lib/rigor/cli/triage_renderer.rb +1 -2
  96. data/lib/rigor/cli/type_of_command.rb +14 -23
  97. data/lib/rigor/cli/type_of_renderer.rb +3 -5
  98. data/lib/rigor/cli/type_scan_command.rb +6 -10
  99. data/lib/rigor/cli/type_scan_renderer.rb +3 -5
  100. data/lib/rigor/cli/type_scan_report.rb +2 -3
  101. data/lib/rigor/cli/upgrade_command.rb +2 -3
  102. data/lib/rigor/cli.rb +16 -28
  103. data/lib/rigor/config_audit.rb +35 -44
  104. data/lib/rigor/configuration/dependencies.rb +41 -70
  105. data/lib/rigor/configuration/severity_profile.rb +28 -42
  106. data/lib/rigor/configuration.rb +150 -241
  107. data/lib/rigor/environment/bundle_sig_discovery.rb +74 -118
  108. data/lib/rigor/environment/class_registry.rb +19 -26
  109. data/lib/rigor/environment/constant_type_cache_holder.rb +14 -21
  110. data/lib/rigor/environment/hkt_registry_holder.rb +6 -12
  111. data/lib/rigor/environment/lockfile_resolver.rb +31 -47
  112. data/lib/rigor/environment/rbs_collection_discovery.rb +39 -63
  113. data/lib/rigor/environment/rbs_coverage_report.rb +24 -42
  114. data/lib/rigor/environment/rbs_loader.rb +420 -518
  115. data/lib/rigor/environment/reflection.rb +28 -53
  116. data/lib/rigor/environment/reporters.rb +13 -24
  117. data/lib/rigor/environment.rb +176 -291
  118. data/lib/rigor/flow_contribution/conflict.rb +16 -27
  119. data/lib/rigor/flow_contribution/element.rb +7 -12
  120. data/lib/rigor/flow_contribution/fact.rb +33 -57
  121. data/lib/rigor/flow_contribution/merge_result.rb +6 -9
  122. data/lib/rigor/flow_contribution/merger.rb +32 -47
  123. data/lib/rigor/flow_contribution.rb +37 -55
  124. data/lib/rigor/inference/acceptance.rb +133 -219
  125. data/lib/rigor/inference/block_parameter_binder.rb +52 -82
  126. data/lib/rigor/inference/body_fixpoint.rb +22 -30
  127. data/lib/rigor/inference/budget_trace.rb +43 -63
  128. data/lib/rigor/inference/builtins/array_catalog.rb +4 -6
  129. data/lib/rigor/inference/builtins/comparable_catalog.rb +4 -6
  130. data/lib/rigor/inference/builtins/complex_catalog.rb +13 -19
  131. data/lib/rigor/inference/builtins/date_catalog.rb +38 -67
  132. data/lib/rigor/inference/builtins/encoding_catalog.rb +22 -36
  133. data/lib/rigor/inference/builtins/enumerable_catalog.rb +4 -6
  134. data/lib/rigor/inference/builtins/exception_catalog.rb +38 -57
  135. data/lib/rigor/inference/builtins/hash_catalog.rb +9 -14
  136. data/lib/rigor/inference/builtins/method_catalog.rb +29 -48
  137. data/lib/rigor/inference/builtins/numeric_catalog.rb +13 -18
  138. data/lib/rigor/inference/builtins/pathname_catalog.rb +8 -13
  139. data/lib/rigor/inference/builtins/proc_catalog.rb +38 -62
  140. data/lib/rigor/inference/builtins/random_catalog.rb +21 -32
  141. data/lib/rigor/inference/builtins/range_catalog.rb +12 -21
  142. data/lib/rigor/inference/builtins/rational_catalog.rb +9 -15
  143. data/lib/rigor/inference/builtins/re_catalog.rb +29 -48
  144. data/lib/rigor/inference/builtins/set_catalog.rb +18 -27
  145. data/lib/rigor/inference/builtins/string_catalog.rb +12 -19
  146. data/lib/rigor/inference/builtins/struct_catalog.rb +18 -30
  147. data/lib/rigor/inference/builtins/time_catalog.rb +28 -44
  148. data/lib/rigor/inference/closure_escape_analyzer.rb +44 -67
  149. data/lib/rigor/inference/coverage_scanner.rb +13 -18
  150. data/lib/rigor/inference/def_return_typer.rb +8 -14
  151. data/lib/rigor/inference/dynamic_origin.rb +23 -20
  152. data/lib/rigor/inference/expression_typer.rb +774 -1152
  153. data/lib/rigor/inference/fallback.rb +8 -12
  154. data/lib/rigor/inference/fallback_tracer.rb +4 -10
  155. data/lib/rigor/inference/flow_tracer.rb +25 -36
  156. data/lib/rigor/inference/hkt_body.rb +45 -68
  157. data/lib/rigor/inference/hkt_body_parser.rb +33 -52
  158. data/lib/rigor/inference/hkt_reducer.rb +38 -59
  159. data/lib/rigor/inference/hkt_registry.rb +50 -76
  160. data/lib/rigor/inference/indexed_narrowing.rb +55 -81
  161. data/lib/rigor/inference/macro_block_self_type.rb +21 -34
  162. data/lib/rigor/inference/method_dispatcher/array_to_h_folding.rb +11 -18
  163. data/lib/rigor/inference/method_dispatcher/block_folding.rb +49 -83
  164. data/lib/rigor/inference/method_dispatcher/call_context.rb +16 -23
  165. data/lib/rigor/inference/method_dispatcher/cgi_folding.rb +13 -22
  166. data/lib/rigor/inference/method_dispatcher/constant_folding.rb +307 -454
  167. data/lib/rigor/inference/method_dispatcher/data_folding.rb +24 -34
  168. data/lib/rigor/inference/method_dispatcher/file_folding.rb +22 -37
  169. data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +52 -81
  170. data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +51 -78
  171. data/lib/rigor/inference/method_dispatcher/literal_string_folding.rb +60 -97
  172. data/lib/rigor/inference/method_dispatcher/math_folding.rb +23 -34
  173. data/lib/rigor/inference/method_dispatcher/member_shape_projection.rb +18 -26
  174. data/lib/rigor/inference/method_dispatcher/method_folding.rb +37 -71
  175. data/lib/rigor/inference/method_dispatcher/overload_selector.rb +114 -182
  176. data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +122 -193
  177. data/lib/rigor/inference/method_dispatcher/receiver_affinity.rb +15 -24
  178. data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +64 -93
  179. data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +31 -45
  180. data/lib/rigor/inference/method_dispatcher/set_folding.rb +6 -9
  181. data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +356 -511
  182. data/lib/rigor/inference/method_dispatcher/shellwords_folding.rb +22 -32
  183. data/lib/rigor/inference/method_dispatcher/singleton_folding.rb +15 -21
  184. data/lib/rigor/inference/method_dispatcher/struct_folding.rb +66 -82
  185. data/lib/rigor/inference/method_dispatcher/time_folding.rb +10 -15
  186. data/lib/rigor/inference/method_dispatcher/uri_folding.rb +9 -13
  187. data/lib/rigor/inference/method_dispatcher.rb +378 -524
  188. data/lib/rigor/inference/method_parameter_binder.rb +81 -114
  189. data/lib/rigor/inference/multi_target_binder.rb +51 -68
  190. data/lib/rigor/inference/mutation_widening.rb +115 -158
  191. data/lib/rigor/inference/narrowing.rb +509 -727
  192. data/lib/rigor/inference/origin_lookup.rb +38 -0
  193. data/lib/rigor/inference/parameter_inference_collector.rb +100 -100
  194. data/lib/rigor/inference/precision_scanner.rb +26 -35
  195. data/lib/rigor/inference/project_patched_methods.rb +20 -32
  196. data/lib/rigor/inference/project_patched_scanner.rb +23 -37
  197. data/lib/rigor/inference/protection_scanner.rb +16 -18
  198. data/lib/rigor/inference/rbs_type_translator.rb +49 -66
  199. data/lib/rigor/inference/scope_indexer.rb +473 -817
  200. data/lib/rigor/inference/statement_evaluator.rb +706 -1111
  201. data/lib/rigor/inference/struct_fold_safety.rb +34 -48
  202. data/lib/rigor/inference/synthetic_method.rb +9 -16
  203. data/lib/rigor/inference/synthetic_method_index.rb +20 -35
  204. data/lib/rigor/inference/synthetic_method_scanner.rb +63 -103
  205. data/lib/rigor/language_server/buffer_resolution.rb +6 -9
  206. data/lib/rigor/language_server/buffer_table.rb +11 -18
  207. data/lib/rigor/language_server/completion_provider.rb +69 -116
  208. data/lib/rigor/language_server/debouncer.rb +16 -25
  209. data/lib/rigor/language_server/diagnostic_publisher.rb +26 -40
  210. data/lib/rigor/language_server/document_symbol_provider.rb +14 -19
  211. data/lib/rigor/language_server/folding_range_provider.rb +11 -19
  212. data/lib/rigor/language_server/hover_provider.rb +8 -11
  213. data/lib/rigor/language_server/hover_renderer.rb +56 -93
  214. data/lib/rigor/language_server/loop.rb +14 -19
  215. data/lib/rigor/language_server/project_context.rb +46 -74
  216. data/lib/rigor/language_server/selection_range_provider.rb +9 -12
  217. data/lib/rigor/language_server/server.rb +55 -83
  218. data/lib/rigor/language_server/signature_help_provider.rb +29 -46
  219. data/lib/rigor/language_server/synchronized_writer.rb +4 -7
  220. data/lib/rigor/language_server/uri.rb +8 -13
  221. data/lib/rigor/language_server.rb +4 -6
  222. data/lib/rigor/mcp/loop.rb +2 -3
  223. data/lib/rigor/mcp/server.rb +4 -7
  224. data/lib/rigor/mcp.rb +3 -6
  225. data/lib/rigor/plugin/access_denied_error.rb +5 -8
  226. data/lib/rigor/plugin/additional_initializer.rb +21 -31
  227. data/lib/rigor/plugin/base.rb +335 -518
  228. data/lib/rigor/plugin/blueprint.rb +14 -23
  229. data/lib/rigor/plugin/box.rb +18 -29
  230. data/lib/rigor/plugin/fact_store.rb +16 -26
  231. data/lib/rigor/plugin/inflector.rb +37 -53
  232. data/lib/rigor/plugin/io_boundary.rb +33 -56
  233. data/lib/rigor/plugin/isolation.rb +42 -55
  234. data/lib/rigor/plugin/load_error.rb +10 -15
  235. data/lib/rigor/plugin/loader.rb +30 -49
  236. data/lib/rigor/plugin/macro/block_as_method.rb +20 -32
  237. data/lib/rigor/plugin/macro/heredoc_template.rb +35 -58
  238. data/lib/rigor/plugin/macro/nested_class_template.rb +22 -36
  239. data/lib/rigor/plugin/macro/trait_registry.rb +34 -51
  240. data/lib/rigor/plugin/macro.rb +10 -15
  241. data/lib/rigor/plugin/manifest.rb +85 -144
  242. data/lib/rigor/plugin/node_context.rb +14 -22
  243. data/lib/rigor/plugin/node_rule_walk.rb +49 -74
  244. data/lib/rigor/plugin/protocol_contract.rb +25 -39
  245. data/lib/rigor/plugin/registry.rb +132 -205
  246. data/lib/rigor/plugin/services.rb +21 -33
  247. data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +11 -19
  248. data/lib/rigor/plugin/trust_policy.rb +24 -38
  249. data/lib/rigor/plugin/type_node_resolver.rb +15 -24
  250. data/lib/rigor/protection/diagnostic_oracle.rb +11 -13
  251. data/lib/rigor/protection/mutation_scanner.rb +27 -35
  252. data/lib/rigor/protection/mutator.rb +50 -70
  253. data/lib/rigor/protection/test_suite_oracle.rb +20 -27
  254. data/lib/rigor/rbs_extended/conformance_checker.rb +48 -68
  255. data/lib/rigor/rbs_extended/hkt_directives.rb +28 -54
  256. data/lib/rigor/rbs_extended/reporter.rb +24 -40
  257. data/lib/rigor/rbs_extended.rb +107 -197
  258. data/lib/rigor/reflection.rb +68 -86
  259. data/lib/rigor/scope/discovery_index.rb +14 -19
  260. data/lib/rigor/scope.rb +255 -310
  261. data/lib/rigor/sig_gen/classification.rb +6 -10
  262. data/lib/rigor/sig_gen/generator.rb +197 -323
  263. data/lib/rigor/sig_gen/layout_index.rb +12 -20
  264. data/lib/rigor/sig_gen/method_candidate.rb +12 -17
  265. data/lib/rigor/sig_gen/observation_collector.rb +38 -70
  266. data/lib/rigor/sig_gen/observed_call.rb +13 -23
  267. data/lib/rigor/sig_gen/path_mapper.rb +17 -29
  268. data/lib/rigor/sig_gen/renderer.rb +7 -13
  269. data/lib/rigor/sig_gen/type_elaborator.rb +15 -28
  270. data/lib/rigor/sig_gen/write_result.rb +8 -16
  271. data/lib/rigor/sig_gen/writer.rb +95 -174
  272. data/lib/rigor/sig_gen.rb +3 -6
  273. data/lib/rigor/signature_path_audit.rb +24 -30
  274. data/lib/rigor/source/constant_path.rb +10 -14
  275. data/lib/rigor/source/literals.rb +31 -45
  276. data/lib/rigor/source/node_locator.rb +9 -11
  277. data/lib/rigor/source/node_walker.rb +9 -13
  278. data/lib/rigor/source.rb +3 -4
  279. data/lib/rigor/testing.rb +16 -20
  280. data/lib/rigor/triage/catalogue.rb +38 -62
  281. data/lib/rigor/triage.rb +31 -52
  282. data/lib/rigor/trinary.rb +9 -13
  283. data/lib/rigor/type/acceptance_router.rb +4 -6
  284. data/lib/rigor/type/accepts_result.rb +10 -14
  285. data/lib/rigor/type/app.rb +19 -27
  286. data/lib/rigor/type/bot.rb +4 -6
  287. data/lib/rigor/type/bound_method.rb +10 -15
  288. data/lib/rigor/type/combinator.rb +165 -257
  289. data/lib/rigor/type/constant.rb +23 -34
  290. data/lib/rigor/type/data_class.rb +10 -15
  291. data/lib/rigor/type/data_instance.rb +14 -20
  292. data/lib/rigor/type/difference.rb +21 -32
  293. data/lib/rigor/type/dynamic.rb +3 -5
  294. data/lib/rigor/type/hash_shape.rb +32 -18
  295. data/lib/rigor/type/integer_range.rb +11 -16
  296. data/lib/rigor/type/intersection.rb +27 -42
  297. data/lib/rigor/type/nominal.rb +10 -15
  298. data/lib/rigor/type/plain_lattice.rb +9 -13
  299. data/lib/rigor/type/refined.rb +67 -114
  300. data/lib/rigor/type/singleton.rb +4 -6
  301. data/lib/rigor/type/struct_class.rb +11 -16
  302. data/lib/rigor/type/struct_instance.rb +15 -21
  303. data/lib/rigor/type/tuple.rb +14 -19
  304. data/lib/rigor/type/union.rb +30 -42
  305. data/lib/rigor/type_node/generic.rb +14 -26
  306. data/lib/rigor/type_node/identifier.rb +12 -19
  307. data/lib/rigor/type_node.rb +3 -12
  308. data/lib/rigor/value_semantics.rb +16 -21
  309. data/lib/rigor/version.rb +1 -1
  310. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/analyzer.rb +18 -30
  311. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +16 -29
  312. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +12 -23
  313. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +22 -39
  314. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/analyzer.rb +26 -46
  315. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +51 -87
  316. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +10 -17
  317. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +26 -39
  318. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +118 -176
  319. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_discoverer.rb +30 -51
  320. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +57 -92
  321. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +71 -108
  322. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/analyzer.rb +13 -22
  323. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_discoverer.rb +15 -25
  324. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_index.rb +8 -13
  325. data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +16 -24
  326. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/analyzer.rb +30 -47
  327. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +79 -129
  328. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +36 -57
  329. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +27 -41
  330. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_table.rb +16 -24
  331. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +148 -235
  332. data/plugins/rigor-activerecord/lib/rigor-activerecord.rb +3 -5
  333. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/analyzer.rb +8 -14
  334. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_discoverer.rb +9 -15
  335. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_index.rb +4 -7
  336. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +23 -41
  337. data/plugins/rigor-activestorage/lib/rigor-activestorage.rb +3 -5
  338. data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +6 -10
  339. data/plugins/rigor-activesupport-core-ext/lib/rigor-activesupport-core-ext.rb +8 -11
  340. data/plugins/rigor-devise/lib/rigor/plugin/devise.rb +30 -45
  341. data/plugins/rigor-devise/lib/rigor-devise.rb +3 -5
  342. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +43 -69
  343. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema.rb +26 -35
  344. data/plugins/rigor-dry-schema/lib/rigor-dry-schema.rb +3 -5
  345. data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +30 -47
  346. data/plugins/rigor-dry-struct/lib/rigor-dry-struct.rb +3 -5
  347. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +67 -113
  348. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +29 -46
  349. data/plugins/rigor-dry-types/lib/rigor-dry-types.rb +3 -5
  350. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/contract_scanner.rb +13 -20
  351. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +14 -23
  352. data/plugins/rigor-dry-validation/lib/rigor-dry-validation.rb +2 -3
  353. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/analyzer.rb +22 -37
  354. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +28 -46
  355. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_index.rb +13 -17
  356. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +30 -47
  357. data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +52 -80
  358. data/plugins/rigor-graphql/lib/rigor/plugin/graphql.rb +21 -31
  359. data/plugins/rigor-graphql/lib/rigor-graphql.rb +3 -5
  360. data/plugins/rigor-hanami/lib/rigor/plugin/hanami/action_checker.rb +11 -17
  361. data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +20 -34
  362. data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +45 -75
  363. data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +22 -36
  364. data/plugins/rigor-minitest/lib/rigor/plugin/minitest.rb +22 -41
  365. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/analyzer.rb +17 -32
  366. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +6 -12
  367. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_index.rb +4 -8
  368. data/plugins/rigor-pundit/lib/rigor/plugin/pundit.rb +17 -32
  369. data/plugins/rigor-rails/lib/rigor-rails.rb +11 -18
  370. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +58 -92
  371. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +20 -34
  372. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +20 -31
  373. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n.rb +49 -82
  374. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +55 -92
  375. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +51 -90
  376. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/doorkeeper_routes.rb +17 -30
  377. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +38 -70
  378. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_table.rb +42 -74
  379. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +280 -497
  380. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +54 -89
  381. data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +32 -54
  382. data/plugins/rigor-rbs-inline/lib/rigor-rbs-inline.rb +8 -13
  383. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/analyzer.rb +9 -16
  384. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_scope_index.rb +24 -39
  385. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_type_resolver.rb +13 -22
  386. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +34 -56
  387. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/scope_walker.rb +22 -42
  388. data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +43 -75
  389. data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/have_http_status_analyzer.rb +27 -39
  390. data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/http_status_codes.rb +14 -19
  391. data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +20 -34
  392. data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +28 -47
  393. data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers.rb +21 -37
  394. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/analyzer.rb +13 -22
  395. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_discoverer.rb +18 -31
  396. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_index.rb +6 -10
  397. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +14 -29
  398. data/plugins/rigor-sinatra/lib/rigor/plugin/sinatra.rb +23 -41
  399. data/plugins/rigor-sinatra/lib/rigor-sinatra.rb +3 -5
  400. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +23 -38
  401. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +57 -96
  402. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +22 -35
  403. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog_walker.rb +41 -69
  404. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/method_signature.rb +6 -10
  405. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +24 -41
  406. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sigil_detector.rb +29 -50
  407. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/type_translator.rb +55 -88
  408. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +159 -262
  409. data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +21 -29
  410. data/plugins/rigor-statesman/lib/rigor-statesman.rb +3 -5
  411. data/plugins/rigor-typescript-utility-types/lib/rigor/plugin/typescript_utility_types.rb +23 -37
  412. data/plugins/rigor-typescript-utility-types/lib/rigor-typescript-utility-types.rb +4 -6
  413. data/sig/rigor/scope.rbs +6 -0
  414. metadata +2 -1
@@ -12,23 +12,19 @@ require_relative "../project_scan"
12
12
  module Rigor
13
13
  module Analysis
14
14
  class Runner
15
- # Owns every project-wide pre-pass that runs once per run before
16
- # per-file analysis: plugin load + `#prepare`, the ADR-10
17
- # dependency-source index, the ADR-16 synthetic-method scanner,
18
- # the ADR-17 project-patched (`pre_eval:`) scanner, cross-file
19
- # class discovery, and the ADR-24 def-node + visibility index.
20
- # Also owns the {ProjectScan} snapshot adopt / build paths the LSP
21
- # uses.
15
+ # Owns every project-wide pre-pass that runs once per run before per-file analysis: plugin load +
16
+ # `#prepare`, the ADR-10 dependency-source index, the ADR-16 synthetic-method scanner, the ADR-17
17
+ # project-patched (`pre_eval:`) scanner, cross-file class discovery, and the ADR-24 def-node +
18
+ # visibility index. Also owns the {ProjectScan} snapshot adopt / build paths the LSP uses.
22
19
  #
23
- # The collaborator produces a frozen {Result} bundle; the {Runner}
24
- # assigns each slot onto its own ivar surface, preserving the exact
25
- # assignment order and timing the inline body had. The `pool_mode`
26
- # predicate is injected (it keys on `@workers` / `@buffer`, owned by
27
- # the Runner) so this collaborator never calls back into it.
20
+ # The collaborator produces a frozen {Result} bundle; the {Runner} assigns each slot onto its own
21
+ # ivar surface, preserving the exact assignment order and timing the inline body had. The `pool_mode`
22
+ # predicate is injected (it keys on `@workers` / `@buffer`, owned by the Runner) so this collaborator
23
+ # never calls back into it.
28
24
  class ProjectPrePasses
29
- # Frozen bundle of the project-wide state the pre-passes produce.
30
- # Mirrors the ivars `run_project_pre_passes` / `adopt_prebuilt`
31
- # set on the {Runner}, in the same order they were assigned.
25
+ # Frozen bundle of the project-wide state the pre-passes produce. Mirrors the ivars
26
+ # `run_project_pre_passes` / `adopt_prebuilt` set on the {Runner}, in the same order they were
27
+ # assigned.
32
28
  Result = Data.define(
33
29
  :plugin_registry,
34
30
  :dependency_source_index,
@@ -62,29 +58,23 @@ module Rigor
62
58
  @pool_mode_reader = pool_mode
63
59
  end
64
60
 
65
- # Internal: drives every project-wide pre-pass and returns the
66
- # results bundled in {Result} in the order the downstream `#run`
67
- # body expects. Extracted so `#prepare_project_scan` and the
61
+ # Internal: drives every project-wide pre-pass and returns the results bundled in {Result} in the
62
+ # order the downstream `#run` body expects. Extracted so `#prepare_project_scan` and the
68
63
  # prebuilt-less `#run` path share one implementation.
69
64
  def run(expansion:) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
70
65
  plugin_registry = load_plugins
71
66
  dependency_source_index = DependencySourceInference::Builder.build(@configuration.dependencies)
72
- # ADR-18 slice 3 — plugin prepare MUST run before the
73
- # synthetic-method scanner so cross-plugin facts
74
- # (`:dry_type_aliases` etc.) are already published when
75
- # the scanner resolves Tier C `returns_from_arg:`
76
- # lookups. The diagnostics produced by prepare are
77
- # captured here so `pre_file_diagnostics` can re-emit
78
- # them in the existing order without invoking prepare
79
- # twice. Pool mode still re-runs prepare per worker
80
- # (workers don't see this early invocation), preserving
67
+ # ADR-18 slice 3 — plugin prepare MUST run before the synthetic-method scanner so cross-plugin
68
+ # facts (`:dry_type_aliases` etc.) are already published when the scanner resolves Tier C
69
+ # `returns_from_arg:` lookups. The diagnostics produced by prepare are captured here so
70
+ # `pre_file_diagnostics` can re-emit them in the existing order without invoking prepare twice.
71
+ # Pool mode still re-runs prepare per worker (workers don't see this early invocation), preserving
81
72
  # the existing Phase 4b contract.
82
73
  cached_plugin_prepare_diagnostics =
83
74
  pool_mode? ? [] : plugin_prepare_diagnostics(plugin_registry)
84
- # ADR-16 slice 2b — Tier C pre-pass. Built once per run
85
- # against the resolved file set + the loaded plugin
86
- # registry's `heredoc_templates` so synthetic methods are
87
- # visible cross-file when per-file inference dispatches.
75
+ # ADR-16 slice 2b — Tier C pre-pass. Built once per run against the resolved file set + the loaded
76
+ # plugin registry's `heredoc_templates` so synthetic methods are visible cross-file when per-file
77
+ # inference dispatches.
88
78
  synthetic_method_index = Inference::SyntheticMethodScanner.scan(
89
79
  plugin_registry: plugin_registry,
90
80
  paths: expansion.fetch(:files),
@@ -92,36 +82,27 @@ module Rigor
92
82
  fact_store: shared_fact_store(plugin_registry),
93
83
  buffer: @buffer
94
84
  )
95
- # ADR-17 slice 2 — pre-eval pre-pass. Built once per run
96
- # from the `pre_eval:` entries that exist on disk
97
- # (slice-1's `pre-eval.file-not-found` `:error` already
98
- # surfaced any missing entries; the scanner skips them
99
- # here). The resulting {ProjectPatchedMethods} registry
100
- # is consulted by the dispatcher tier between plugins
101
- # and dependency-source inference so project-side
102
- # patches resolve cross-file.
85
+ # ADR-17 slice 2 — pre-eval pre-pass. Built once per run from the `pre_eval:` entries that exist
86
+ # on disk (slice-1's `pre-eval.file-not-found` `:error` already surfaced any missing entries; the
87
+ # scanner skips them here). The resulting {ProjectPatchedMethods} registry is consulted by the
88
+ # dispatcher tier between plugins and dependency-source inference so project-side patches resolve
89
+ # cross-file.
103
90
  existing_pre_eval = @configuration.pre_eval.select { |path| File.file?(path) }
104
91
  pre_eval_outcome = Inference::ProjectPatchedScanner.scan(existing_pre_eval, buffer: @buffer)
105
92
  project_patched_methods = pre_eval_outcome.registry
106
93
  pre_eval_diagnostics_from_scanner = pre_eval_outcome.diagnostics
107
- # Cross-file class discovery — walks every project file
108
- # for `class Foo` / `module Bar` declarations so a
109
- # `Foo.method_call` receiver in one file resolves a
110
- # `class Foo` declared in a sibling file. Without this
111
- # pre-pass each file's `discovered_classes` was per-file
112
- # only, and lexical lookup fell back to stdlib `::Foo`
113
- # for any user class shadowing a stdlib name (e.g.
114
- # `Google::Cloud::Storage::File`). Cost is one extra
115
- # parse pass over the project; small projects pay
116
- # tens of ms, larger projects ~1s. Future optimisation
117
- # can share parses with the existing scanner passes.
94
+ # Cross-file class discovery — walks every project file for `class Foo` / `module Bar`
95
+ # declarations so a `Foo.method_call` receiver in one file resolves a `class Foo` declared in a
96
+ # sibling file. Without this pre-pass each file's `discovered_classes` was per-file only, and
97
+ # lexical lookup fell back to stdlib `::Foo` for any user class shadowing a stdlib name (e.g.
98
+ # `Google::Cloud::Storage::File`). Cost is one extra parse pass over the project; small projects
99
+ # pay tens of ms, larger projects ~1s. Future optimisation can share parses with the existing
100
+ # scanner passes.
118
101
  discovered_classes =
119
102
  Inference::ScopeIndexer.discovered_classes_for_paths(expansion.fetch(:files), buffer: @buffer)
120
- # ADR-24 slice 2 — cross-file def-node + class->superclass
121
- # index so an implicit-self call inside a subclass
122
- # resolves a superclass `def` declared in a sibling
123
- # file. One extra parse pass over the project; shares
124
- # the cost profile of the class-discovery pass above.
103
+ # ADR-24 slice 2 — cross-file def-node + class->superclass index so an implicit-self call inside a
104
+ # subclass resolves a superclass `def` declared in a sibling file. One extra parse pass over the
105
+ # project; shares the cost profile of the class-discovery pass above.
125
106
  def_index =
126
107
  Inference::ScopeIndexer.discovered_def_index_for_paths(expansion.fetch(:files), buffer: @buffer)
127
108
  Result.new(
@@ -145,11 +126,9 @@ module Rigor
145
126
  )
146
127
  end
147
128
 
148
- # Builds the LSP-facing {ProjectScan} snapshot from a fresh
149
- # pre-pass run. The runner adopts `result` onto its ivars first
150
- # so the same registry object that ran `#prepare` (and so the
151
- # populated `services.fact_store`) is the one the snapshot
152
- # carries.
129
+ # Builds the LSP-facing {ProjectScan} snapshot from a fresh pre-pass run. The runner adopts `result`
130
+ # onto its ivars first so the same registry object that ran `#prepare` (and so the populated
131
+ # `services.fact_store`) is the one the snapshot carries.
153
132
  def build_project_scan(result)
154
133
  ProjectScan.new(
155
134
  plugin_registry: result.plugin_registry,
@@ -161,12 +140,10 @@ module Rigor
161
140
  )
162
141
  end
163
142
 
164
- # Translates a prebuilt {ProjectScan} snapshot supplied to
165
- # `Runner.new(prebuilt: ...)` into a {Result} the runner adopts
166
- # the same way it adopts a fresh pre-pass run. The discovery
167
- # tables are not part of the snapshot (the LSP path seeds an
168
- # empty project scope), so they stay at their frozen-empty
169
- # constructor defaults.
143
+ # Translates a prebuilt {ProjectScan} snapshot supplied to `Runner.new(prebuilt: ...)` into a
144
+ # {Result} the runner adopts the same way it adopts a fresh pre-pass run. The discovery tables are
145
+ # not part of the snapshot (the LSP path seeds an empty project scope), so they stay at their
146
+ # frozen-empty constructor defaults.
170
147
  def adopt_prebuilt(scan)
171
148
  Result.new(
172
149
  plugin_registry: scan.plugin_registry,
@@ -189,11 +166,9 @@ module Rigor
189
166
  )
190
167
  end
191
168
 
192
- # Returns the per-run shared `Plugin::FactStore` instance.
193
- # All loaded plugins share this store through their
194
- # respective `Plugin::Services` (the same instance is
195
- # threaded by `Plugin::Loader.load`). Returns `nil` when
196
- # no plugins are loaded.
169
+ # Returns the per-run shared `Plugin::FactStore` instance. All loaded plugins share this store
170
+ # through their respective `Plugin::Services` (the same instance is threaded by
171
+ # `Plugin::Loader.load`). Returns `nil` when no plugins are loaded.
197
172
  def shared_fact_store(plugin_registry)
198
173
  return nil if plugin_registry.nil? || plugin_registry.empty?
199
174
 
@@ -206,13 +181,11 @@ module Rigor
206
181
  @pool_mode_reader.call
207
182
  end
208
183
 
209
- # Loads project-configured plugins through {Rigor::Plugin::Loader}
210
- # and returns the resulting {Rigor::Plugin::Registry}. Loader
211
- # failures are isolated: each surfaces as a `:plugin_loader`
212
- # diagnostic on the run's `Result` rather than aborting the
213
- # analysis. Plugins that load successfully but contribute no
214
- # protocol hooks are inert in slice 1; later v0.1.0 slices
215
- # wire the contribution merger through this registry.
184
+ # Loads project-configured plugins through {Rigor::Plugin::Loader} and returns the resulting
185
+ # {Rigor::Plugin::Registry}. Loader failures are isolated: each surfaces as a `:plugin_loader`
186
+ # diagnostic on the run's `Result` rather than aborting the analysis. Plugins that load successfully
187
+ # but contribute no protocol hooks are inert in slice 1; later v0.1.0 slices wire the contribution
188
+ # merger through this registry.
216
189
  def load_plugins
217
190
  return Plugin::Registry::EMPTY if @configuration.plugins.empty?
218
191
 
@@ -230,14 +203,11 @@ module Rigor
230
203
  end
231
204
  end
232
205
 
233
- # Builds the {Rigor::Plugin::TrustPolicy} for this run. Trusted
234
- # gems are the gem-name half of every entry in
235
- # `Configuration#plugins`. Allowed read roots default to the
236
- # project root (CWD), the project's signature_paths, and each
237
- # trusted gem's `Gem::Specification#full_gem_path`, plus any
238
- # extras the user listed under `plugins_io.allowed_paths`.
239
- # Slice 2 keeps `network_policy` `:disabled` — the only value
240
- # the configuration accepts today.
206
+ # Builds the {Rigor::Plugin::TrustPolicy} for this run. Trusted gems are the gem-name half of every
207
+ # entry in `Configuration#plugins`. Allowed read roots default to the project root (CWD), the
208
+ # project's signature_paths, and each trusted gem's `Gem::Specification#full_gem_path`, plus any
209
+ # extras the user listed under `plugins_io.allowed_paths`. Slice 2 keeps `network_policy` `:disabled`
210
+ # the only value the configuration accepts today.
241
211
  def build_trust_policy
242
212
  trusted_gems = @configuration.plugins.map { |entry| trusted_gem_name(entry) }.uniq
243
213
  roots = [Dir.pwd]
@@ -272,18 +242,14 @@ module Rigor
272
242
  nil
273
243
  end
274
244
 
275
- # ADR-9 slice 3 — invokes every loaded plugin's `#prepare`
276
- # hook once per run, after the loader's `#init` pass and
277
- # before per-file iteration. Plugins publish facts here
278
- # for cross-plugin consumption via the shared
279
- # `services.fact_store`. Failures isolate as
280
- # `:plugin_loader runtime-error` diagnostics, mirroring the
281
- # `#diagnostics_for_file` raise envelope in
245
+ # ADR-9 slice 3 — invokes every loaded plugin's `#prepare` hook once per run, after the loader's
246
+ # `#init` pass and before per-file iteration. Plugins publish facts here for cross-plugin
247
+ # consumption via the shared `services.fact_store`. Failures isolate as `:plugin_loader
248
+ # runtime-error` diagnostics, mirroring the `#diagnostics_for_file` raise envelope in
282
249
  # `plugin_runtime_error_diagnostic`.
283
250
  #
284
- # `Plugin::Loader` returns plugins in topological order by
285
- # `manifest(consumes:)` (ADR-9 slice 5), so producers
286
- # always run before consumers.
251
+ # `Plugin::Loader` returns plugins in topological order by `manifest(consumes:)` (ADR-9 slice 5), so
252
+ # producers always run before consumers.
287
253
  def plugin_prepare_diagnostics(plugin_registry)
288
254
  return [] if plugin_registry.empty?
289
255
 
@@ -3,27 +3,22 @@
3
3
  module Rigor
4
4
  module Analysis
5
5
  class Runner
6
- # Mutable per-run holder for the four end-of-pass snapshots that
7
- # the analysis paths compute as a side effect and the rest of the
8
- # run reads back: the RBS `class_decl_paths` / `signature_paths`
9
- # tables (consumed by {RunStats}), the synthesized-namespace name
10
- # list, and the `conforms-to` scan results (consumed by the
11
- # diagnostic aggregator).
6
+ # Mutable per-run holder for the four end-of-pass snapshots that the analysis paths compute as a side
7
+ # effect and the rest of the run reads back: the RBS `class_decl_paths` / `signature_paths` tables
8
+ # (consumed by {RunStats}), the synthesized-namespace name list, and the `conforms-to` scan results
9
+ # (consumed by the diagnostic aggregator).
12
10
  #
13
- # The snapshots are written by whichever analysis path ran
14
- # ({PoolCoordinator} sequential / fork-pool / fallback) and read by
15
- # the {Runner} and {DiagnosticAggregator}. A shared mutable holder
16
- # keeps the write/read timing bit-for-bit with the original inline
17
- # ivars (the same pattern the reporter accumulators use) while
18
- # letting the writer and readers live in separate objects without a
11
+ # The snapshots are written by whichever analysis path ran ({PoolCoordinator} sequential / fork-pool /
12
+ # fallback) and read by the {Runner} and {DiagnosticAggregator}. A shared mutable holder keeps the
13
+ # write/read timing bit-for-bit with the original inline ivars (the same pattern the reporter
14
+ # accumulators use) while letting the writer and readers live in separate objects without a
19
15
  # back-reference cycle.
20
16
  class RunSnapshots
21
17
  attr_accessor :class_decl_paths, :signature_paths,
22
18
  :synthesized_namespaces, :conformance_results
23
19
 
24
- # Constructor defaults match the {Runner} constructor: the
25
- # pre-seed values `build_run_stats` / `pre_file_diagnostics` read
26
- # before the first analysis path runs are frozen empties.
20
+ # Constructor defaults match the {Runner} constructor: the pre-seed values `build_run_stats` /
21
+ # `pre_file_diagnostics` read before the first analysis path runs are frozen empties.
27
22
  def initialize
28
23
  @class_decl_paths = {}.freeze
29
24
  @signature_paths = [].freeze
@@ -31,9 +26,8 @@ module Rigor
31
26
  @conformance_results = [].freeze
32
27
  end
33
28
 
34
- # Per-`#run` reset. Mirrors the original `#run` body, which reset
35
- # these to NON-frozen empties (distinct from the frozen
36
- # constructor defaults) at the top of each run.
29
+ # Per-`#run` reset. Mirrors the original `#run` body, which reset these to NON-frozen empties (distinct
30
+ # from the frozen constructor defaults) at the top of each run.
37
31
  def reset_for_run
38
32
  @class_decl_paths = {}.freeze
39
33
  @signature_paths = []