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
@@ -5,41 +5,31 @@ require_relative "../diagnostic"
5
5
  module Rigor
6
6
  module Analysis
7
7
  class Runner
8
- # Builds and orders every project-level diagnostic stream the
9
- # {Runner} surfaces the pre-file streams (plugin load / prepare,
10
- # ADR-10 dependency-source, pre-eval, RBS coverage, path errors),
11
- # the post-analysis streams (synthesized namespaces, conforms-to,
12
- # the three reporter drains), and the final severity stamp.
8
+ # Builds and orders every project-level diagnostic stream the {Runner} surfaces — the pre-file
9
+ # streams (plugin load / prepare, ADR-10 dependency-source, pre-eval, RBS coverage, path errors), the
10
+ # post-analysis streams (synthesized namespaces, conforms-to, the three reporter drains), and the
11
+ # final severity stamp.
13
12
  #
14
- # Constraint: the relative order of every stream below is the
15
- # diagnostic output contract callers MUST NOT reorder the
16
- # concatenation in `pre_file_diagnostics` or the post-analysis
17
- # streams the {Runner} drains after `analyze_files`.
13
+ # Constraint: the relative order of every stream below is the diagnostic output contract — callers
14
+ # MUST NOT reorder the concatenation in `pre_file_diagnostics` or the post-analysis streams the
15
+ # {Runner} drains after `analyze_files`.
18
16
  #
19
- # The collaborator holds the immutable per-run inputs (the
20
- # configuration and the three mutable reporter accumulators, which
21
- # are shared instances the dispatcher records into). The per-run
22
- # varying state produced by other passes (the plugin registry, the
23
- # dependency-source index, and the four end-of-pass snapshots) is
24
- # read through injected reader procs so this collaborator never
25
- # calls back into the {Runner} and the read happens at the exact
26
- # point in the run the original inline read did.
17
+ # The collaborator holds the immutable per-run inputs (the configuration and the three mutable
18
+ # reporter accumulators, which are shared instances the dispatcher records into). The per-run varying
19
+ # state produced by other passes (the plugin registry, the dependency-source index, and the four
20
+ # end-of-pass snapshots) is read through injected reader procs so this collaborator never calls back
21
+ # into the {Runner} and the read happens at the exact point in the run the original inline read did.
27
22
  class DiagnosticAggregator # rubocop:disable Metrics/ClassLength
28
23
  # @param configuration [Rigor::Configuration]
29
24
  # @param rbs_extended_reporter [RbsExtended::Reporter]
30
- # @param boundary_cross_reporter
31
- # [DependencySourceInference::BoundaryCrossReporter]
32
- # @param source_rbs_synthesis_reporter
33
- # [Plugin::SourceRbsSynthesisReporter]
34
- # @param plugin_registry [#call] reader returning the current
35
- # {Plugin::Registry} (varies per run).
36
- # @param dependency_source_index [#call] reader returning the
37
- # current {DependencySourceInference::Index}.
25
+ # @param boundary_cross_reporter [DependencySourceInference::BoundaryCrossReporter]
26
+ # @param source_rbs_synthesis_reporter [Plugin::SourceRbsSynthesisReporter]
27
+ # @param plugin_registry [#call] reader returning the current {Plugin::Registry} (varies per run).
28
+ # @param dependency_source_index [#call] reader returning the current
29
+ # {DependencySourceInference::Index}.
38
30
  # @param pool_mode [#call] reader returning the pool-mode flag.
39
- # @param cached_plugin_prepare_diagnostics [#call] reader
40
- # returning the prepare-diagnostic snapshot.
41
- # @param pre_eval_diagnostics_from_scanner [#call] reader
42
- # returning the pre-eval scanner diagnostics.
31
+ # @param cached_plugin_prepare_diagnostics [#call] reader returning the prepare-diagnostic snapshot.
32
+ # @param pre_eval_diagnostics_from_scanner [#call] reader returning the pre-eval scanner diagnostics.
43
33
  # @param synthesized_namespaces_snapshot [#call] reader.
44
34
  # @param conformance_results_snapshot [#call] reader.
45
35
  def initialize(configuration:, rbs_extended_reporter:, boundary_cross_reporter:, # rubocop:disable Metrics/ParameterLists
@@ -60,29 +50,21 @@ module Rigor
60
50
  @conformance_results_snapshot_reader = conformance_results_snapshot
61
51
  end
62
52
 
63
- # Pre-file diagnostic streams that fire once per run rather
64
- # than per analyzed file: plugin load / prepare envelopes,
65
- # the ADR-10 dependency-source resolution surface, and the
66
- # `expand_paths` errors for `paths:` entries that don't
67
- # exist or aren't `.rb`. Aggregated here so `#run` stays
68
- # under the ABC budget.
53
+ # Pre-file diagnostic streams that fire once per run rather than per analyzed file: plugin load /
54
+ # prepare envelopes, the ADR-10 dependency-source resolution surface, and the `expand_paths` errors
55
+ # for `paths:` entries that don't exist or aren't `.rb`. Aggregated here so `#run` stays under the
56
+ # ABC budget.
69
57
  #
70
- # ADR-15 Phase 4b — `plugin_prepare_diagnostics` runs on
71
- # the coordinator's plugin registry under sequential mode;
72
- # under pool mode each worker re-runs `prepare` against
73
- # its own plugin instances, so the pool path drains the
74
- # first worker's prepare-diagnostic snapshot into the
75
- # aggregated diagnostic stream instead (see
76
- # {#analyze_files_in_pool}). Skipping the coordinator
77
- # prepare in pool mode avoids double-running `#prepare`
78
- # against the coordinator-side plugin instances (which
79
- # the pool path never consults for per-file analysis).
58
+ # ADR-15 Phase 4b — `plugin_prepare_diagnostics` runs on the coordinator's plugin registry under
59
+ # sequential mode; under pool mode each worker re-runs `prepare` against its own plugin instances,
60
+ # so the pool path drains the first worker's prepare-diagnostic snapshot into the aggregated
61
+ # diagnostic stream instead (see {#analyze_files_in_pool}). Skipping the coordinator prepare in pool
62
+ # mode avoids double-running `#prepare` against the coordinator-side plugin instances (which the
63
+ # pool path never consults for per-file analysis).
80
64
  def pre_file_diagnostics(expansion)
81
- # ADR-18 slice 3 — prepare diagnostics are captured
82
- # earlier in #run (before the synthetic-method scanner)
83
- # so cross-plugin facts are available to the scanner.
84
- # We re-surface the captured diagnostics here so the
85
- # existing pre_file_diagnostics ordering is preserved.
65
+ # ADR-18 slice 3 — prepare diagnostics are captured earlier in #run (before the synthetic-method
66
+ # scanner) so cross-plugin facts are available to the scanner. We re-surface the captured
67
+ # diagnostics here so the existing pre_file_diagnostics ordering is preserved.
86
68
  prepare = pool_mode? ? [] : cached_plugin_prepare_diagnostics
87
69
  plugin_load_diagnostics +
88
70
  prepare +
@@ -94,17 +76,13 @@ module Rigor
94
76
  expansion.fetch(:errors)
95
77
  end
96
78
 
97
- # ADR-17 slice 1 — surface a `:error` diagnostic for each
98
- # `pre_eval:` entry whose resolved path doesn't exist on
99
- # disk. Loud failure mode (`:error`, not `:warning`):
100
- # a missing pre_eval path is a configuration mistake the
101
- # user must fix before analysis is meaningful.
79
+ # ADR-17 slice 1 — surface a `:error` diagnostic for each `pre_eval:` entry whose resolved path
80
+ # doesn't exist on disk. Loud failure mode (`:error`, not `:warning`): a missing pre_eval path is a
81
+ # configuration mistake the user must fix before analysis is meaningful.
102
82
  #
103
- # Slice 2 adds the `:warning` `pre-eval.parse-error`
104
- # stream from the pre-pass scanner accumulated as
105
- # `@pre_eval_diagnostics_from_scanner` during {#run} and
106
- # merged here so both diagnostics flow through the same
107
- # severity / ordering pipeline.
83
+ # Slice 2 adds the `:warning` `pre-eval.parse-error` stream from the pre-pass scanner — accumulated
84
+ # as `@pre_eval_diagnostics_from_scanner` during {#run} and merged here so both diagnostics flow
85
+ # through the same severity / ordering pipeline.
108
86
  def pre_eval_diagnostics
109
87
  not_found = @configuration.pre_eval.filter_map do |path|
110
88
  next if File.file?(path)
@@ -144,14 +122,11 @@ module Rigor
144
122
  end
145
123
  end
146
124
 
147
- # ADR-10 § "Diagnostic prefix family" — surfaces gems
148
- # listed in `dependencies.source_inference` that RubyGems
149
- # could not resolve. The run continues; the gem simply
150
- # contributes nothing this session, mirroring the
151
- # plugin-load error envelope. Authored `:warning` because
152
- # an unresolvable gem usually means a typo or a missing
153
- # `bundle install` rather than a project-blocking problem;
154
- # the severity profile still re-stamps it.
125
+ # ADR-10 § "Diagnostic prefix family" — surfaces gems listed in `dependencies.source_inference`
126
+ # that RubyGems could not resolve. The run continues; the gem simply contributes nothing this
127
+ # session, mirroring the plugin-load error envelope. Authored `:warning` because an unresolvable
128
+ # gem usually means a typo or a missing `bundle install` rather than a project-blocking problem; the
129
+ # severity profile still re-stamps it.
155
130
  def dependency_source_diagnostics
156
131
  dependency_source_index.unresolvable.map do |entry|
157
132
  Diagnostic.new(
@@ -167,23 +142,16 @@ module Rigor
167
142
  end
168
143
  end
169
144
 
170
- # ADR-10 § "Budget interaction" / slice 4 — emits one
171
- # `:warning` per gem whose Walker run hit the
172
- # `dependencies.budget_per_gem` cap. The cap is a Walker-
173
- # side guard rail (slice 4 picks the (α) semantics from
174
- # ADR-10 WD4: harvesting stops, the dispatcher behaves
175
- # exactly as before for unrecorded methods). The
176
- # diagnostic names the gem and points the user at the
177
- # three remediations: ship RBS, reduce `mode:` from
178
- # `full` to `when_missing`, or de-list the gem.
179
- # ADR-10 § "config-conflict diagnostic" / 5d — surfaces
180
- # `Configuration::Dependencies` warnings accumulated
181
- # during `from_h` deduplication of the `includes:`-chain
182
- # source_inference array. Each warning describes a
183
- # per-gem mode conflict that the merge resolved
184
- # right-wins; the user sees one diagnostic per conflict.
185
- # `:warning` matches the user's "warn but don't block"
186
- # preference per the design discussion.
145
+ # ADR-10 § "Budget interaction" / slice 4 — emits one `:warning` per gem whose Walker run hit the
146
+ # `dependencies.budget_per_gem` cap. The cap is a Walker- side guard rail (slice 4 picks the (α)
147
+ # semantics from ADR-10 WD4: harvesting stops, the dispatcher behaves exactly as before for
148
+ # unrecorded methods). The diagnostic names the gem and points the user at the three remediations:
149
+ # ship RBS, reduce `mode:` from `full` to `when_missing`, or de-list the gem.
150
+ # ADR-10 § "config-conflict diagnostic" / 5d — surfaces `Configuration::Dependencies` warnings
151
+ # accumulated during `from_h` deduplication of the `includes:`-chain source_inference array. Each
152
+ # warning describes a per-gem mode conflict that the merge resolved right-wins; the user sees one
153
+ # diagnostic per conflict. `:warning` matches the user's "warn but don't block" preference per the
154
+ # design discussion.
187
155
  def dependency_source_config_conflict_diagnostics
188
156
  @configuration.dependencies.warnings.map do |message|
189
157
  Diagnostic.new(
@@ -216,20 +184,15 @@ module Rigor
216
184
  end
217
185
  end
218
186
 
219
- # O4 Layer 3 slice 3 — graceful-degradation coverage
220
- # report. When the project has a `Gemfile.lock` (slice 1)
221
- # and one or more locked gems are not covered by ANY of
222
- # the four RBS resolution paths (`DEFAULT_LIBRARIES`,
223
- # `data/vendored_gem_sigs/`, slice-1 bundle-shipped
224
- # `sig/`, slice-2 `rbs_collection.lock.yaml`), emit a
225
- # single `:info` diagnostic summarising the uncovered set
226
- # so the user can act on it (run `rbs collection install`,
227
- # opt the gem into `dependencies.source_inference:`, or
228
- # accept the `Dynamic[T]` fallback).
187
+ # O4 Layer 3 slice 3 — graceful-degradation coverage report. When the project has a `Gemfile.lock`
188
+ # (slice 1) and one or more locked gems are not covered by ANY of the four RBS resolution paths
189
+ # (`DEFAULT_LIBRARIES`, `data/vendored_gem_sigs/`, slice-1 bundle-shipped `sig/`, slice-2
190
+ # `rbs_collection.lock.yaml`), emit a single `:info` diagnostic summarising the uncovered set so the
191
+ # user can act on it (run `rbs collection install`, opt the gem into `dependencies.source_inference:`,
192
+ # or accept the `Dynamic[T]` fallback).
229
193
  #
230
- # Suppressed when the lockfile is empty, when every gem
231
- # is covered, or when slice 1's `bundler.lockfile`
232
- # discovery returned nothing (no lockfile to read).
194
+ # Suppressed when the lockfile is empty, when every gem is covered, or when slice 1's
195
+ # `bundler.lockfile` discovery returned nothing (no lockfile to read).
233
196
  def rbs_coverage_diagnostics
234
197
  locked = Environment::LockfileResolver.locked_gems(
235
198
  lockfile_path: @configuration.bundler_lockfile,
@@ -261,14 +224,12 @@ module Rigor
261
224
  [build_rbs_coverage_missing_diagnostic(missing)]
262
225
  end
263
226
 
264
- # Robustness uplift companion (ADR-5) — when the project's
265
- # `signature_paths:` RBS declared qualified names without their
266
- # enclosing namespace, `RbsLoader` synthesizes the missing
267
- # `module`s so the otherwise-inert signatures resolve. Surface a
268
- # single `:info` diagnostic naming them so the user knows their
269
- # sig set is malformed (`rbs validate` rejects it) and can fix it
270
- # at the source. Authored `:info`: the analysis already succeeded;
271
- # this is advisory, never a gate. Empty for a well-formed sig set.
227
+ # Robustness uplift companion (ADR-5) — when the project's `signature_paths:` RBS declared
228
+ # qualified names without their enclosing namespace, `RbsLoader` synthesizes the missing `module`s
229
+ # so the otherwise-inert signatures resolve. Surface a single `:info` diagnostic naming them so the
230
+ # user knows their sig set is malformed (`rbs validate` rejects it) and can fix it at the source.
231
+ # Authored `:info`: the analysis already succeeded; this is advisory, never a gate. Empty for a
232
+ # well-formed sig set.
272
233
  def rbs_synthesized_namespace_diagnostics
273
234
  synthesized = synthesized_namespaces_snapshot
274
235
  return [] if synthesized.nil? || synthesized.empty?
@@ -276,16 +237,12 @@ module Rigor
276
237
  [build_rbs_synthesized_namespace_diagnostic(synthesized)]
277
238
  end
278
239
 
279
- # Maps the per-run `rigor:v1:conforms-to` scan results into
280
- # diagnostics (spec: `rbs-extended.md` § "Explicit conformance
281
- # directive"). A class that declares `conforms-to _Interface`
282
- # but is missing a required interface method surfaces as
283
- # `rbs_extended.unsatisfied-conformance`; an unresolvable
284
- # interface name surfaces as `dynamic.rbs-extended.unresolved`
285
- # `:info` (the same fail-soft channel the other directive
286
- # parsers use). Empty for a project with no directive, a
287
- # well-formed conformance, or a non-sequential pool run (the
288
- # snapshot mirrors `synthesized_namespaces`).
240
+ # Maps the per-run `rigor:v1:conforms-to` scan results into diagnostics (spec: `rbs-extended.md` §
241
+ # "Explicit conformance directive"). A class that declares `conforms-to _Interface` but is missing
242
+ # a required interface method surfaces as `rbs_extended.unsatisfied-conformance`; an unresolvable
243
+ # interface name surfaces as `dynamic.rbs-extended.unresolved` `:info` (the same fail-soft channel
244
+ # the other directive parsers use). Empty for a project with no directive, a well-formed
245
+ # conformance, or a non-sequential pool run (the snapshot mirrors `synthesized_namespaces`).
289
246
  def conforms_to_diagnostics
290
247
  results = conformance_results_snapshot
291
248
  return [] if results.nil? || results.empty?
@@ -381,22 +338,18 @@ module Rigor
381
338
  )
382
339
  end
383
340
 
384
- # ADR-13 slice 3b — drains the per-run
385
- # {RbsExtended::Reporter} into one diagnostic per accumulated
341
+ # ADR-13 slice 3b — drains the per-run {RbsExtended::Reporter} into one diagnostic per accumulated
386
342
  # event:
387
343
  #
388
- # - `dynamic.rbs-extended.unresolved` for every annotation
389
- # payload the parser could not turn into a {Rigor::Type}.
390
- # Surfaces typos and references to plugin-supplied names
391
- # the project did not enable.
392
- # - `dynamic.shape.lossy-projection` for every shape-projection
393
- # type function (`pick_of`, …) applied to a carrier that
394
- # loses precision (anything other than `HashShape` / `Tuple`).
344
+ # - `dynamic.rbs-extended.unresolved` for every annotation payload the parser could not turn into a
345
+ # {Rigor::Type}. Surfaces typos and references to plugin-supplied names the project did not
346
+ # enable.
347
+ # - `dynamic.shape.lossy-projection` for every shape-projection type function (`pick_of`, …) applied
348
+ # to a carrier that loses precision (anything other than `HashShape` / `Tuple`).
395
349
  #
396
- # Both are authored `:info`; the severity profile re-stamps
397
- # them per project taste. Path / line / column come from the
398
- # annotation's `RBS::Location` when available, falling back
399
- # to `.rigor.yml`-style file-level attribution otherwise.
350
+ # Both are authored `:info`; the severity profile re-stamps them per project taste. Path / line /
351
+ # column come from the annotation's `RBS::Location` when available, falling back to
352
+ # `.rigor.yml`-style file-level attribution otherwise.
400
353
  def rbs_extended_reporter_diagnostics
401
354
  return [] if @rbs_extended_reporter.empty?
402
355
 
@@ -423,16 +376,12 @@ module Rigor
423
376
  unresolved + lossy
424
377
  end
425
378
 
426
- # ADR-32 WD6 — drains the per-run
427
- # {Plugin::SourceRbsSynthesisReporter} into
428
- # `source-rbs-synthesis-failed` `:info` diagnostics. Each
429
- # entry names the plugin that owns the synthesizer, the
430
- # source file the rbs-inline parser couldn't process, and
431
- # the upstream error message. The synthesizer-emitting
432
- # plugin (currently only `rigor-rbs-inline`) treats a
433
- # parse failure as a no-contribution event so analysis
434
- # continues; this stream surfaces the failure so the user
435
- # can see which files contributed nothing and why.
379
+ # ADR-32 WD6 — drains the per-run {Plugin::SourceRbsSynthesisReporter} into
380
+ # `source-rbs-synthesis-failed` `:info` diagnostics. Each entry names the plugin that owns the
381
+ # synthesizer, the source file the rbs-inline parser couldn't process, and the upstream error
382
+ # message. The synthesizer-emitting plugin (currently only `rigor-rbs-inline`) treats a parse
383
+ # failure as a no-contribution event so analysis continues; this stream surfaces the failure so the
384
+ # user can see which files contributed nothing and why.
436
385
  #
437
386
  # Severity profile re-stamps the rule per project taste.
438
387
  def source_rbs_synthesis_diagnostics
@@ -452,23 +401,17 @@ module Rigor
452
401
  end
453
402
  end
454
403
 
455
- # ADR-10 slice 5c — drains the per-run
456
- # {DependencySourceInference::BoundaryCrossReporter} into
457
- # `dynamic.dependency-source.boundary-cross` `:info`
458
- # diagnostics. Each event flags a call site where RBS
459
- # dispatch produced a concrete answer AND a `mode: :full`
460
- # opt-in gem's source catalog ALSO contains an entry for
461
- # the same `(class_name, method_name)` — i.e., both
462
- # contracts have an opinion. RBS still wins on the
463
- # dispatch result; the diagnostic is purely advisory so
464
- # the user can verify the two contracts haven't drifted.
404
+ # ADR-10 slice 5c — drains the per-run {DependencySourceInference::BoundaryCrossReporter} into
405
+ # `dynamic.dependency-source.boundary-cross` `:info` diagnostics. Each event flags a call site
406
+ # where RBS dispatch produced a concrete answer AND a `mode: :full` opt-in gem's source catalog
407
+ # ALSO contains an entry for the same `(class_name, method_name)` — i.e., both contracts have an
408
+ # opinion. RBS still wins on the dispatch result; the diagnostic is purely advisory so the user can
409
+ # verify the two contracts haven't drifted.
465
410
  #
466
- # Severity profile re-stamps the rule per project taste.
467
- # The diagnostic carries no `path` / `line` / `column`
468
- # because the crossing is per-method-per-gem, not
469
- # per-call-site — the diagnostic anchors at `.rigor.yml`
470
- # like the other `dependency-source.*` diagnostics that
471
- # report on opt-in configuration.
411
+ # Severity profile re-stamps the rule per project taste. The diagnostic carries no `path` / `line`
412
+ # / `column` because the crossing is per-method-per-gem, not per-call-site — the diagnostic anchors
413
+ # at `.rigor.yml` like the other `dependency-source.*` diagnostics that report on opt-in
414
+ # configuration.
472
415
  def boundary_cross_diagnostics
473
416
  return [] if @boundary_cross_reporter.empty?
474
417
 
@@ -513,11 +456,9 @@ module Rigor
513
456
  name.empty? ? ".rigor.yml" : name
514
457
  end
515
458
 
516
- # ADR-8 § "Severity profile" — re-stamps each diagnostic's
517
- # severity from the configured profile + per-rule
518
- # overrides. Rules emit with their authored severity; the
519
- # profile is the final filter. Diagnostics whose resolved
520
- # severity is `:off` are dropped from the run result.
459
+ # ADR-8 § "Severity profile" — re-stamps each diagnostic's severity from the configured profile +
460
+ # per-rule overrides. Rules emit with their authored severity; the profile is the final filter.
461
+ # Diagnostics whose resolved severity is `:off` are dropped from the run result.
521
462
  def apply_severity_profile(diagnostics)
522
463
  diagnostics.filter_map { |diagnostic| stamp_severity(diagnostic) }
523
464
  end