rigortype 0.2.7 → 0.2.9

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 (433) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/data/core_overlay/csv.rbs +28 -0
  4. data/data/core_overlay/psych.rbs +22 -0
  5. data/docs/handbook/01-getting-started.md +9 -1
  6. data/docs/handbook/02-everyday-types.md +4 -1
  7. data/docs/handbook/08-understanding-errors.md +3 -3
  8. data/docs/manual/01-installation.md +1 -0
  9. data/docs/manual/02-cli-reference.md +16 -7
  10. data/docs/manual/04-diagnostics.md +7 -4
  11. data/docs/manual/06-baseline.md +5 -2
  12. data/docs/manual/07-plugins.md +1 -1
  13. data/docs/manual/14-rails-quickstart.md +4 -2
  14. data/docs/manual/15-type-protection-coverage.md +27 -4
  15. data/docs/manual/plugins/rigor-actionpack.md +1 -1
  16. data/docs/manual/plugins/rigor-activerecord.md +12 -5
  17. data/docs/manual/plugins/rigor-rails-routes.md +11 -0
  18. data/lib/rigor/analysis/baseline.rb +56 -96
  19. data/lib/rigor/analysis/buffer_binding.rb +13 -20
  20. data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +29 -48
  21. data/lib/rigor/analysis/check_rules/dead_assignment_collector.rb +35 -54
  22. data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +23 -37
  23. data/lib/rigor/analysis/check_rules/main_pass_collector.rb +16 -23
  24. data/lib/rigor/analysis/check_rules/rule_walk.rb +48 -71
  25. data/lib/rigor/analysis/check_rules/self_closedness_scanner.rb +19 -28
  26. data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +48 -67
  27. data/lib/rigor/analysis/check_rules.rb +174 -274
  28. data/lib/rigor/analysis/dependency_recorder.rb +26 -38
  29. data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +13 -25
  30. data/lib/rigor/analysis/dependency_source_inference/builder.rb +17 -30
  31. data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +15 -26
  32. data/lib/rigor/analysis/dependency_source_inference/index.rb +45 -76
  33. data/lib/rigor/analysis/dependency_source_inference/return_type_heuristic.rb +23 -40
  34. data/lib/rigor/analysis/dependency_source_inference/walker.rb +50 -83
  35. data/lib/rigor/analysis/dependency_source_inference.rb +6 -10
  36. data/lib/rigor/analysis/diagnostic.rb +48 -75
  37. data/lib/rigor/analysis/erb_template_detector.rb +13 -18
  38. data/lib/rigor/analysis/fact_store.rb +12 -22
  39. data/lib/rigor/analysis/incremental.rb +47 -63
  40. data/lib/rigor/analysis/incremental_session.rb +74 -100
  41. data/lib/rigor/analysis/project_scan.rb +12 -23
  42. data/lib/rigor/analysis/result.rb +3 -5
  43. data/lib/rigor/analysis/rule_catalog.rb +67 -95
  44. data/lib/rigor/analysis/run_stats.rb +38 -61
  45. data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +101 -160
  46. data/lib/rigor/analysis/runner/pool_coordinator.rb +121 -188
  47. data/lib/rigor/analysis/runner/project_pre_passes.rb +62 -96
  48. data/lib/rigor/analysis/runner/run_snapshots.rb +12 -18
  49. data/lib/rigor/analysis/runner.rb +220 -333
  50. data/lib/rigor/analysis/self_call_resolution_recorder.rb +30 -43
  51. data/lib/rigor/analysis/worker_session.rb +64 -102
  52. data/lib/rigor/ast/type_node.rb +6 -8
  53. data/lib/rigor/ast.rb +6 -10
  54. data/lib/rigor/bleeding_edge.rb +27 -35
  55. data/lib/rigor/builtins/hkt_builtins.rb +7 -14
  56. data/lib/rigor/builtins/imported_refinements.rb +106 -149
  57. data/lib/rigor/builtins/predefined_constant_refinements.rb +51 -65
  58. data/lib/rigor/builtins/regex_refinement.rb +32 -43
  59. data/lib/rigor/builtins/static_return_refinements.rb +57 -81
  60. data/lib/rigor/cache/descriptor.rb +58 -94
  61. data/lib/rigor/cache/incremental_snapshot.rb +32 -48
  62. data/lib/rigor/cache/rbs_cache_producer.rb +10 -15
  63. data/lib/rigor/cache/rbs_class_ancestor_table.rb +10 -16
  64. data/lib/rigor/cache/rbs_class_type_param_names.rb +10 -16
  65. data/lib/rigor/cache/rbs_constant_table.rb +8 -13
  66. data/lib/rigor/cache/rbs_descriptor.rb +8 -13
  67. data/lib/rigor/cache/rbs_environment.rb +11 -19
  68. data/lib/rigor/cache/rbs_environment_marshal_patch.rb +11 -19
  69. data/lib/rigor/cache/rbs_known_class_names.rb +8 -12
  70. data/lib/rigor/cache/store.rb +248 -186
  71. data/lib/rigor/cli/annotate_command.rb +51 -88
  72. data/lib/rigor/cli/baseline_command.rb +10 -17
  73. data/lib/rigor/cli/check_command.rb +121 -199
  74. data/lib/rigor/cli/check_runner_factory.rb +8 -14
  75. data/lib/rigor/cli/ci_detector.rb +9 -14
  76. data/lib/rigor/cli/command.rb +8 -14
  77. data/lib/rigor/cli/coverage_command.rb +62 -48
  78. data/lib/rigor/cli/coverage_mutation.rb +14 -19
  79. data/lib/rigor/cli/coverage_report.rb +0 -2
  80. data/lib/rigor/cli/coverage_scan.rb +7 -11
  81. data/lib/rigor/cli/diagnostic_formats.rb +46 -62
  82. data/lib/rigor/cli/diff_command.rb +10 -20
  83. data/lib/rigor/cli/docs_command.rb +26 -40
  84. data/lib/rigor/cli/doctor_command.rb +8 -9
  85. data/lib/rigor/cli/explain_command.rb +4 -7
  86. data/lib/rigor/cli/fused_protection_renderer.rb +4 -5
  87. data/lib/rigor/cli/fused_protection_report.rb +6 -8
  88. data/lib/rigor/cli/lsp_command.rb +11 -19
  89. data/lib/rigor/cli/mcp_command.rb +4 -6
  90. data/lib/rigor/cli/mutation_protection_renderer.rb +3 -4
  91. data/lib/rigor/cli/mutation_protection_report.rb +6 -9
  92. data/lib/rigor/cli/options.rb +11 -19
  93. data/lib/rigor/cli/plugin_command.rb +18 -30
  94. data/lib/rigor/cli/plugins_command.rb +29 -51
  95. data/lib/rigor/cli/plugins_renderer.rb +12 -20
  96. data/lib/rigor/cli/prism_colorizer.rb +13 -19
  97. data/lib/rigor/cli/protection_fork_scan.rb +55 -0
  98. data/lib/rigor/cli/protection_renderer.rb +5 -7
  99. data/lib/rigor/cli/protection_report.rb +34 -18
  100. data/lib/rigor/cli/renderable.rb +4 -6
  101. data/lib/rigor/cli/show_bleedingedge_command.rb +5 -8
  102. data/lib/rigor/cli/sig_gen_command.rb +14 -26
  103. data/lib/rigor/cli/skill_command.rb +30 -47
  104. data/lib/rigor/cli/skill_describe.rb +40 -64
  105. data/lib/rigor/cli/trace_command.rb +9 -16
  106. data/lib/rigor/cli/trace_renderer.rb +35 -51
  107. data/lib/rigor/cli/triage_command.rb +6 -10
  108. data/lib/rigor/cli/triage_renderer.rb +1 -2
  109. data/lib/rigor/cli/type_of_command.rb +14 -23
  110. data/lib/rigor/cli/type_of_renderer.rb +3 -5
  111. data/lib/rigor/cli/type_scan_command.rb +6 -10
  112. data/lib/rigor/cli/type_scan_renderer.rb +3 -5
  113. data/lib/rigor/cli/type_scan_report.rb +2 -3
  114. data/lib/rigor/cli/upgrade_command.rb +2 -3
  115. data/lib/rigor/cli.rb +16 -28
  116. data/lib/rigor/config_audit.rb +35 -44
  117. data/lib/rigor/configuration/dependencies.rb +41 -70
  118. data/lib/rigor/configuration/severity_profile.rb +28 -42
  119. data/lib/rigor/configuration.rb +150 -241
  120. data/lib/rigor/environment/bundle_sig_discovery.rb +74 -118
  121. data/lib/rigor/environment/class_registry.rb +19 -26
  122. data/lib/rigor/environment/constant_type_cache_holder.rb +14 -21
  123. data/lib/rigor/environment/hkt_registry_holder.rb +6 -12
  124. data/lib/rigor/environment/lockfile_resolver.rb +31 -47
  125. data/lib/rigor/environment/missing_gem_constant_index.rb +128 -0
  126. data/lib/rigor/environment/rbs_collection_discovery.rb +39 -63
  127. data/lib/rigor/environment/rbs_coverage_report.rb +24 -42
  128. data/lib/rigor/environment/rbs_loader.rb +420 -518
  129. data/lib/rigor/environment/reflection.rb +28 -53
  130. data/lib/rigor/environment/reporters.rb +13 -24
  131. data/lib/rigor/environment.rb +225 -304
  132. data/lib/rigor/flow_contribution/conflict.rb +16 -27
  133. data/lib/rigor/flow_contribution/element.rb +7 -12
  134. data/lib/rigor/flow_contribution/fact.rb +33 -57
  135. data/lib/rigor/flow_contribution/merge_result.rb +6 -9
  136. data/lib/rigor/flow_contribution/merger.rb +32 -47
  137. data/lib/rigor/flow_contribution.rb +37 -55
  138. data/lib/rigor/inference/acceptance.rb +133 -219
  139. data/lib/rigor/inference/block_parameter_binder.rb +52 -82
  140. data/lib/rigor/inference/body_fixpoint.rb +22 -30
  141. data/lib/rigor/inference/budget_trace.rb +43 -63
  142. data/lib/rigor/inference/builtins/array_catalog.rb +4 -6
  143. data/lib/rigor/inference/builtins/comparable_catalog.rb +4 -6
  144. data/lib/rigor/inference/builtins/complex_catalog.rb +13 -19
  145. data/lib/rigor/inference/builtins/date_catalog.rb +38 -67
  146. data/lib/rigor/inference/builtins/encoding_catalog.rb +22 -36
  147. data/lib/rigor/inference/builtins/enumerable_catalog.rb +4 -6
  148. data/lib/rigor/inference/builtins/exception_catalog.rb +38 -57
  149. data/lib/rigor/inference/builtins/hash_catalog.rb +9 -14
  150. data/lib/rigor/inference/builtins/method_catalog.rb +29 -48
  151. data/lib/rigor/inference/builtins/numeric_catalog.rb +13 -18
  152. data/lib/rigor/inference/builtins/pathname_catalog.rb +8 -13
  153. data/lib/rigor/inference/builtins/proc_catalog.rb +38 -62
  154. data/lib/rigor/inference/builtins/random_catalog.rb +21 -32
  155. data/lib/rigor/inference/builtins/range_catalog.rb +12 -21
  156. data/lib/rigor/inference/builtins/rational_catalog.rb +9 -15
  157. data/lib/rigor/inference/builtins/re_catalog.rb +29 -48
  158. data/lib/rigor/inference/builtins/set_catalog.rb +18 -27
  159. data/lib/rigor/inference/builtins/string_catalog.rb +12 -19
  160. data/lib/rigor/inference/builtins/struct_catalog.rb +18 -30
  161. data/lib/rigor/inference/builtins/time_catalog.rb +28 -44
  162. data/lib/rigor/inference/closure_escape_analyzer.rb +44 -67
  163. data/lib/rigor/inference/coverage_scanner.rb +13 -18
  164. data/lib/rigor/inference/def_return_typer.rb +8 -14
  165. data/lib/rigor/inference/dynamic_origin.rb +23 -20
  166. data/lib/rigor/inference/expression_typer.rb +794 -1154
  167. data/lib/rigor/inference/fallback.rb +8 -12
  168. data/lib/rigor/inference/fallback_tracer.rb +4 -10
  169. data/lib/rigor/inference/flow_tracer.rb +25 -36
  170. data/lib/rigor/inference/fork_map.rb +87 -0
  171. data/lib/rigor/inference/hkt_body.rb +45 -68
  172. data/lib/rigor/inference/hkt_body_parser.rb +33 -52
  173. data/lib/rigor/inference/hkt_reducer.rb +38 -59
  174. data/lib/rigor/inference/hkt_registry.rb +50 -76
  175. data/lib/rigor/inference/indexed_narrowing.rb +55 -81
  176. data/lib/rigor/inference/macro_block_self_type.rb +21 -34
  177. data/lib/rigor/inference/method_dispatcher/array_to_h_folding.rb +11 -18
  178. data/lib/rigor/inference/method_dispatcher/block_folding.rb +49 -83
  179. data/lib/rigor/inference/method_dispatcher/call_context.rb +16 -23
  180. data/lib/rigor/inference/method_dispatcher/cgi_folding.rb +13 -22
  181. data/lib/rigor/inference/method_dispatcher/constant_folding.rb +307 -454
  182. data/lib/rigor/inference/method_dispatcher/data_folding.rb +24 -34
  183. data/lib/rigor/inference/method_dispatcher/file_folding.rb +22 -37
  184. data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +52 -81
  185. data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +51 -78
  186. data/lib/rigor/inference/method_dispatcher/literal_string_folding.rb +60 -97
  187. data/lib/rigor/inference/method_dispatcher/math_folding.rb +23 -34
  188. data/lib/rigor/inference/method_dispatcher/member_shape_projection.rb +18 -26
  189. data/lib/rigor/inference/method_dispatcher/method_folding.rb +37 -71
  190. data/lib/rigor/inference/method_dispatcher/overload_selector.rb +114 -182
  191. data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +122 -193
  192. data/lib/rigor/inference/method_dispatcher/receiver_affinity.rb +15 -24
  193. data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +64 -93
  194. data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +31 -45
  195. data/lib/rigor/inference/method_dispatcher/set_folding.rb +6 -9
  196. data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +356 -511
  197. data/lib/rigor/inference/method_dispatcher/shellwords_folding.rb +22 -32
  198. data/lib/rigor/inference/method_dispatcher/singleton_folding.rb +15 -21
  199. data/lib/rigor/inference/method_dispatcher/struct_folding.rb +66 -82
  200. data/lib/rigor/inference/method_dispatcher/time_folding.rb +10 -15
  201. data/lib/rigor/inference/method_dispatcher/uri_folding.rb +9 -13
  202. data/lib/rigor/inference/method_dispatcher.rb +378 -524
  203. data/lib/rigor/inference/method_parameter_binder.rb +81 -114
  204. data/lib/rigor/inference/multi_target_binder.rb +51 -68
  205. data/lib/rigor/inference/mutation_widening.rb +115 -158
  206. data/lib/rigor/inference/narrowing.rb +627 -727
  207. data/lib/rigor/inference/origin_lookup.rb +38 -0
  208. data/lib/rigor/inference/parameter_inference_collector.rb +154 -109
  209. data/lib/rigor/inference/precision_scanner.rb +26 -35
  210. data/lib/rigor/inference/project_patched_methods.rb +20 -32
  211. data/lib/rigor/inference/project_patched_scanner.rb +23 -37
  212. data/lib/rigor/inference/protection_scanner.rb +16 -18
  213. data/lib/rigor/inference/rbs_type_translator.rb +49 -66
  214. data/lib/rigor/inference/scope_indexer.rb +473 -821
  215. data/lib/rigor/inference/statement_evaluator.rb +754 -1114
  216. data/lib/rigor/inference/struct_fold_safety.rb +34 -48
  217. data/lib/rigor/inference/synthetic_method.rb +9 -16
  218. data/lib/rigor/inference/synthetic_method_index.rb +20 -35
  219. data/lib/rigor/inference/synthetic_method_scanner.rb +63 -103
  220. data/lib/rigor/language_server/buffer_resolution.rb +6 -9
  221. data/lib/rigor/language_server/buffer_table.rb +11 -18
  222. data/lib/rigor/language_server/completion_provider.rb +69 -116
  223. data/lib/rigor/language_server/debouncer.rb +16 -25
  224. data/lib/rigor/language_server/diagnostic_publisher.rb +26 -40
  225. data/lib/rigor/language_server/document_symbol_provider.rb +14 -19
  226. data/lib/rigor/language_server/folding_range_provider.rb +11 -19
  227. data/lib/rigor/language_server/hover_provider.rb +8 -11
  228. data/lib/rigor/language_server/hover_renderer.rb +56 -93
  229. data/lib/rigor/language_server/loop.rb +14 -19
  230. data/lib/rigor/language_server/project_context.rb +46 -74
  231. data/lib/rigor/language_server/selection_range_provider.rb +9 -12
  232. data/lib/rigor/language_server/server.rb +55 -83
  233. data/lib/rigor/language_server/signature_help_provider.rb +29 -46
  234. data/lib/rigor/language_server/synchronized_writer.rb +4 -7
  235. data/lib/rigor/language_server/uri.rb +8 -13
  236. data/lib/rigor/language_server.rb +4 -6
  237. data/lib/rigor/mcp/loop.rb +2 -3
  238. data/lib/rigor/mcp/server.rb +4 -7
  239. data/lib/rigor/mcp.rb +3 -6
  240. data/lib/rigor/plugin/access_denied_error.rb +5 -8
  241. data/lib/rigor/plugin/additional_initializer.rb +21 -31
  242. data/lib/rigor/plugin/base.rb +335 -518
  243. data/lib/rigor/plugin/blueprint.rb +14 -23
  244. data/lib/rigor/plugin/box.rb +18 -29
  245. data/lib/rigor/plugin/fact_store.rb +16 -26
  246. data/lib/rigor/plugin/inflector.rb +37 -53
  247. data/lib/rigor/plugin/io_boundary.rb +33 -56
  248. data/lib/rigor/plugin/isolation.rb +42 -55
  249. data/lib/rigor/plugin/load_error.rb +10 -15
  250. data/lib/rigor/plugin/loader.rb +30 -49
  251. data/lib/rigor/plugin/macro/block_as_method.rb +20 -32
  252. data/lib/rigor/plugin/macro/heredoc_template.rb +35 -58
  253. data/lib/rigor/plugin/macro/nested_class_template.rb +22 -36
  254. data/lib/rigor/plugin/macro/trait_registry.rb +34 -51
  255. data/lib/rigor/plugin/macro.rb +10 -15
  256. data/lib/rigor/plugin/manifest.rb +85 -144
  257. data/lib/rigor/plugin/node_context.rb +14 -22
  258. data/lib/rigor/plugin/node_rule_walk.rb +49 -74
  259. data/lib/rigor/plugin/protocol_contract.rb +25 -39
  260. data/lib/rigor/plugin/registry.rb +132 -205
  261. data/lib/rigor/plugin/services.rb +21 -33
  262. data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +11 -19
  263. data/lib/rigor/plugin/trust_policy.rb +24 -38
  264. data/lib/rigor/plugin/type_node_resolver.rb +15 -24
  265. data/lib/rigor/protection/diagnostic_oracle.rb +11 -13
  266. data/lib/rigor/protection/mutation_scanner.rb +27 -35
  267. data/lib/rigor/protection/mutator.rb +50 -70
  268. data/lib/rigor/protection/test_suite_oracle.rb +20 -27
  269. data/lib/rigor/rbs_extended/conformance_checker.rb +48 -68
  270. data/lib/rigor/rbs_extended/hkt_directives.rb +28 -54
  271. data/lib/rigor/rbs_extended/reporter.rb +24 -40
  272. data/lib/rigor/rbs_extended.rb +107 -197
  273. data/lib/rigor/reflection.rb +68 -86
  274. data/lib/rigor/scope/discovery_index.rb +14 -19
  275. data/lib/rigor/scope.rb +255 -310
  276. data/lib/rigor/sig_gen/classification.rb +6 -10
  277. data/lib/rigor/sig_gen/generator.rb +197 -323
  278. data/lib/rigor/sig_gen/layout_index.rb +12 -20
  279. data/lib/rigor/sig_gen/method_candidate.rb +12 -17
  280. data/lib/rigor/sig_gen/observation_collector.rb +38 -70
  281. data/lib/rigor/sig_gen/observed_call.rb +13 -23
  282. data/lib/rigor/sig_gen/path_mapper.rb +17 -29
  283. data/lib/rigor/sig_gen/renderer.rb +7 -13
  284. data/lib/rigor/sig_gen/type_elaborator.rb +15 -28
  285. data/lib/rigor/sig_gen/write_result.rb +8 -16
  286. data/lib/rigor/sig_gen/writer.rb +95 -174
  287. data/lib/rigor/sig_gen.rb +3 -6
  288. data/lib/rigor/signature_path_audit.rb +24 -30
  289. data/lib/rigor/source/constant_path.rb +10 -14
  290. data/lib/rigor/source/literals.rb +31 -45
  291. data/lib/rigor/source/node_locator.rb +9 -11
  292. data/lib/rigor/source/node_walker.rb +9 -13
  293. data/lib/rigor/source.rb +3 -4
  294. data/lib/rigor/testing.rb +16 -20
  295. data/lib/rigor/triage/catalogue.rb +38 -62
  296. data/lib/rigor/triage.rb +31 -52
  297. data/lib/rigor/trinary.rb +9 -13
  298. data/lib/rigor/type/acceptance_router.rb +4 -6
  299. data/lib/rigor/type/accepts_result.rb +10 -14
  300. data/lib/rigor/type/app.rb +19 -27
  301. data/lib/rigor/type/bot.rb +4 -6
  302. data/lib/rigor/type/bound_method.rb +10 -15
  303. data/lib/rigor/type/combinator.rb +165 -257
  304. data/lib/rigor/type/constant.rb +23 -34
  305. data/lib/rigor/type/data_class.rb +10 -15
  306. data/lib/rigor/type/data_instance.rb +14 -20
  307. data/lib/rigor/type/difference.rb +21 -32
  308. data/lib/rigor/type/dynamic.rb +3 -5
  309. data/lib/rigor/type/hash_shape.rb +32 -18
  310. data/lib/rigor/type/integer_range.rb +11 -16
  311. data/lib/rigor/type/intersection.rb +27 -42
  312. data/lib/rigor/type/nominal.rb +10 -15
  313. data/lib/rigor/type/plain_lattice.rb +9 -13
  314. data/lib/rigor/type/refined.rb +67 -114
  315. data/lib/rigor/type/singleton.rb +4 -6
  316. data/lib/rigor/type/struct_class.rb +11 -16
  317. data/lib/rigor/type/struct_instance.rb +15 -21
  318. data/lib/rigor/type/tuple.rb +14 -19
  319. data/lib/rigor/type/union.rb +30 -42
  320. data/lib/rigor/type_node/generic.rb +14 -26
  321. data/lib/rigor/type_node/identifier.rb +12 -19
  322. data/lib/rigor/type_node.rb +3 -12
  323. data/lib/rigor/value_semantics.rb +16 -21
  324. data/lib/rigor/version.rb +1 -1
  325. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/analyzer.rb +18 -30
  326. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +16 -29
  327. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +12 -23
  328. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +22 -39
  329. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/analyzer.rb +26 -46
  330. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +51 -87
  331. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +10 -17
  332. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +26 -39
  333. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +141 -184
  334. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_discoverer.rb +30 -51
  335. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +57 -92
  336. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +92 -108
  337. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/analyzer.rb +13 -22
  338. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_discoverer.rb +15 -25
  339. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_index.rb +8 -13
  340. data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +16 -24
  341. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/analyzer.rb +40 -48
  342. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +140 -129
  343. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +56 -59
  344. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +27 -41
  345. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_table.rb +16 -24
  346. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/structure_sql_parser.rb +172 -0
  347. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +168 -241
  348. data/plugins/rigor-activerecord/lib/rigor-activerecord.rb +3 -5
  349. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/analyzer.rb +8 -14
  350. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_discoverer.rb +9 -15
  351. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_index.rb +4 -7
  352. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +23 -41
  353. data/plugins/rigor-activestorage/lib/rigor-activestorage.rb +3 -5
  354. data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +6 -10
  355. data/plugins/rigor-activesupport-core-ext/lib/rigor-activesupport-core-ext.rb +8 -11
  356. data/plugins/rigor-activesupport-core-ext/sig/active_support/core_ext.rbs +32 -0
  357. data/plugins/rigor-devise/lib/rigor/plugin/devise.rb +30 -45
  358. data/plugins/rigor-devise/lib/rigor-devise.rb +3 -5
  359. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +43 -69
  360. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema.rb +26 -35
  361. data/plugins/rigor-dry-schema/lib/rigor-dry-schema.rb +3 -5
  362. data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +30 -47
  363. data/plugins/rigor-dry-struct/lib/rigor-dry-struct.rb +3 -5
  364. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +67 -113
  365. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +29 -46
  366. data/plugins/rigor-dry-types/lib/rigor-dry-types.rb +3 -5
  367. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/contract_scanner.rb +13 -20
  368. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +14 -23
  369. data/plugins/rigor-dry-validation/lib/rigor-dry-validation.rb +2 -3
  370. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/analyzer.rb +22 -37
  371. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +28 -46
  372. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_index.rb +13 -17
  373. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +30 -47
  374. data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +52 -80
  375. data/plugins/rigor-graphql/lib/rigor/plugin/graphql.rb +21 -31
  376. data/plugins/rigor-graphql/lib/rigor-graphql.rb +3 -5
  377. data/plugins/rigor-hanami/lib/rigor/plugin/hanami/action_checker.rb +11 -17
  378. data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +20 -34
  379. data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +45 -75
  380. data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +22 -36
  381. data/plugins/rigor-minitest/lib/rigor/plugin/minitest.rb +22 -41
  382. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/analyzer.rb +17 -32
  383. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +6 -12
  384. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_index.rb +4 -8
  385. data/plugins/rigor-pundit/lib/rigor/plugin/pundit.rb +17 -32
  386. data/plugins/rigor-rails/lib/rigor-rails.rb +11 -18
  387. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +58 -92
  388. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +20 -34
  389. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +20 -31
  390. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n.rb +49 -82
  391. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +55 -92
  392. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +51 -90
  393. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/doorkeeper_routes.rb +17 -30
  394. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/grape_api_discoverer.rb +189 -0
  395. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +38 -70
  396. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_table.rb +61 -75
  397. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +319 -505
  398. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +91 -96
  399. data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +32 -54
  400. data/plugins/rigor-rbs-inline/lib/rigor-rbs-inline.rb +8 -13
  401. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/analyzer.rb +9 -16
  402. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_scope_index.rb +24 -39
  403. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_type_resolver.rb +13 -22
  404. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +34 -56
  405. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/scope_walker.rb +22 -42
  406. data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +43 -75
  407. data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/have_http_status_analyzer.rb +27 -39
  408. data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/http_status_codes.rb +14 -19
  409. data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +20 -34
  410. data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +28 -47
  411. data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers.rb +21 -37
  412. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/analyzer.rb +13 -22
  413. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_discoverer.rb +18 -31
  414. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_index.rb +6 -10
  415. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +14 -29
  416. data/plugins/rigor-sinatra/lib/rigor/plugin/sinatra.rb +23 -41
  417. data/plugins/rigor-sinatra/lib/rigor-sinatra.rb +3 -5
  418. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +23 -38
  419. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +57 -96
  420. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +22 -35
  421. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog_walker.rb +41 -69
  422. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/method_signature.rb +6 -10
  423. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +24 -41
  424. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sigil_detector.rb +29 -50
  425. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/type_translator.rb +55 -88
  426. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +159 -262
  427. data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +21 -29
  428. data/plugins/rigor-statesman/lib/rigor-statesman.rb +3 -5
  429. data/plugins/rigor-typescript-utility-types/lib/rigor/plugin/typescript_utility_types.rb +23 -37
  430. data/plugins/rigor-typescript-utility-types/lib/rigor-typescript-utility-types.rb +4 -6
  431. data/sig/rigor/environment.rbs +1 -0
  432. data/sig/rigor/scope.rbs +6 -0
  433. metadata +9 -1
@@ -19,37 +19,26 @@ module Rigor
19
19
  class CLI
20
20
  # Executes `rigor annotate FILE`.
21
21
  #
22
- # For every source line the command finds the expression the
23
- # line evaluates to the last statement that ends on the line
24
- # (so `1; 2; 3` reports `3`), or, for a line that no statement
25
- # closes, the widest expression ending there (so the `if nil`
26
- # header reports its condition). It infers that expression's
27
- # type and appends a `#=> <type>` comment (the xmpfilter /
28
- # seeing_is_believing convention).
22
+ # For every source line the command finds the expression the line evaluates to — the last statement that ends on the
23
+ # line (so `1; 2; 3` reports `3`), or, for a line that no statement closes, the widest expression ending there (so
24
+ # the `if nil` header reports its condition). It infers that expression's type and appends a `#=> <type>` comment
25
+ # (the xmpfilter / seeing_is_believing convention).
29
26
  #
30
- # The annotated source is re-parsed with Prism — a sanity gate,
31
- # since the appended text is always a comment and printed to
32
- # stdout. When colour is enabled and `bat`
33
- # (https://github.com/sharkdp/bat) is on PATH it is used for
34
- # highlighting; otherwise IRB-style highlighting via
35
- # {PrismColorizer}.
27
+ # The annotated source is re-parsed with Prism — a sanity gate, since the appended text is always a comment — and
28
+ # printed to stdout. When colour is enabled and `bat` (https://github.com/sharkdp/bat) is on PATH it is used for
29
+ # highlighting; otherwise IRB-style highlighting via {PrismColorizer}.
36
30
  class AnnotateCommand < Command
37
31
  USAGE = "Usage: rigor annotate [options] FILE"
38
32
 
39
- # Trailing `#=> …` annotation comment. Matched and stripped
40
- # before re-annotating so re-running is idempotent this
41
- # follows xmpfilter's convention of owning the `#=>` marker,
42
- # and also absorbs the older `#=> dump_type: <type>` spelling
43
- # (idempotency across re-runs). The leading `\s` requirement
44
- # keeps a `#=>` inside a string literal (no preceding
45
- # whitespace ambiguity aside) from matching mid-expression.
33
+ # Trailing `#=> …` annotation comment. Matched and stripped before re-annotating so re-running is idempotent —
34
+ # this follows xmpfilter's convention of owning the `#=>` marker, and also absorbs the older `#=> dump_type:
35
+ # <type>` spelling (idempotency across re-runs). The leading `\s` requirement keeps a `#=>` inside a string
36
+ # literal (no preceding whitespace ambiguity aside) from matching mid-expression.
46
37
  ANNOTATION_PATTERN = /\s+#=>(?:\s.*)?\z/
47
38
 
48
- # Arguments for highlighting through `bat`: the annotated
49
- # text arrives on stdin, so the language must be explicit;
50
- # `--style=plain` drops the grid/header chrome so the output
51
- # matches the PrismColorizer fallback line-for-line; paging
52
- # stays off because the CLI may itself sit in a pipeline.
39
+ # Arguments for highlighting through `bat`: the annotated text arrives on stdin, so the language must be explicit;
40
+ # `--style=plain` drops the grid/header chrome so the output matches the PrismColorizer fallback line-for-line;
41
+ # paging stays off because the CLI may itself sit in a pipeline.
53
42
  BAT_ARGS = %w[--language=ruby --style=plain --paging=never --color=always].freeze
54
43
 
55
44
  # @return [Integer] CLI exit status.
@@ -71,8 +60,7 @@ module Rigor
71
60
  private
72
61
 
73
62
  def parse_options
74
- # Default: colour a tty, unless `NO_COLOR` opts out. An
75
- # explicit `--color` / `--no-color` overrides both.
63
+ # Default: colour a tty, unless `NO_COLOR` opts out. An explicit `--color` / `--no-color` overrides both.
76
64
  options = { config: nil, color: @out.tty? && !no_color_env?, bat: nil, format: :text }
77
65
 
78
66
  parser = OptionParser.new do |opts|
@@ -96,9 +84,8 @@ module Rigor
96
84
  options
97
85
  end
98
86
 
99
- # https://no-color.org — colour output is suppressed by
100
- # default when `NO_COLOR` is present and not an empty string,
101
- # regardless of its value.
87
+ # https://no-color.org — colour output is suppressed by default when `NO_COLOR` is present and not an empty
88
+ # string, regardless of its value.
102
89
  def no_color_env?
103
90
  value = ENV.fetch("NO_COLOR", nil)
104
91
  !value.nil? && !value.empty?
@@ -106,22 +93,17 @@ module Rigor
106
93
 
107
94
  def execute(file, options)
108
95
  configuration = Configuration.load(options.fetch(:config))
109
- # Force UTF-8 (with BOM tolerance) regardless of
110
- # `Encoding.default_external`. Under a minimal locale
111
- # the default is US-ASCII; reading multi-byte source
112
- # under that tag makes the post-parse `String#sub` /
113
- # `String#lines` calls in `#annotate` raise
114
- # `invalid byte sequence in US-ASCII`. Ruby source is
115
- # UTF-8 by convention (the parser's own assumption
116
- # absent a magic comment).
96
+ # Force UTF-8 (with BOM tolerance) regardless of `Encoding.default_external`. Under a minimal locale the default
97
+ # is US-ASCII; reading multi-byte source under that tag makes the post-parse `String#sub` / `String#lines` calls
98
+ # in `#annotate` raise `invalid byte sequence in US-ASCII`. Ruby source is UTF-8 by convention (the parser's own
99
+ # assumption absent a magic comment).
117
100
  source = File.read(file, mode: "r:bom|utf-8")
118
101
  parse_result = Prism.parse(source, filepath: file, version: configuration.target_ruby)
119
102
  return 1 if parse_errors?(parse_result, file)
120
103
 
121
- # `converged_loop_recording` re-records fixpoint-tracked loop
122
- # bodies from their converged (post-writeback) bindings, so a
123
- # loop-body line annotates the joined widened type (`Integer`)
124
- # rather than a stale first-iterations constant (`1 | 2`).
104
+ # `converged_loop_recording` re-records fixpoint-tracked loop bodies from their converged (post-writeback)
105
+ # bindings, so a loop-body line annotates the joined widened type (`Integer`) rather than a stale
106
+ # first-iterations constant (`1 | 2`).
125
107
  scope_index = Inference::ScopeIndexer.index(
126
108
  parse_result.value, default_scope: base_scope(configuration),
127
109
  converged_loop_recording: true
@@ -137,11 +119,10 @@ module Rigor
137
119
  0
138
120
  end
139
121
 
140
- # `--format json` — emit the { line_number => type } map directly, the
141
- # same data the text renderer consumes, so clients (the playground,
142
- # editors) get structured annotations without reparsing the `#=> <type>`
143
- # comment grammar. Values are the short type descriptions the text form
144
- # also shows; keys are 1-based line numbers as strings (JSON object keys).
122
+ # `--format json` — emit the { line_number => type } map directly, the same data the text renderer consumes, so
123
+ # clients (the playground, editors) get structured annotations without reparsing the `#=> <type>` comment grammar.
124
+ # Values are the short type descriptions the text form also shows; keys are 1-based line numbers as strings (JSON
125
+ # object keys).
145
126
  def emit_json(line_types)
146
127
  annotations = line_types.keys.sort.to_h { |line| [line.to_s, line_types[line].describe(:short)] }
147
128
  @out.puts(JSON.generate({ "annotations" => annotations }))
@@ -165,8 +146,7 @@ module Rigor
165
146
  true
166
147
  end
167
148
 
168
- # Appends ` #=> <type>` to every line a type was inferred
169
- # for, aligning the comment column.
149
+ # Appends ` #=> <type>` to every line a type was inferred for, aligning the comment column.
170
150
  def annotate(source, line_types)
171
151
  lines = source.lines
172
152
  column = annotation_column(lines, line_types)
@@ -198,10 +178,8 @@ module Rigor
198
178
  rendered || PrismColorizer.colorize(annotated)
199
179
  end
200
180
 
201
- # Pipes the annotated source through `bat` and returns its
202
- # highlighted output, or nil when bat is unavailable or
203
- # fails (broken install, killed mid-write) — the caller
204
- # falls back to {PrismColorizer}. An explicit `--bat` with
181
+ # Pipes the annotated source through `bat` and returns its highlighted output, or nil when bat is unavailable or
182
+ # fails (broken install, killed mid-write) the caller falls back to {PrismColorizer}. An explicit `--bat` with
205
183
  # no bat on PATH warns instead of failing silently.
206
184
  def render_with_bat(annotated, forced: nil)
207
185
  executable = bat_executable
@@ -233,9 +211,8 @@ module Rigor
233
211
  end
234
212
  end
235
213
 
236
- # Walks a parsed program and resolves, per source line, the
237
- # type of the expression the line evaluates to. Used only by
238
- # {AnnotateCommand}.
214
+ # Walks a parsed program and resolves, per source line, the type of the expression the line evaluates to. Used only
215
+ # by {AnnotateCommand}.
239
216
  class LineTypeCollector
240
217
  def initialize(scope_index)
241
218
  @scope_index = scope_index
@@ -256,16 +233,11 @@ module Rigor
256
233
 
257
234
  private
258
235
 
259
- # Yields each statement node (a child of any `StatementsNode`
260
- # anywhere in the tree) in post-order: nested statements are
261
- # yielded before the enclosing statement that contains them.
262
- # `by_line[end_line] = type` overwrites earlier entries, so
263
- # post-order means the *outermost* statement closing a line
264
- # wins — for `b = if cond then :then else :else end` the
265
- # line resolves to the assignment's type (the if-expression's
266
- # union), not the else-branch's inner `:else`. Direct siblings
267
- # (`1; 2; 3`) are still yielded in source order so the last
268
- # sibling wins.
236
+ # Yields each statement node (a child of any `StatementsNode` anywhere in the tree) in post-order: nested
237
+ # statements are yielded before the enclosing statement that contains them. `by_line[end_line] = type` overwrites
238
+ # earlier entries, so post-order means the *outermost* statement closing a line wins — for `b = if cond then :then
239
+ # else :else end` the line resolves to the assignment's type (the if-expression's union), not the else-branch's
240
+ # inner `:else`. Direct siblings (`1; 2; 3`) are still yielded in source order so the last sibling wins.
269
241
  def each_statement(node, &block)
270
242
  return if node.nil?
271
243
 
@@ -279,8 +251,7 @@ module Rigor
279
251
  end
280
252
  end
281
253
 
282
- # For a line no statement closes (the `if` / block header
283
- # lines), fall back to the widest expression ending there.
254
+ # For a line no statement closes (the `if` / block header lines), fall back to the widest expression ending there.
284
255
  def fill_uncovered_lines(program, by_line)
285
256
  widest_per_line(program).each do |line, node|
286
257
  next if by_line.key?(line)
@@ -290,12 +261,10 @@ module Rigor
290
261
  end
291
262
  end
292
263
 
293
- # A `do |i|` header line's widest node is its BlockParametersNode —
294
- # not an expression, so evaluating it would only echo the
295
- # `Dynamic[top]` fallback. Annotate the line with the parameters'
296
- # inferred bindings instead (the single param's type, or a tuple
297
- # for multi-param blocks); decline (nil) when any param has no
298
- # plain name or no recorded binding, leaving the line bare.
264
+ # A `do |i|` header line's widest node is its BlockParametersNode — not an expression, so evaluating it would only
265
+ # echo the `Dynamic[top]` fallback. Annotate the line with the parameters' inferred bindings instead (the single
266
+ # param's type, or a tuple for multi-param blocks); decline (nil) when any param has no plain name or no recorded
267
+ # binding, leaving the line bare.
299
268
  def block_params_type(params_node)
300
269
  inner = params_node.parameters
301
270
  return nil if inner.nil? || inner.requireds.empty?
@@ -332,26 +301,20 @@ module Rigor
332
301
  node.compact_child_nodes.each { |child| walk(child, &block) }
333
302
  end
334
303
 
335
- # Types the node through the flow evaluator (not the bare
336
- # expression typer) under its recorded entry scope, so flow-only
337
- # forms type as the engine sees them — `i += 1` dispatches `+` on
338
- # `i`'s binding (`Integer`, post-fixpoint) instead of echoing the
339
- # RHS literal's `1`.
304
+ # Types the node through the flow evaluator (not the bare expression typer) under its recorded entry scope, so
305
+ # flow-only forms type as the engine sees them — `i += 1` dispatches `+` on `i`'s binding (`Integer`,
306
+ # post-fixpoint) instead of echoing the RHS literal's `1`.
340
307
  def type_of(node)
341
308
  Inference::StatementEvaluator.new(scope: @scope_index[node]).evaluate(node).first
342
309
  rescue StandardError
343
310
  nil
344
311
  end
345
312
 
346
- # For every `def`, replace the annotation on the header line
347
- # (where the `def` keyword sits) with the method's inferred
348
- # return type. The default annotation there comes from the
349
- # parameter list (`name` typing as `Dynamic[top]`), which is
350
- # noise; the return type is what readers actually want next
351
- # to the method signature. When the return type cannot be
352
- # inferred (empty body, scope-lookup miss, or any error
353
- # under `DefReturnTyper.call`), the entry is deleted so no
354
- # annotation is shown on that line.
313
+ # For every `def`, replace the annotation on the header line (where the `def` keyword sits) with the method's
314
+ # inferred return type. The default annotation there comes from the parameter list (`name` typing as
315
+ # `Dynamic[top]`), which is noise; the return type is what readers actually want next to the method signature.
316
+ # When the return type cannot be inferred (empty body, scope-lookup miss, or any error under
317
+ # `DefReturnTyper.call`), the entry is deleted so no annotation is shown on that line.
355
318
  def override_def_header_lines(program, by_line)
356
319
  each_def_node(program) do |def_node|
357
320
  line = def_node.location.start_line
@@ -11,8 +11,8 @@ require_relative "command"
11
11
 
12
12
  module Rigor
13
13
  class CLI
14
- # ADR-22 — `rigor baseline {generate,regenerate,dump,drift,
15
- # prune}` subcommands, backed by `Rigor::Analysis::Baseline`.
14
+ # ADR-22 — `rigor baseline {generate,regenerate,dump,drift, prune}` subcommands, backed by
15
+ # `Rigor::Analysis::Baseline`.
16
16
  #
17
17
  # rigor baseline generate # default: rule-ID rows
18
18
  # rigor baseline generate --match-mode message
@@ -64,12 +64,9 @@ module Rigor
64
64
  write_baseline(options, verb: "wrote baseline to")
65
65
  end
66
66
 
67
- # ADR-22 slice 5 — `regenerate` is `generate --force`: the
68
- # end-of-quality-improvement-session refresh after landing
69
- # baseline-reducing fixes. It rewrites the file
70
- # unconditionally (no existence guard, no `--force` flag),
71
- # so `rigor baseline regenerate` reads cleanly as "make the
72
- # baseline match reality again".
67
+ # ADR-22 slice 5 — `regenerate` is `generate --force`: the end-of-quality-improvement-session refresh after
68
+ # landing baseline-reducing fixes. It rewrites the file unconditionally (no existence guard, no `--force` flag),
69
+ # so `rigor baseline regenerate` reads cleanly as "make the baseline match reality again".
73
70
  def run_regenerate
74
71
  options = parse_generate_options(subcommand: "regenerate")
75
72
  write_baseline(options, verb: "regenerated baseline")
@@ -126,10 +123,8 @@ module Rigor
126
123
 
127
124
  def collect_diagnostics(configuration, _options)
128
125
  cache_store = Cache::Store.new(root: configuration.cache_path)
129
- # IMPORTANT: do NOT activate the existing baseline when
130
- # generating a fresh one otherwise the new file
131
- # records the post-filter (silenced) diagnostic set,
132
- # which is empty after a successful first run.
126
+ # IMPORTANT: do NOT activate the existing baseline when generating a fresh one — otherwise the new file records
127
+ # the post-filter (silenced) diagnostic set, which is empty after a successful first run.
133
128
  configuration_for_generation = override_configuration_baseline_off(configuration)
134
129
  runner = Analysis::Runner.new(
135
130
  configuration: configuration_for_generation,
@@ -140,9 +135,8 @@ module Rigor
140
135
  end
141
136
 
142
137
  def override_configuration_baseline_off(configuration)
143
- # Synthesise a new Configuration with `baseline` explicitly
144
- # disabled. The original Configuration is frozen-ish so we
145
- # round-trip through the constructor with an override hash.
138
+ # Synthesise a new Configuration with `baseline` explicitly disabled. The original Configuration is frozen-ish
139
+ # so we round-trip through the constructor with an override hash.
146
140
  defaults = Configuration::DEFAULTS.merge(
147
141
  "paths" => configuration.paths,
148
142
  "exclude" => configuration.exclude_patterns,
@@ -206,8 +200,7 @@ module Rigor
206
200
  return
207
201
  end
208
202
 
209
- # Group by rule for readability; rules with the most
210
- # entries first.
203
+ # Group by rule for readability; rules with the most entries first.
211
204
  by_rule = rows.group_by(&:rule).sort_by { |_rule, group| -group.size }
212
205
  by_rule.each do |rule, group|
213
206
  total = group.sum(&:count)