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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/docs/manual/04-diagnostics.md +7 -4
- data/docs/manual/06-baseline.md +5 -2
- data/docs/manual/15-type-protection-coverage.md +6 -4
- data/lib/rigor/analysis/baseline.rb +56 -96
- data/lib/rigor/analysis/buffer_binding.rb +13 -20
- data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +29 -48
- data/lib/rigor/analysis/check_rules/dead_assignment_collector.rb +35 -54
- data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +23 -37
- data/lib/rigor/analysis/check_rules/main_pass_collector.rb +16 -23
- data/lib/rigor/analysis/check_rules/rule_walk.rb +48 -71
- data/lib/rigor/analysis/check_rules/self_closedness_scanner.rb +19 -28
- data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +48 -67
- data/lib/rigor/analysis/check_rules.rb +174 -274
- data/lib/rigor/analysis/dependency_recorder.rb +26 -38
- data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +13 -25
- data/lib/rigor/analysis/dependency_source_inference/builder.rb +17 -30
- data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +15 -26
- data/lib/rigor/analysis/dependency_source_inference/index.rb +45 -76
- data/lib/rigor/analysis/dependency_source_inference/return_type_heuristic.rb +23 -40
- data/lib/rigor/analysis/dependency_source_inference/walker.rb +50 -83
- data/lib/rigor/analysis/dependency_source_inference.rb +6 -10
- data/lib/rigor/analysis/diagnostic.rb +48 -75
- data/lib/rigor/analysis/erb_template_detector.rb +13 -18
- data/lib/rigor/analysis/fact_store.rb +12 -22
- data/lib/rigor/analysis/incremental.rb +47 -63
- data/lib/rigor/analysis/incremental_session.rb +74 -100
- data/lib/rigor/analysis/project_scan.rb +12 -23
- data/lib/rigor/analysis/result.rb +3 -5
- data/lib/rigor/analysis/rule_catalog.rb +67 -95
- data/lib/rigor/analysis/run_stats.rb +38 -61
- data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +101 -160
- data/lib/rigor/analysis/runner/pool_coordinator.rb +121 -188
- data/lib/rigor/analysis/runner/project_pre_passes.rb +62 -96
- data/lib/rigor/analysis/runner/run_snapshots.rb +12 -18
- data/lib/rigor/analysis/runner.rb +220 -333
- data/lib/rigor/analysis/self_call_resolution_recorder.rb +30 -43
- data/lib/rigor/analysis/worker_session.rb +64 -102
- data/lib/rigor/ast/type_node.rb +6 -8
- data/lib/rigor/ast.rb +6 -10
- data/lib/rigor/bleeding_edge.rb +27 -35
- data/lib/rigor/builtins/hkt_builtins.rb +7 -14
- data/lib/rigor/builtins/imported_refinements.rb +106 -149
- data/lib/rigor/builtins/predefined_constant_refinements.rb +51 -65
- data/lib/rigor/builtins/regex_refinement.rb +32 -43
- data/lib/rigor/builtins/static_return_refinements.rb +57 -81
- data/lib/rigor/cache/descriptor.rb +58 -94
- data/lib/rigor/cache/incremental_snapshot.rb +32 -48
- data/lib/rigor/cache/rbs_cache_producer.rb +10 -15
- data/lib/rigor/cache/rbs_class_ancestor_table.rb +10 -16
- data/lib/rigor/cache/rbs_class_type_param_names.rb +10 -16
- data/lib/rigor/cache/rbs_constant_table.rb +8 -13
- data/lib/rigor/cache/rbs_descriptor.rb +8 -13
- data/lib/rigor/cache/rbs_environment.rb +11 -19
- data/lib/rigor/cache/rbs_environment_marshal_patch.rb +11 -19
- data/lib/rigor/cache/rbs_known_class_names.rb +8 -12
- data/lib/rigor/cache/store.rb +96 -151
- data/lib/rigor/cli/annotate_command.rb +51 -88
- data/lib/rigor/cli/baseline_command.rb +10 -17
- data/lib/rigor/cli/check_command.rb +121 -199
- data/lib/rigor/cli/check_runner_factory.rb +8 -14
- data/lib/rigor/cli/ci_detector.rb +9 -14
- data/lib/rigor/cli/command.rb +8 -14
- data/lib/rigor/cli/coverage_command.rb +19 -26
- data/lib/rigor/cli/coverage_mutation.rb +14 -19
- data/lib/rigor/cli/coverage_report.rb +0 -2
- data/lib/rigor/cli/coverage_scan.rb +7 -11
- data/lib/rigor/cli/diagnostic_formats.rb +43 -62
- data/lib/rigor/cli/diff_command.rb +10 -20
- data/lib/rigor/cli/docs_command.rb +26 -40
- data/lib/rigor/cli/doctor_command.rb +8 -9
- data/lib/rigor/cli/explain_command.rb +4 -7
- data/lib/rigor/cli/fused_protection_renderer.rb +4 -5
- data/lib/rigor/cli/fused_protection_report.rb +6 -8
- data/lib/rigor/cli/lsp_command.rb +11 -19
- data/lib/rigor/cli/mcp_command.rb +4 -6
- data/lib/rigor/cli/mutation_protection_renderer.rb +3 -4
- data/lib/rigor/cli/mutation_protection_report.rb +6 -9
- data/lib/rigor/cli/options.rb +11 -19
- data/lib/rigor/cli/plugin_command.rb +18 -30
- data/lib/rigor/cli/plugins_command.rb +29 -51
- data/lib/rigor/cli/plugins_renderer.rb +12 -20
- data/lib/rigor/cli/prism_colorizer.rb +13 -19
- data/lib/rigor/cli/protection_renderer.rb +5 -7
- data/lib/rigor/cli/protection_report.rb +27 -17
- data/lib/rigor/cli/renderable.rb +4 -6
- data/lib/rigor/cli/show_bleedingedge_command.rb +5 -8
- data/lib/rigor/cli/sig_gen_command.rb +14 -26
- data/lib/rigor/cli/skill_command.rb +30 -47
- data/lib/rigor/cli/skill_describe.rb +40 -64
- data/lib/rigor/cli/trace_command.rb +9 -16
- data/lib/rigor/cli/trace_renderer.rb +35 -51
- data/lib/rigor/cli/triage_command.rb +6 -10
- data/lib/rigor/cli/triage_renderer.rb +1 -2
- data/lib/rigor/cli/type_of_command.rb +14 -23
- data/lib/rigor/cli/type_of_renderer.rb +3 -5
- data/lib/rigor/cli/type_scan_command.rb +6 -10
- data/lib/rigor/cli/type_scan_renderer.rb +3 -5
- data/lib/rigor/cli/type_scan_report.rb +2 -3
- data/lib/rigor/cli/upgrade_command.rb +2 -3
- data/lib/rigor/cli.rb +16 -28
- data/lib/rigor/config_audit.rb +35 -44
- data/lib/rigor/configuration/dependencies.rb +41 -70
- data/lib/rigor/configuration/severity_profile.rb +28 -42
- data/lib/rigor/configuration.rb +150 -241
- data/lib/rigor/environment/bundle_sig_discovery.rb +74 -118
- data/lib/rigor/environment/class_registry.rb +19 -26
- data/lib/rigor/environment/constant_type_cache_holder.rb +14 -21
- data/lib/rigor/environment/hkt_registry_holder.rb +6 -12
- data/lib/rigor/environment/lockfile_resolver.rb +31 -47
- data/lib/rigor/environment/rbs_collection_discovery.rb +39 -63
- data/lib/rigor/environment/rbs_coverage_report.rb +24 -42
- data/lib/rigor/environment/rbs_loader.rb +420 -518
- data/lib/rigor/environment/reflection.rb +28 -53
- data/lib/rigor/environment/reporters.rb +13 -24
- data/lib/rigor/environment.rb +176 -291
- data/lib/rigor/flow_contribution/conflict.rb +16 -27
- data/lib/rigor/flow_contribution/element.rb +7 -12
- data/lib/rigor/flow_contribution/fact.rb +33 -57
- data/lib/rigor/flow_contribution/merge_result.rb +6 -9
- data/lib/rigor/flow_contribution/merger.rb +32 -47
- data/lib/rigor/flow_contribution.rb +37 -55
- data/lib/rigor/inference/acceptance.rb +133 -219
- data/lib/rigor/inference/block_parameter_binder.rb +52 -82
- data/lib/rigor/inference/body_fixpoint.rb +22 -30
- data/lib/rigor/inference/budget_trace.rb +43 -63
- data/lib/rigor/inference/builtins/array_catalog.rb +4 -6
- data/lib/rigor/inference/builtins/comparable_catalog.rb +4 -6
- data/lib/rigor/inference/builtins/complex_catalog.rb +13 -19
- data/lib/rigor/inference/builtins/date_catalog.rb +38 -67
- data/lib/rigor/inference/builtins/encoding_catalog.rb +22 -36
- data/lib/rigor/inference/builtins/enumerable_catalog.rb +4 -6
- data/lib/rigor/inference/builtins/exception_catalog.rb +38 -57
- data/lib/rigor/inference/builtins/hash_catalog.rb +9 -14
- data/lib/rigor/inference/builtins/method_catalog.rb +29 -48
- data/lib/rigor/inference/builtins/numeric_catalog.rb +13 -18
- data/lib/rigor/inference/builtins/pathname_catalog.rb +8 -13
- data/lib/rigor/inference/builtins/proc_catalog.rb +38 -62
- data/lib/rigor/inference/builtins/random_catalog.rb +21 -32
- data/lib/rigor/inference/builtins/range_catalog.rb +12 -21
- data/lib/rigor/inference/builtins/rational_catalog.rb +9 -15
- data/lib/rigor/inference/builtins/re_catalog.rb +29 -48
- data/lib/rigor/inference/builtins/set_catalog.rb +18 -27
- data/lib/rigor/inference/builtins/string_catalog.rb +12 -19
- data/lib/rigor/inference/builtins/struct_catalog.rb +18 -30
- data/lib/rigor/inference/builtins/time_catalog.rb +28 -44
- data/lib/rigor/inference/closure_escape_analyzer.rb +44 -67
- data/lib/rigor/inference/coverage_scanner.rb +13 -18
- data/lib/rigor/inference/def_return_typer.rb +8 -14
- data/lib/rigor/inference/dynamic_origin.rb +23 -20
- data/lib/rigor/inference/expression_typer.rb +774 -1152
- data/lib/rigor/inference/fallback.rb +8 -12
- data/lib/rigor/inference/fallback_tracer.rb +4 -10
- data/lib/rigor/inference/flow_tracer.rb +25 -36
- data/lib/rigor/inference/hkt_body.rb +45 -68
- data/lib/rigor/inference/hkt_body_parser.rb +33 -52
- data/lib/rigor/inference/hkt_reducer.rb +38 -59
- data/lib/rigor/inference/hkt_registry.rb +50 -76
- data/lib/rigor/inference/indexed_narrowing.rb +55 -81
- data/lib/rigor/inference/macro_block_self_type.rb +21 -34
- data/lib/rigor/inference/method_dispatcher/array_to_h_folding.rb +11 -18
- data/lib/rigor/inference/method_dispatcher/block_folding.rb +49 -83
- data/lib/rigor/inference/method_dispatcher/call_context.rb +16 -23
- data/lib/rigor/inference/method_dispatcher/cgi_folding.rb +13 -22
- data/lib/rigor/inference/method_dispatcher/constant_folding.rb +307 -454
- data/lib/rigor/inference/method_dispatcher/data_folding.rb +24 -34
- data/lib/rigor/inference/method_dispatcher/file_folding.rb +22 -37
- data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +52 -81
- data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +51 -78
- data/lib/rigor/inference/method_dispatcher/literal_string_folding.rb +60 -97
- data/lib/rigor/inference/method_dispatcher/math_folding.rb +23 -34
- data/lib/rigor/inference/method_dispatcher/member_shape_projection.rb +18 -26
- data/lib/rigor/inference/method_dispatcher/method_folding.rb +37 -71
- data/lib/rigor/inference/method_dispatcher/overload_selector.rb +114 -182
- data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +122 -193
- data/lib/rigor/inference/method_dispatcher/receiver_affinity.rb +15 -24
- data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +64 -93
- data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +31 -45
- data/lib/rigor/inference/method_dispatcher/set_folding.rb +6 -9
- data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +356 -511
- data/lib/rigor/inference/method_dispatcher/shellwords_folding.rb +22 -32
- data/lib/rigor/inference/method_dispatcher/singleton_folding.rb +15 -21
- data/lib/rigor/inference/method_dispatcher/struct_folding.rb +66 -82
- data/lib/rigor/inference/method_dispatcher/time_folding.rb +10 -15
- data/lib/rigor/inference/method_dispatcher/uri_folding.rb +9 -13
- data/lib/rigor/inference/method_dispatcher.rb +378 -524
- data/lib/rigor/inference/method_parameter_binder.rb +81 -114
- data/lib/rigor/inference/multi_target_binder.rb +51 -68
- data/lib/rigor/inference/mutation_widening.rb +115 -158
- data/lib/rigor/inference/narrowing.rb +509 -727
- data/lib/rigor/inference/origin_lookup.rb +38 -0
- data/lib/rigor/inference/parameter_inference_collector.rb +100 -100
- data/lib/rigor/inference/precision_scanner.rb +26 -35
- data/lib/rigor/inference/project_patched_methods.rb +20 -32
- data/lib/rigor/inference/project_patched_scanner.rb +23 -37
- data/lib/rigor/inference/protection_scanner.rb +16 -18
- data/lib/rigor/inference/rbs_type_translator.rb +49 -66
- data/lib/rigor/inference/scope_indexer.rb +473 -817
- data/lib/rigor/inference/statement_evaluator.rb +706 -1111
- data/lib/rigor/inference/struct_fold_safety.rb +34 -48
- data/lib/rigor/inference/synthetic_method.rb +9 -16
- data/lib/rigor/inference/synthetic_method_index.rb +20 -35
- data/lib/rigor/inference/synthetic_method_scanner.rb +63 -103
- data/lib/rigor/language_server/buffer_resolution.rb +6 -9
- data/lib/rigor/language_server/buffer_table.rb +11 -18
- data/lib/rigor/language_server/completion_provider.rb +69 -116
- data/lib/rigor/language_server/debouncer.rb +16 -25
- data/lib/rigor/language_server/diagnostic_publisher.rb +26 -40
- data/lib/rigor/language_server/document_symbol_provider.rb +14 -19
- data/lib/rigor/language_server/folding_range_provider.rb +11 -19
- data/lib/rigor/language_server/hover_provider.rb +8 -11
- data/lib/rigor/language_server/hover_renderer.rb +56 -93
- data/lib/rigor/language_server/loop.rb +14 -19
- data/lib/rigor/language_server/project_context.rb +46 -74
- data/lib/rigor/language_server/selection_range_provider.rb +9 -12
- data/lib/rigor/language_server/server.rb +55 -83
- data/lib/rigor/language_server/signature_help_provider.rb +29 -46
- data/lib/rigor/language_server/synchronized_writer.rb +4 -7
- data/lib/rigor/language_server/uri.rb +8 -13
- data/lib/rigor/language_server.rb +4 -6
- data/lib/rigor/mcp/loop.rb +2 -3
- data/lib/rigor/mcp/server.rb +4 -7
- data/lib/rigor/mcp.rb +3 -6
- data/lib/rigor/plugin/access_denied_error.rb +5 -8
- data/lib/rigor/plugin/additional_initializer.rb +21 -31
- data/lib/rigor/plugin/base.rb +335 -518
- data/lib/rigor/plugin/blueprint.rb +14 -23
- data/lib/rigor/plugin/box.rb +18 -29
- data/lib/rigor/plugin/fact_store.rb +16 -26
- data/lib/rigor/plugin/inflector.rb +37 -53
- data/lib/rigor/plugin/io_boundary.rb +33 -56
- data/lib/rigor/plugin/isolation.rb +42 -55
- data/lib/rigor/plugin/load_error.rb +10 -15
- data/lib/rigor/plugin/loader.rb +30 -49
- data/lib/rigor/plugin/macro/block_as_method.rb +20 -32
- data/lib/rigor/plugin/macro/heredoc_template.rb +35 -58
- data/lib/rigor/plugin/macro/nested_class_template.rb +22 -36
- data/lib/rigor/plugin/macro/trait_registry.rb +34 -51
- data/lib/rigor/plugin/macro.rb +10 -15
- data/lib/rigor/plugin/manifest.rb +85 -144
- data/lib/rigor/plugin/node_context.rb +14 -22
- data/lib/rigor/plugin/node_rule_walk.rb +49 -74
- data/lib/rigor/plugin/protocol_contract.rb +25 -39
- data/lib/rigor/plugin/registry.rb +132 -205
- data/lib/rigor/plugin/services.rb +21 -33
- data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +11 -19
- data/lib/rigor/plugin/trust_policy.rb +24 -38
- data/lib/rigor/plugin/type_node_resolver.rb +15 -24
- data/lib/rigor/protection/diagnostic_oracle.rb +11 -13
- data/lib/rigor/protection/mutation_scanner.rb +27 -35
- data/lib/rigor/protection/mutator.rb +50 -70
- data/lib/rigor/protection/test_suite_oracle.rb +20 -27
- data/lib/rigor/rbs_extended/conformance_checker.rb +48 -68
- data/lib/rigor/rbs_extended/hkt_directives.rb +28 -54
- data/lib/rigor/rbs_extended/reporter.rb +24 -40
- data/lib/rigor/rbs_extended.rb +107 -197
- data/lib/rigor/reflection.rb +68 -86
- data/lib/rigor/scope/discovery_index.rb +14 -19
- data/lib/rigor/scope.rb +255 -310
- data/lib/rigor/sig_gen/classification.rb +6 -10
- data/lib/rigor/sig_gen/generator.rb +197 -323
- data/lib/rigor/sig_gen/layout_index.rb +12 -20
- data/lib/rigor/sig_gen/method_candidate.rb +12 -17
- data/lib/rigor/sig_gen/observation_collector.rb +38 -70
- data/lib/rigor/sig_gen/observed_call.rb +13 -23
- data/lib/rigor/sig_gen/path_mapper.rb +17 -29
- data/lib/rigor/sig_gen/renderer.rb +7 -13
- data/lib/rigor/sig_gen/type_elaborator.rb +15 -28
- data/lib/rigor/sig_gen/write_result.rb +8 -16
- data/lib/rigor/sig_gen/writer.rb +95 -174
- data/lib/rigor/sig_gen.rb +3 -6
- data/lib/rigor/signature_path_audit.rb +24 -30
- data/lib/rigor/source/constant_path.rb +10 -14
- data/lib/rigor/source/literals.rb +31 -45
- data/lib/rigor/source/node_locator.rb +9 -11
- data/lib/rigor/source/node_walker.rb +9 -13
- data/lib/rigor/source.rb +3 -4
- data/lib/rigor/testing.rb +16 -20
- data/lib/rigor/triage/catalogue.rb +38 -62
- data/lib/rigor/triage.rb +31 -52
- data/lib/rigor/trinary.rb +9 -13
- data/lib/rigor/type/acceptance_router.rb +4 -6
- data/lib/rigor/type/accepts_result.rb +10 -14
- data/lib/rigor/type/app.rb +19 -27
- data/lib/rigor/type/bot.rb +4 -6
- data/lib/rigor/type/bound_method.rb +10 -15
- data/lib/rigor/type/combinator.rb +165 -257
- data/lib/rigor/type/constant.rb +23 -34
- data/lib/rigor/type/data_class.rb +10 -15
- data/lib/rigor/type/data_instance.rb +14 -20
- data/lib/rigor/type/difference.rb +21 -32
- data/lib/rigor/type/dynamic.rb +3 -5
- data/lib/rigor/type/hash_shape.rb +32 -18
- data/lib/rigor/type/integer_range.rb +11 -16
- data/lib/rigor/type/intersection.rb +27 -42
- data/lib/rigor/type/nominal.rb +10 -15
- data/lib/rigor/type/plain_lattice.rb +9 -13
- data/lib/rigor/type/refined.rb +67 -114
- data/lib/rigor/type/singleton.rb +4 -6
- data/lib/rigor/type/struct_class.rb +11 -16
- data/lib/rigor/type/struct_instance.rb +15 -21
- data/lib/rigor/type/tuple.rb +14 -19
- data/lib/rigor/type/union.rb +30 -42
- data/lib/rigor/type_node/generic.rb +14 -26
- data/lib/rigor/type_node/identifier.rb +12 -19
- data/lib/rigor/type_node.rb +3 -12
- data/lib/rigor/value_semantics.rb +16 -21
- data/lib/rigor/version.rb +1 -1
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/analyzer.rb +18 -30
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +16 -29
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +12 -23
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +22 -39
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/analyzer.rb +26 -46
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +51 -87
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +10 -17
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +26 -39
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +118 -176
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_discoverer.rb +30 -51
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +57 -92
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +71 -108
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/analyzer.rb +13 -22
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_discoverer.rb +15 -25
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_index.rb +8 -13
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +16 -24
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/analyzer.rb +30 -47
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +79 -129
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +36 -57
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +27 -41
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_table.rb +16 -24
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +148 -235
- data/plugins/rigor-activerecord/lib/rigor-activerecord.rb +3 -5
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/analyzer.rb +8 -14
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_discoverer.rb +9 -15
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_index.rb +4 -7
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +23 -41
- data/plugins/rigor-activestorage/lib/rigor-activestorage.rb +3 -5
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +6 -10
- data/plugins/rigor-activesupport-core-ext/lib/rigor-activesupport-core-ext.rb +8 -11
- data/plugins/rigor-devise/lib/rigor/plugin/devise.rb +30 -45
- data/plugins/rigor-devise/lib/rigor-devise.rb +3 -5
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +43 -69
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema.rb +26 -35
- data/plugins/rigor-dry-schema/lib/rigor-dry-schema.rb +3 -5
- data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +30 -47
- data/plugins/rigor-dry-struct/lib/rigor-dry-struct.rb +3 -5
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +67 -113
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +29 -46
- data/plugins/rigor-dry-types/lib/rigor-dry-types.rb +3 -5
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/contract_scanner.rb +13 -20
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +14 -23
- data/plugins/rigor-dry-validation/lib/rigor-dry-validation.rb +2 -3
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/analyzer.rb +22 -37
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +28 -46
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_index.rb +13 -17
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +30 -47
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +52 -80
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql.rb +21 -31
- data/plugins/rigor-graphql/lib/rigor-graphql.rb +3 -5
- data/plugins/rigor-hanami/lib/rigor/plugin/hanami/action_checker.rb +11 -17
- data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +20 -34
- data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +45 -75
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +22 -36
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest.rb +22 -41
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/analyzer.rb +17 -32
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +6 -12
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_index.rb +4 -8
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit.rb +17 -32
- data/plugins/rigor-rails/lib/rigor-rails.rb +11 -18
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +58 -92
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +20 -34
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +20 -31
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n.rb +49 -82
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +55 -92
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +51 -90
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/doorkeeper_routes.rb +17 -30
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +38 -70
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_table.rb +42 -74
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +280 -497
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +54 -89
- data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +32 -54
- data/plugins/rigor-rbs-inline/lib/rigor-rbs-inline.rb +8 -13
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/analyzer.rb +9 -16
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_scope_index.rb +24 -39
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_type_resolver.rb +13 -22
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +34 -56
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/scope_walker.rb +22 -42
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +43 -75
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/have_http_status_analyzer.rb +27 -39
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/http_status_codes.rb +14 -19
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +20 -34
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +28 -47
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers.rb +21 -37
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/analyzer.rb +13 -22
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_discoverer.rb +18 -31
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_index.rb +6 -10
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +14 -29
- data/plugins/rigor-sinatra/lib/rigor/plugin/sinatra.rb +23 -41
- data/plugins/rigor-sinatra/lib/rigor-sinatra.rb +3 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +23 -38
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +57 -96
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +22 -35
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog_walker.rb +41 -69
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/method_signature.rb +6 -10
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +24 -41
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sigil_detector.rb +29 -50
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/type_translator.rb +55 -88
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +159 -262
- data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +21 -29
- data/plugins/rigor-statesman/lib/rigor-statesman.rb +3 -5
- data/plugins/rigor-typescript-utility-types/lib/rigor/plugin/typescript_utility_types.rb +23 -37
- data/plugins/rigor-typescript-utility-types/lib/rigor-typescript-utility-types.rb +4 -6
- data/sig/rigor/scope.rbs +6 -0
- 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
|
-
#
|
|
11
|
-
#
|
|
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
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
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
|
-
#
|
|
28
|
-
#
|
|
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
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
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
|
-
#
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
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
|
-
#
|
|
89
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
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
|
-
#
|
|
18
|
-
#
|
|
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
|
-
#
|
|
25
|
-
#
|
|
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
|
-
#
|
|
10
|
-
# `
|
|
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
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
10
|
-
# `Hash
|
|
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
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
10
|
-
# a
|
|
11
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
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
|
-
#
|
|
57
|
-
#
|
|
58
|
-
#
|
|
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
|
-
# `
|
|
11
|
-
#
|
|
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
|
-
# `
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
# `
|
|
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
|
-
#
|
|
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
|
-
# `
|
|
7
|
-
#
|
|
8
|
-
#
|
|
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
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
10
|
-
# `
|
|
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
|
-
#
|
|
15
|
-
#
|
|
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
|
-
#
|
|
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
|
|