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
@@ -6,34 +6,25 @@ require "zlib"
6
6
 
7
7
  module Rigor
8
8
  module Cache
9
- # ADR-46 — disk persistence for the incremental analyzer's per-file
10
- # state, so a `--incremental` session survives across processes (one
11
- # `rigor check` invocation reads the prior run's per-file diagnostics +
12
- # dependency graph, re-analyzes only the changed closure, and serves the
13
- # rest from disk).
9
+ # ADR-46 — disk persistence for the incremental analyzer's per-file state, so a `--incremental` session
10
+ # survives across processes (one `rigor check` invocation reads the prior run's per-file diagnostics +
11
+ # dependency graph, re-analyzes only the changed closure, and serves the rest from disk).
14
12
  #
15
- # Unlike ADR-45's whole-run cache (record-and-validate ONE entry,
16
- # invalidated by any analyzed-file change), this snapshot is loaded
17
- # UNCONDITIONALLY when the global fingerprint matches the per-file
18
- # digests *inside* it drive the incremental re-analysis decision; they
19
- # do not gate the load. The fingerprint captures the inputs whose change
20
- # requires a full rebuild the resolved configuration, the RBS
21
- # environment, the engine version — but NOT the analyzed source
22
- # contents. A fingerprint mismatch (config / gem / version change) drops
23
- # the snapshot and forces a full re-analysis, the conservative
24
- # direction.
13
+ # Unlike ADR-45's whole-run cache (record-and-validate ONE entry, invalidated by any analyzed-file change),
14
+ # this snapshot is loaded UNCONDITIONALLY when the global fingerprint matches — the per-file digests
15
+ # *inside* it drive the incremental re-analysis decision; they do not gate the load. The fingerprint
16
+ # captures the inputs whose change requires a full rebuild — the resolved configuration, the RBS
17
+ # environment, the engine version — but NOT the analyzed source contents. A fingerprint mismatch (config /
18
+ # gem / version change) drops the snapshot and forces a full re-analysis, the conservative direction.
25
19
  #
26
- # Every operation is fault-tolerant: a missing, unreadable, schema-
27
- # mismatched, fingerprint-mismatched, or corrupt snapshot loads as nil
28
- # (→ a cold full run), and a write failure is swallowed (the next run
29
- # is cold). A cache must never break a run (the ADR-45 invariant).
20
+ # Every operation is fault-tolerant: a missing, unreadable, schema-mismatched, fingerprint-mismatched, or
21
+ # corrupt snapshot loads as nil (→ a cold full run), and a write failure is swallowed (→ the next run is
22
+ # cold). A cache must never break a run (the ADR-45 invariant).
30
23
  class IncrementalSnapshot
31
- # Bump when the on-disk shape changes so stale snapshots are ignored
32
- # rather than mis-deserialized. 5: the blob is zlib-deflated
33
- # (ADR-54 WD2 parity with `Store` entries the snapshot is the
34
- # one cache artefact that does not go through `Store`); a raw
35
- # pre-5 blob fails the inflate and loads as nil, the usual
36
- # fault-tolerant cold-run path.
24
+ # Bump when the on-disk shape changes so stale snapshots are ignored rather than mis-deserialized. 5:
25
+ # the blob is zlib-deflated (ADR-54 WD2 parity with `Store` entries — the snapshot is the one cache
26
+ # artefact that does not go through `Store`); a raw pre-5 blob fails the inflate and loads as nil, the
27
+ # usual fault-tolerant cold-run path.
37
28
  SCHEMA = 5
38
29
 
39
30
  # The persisted per-file state.
@@ -52,19 +43,15 @@ module Rigor
52
43
  :symbol_sources, :ancestry_sources, :symbol_fingerprints,
53
44
  :missing, :class_decls)
54
45
 
55
- # The global fingerprint that gates a snapshot load: a digest of the
56
- # inputs whose change requires a full rebuild the engine version +
57
- # schema, the resolved configuration, the analysis **roots** (the path
58
- # arguments, e.g. `["lib"]`, NOT the expanded file list so a snapshot
59
- # is keyed to an invocation's roots but adding / removing a file under
60
- # them is handled incrementally by the session, not a full rebuild), the
61
- # resolved gem set (`Gemfile.lock` / `rbs_collection`), and the project's
62
- # own RBS (`signature_paths` file contents). Built WITHOUT constructing
63
- # the RBS environment so the warm path can gate the load cheaply, before
64
- # the costly env build. The `--verify-incremental` gate is the safety net
65
- # for any under-capture (it would surface as an incremental-vs-full
66
- # mismatch). Returns nil on any error → the caller falls back to a
67
- # non-persisted run.
46
+ # The global fingerprint that gates a snapshot load: a digest of the inputs whose change requires a full
47
+ # rebuild the engine version + schema, the resolved configuration, the analysis **roots** (the path
48
+ # arguments, e.g. `["lib"]`, NOT the expanded file list — so a snapshot is keyed to an invocation's roots
49
+ # but adding / removing a file under them is handled incrementally by the session, not a full rebuild),
50
+ # the resolved gem set (`Gemfile.lock` / `rbs_collection`), and the project's own RBS (`signature_paths`
51
+ # file contents). Built WITHOUT constructing the RBS environment so the warm path can gate the load
52
+ # cheaply, before the costly env build. The `--verify-incremental` gate is the safety net for any
53
+ # under-capture (it would surface as an incremental-vs-full mismatch). Returns nil on any error → the
54
+ # caller falls back to a non-persisted run.
68
55
  def self.fingerprint(configuration:, roots:)
69
56
  parts = [
70
57
  "engine:#{Rigor::VERSION}:#{SCHEMA}",
@@ -84,10 +71,9 @@ module Rigor
84
71
  end
85
72
  private_class_method :digest_file_if_present
86
73
 
87
- # Content-digest every `.rbs` under the configured signature paths
88
- # (sorted for determinism) so a project RBS edit invalidates the
89
- # snapshot. Sig trees are small; content (not mtime) keeps it stable
90
- # across checkouts.
74
+ # Content-digest every `.rbs` under the configured signature paths (sorted for determinism) so a project
75
+ # RBS edit invalidates the snapshot. Sig trees are small; content (not mtime) keeps it stable across
76
+ # checkouts.
91
77
  def self.digest_signature_paths(signature_paths)
92
78
  globbed = Array(signature_paths).flat_map do |entry|
93
79
  File.directory?(entry) ? Dir.glob(File.join(entry, "**", "*.rbs")) : [entry]
@@ -105,8 +91,8 @@ module Rigor
105
91
 
106
92
  attr_reader :path
107
93
 
108
- # The stored {Payload}, or nil when absent / unreadable / schema or
109
- # fingerprint mismatch / corrupt. Never raises.
94
+ # The stored {Payload}, or nil when absent / unreadable / schema or fingerprint mismatch / corrupt.
95
+ # Never raises.
110
96
  def load(fingerprint:)
111
97
  data = Marshal.load(Zlib::Inflate.inflate(File.binread(@path))) # rubocop:disable Security/MarshalLoad
112
98
  return nil unless data.is_a?(Hash) && data[:schema] == SCHEMA && data[:fingerprint] == fingerprint
@@ -124,10 +110,8 @@ module Rigor
124
110
  nil
125
111
  end
126
112
 
127
- # Persist `payload` under `fingerprint`. Writes via a temp file +
128
- # atomic rename so a concurrent reader never sees a half-written
129
- # snapshot. Returns true on success, false on any failure (never
130
- # raises).
113
+ # Persist `payload` under `fingerprint`. Writes via a temp file + atomic rename so a concurrent reader
114
+ # never sees a half-written snapshot. Returns true on success, false on any failure (never raises).
131
115
  def save(fingerprint:, payload:)
132
116
  FileUtils.mkdir_p(File.dirname(@path))
133
117
  raw = Marshal.dump(
@@ -6,24 +6,19 @@ module Rigor
6
6
  module Cache
7
7
  # Base for the RBS-derived cache producers.
8
8
  #
9
- # Every producer (`RbsKnownClassNames`, `RbsConstantTable`,
10
- # `RbsEnvironment`, the ancestor / type-param / definition tables, …)
11
- # repeated the identical `fetch` wiring: build the RBS descriptor,
12
- # then `store.fetch_or_compute` under the producer's id, yielding to
13
- # the producer's `compute`. Only the `PRODUCER_ID` constant and the
14
- # `compute(loader)` body actually differ between producers.
9
+ # Every producer (`RbsKnownClassNames`, `RbsConstantTable`, `RbsEnvironment`, the ancestor / type-param /
10
+ # definition tables, …) repeated the identical `fetch` wiring: build the RBS descriptor, then
11
+ # `store.fetch_or_compute` under the producer's id, yielding to the producer's `compute`. Only the
12
+ # `PRODUCER_ID` constant and the `compute(loader)` body actually differ between producers.
15
13
  #
16
- # Subclasses declare `PRODUCER_ID` and a (private) `self.compute`;
17
- # this base owns `fetch`. `self::PRODUCER_ID` resolves the constant on
18
- # the concrete subclass, and `compute(loader)` dispatches to its
19
- # private class method. See the `_CacheProducer` RBS interface for the
20
- # structural contract.
14
+ # Subclasses declare `PRODUCER_ID` and a (private) `self.compute`; this base owns `fetch`.
15
+ # `self::PRODUCER_ID` resolves the constant on the concrete subclass, and `compute(loader)` dispatches to
16
+ # its private class method. See the `_CacheProducer` RBS interface for the structural contract.
21
17
  class RbsCacheProducer
22
18
  def self.fetch(loader:, store:)
23
- # ADR-54 WD4 — the descriptor is identical for every producer
24
- # consulting the same loader (same sig files, same libraries),
25
- # so the loader memoises one build per process instead of
26
- # re-digesting every .rbs file once per producer.
19
+ # ADR-54 WD4 — the descriptor is identical for every producer consulting the same loader (same sig
20
+ # files, same libraries), so the loader memoises one build per process instead of re-digesting every
21
+ # .rbs file once per producer.
27
22
  descriptor = loader.rbs_cache_descriptor
28
23
  store.fetch_or_compute(producer_id: self::PRODUCER_ID, params: {}, descriptor: descriptor) do
29
24
  compute(loader)
@@ -5,24 +5,18 @@ require_relative "rbs_cache_producer"
5
5
 
6
6
  module Rigor
7
7
  module Cache
8
- # Cache producer that materialises the RBS-declared ancestor
9
- # chain of every loaded class / module into a Marshal-clean
10
- # `Hash<String, Array<String>>`. Ancestor names are top-level-
11
- # stripped (e.g. `"Integer"` not `"::Integer"`) to match
12
- # `Environment::RbsHierarchy#normalize_name`.
8
+ # Cache producer that materialises the RBS-declared ancestor chain of every loaded class / module into a
9
+ # Marshal-clean `Hash<String, Array<String>>`. Ancestor names are top-level-stripped (e.g. `"Integer"` not
10
+ # `"::Integer"`) to match `Environment::RbsHierarchy#normalize_name`.
13
11
  #
14
- # The hierarchy is the substrate behind every `class_ordering`
15
- # query, which is itself a hot path on the dispatcher (overload
16
- # selection, narrowing, etc.). Building one ancestor chain
17
- # requires a full `RBS::DefinitionBuilder#build_instance` over
18
- # that class — a cold-cost dominated by RBS's own resolution
19
- # work. Caching the table lets a warm process skip the build
20
- # entirely and pay only a `Marshal.load` of the resulting
21
- # hash.
12
+ # The hierarchy is the substrate behind every `class_ordering` query, which is itself a hot path on the
13
+ # dispatcher (overload selection, narrowing, etc.). Building one ancestor chain requires a full
14
+ # `RBS::DefinitionBuilder#build_instance` over that class a cold-cost dominated by RBS's own resolution
15
+ # work. Caching the table lets a warm process skip the build entirely and pay only a `Marshal.load` of the
16
+ # resulting hash.
22
17
  #
23
- # Cache descriptor shape is shared with every other cache
24
- # producer that depends on the RBS environment — see
25
- # {RbsDescriptor.build}.
18
+ # Cache descriptor shape is shared with every other cache producer that depends on the RBS environment —
19
+ # see {RbsDescriptor.build}.
26
20
  class RbsClassAncestorTable < RbsCacheProducer
27
21
  PRODUCER_ID = "rbs.class_ancestor_table"
28
22
 
@@ -5,24 +5,18 @@ require_relative "rbs_cache_producer"
5
5
 
6
6
  module Rigor
7
7
  module Cache
8
- # Cache producer that materialises every loaded class's
9
- # RBS-declared type-parameter names as a Marshal-clean
10
- # `Hash<String, Array<Symbol>>` keyed by top-level-stripped
11
- # class name (e.g. `"Array"` → `[:Elem]`, `"Hash"` →
12
- # `[:K, :V]`). Producer id `"rbs.class_type_param_names"`.
8
+ # Cache producer that materialises every loaded class's RBS-declared type-parameter names as a
9
+ # Marshal-clean `Hash<String, Array<Symbol>>` keyed by top-level-stripped class name (e.g. `"Array"` →
10
+ # `[:Elem]`, `"Hash"` → `[:K, :V]`). Producer id `"rbs.class_type_param_names"`.
13
11
  #
14
- # The dispatcher reads type-parameter names every time it
15
- # builds a substitution map from a receiver's `type_args`
16
- # into a method's return type it is one of the hottest
17
- # reflection lookups during analysis. Building one entry
18
- # requires a full `RBS::DefinitionBuilder#build_instance`
19
- # over that class, the same expensive operation
20
- # {RbsClassAncestorTable} caches; the two producers share
21
- # the build cost when populated together.
12
+ # The dispatcher reads type-parameter names every time it builds a substitution map from a receiver's
13
+ # `type_args` into a method's return type it is one of the hottest reflection lookups during analysis.
14
+ # Building one entry requires a full `RBS::DefinitionBuilder#build_instance` over that class, the same
15
+ # expensive operation {RbsClassAncestorTable} caches; the two producers share the build cost when
16
+ # populated together.
22
17
  #
23
- # Cache descriptor shape is shared with every other cache
24
- # producer that depends on the RBS environment — see
25
- # {RbsDescriptor.build}.
18
+ # Cache descriptor shape is shared with every other cache producer that depends on the RBS environment —
19
+ # see {RbsDescriptor.build}.
26
20
  class RbsClassTypeParamNames < RbsCacheProducer
27
21
  PRODUCER_ID = "rbs.class_type_param_names"
28
22
 
@@ -5,17 +5,13 @@ require_relative "rbs_cache_producer"
5
5
 
6
6
  module Rigor
7
7
  module Cache
8
- # Cache producer that materialises every RBS-declared constant
9
- # to its translated `Rigor::Type` form and stores the result as
10
- # a `Hash<String, Rigor::Type>` keyed by canonical constant name.
11
- # This is the v0.0.8 first cached producer per ADR-6 § 7; it
12
- # caches a post-translation artefact so the cache value is
13
- # `Marshal`-clean (RBS-native objects carry `RBS::Location`,
14
- # which lacks `_dump_data`).
8
+ # Cache producer that materialises every RBS-declared constant to its translated `Rigor::Type` form and
9
+ # stores the result as a `Hash<String, Rigor::Type>` keyed by canonical constant name. This is the v0.0.8
10
+ # first cached producer per ADR-6 § 7; it caches a post-translation artefact so the cache value is
11
+ # `Marshal`-clean (RBS-native objects carry `RBS::Location`, which lacks `_dump_data`).
15
12
  #
16
- # Cache descriptor shape is shared with every other cache
17
- # producer that depends on the RBS environment — see
18
- # {RbsDescriptor.build} for the slot definitions.
13
+ # Cache descriptor shape is shared with every other cache producer that depends on the RBS environment —
14
+ # see {RbsDescriptor.build} for the slot definitions.
19
15
  class RbsConstantTable < RbsCacheProducer
20
16
  PRODUCER_ID = "rbs.constant_type_table"
21
17
 
@@ -28,9 +24,8 @@ module Rigor
28
24
  translated = Inference::RbsTypeTranslator.translate(entry.decl.type)
29
25
  table[name] = translated unless translated.is_a?(Type::Bot)
30
26
  rescue ::RBS::BaseError
31
- # Skip entries whose RBS type fails to translate; the cache
32
- # stays robust to a broken signature rather than corrupting
33
- # the whole table. Analyzer-internal errors propagate.
27
+ # Skip entries whose RBS type fails to translate; the cache stays robust to a broken signature
28
+ # rather than corrupting the whole table. Analyzer-internal errors propagate.
34
29
  end
35
30
  table
36
31
  end
@@ -6,12 +6,10 @@ require_relative "descriptor"
6
6
 
7
7
  module Rigor
8
8
  module Cache
9
- # Shared descriptor builder for cache producers that depend on the
10
- # RBS environment (constant table, known-class set, future
11
- # Marshal-clean reflection artefacts). Every consumer attaches the
12
- # same three slots, so factoring the construction here keeps the
13
- # producers small and ensures invalidation behaves identically
14
- # across them.
9
+ # Shared descriptor builder for cache producers that depend on the RBS environment (constant table,
10
+ # known-class set, future Marshal-clean reflection artefacts). Every consumer attaches the same three
11
+ # slots, so factoring the construction here keeps the producers small and ensures invalidation behaves
12
+ # identically across them.
15
13
  module RbsDescriptor
16
14
  # @param loader [Rigor::Environment::RbsLoader]
17
15
  # @return [Rigor::Cache::Descriptor]
@@ -52,13 +50,10 @@ module Rigor
52
50
  )
53
51
  end
54
52
 
55
- # ADR-32 WD5 — encode the loader's virtual_rbs set into a
56
- # `ConfigEntry` so the env cache invalidates when a
57
- # plugin-contributed synthesised RBS string changes (or
58
- # appears for the first time). Returns nil when the
59
- # loader has no virtual_rbs entries, so callers without
60
- # any synthesizer-emitting plugin pay zero descriptor
61
- # cost.
53
+ # ADR-32 WD5 — encode the loader's virtual_rbs set into a `ConfigEntry` so the env cache invalidates when
54
+ # a plugin-contributed synthesised RBS string changes (or appears for the first time). Returns nil when
55
+ # the loader has no virtual_rbs entries, so callers without any synthesizer-emitting plugin pay zero
56
+ # descriptor cost.
62
57
  def self.virtual_rbs_entry(loader)
63
58
  return nil unless loader.respond_to?(:virtual_rbs)
64
59
  return nil if loader.virtual_rbs.nil? || loader.virtual_rbs.empty?
@@ -6,27 +6,19 @@ require_relative "rbs_environment_marshal_patch"
6
6
 
7
7
  module Rigor
8
8
  module Cache
9
- # Cache producer that materialises the entire
10
- # `RBS::Environment` (the loader's `build_env` result) and
11
- # round-trips it through `Marshal` against the patched
12
- # `RBS::Location` (see {RbsEnvironmentMarshalPatch}).
9
+ # Cache producer that materialises the entire `RBS::Environment` (the loader's `build_env` result) and
10
+ # round-trips it through `Marshal` against the patched `RBS::Location` (see
11
+ # {RbsEnvironmentMarshalPatch}).
13
12
  #
14
- # Cold runs pay the full
15
- # `RBS::EnvironmentLoader#load + RBS::Environment.from_loader
16
- # + resolve_type_names` cost once; warm runs (and a separate
17
- # loader sharing the same Store) load the marshalled blob and
18
- # skip the parse / resolve stages entirely. The
19
- # `RbsConstantTable`, `RbsKnownClassNames`,
20
- # `RbsClassAncestorTable`, and `RbsClassTypeParamNames`
21
- # caches still live alongside this producer — their cached
22
- # values are reached without re-touching env, but when an
23
- # uncached lookup happens (`instance_method`,
24
- # `singleton_method`, …) the env produced here is what
25
- # answers it.
13
+ # Cold runs pay the full `RBS::EnvironmentLoader#load + RBS::Environment.from_loader +
14
+ # resolve_type_names` cost once; warm runs (and a separate loader sharing the same Store) load the
15
+ # marshalled blob and skip the parse / resolve stages entirely. The `RbsConstantTable`,
16
+ # `RbsKnownClassNames`, `RbsClassAncestorTable`, and `RbsClassTypeParamNames` caches still live alongside
17
+ # this producer their cached values are reached without re-touching env, but when an uncached lookup
18
+ # happens (`instance_method`, `singleton_method`, …) the env produced here is what answers it.
26
19
  #
27
- # Cache descriptor shape is shared with every other cache
28
- # producer that depends on the RBS environment — see
29
- # {RbsDescriptor.build}.
20
+ # Cache descriptor shape is shared with every other cache producer that depends on the RBS environment —
21
+ # see {RbsDescriptor.build}.
30
22
  class RbsEnvironment < RbsCacheProducer
31
23
  PRODUCER_ID = "rbs.environment"
32
24
 
@@ -2,29 +2,21 @@
2
2
 
3
3
  require "rbs"
4
4
 
5
- # Adds `_dump` / `_load` to {RBS::Location} so an
6
- # `RBS::Environment` (and its transitive AST nodes, all of
7
- # which carry Locations) round-trips through `Marshal`. The
8
- # rbs gem's C-extension `RBS::Location` ships without the
9
- # Marshal hooks; until rbs grows them upstream this patch is
10
- # the minimal monkey-patch the v0.0.9 RBS::Environment cache
11
- # relies on.
5
+ # Adds `_dump` / `_load` to {RBS::Location} so an `RBS::Environment` (and its transitive AST nodes, all of
6
+ # which carry Locations) round-trips through `Marshal`. The rbs gem's C-extension `RBS::Location` ships
7
+ # without the Marshal hooks; until rbs grows them upstream this patch is the minimal monkey-patch the v0.0.9
8
+ # RBS::Environment cache relies on.
12
9
  #
13
10
  # Patch policy (purely additive):
14
11
  #
15
- # - `_dump` returns an empty string. The cached env loses
16
- # per-node source-position info, but Rigor does not consult
17
- # `RBS::Location` from any analysis code path (every
18
- # diagnostic uses Prism's own location), so the loss is
19
- # inert in practice.
20
- # - `_load` reconstructs a sentinel Location backed by an
21
- # empty `<cached>` Buffer. Code paths that DID consult
22
- # Location after a cache hit see a benign zero-range value
23
- # rather than crashing.
12
+ # - `_dump` returns an empty string. The cached env loses per-node source-position info, but Rigor does not
13
+ # consult `RBS::Location` from any analysis code path (every diagnostic uses Prism's own location), so the
14
+ # loss is inert in practice.
15
+ # - `_load` reconstructs a sentinel Location backed by an empty `<cached>` Buffer. Code paths that DID consult
16
+ # Location after a cache hit see a benign zero-range value rather than crashing.
24
17
  #
25
- # Idempotent: the guard checks `method_defined?(:_dump)` so
26
- # requiring this file twice (or against an upstream rbs that
27
- # adds Marshal hooks itself) is a no-op.
18
+ # Idempotent: the guard checks `method_defined?(:_dump)` so requiring this file twice (or against an upstream
19
+ # rbs that adds Marshal hooks itself) is a no-op.
28
20
  module RBS
29
21
  class Location
30
22
  unless method_defined?(:_dump)
@@ -5,20 +5,16 @@ require_relative "rbs_cache_producer"
5
5
 
6
6
  module Rigor
7
7
  module Cache
8
- # Cache producer that materialises the set of every RBS-declared
9
- # class / module / alias name (top-level prefixed, e.g.
10
- # `"::Math"`) currently loaded into the environment. Marshal-
11
- # clean — the cache value is a `Set<String>`.
8
+ # Cache producer that materialises the set of every RBS-declared class / module / alias name (top-level
9
+ # prefixed, e.g. `"::Math"`) currently loaded into the environment. Marshal-clean the cache value is a
10
+ # `Set<String>`.
12
11
  #
13
- # The set lets `RbsLoader#class_known?` answer point lookups in
14
- # O(1) without re-parsing the name on each call, and lets a warm
15
- # process skip the env walk entirely (the env still has to be
16
- # built to enumerate decls on cold misses; subsequent processes
17
- # sharing the Store load the set straight from disk).
12
+ # The set lets `RbsLoader#class_known?` answer point lookups in O(1) without re-parsing the name on each
13
+ # call, and lets a warm process skip the env walk entirely (the env still has to be built to enumerate
14
+ # decls on cold misses; subsequent processes sharing the Store load the set straight from disk).
18
15
  #
19
- # Cache descriptor shape is shared with {RbsConstantTable} via
20
- # {RbsDescriptor.build}; a single signature change or rbs gem
21
- # bump invalidates both producers in lockstep.
16
+ # Cache descriptor shape is shared with {RbsConstantTable} via {RbsDescriptor.build}; a single signature
17
+ # change or rbs gem bump invalidates both producers in lockstep.
22
18
  class RbsKnownClassNames < RbsCacheProducer
23
19
  PRODUCER_ID = "rbs.known_class_names"
24
20