rigortype 0.4.5 → 0.4.7
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 +2 -2
- data/data/gem_overlay/activesupport/core_ext.rbs +16 -13
- data/data/vendored_gem_sigs/bundler/bundler.rbs +1 -1
- data/data/vendored_gem_sigs/rubygems/rubygems_extras.rbs +4 -3
- data/docs/handbook/01-getting-started.md +5 -2
- data/docs/handbook/11-sig-gen.md +61 -5
- data/docs/handbook/appendix-phpstan.md +4 -4
- data/docs/manual/02-cli-reference.md +192 -27
- data/docs/manual/03-configuration.md +38 -4
- data/docs/manual/04-diagnostics.md +1 -1
- data/docs/manual/06-baseline.md +6 -4
- data/docs/manual/09-editor-integration.md +13 -2
- data/docs/manual/10-mcp-server.md +47 -3
- data/docs/manual/12-caching.md +9 -1
- data/docs/manual/plugins/rigor-actionmailer.md +30 -0
- data/docs/manual/plugins/rigor-actionpack.md +49 -11
- data/docs/manual/plugins/rigor-activesupport-core-ext.md +20 -1
- data/docs/manual/plugins/rigor-devise.md +15 -0
- data/docs/manual/plugins/rigor-rspec.md +2 -1
- data/lib/rigor/analysis/baseline.rb +24 -27
- data/lib/rigor/analysis/buffer_binding.rb +14 -0
- data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +5 -6
- data/lib/rigor/analysis/check_rules/dead_assignment_collector.rb +2 -2
- data/lib/rigor/analysis/check_rules/declaration_sourced_guard.rb +4 -4
- data/lib/rigor/analysis/check_rules/duplicate_hash_key_collector.rb +2 -2
- data/lib/rigor/analysis/check_rules/inferred_param_guard.rb +105 -12
- data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +143 -15
- data/lib/rigor/analysis/check_rules/lexical_method_sites.rb +4 -1
- data/lib/rigor/analysis/check_rules/main_pass_collector.rb +5 -8
- data/lib/rigor/analysis/check_rules/published_constant_guard.rb +1 -1
- data/lib/rigor/analysis/check_rules/rbs_receiver_surface.rb +66 -3
- data/lib/rigor/analysis/check_rules/rebinding_block_callees/dispatch.rb +112 -0
- data/lib/rigor/analysis/check_rules/rebinding_block_callees.rb +394 -0
- data/lib/rigor/analysis/check_rules/return_in_ensure_collector.rb +1 -2
- data/lib/rigor/analysis/check_rules/ruby_deprecations.rb +7 -0
- data/lib/rigor/analysis/check_rules/rule_ids.rb +1 -1
- data/lib/rigor/analysis/check_rules/rule_walk.rb +9 -7
- data/lib/rigor/analysis/check_rules/shadowed_rescue_collector.rb +3 -4
- data/lib/rigor/analysis/check_rules/special_global_setters.rb +3 -3
- data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +53 -2
- data/lib/rigor/analysis/check_rules/void_value_use_collector.rb +1 -1
- data/lib/rigor/analysis/check_rules.rb +217 -52
- data/lib/rigor/analysis/crash_signature.rb +2 -2
- data/lib/rigor/analysis/dependency_recorder.rb +15 -4
- data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +14 -3
- data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +1 -1
- data/lib/rigor/analysis/dependency_source_inference/index.rb +6 -8
- data/lib/rigor/analysis/dependency_source_inference/walker.rb +4 -4
- data/lib/rigor/analysis/edit_replay.rb +154 -0
- data/lib/rigor/analysis/fact_store.rb +3 -3
- data/lib/rigor/analysis/incremental.rb +37 -0
- data/lib/rigor/analysis/incremental_run_slot/write_guard.rb +2 -2
- data/lib/rigor/analysis/incremental_run_slot.rb +2 -2
- data/lib/rigor/analysis/incremental_session.rb +202 -43
- data/lib/rigor/analysis/path_expansion.rb +41 -0
- data/lib/rigor/analysis/require_relative_closure.rb +100 -0
- data/lib/rigor/analysis/rule_catalog.rb +7 -3
- data/lib/rigor/analysis/run_disclosure_credit.rb +80 -0
- data/lib/rigor/analysis/run_disclosure_ledger.rb +155 -0
- data/lib/rigor/analysis/run_stats.rb +2 -2
- data/lib/rigor/analysis/runner/buffer_pool_dispatcher.rb +8 -4
- data/lib/rigor/analysis/runner/declaration_position.rb +1 -1
- data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +204 -96
- data/lib/rigor/analysis/runner/effect_envelope_pass.rb +1 -1
- data/lib/rigor/analysis/runner/pool_coordinator.rb +157 -320
- data/lib/rigor/analysis/runner/project_pre_passes.rb +48 -6
- data/lib/rigor/analysis/runner/run_level_facts.rb +304 -0
- data/lib/rigor/analysis/runner/run_snapshots.rb +44 -54
- data/lib/rigor/analysis/runner/scan_environment.rb +51 -0
- data/lib/rigor/analysis/runner/worker_payload.rb +36 -0
- data/lib/rigor/analysis/runner.rb +233 -120
- data/lib/rigor/analysis/self_call_resolution_recorder.rb +1 -1
- data/lib/rigor/analysis/template_unit_positions.rb +2 -3
- data/lib/rigor/analysis/template_units.rb +9 -1
- data/lib/rigor/analysis/worker_session.rb +38 -33
- data/lib/rigor/bleeding_edge.rb +3 -6
- data/lib/rigor/builtins/imported_refinements.rb +6 -8
- data/lib/rigor/builtins/predefined_constant_refinements.rb +1 -1
- data/lib/rigor/builtins/regex_refinement.rb +4 -6
- data/lib/rigor/cache/descriptor.rb +6 -5
- data/lib/rigor/cache/incremental_snapshot.rb +60 -18
- data/lib/rigor/cache/rbs_cache_producer.rb +2 -2
- data/lib/rigor/cache/rbs_class_ancestor_table.rb +1 -1
- data/lib/rigor/cache/rbs_class_type_param_names.rb +2 -2
- data/lib/rigor/cache/rbs_constant_table.rb +1 -1
- data/lib/rigor/cache/rbs_descriptor.rb +54 -3
- data/lib/rigor/cache/rbs_environment.rb +4 -1
- data/lib/rigor/cache/rbs_environment_marshal_patch.rb +2 -2
- data/lib/rigor/cache/rbs_known_class_names.rb +1 -1
- data/lib/rigor/cache/store.rb +11 -10
- data/lib/rigor/ci_detector.rb +1 -1
- data/lib/rigor/cli/annotate_command.rb +24 -19
- data/lib/rigor/cli/baseline_command.rb +145 -55
- data/lib/rigor/cli/catalogue.rb +256 -0
- data/lib/rigor/cli/check_command.rb +188 -93
- data/lib/rigor/cli/check_runner_factory.rb +2 -2
- data/lib/rigor/cli/command.rb +15 -1
- data/lib/rigor/cli/coverage_command.rb +21 -8
- data/lib/rigor/cli/coverage_mutation.rb +5 -7
- data/lib/rigor/cli/coverage_renderer.rb +2 -1
- data/lib/rigor/cli/coverage_scan.rb +3 -5
- data/lib/rigor/cli/diff_command.rb +27 -21
- data/lib/rigor/cli/docs_command.rb +1 -2
- data/lib/rigor/cli/doctor_command.rb +12 -12
- data/lib/rigor/cli/effects_command.rb +50 -40
- data/lib/rigor/cli/effects_diff_renderer.rb +18 -17
- data/lib/rigor/cli/effects_explain_renderer.rb +13 -12
- data/lib/rigor/cli/effects_renderer.rb +2 -1
- data/lib/rigor/cli/effects_snapshot_command.rb +18 -17
- data/lib/rigor/cli/explain_command.rb +18 -8
- data/lib/rigor/cli/fused_protection_renderer.rb +2 -1
- data/lib/rigor/cli/json_document.rb +41 -0
- data/lib/rigor/cli/lens_command.rb +17 -13
- data/lib/rigor/cli/lsp_command.rb +250 -23
- data/lib/rigor/cli/mcp_command.rb +14 -8
- data/lib/rigor/cli/mutation_fork_scan.rb +1 -1
- data/lib/rigor/cli/mutation_protection_renderer.rb +3 -2
- data/lib/rigor/cli/options.rb +60 -4
- data/lib/rigor/cli/plugin_command.rb +93 -46
- data/lib/rigor/cli/plugins_command.rb +22 -18
- data/lib/rigor/cli/plugins_renderer.rb +34 -8
- data/lib/rigor/cli/protection_fork_scan.rb +2 -2
- data/lib/rigor/cli/protection_renderer.rb +2 -1
- data/lib/rigor/cli/show_bleedingedge_command.rb +23 -16
- data/lib/rigor/cli/sig_gen_command.rb +130 -34
- data/lib/rigor/cli/skill_command.rb +32 -3
- data/lib/rigor/cli/skill_deep_probe.rb +1 -1
- data/lib/rigor/cli/skill_describe.rb +1 -1
- data/lib/rigor/cli/trace_command.rb +14 -9
- data/lib/rigor/cli/triage_command.rb +10 -11
- data/lib/rigor/cli/triage_renderer.rb +2 -1
- data/lib/rigor/cli/type_of_command.rb +18 -12
- data/lib/rigor/cli/type_of_project_scope.rb +24 -0
- data/lib/rigor/cli/type_of_renderer.rb +4 -1
- data/lib/rigor/cli/type_scan_command.rb +14 -9
- data/lib/rigor/cli/type_scan_renderer.rb +2 -1
- data/lib/rigor/cli/unused_command.rb +27 -17
- data/lib/rigor/cli/upgrade_command.rb +5 -0
- data/lib/rigor/cli.rb +209 -54
- data/lib/rigor/config_audit.rb +17 -6
- data/lib/rigor/configuration/severity_profile.rb +5 -5
- data/lib/rigor/configuration.rb +86 -34
- data/lib/rigor/effects/definition_context.rb +0 -2
- data/lib/rigor/effects/envelope.rb +1 -1
- data/lib/rigor/effects/framework_units.rb +1 -1
- data/lib/rigor/effects/mutation_classifier.rb +4 -7
- data/lib/rigor/effects/propagator.rb +1 -1
- data/lib/rigor/effects/registry.rb +2 -2
- data/lib/rigor/effects/snapshot.rb +1 -1
- data/lib/rigor/effects/taint_cause.rb +0 -2
- data/lib/rigor/effects/unit_scan.rb +9 -13
- data/lib/rigor/environment/bundle_sig_discovery.rb +5 -9
- data/lib/rigor/environment/class_registry.rb +3 -3
- data/lib/rigor/environment/core_root.rb +77 -0
- data/lib/rigor/environment/default_libraries.rb +1 -1
- data/lib/rigor/environment/deferred_signature_plan.rb +283 -0
- data/lib/rigor/environment/gated_signature_guard.rb +1 -1
- data/lib/rigor/environment/gated_signature_plan.rb +5 -2
- data/lib/rigor/environment/lockfile_resolver.rb +28 -12
- data/lib/rigor/environment/member_consistency/comparator.rb +18 -1
- data/lib/rigor/environment/member_consistency.rb +56 -7
- data/lib/rigor/environment/missing_gem_constant_index.rb +3 -2
- data/lib/rigor/environment/project_path_gems.rb +124 -0
- data/lib/rigor/environment/rbs_hierarchy.rb +6 -15
- data/lib/rigor/environment/rbs_loader.rb +592 -70
- data/lib/rigor/environment/reflection.rb +7 -7
- data/lib/rigor/environment/required_features.rb +136 -32
- data/lib/rigor/environment/ruby_library_roots.rb +122 -0
- data/lib/rigor/environment/vendored_signature_plan.rb +153 -0
- data/lib/rigor/environment.rb +44 -11
- data/lib/rigor/flow_contribution/merger.rb +4 -4
- data/lib/rigor/inference/acceptance.rb +93 -32
- data/lib/rigor/inference/block_parameter_binder.rb +2 -3
- data/lib/rigor/inference/block_run_count.rb +178 -0
- data/lib/rigor/inference/budget_trace.rb +8 -2
- data/lib/rigor/inference/builtins/exception_catalog.rb +2 -2
- data/lib/rigor/inference/builtins/numeric_catalog.rb +2 -5
- data/lib/rigor/inference/builtins/random_catalog.rb +2 -2
- data/lib/rigor/inference/callee_mutation_chain.rb +126 -0
- data/lib/rigor/inference/callee_write_census.rb +815 -0
- data/lib/rigor/inference/construction_escape.rb +217 -0
- data/lib/rigor/inference/declaration_walk/traversal.rb +1 -1
- data/lib/rigor/inference/deep_erasure.rb +170 -0
- data/lib/rigor/inference/def_handle.rb +1 -1
- data/lib/rigor/inference/def_node_resolver.rb +1 -1
- data/lib/rigor/inference/def_return_typer.rb +204 -12
- data/lib/rigor/inference/definer_resolution.rb +21 -5
- data/lib/rigor/inference/definers_index.rb +106 -0
- data/lib/rigor/inference/direct_ivar_writes.rb +300 -0
- data/lib/rigor/inference/element_read_widening.rb +49 -3
- data/lib/rigor/inference/error_info.rb +17 -3
- data/lib/rigor/inference/expression_typer.rb +173 -57
- data/lib/rigor/inference/external_ancestor_resolution.rb +3 -4
- data/lib/rigor/inference/global_write_census.rb +110 -1
- data/lib/rigor/inference/global_writer_reach.rb +260 -0
- data/lib/rigor/inference/hkt_body.rb +1 -2
- data/lib/rigor/inference/hkt_body_parser.rb +3 -5
- data/lib/rigor/inference/hkt_reducer.rb +2 -2
- data/lib/rigor/inference/hkt_registry.rb +3 -5
- data/lib/rigor/inference/indexed_narrowing.rb +4 -7
- data/lib/rigor/inference/intervening_ivar_reset.rb +26 -4
- data/lib/rigor/inference/ivar_writer_census.rb +246 -0
- data/lib/rigor/inference/key_presence_guard.rb +2 -1
- data/lib/rigor/inference/loop_value_record.rb +57 -0
- data/lib/rigor/inference/match_rebinding/frame.rb +65 -0
- data/lib/rigor/inference/match_rebinding/yielding_match.rb +45 -0
- data/lib/rigor/inference/match_rebinding.rb +11 -1
- data/lib/rigor/inference/memo_audit.rb +55 -0
- data/lib/rigor/inference/method_dispatcher/alias_strict_nominals.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/argument_distribution.rb +40 -0
- data/lib/rigor/inference/method_dispatcher/block_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/constant_folding.rb +113 -12
- data/lib/rigor/inference/method_dispatcher/contested_overloads.rb +89 -0
- data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +7 -3
- data/lib/rigor/inference/method_dispatcher/no_match_fallback.rb +54 -0
- data/lib/rigor/inference/method_dispatcher/overload_selector.rb +39 -27
- data/lib/rigor/inference/method_dispatcher/random_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +203 -17
- data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +2 -2
- data/lib/rigor/inference/method_dispatcher/self_substitute.rb +2 -2
- data/lib/rigor/inference/method_dispatcher/set_folding.rb +59 -24
- data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +83 -20
- data/lib/rigor/inference/method_dispatcher/singleton_folding.rb +0 -1
- data/lib/rigor/inference/method_dispatcher/singleton_mixin_dispatch.rb +50 -17
- data/lib/rigor/inference/method_dispatcher/struct_folding.rb +5 -5
- data/lib/rigor/inference/method_dispatcher/struct_materialization.rb +4 -6
- data/lib/rigor/inference/method_dispatcher/uri_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher.rb +109 -29
- data/lib/rigor/inference/module_function_state/spellings.rb +64 -0
- data/lib/rigor/inference/module_function_state.rb +23 -1
- data/lib/rigor/inference/multi_target_binder.rb +1 -1
- data/lib/rigor/inference/mutation_rejoin.rb +240 -4
- data/lib/rigor/inference/mutation_widening.rb +162 -29
- data/lib/rigor/inference/narrowing.rb +113 -38
- data/lib/rigor/inference/object_mixins.rb +13 -1
- data/lib/rigor/inference/optimistic_origin.rb +1 -1
- data/lib/rigor/inference/out_buffer_mutation.rb +72 -0
- data/lib/rigor/inference/parameter_inference_collector.rb +5 -6
- data/lib/rigor/inference/pre_eval_constants.rb +1 -1
- data/lib/rigor/inference/project_method_ownership.rb +6 -3
- data/lib/rigor/inference/project_seed_tables.rb +2 -1
- data/lib/rigor/inference/project_yielder.rb +122 -0
- data/lib/rigor/inference/receiver_alias.rb +20 -0
- data/lib/rigor/inference/refined_dispatch/constructed_class.rb +3 -1
- data/lib/rigor/inference/refined_dispatch/own_method.rb +2 -1
- data/lib/rigor/inference/remover_holder_scan.rb +233 -0
- data/lib/rigor/inference/remover_narrowing.rb +224 -0
- data/lib/rigor/inference/rewrite_mutation.rb +53 -2
- data/lib/rigor/inference/scope_indexer/certainty.rb +9 -1
- data/lib/rigor/inference/scope_indexer/constant_ivar_value.rb +93 -0
- data/lib/rigor/inference/scope_indexer/declared_ivar_types.rb +64 -0
- data/lib/rigor/inference/scope_indexer/declared_param_writes.rb +205 -0
- data/lib/rigor/inference/scope_indexer/derived_param_value.rb +112 -0
- data/lib/rigor/inference/scope_indexer/empty_seed.rb +99 -0
- data/lib/rigor/inference/scope_indexer/ivar_contributions.rb +135 -0
- data/lib/rigor/inference/scope_indexer/unseen_ivar_writers.rb +133 -0
- data/lib/rigor/inference/scope_indexer.rb +614 -146
- data/lib/rigor/inference/self_call_ivar_writes.rb +101 -17
- data/lib/rigor/inference/set_mutation.rb +189 -0
- data/lib/rigor/inference/singleton_hook_decline.rb +1 -2
- data/lib/rigor/inference/statement_evaluator.rb +3036 -278
- data/lib/rigor/inference/struct_fold_safety.rb +4 -6
- data/lib/rigor/inference/synthetic_method_index.rb +23 -0
- data/lib/rigor/inference/synthetic_method_scanner/project_members.rb +130 -0
- data/lib/rigor/inference/synthetic_method_scanner.rb +73 -14
- data/lib/rigor/inference/toplevel_def_census.rb +59 -0
- data/lib/rigor/inference/unknown_store_widening.rb +103 -4
- data/lib/rigor/inference/unthreaded_rebinds.rb +2 -3
- data/lib/rigor/inference/void_tail_summary.rb +2 -1
- data/lib/rigor/language_server/buffer_table.rb +9 -3
- data/lib/rigor/language_server/completion_provider.rb +26 -20
- data/lib/rigor/language_server/config_warning_announcer.rb +28 -0
- data/lib/rigor/language_server/diagnostic_publisher.rb +28 -9
- data/lib/rigor/language_server/document_symbol_provider.rb +1 -1
- data/lib/rigor/language_server/folding_range_provider.rb +1 -2
- data/lib/rigor/language_server/hover_provider.rb +1 -7
- data/lib/rigor/language_server/hover_renderer.rb +6 -8
- data/lib/rigor/language_server/project_context.rb +98 -4
- data/lib/rigor/language_server/publish_batcher.rb +3 -4
- data/lib/rigor/language_server/selection_range_provider.rb +2 -4
- data/lib/rigor/language_server/server.rb +12 -6
- data/lib/rigor/language_server/signature_help_provider.rb +4 -4
- data/lib/rigor/lens/plugins.rb +1 -1
- data/lib/rigor/mcp/server.rb +82 -3
- data/lib/rigor/mcp.rb +1 -1
- data/lib/rigor/plugin/access_denied_error.rb +1 -2
- data/lib/rigor/plugin/base.rb +26 -11
- data/lib/rigor/plugin/bundled_catalog.rb +1 -12
- data/lib/rigor/plugin/io_boundary.rb +1 -1
- data/lib/rigor/plugin/loader.rb +25 -8
- data/lib/rigor/plugin/macro/heredoc_template.rb +7 -8
- data/lib/rigor/plugin/macro/trait_registry.rb +6 -9
- data/lib/rigor/plugin/manifest.rb +38 -16
- data/lib/rigor/plugin/registry.rb +41 -3
- data/lib/rigor/plugin/services.rb +2 -3
- data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +11 -0
- data/lib/rigor/plugin/trust_policy.rb +2 -2
- data/lib/rigor/plugin/type_node_resolver.rb +2 -4
- data/lib/rigor/plugin.rb +6 -8
- data/lib/rigor/plugin_gap_advisory.rb +5 -1
- data/lib/rigor/project_environment.rb +16 -2
- data/lib/rigor/protection/analysis_guard.rb +1 -1
- data/lib/rigor/protection/discovery_seed.rb +96 -2
- data/lib/rigor/protection/mutator.rb +1 -1
- data/lib/rigor/rbs_extended/envelope_scanner.rb +4 -6
- data/lib/rigor/rbs_extended/hkt_directives.rb +6 -10
- data/lib/rigor/rbs_extended/reporter.rb +27 -3
- data/lib/rigor/rbs_extended.rb +2 -3
- data/lib/rigor/reflection/constant_ancestors.rb +5 -3
- data/lib/rigor/rooted_glob.rb +25 -2
- data/lib/rigor/run_scoped_slots.rb +38 -0
- data/lib/rigor/runtime/jit.rb +1 -1
- data/lib/rigor/scope/discovery_index.rb +19 -6
- data/lib/rigor/scope/resolution_chain.rb +3 -1
- data/lib/rigor/scope.rb +379 -36
- data/lib/rigor/sig_gen/classification.rb +4 -0
- data/lib/rigor/sig_gen/effect_annotation.rb +3 -3
- data/lib/rigor/sig_gen/generator.rb +668 -84
- data/lib/rigor/sig_gen/generic_header_scan.rb +189 -0
- data/lib/rigor/sig_gen/inline_declarations.rb +2 -2
- data/lib/rigor/sig_gen/layout_index.rb +3 -3
- data/lib/rigor/sig_gen/method_candidate.rb +23 -4
- data/lib/rigor/sig_gen/observation_collector.rb +7 -6
- data/lib/rigor/sig_gen/observed_call.rb +1 -1
- data/lib/rigor/sig_gen/path_mapper.rb +6 -0
- data/lib/rigor/sig_gen/rbs_validity.rb +1 -1
- data/lib/rigor/sig_gen/renderer.rb +21 -12
- data/lib/rigor/sig_gen/skip_reason_catalog.rb +15 -2
- data/lib/rigor/sig_gen/type_elaborator.rb +21 -5
- data/lib/rigor/sig_gen/type_name_qualification.rb +69 -0
- data/lib/rigor/sig_gen/write_reporter.rb +63 -14
- data/lib/rigor/sig_gen/write_result.rb +23 -12
- data/lib/rigor/sig_gen/writer.rb +217 -37
- data/lib/rigor/type/acceptance_router.rb +2 -2
- data/lib/rigor/type/accepts_result.rb +1 -1
- data/lib/rigor/type/app.rb +4 -6
- data/lib/rigor/type/combinator.rb +13 -16
- data/lib/rigor/type/constant.rb +48 -7
- data/lib/rigor/type/hash_shape.rb +26 -40
- data/lib/rigor/type/struct_instance.rb +3 -2
- data/lib/rigor/type/union.rb +1 -1
- data/lib/rigor/type_node/identifier.rb +1 -2
- data/lib/rigor/type_node/resolver_chain.rb +1 -1
- data/lib/rigor/type_node/string_literal.rb +1 -2
- data/lib/rigor/type_node/symbol_literal.rb +1 -2
- data/lib/rigor/type_node/union.rb +3 -6
- data/lib/rigor/value_semantics.rb +1 -10
- data/lib/rigor/version.rb +1 -1
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +2 -2
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +2 -3
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +1 -1
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +89 -70
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +4 -2
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +25 -4
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +1 -1
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +1 -5
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_scan.rb +0 -1
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/erb_compiler.rb +2 -1
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/view_assigns.rb +1 -1
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +79 -19
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/effects.rb +1 -1
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +6 -3
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/association_roots.rb +3 -2
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/effects.rb +2 -2
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +21 -31
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +10 -16
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +2 -3
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_table.rb +0 -1
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +5 -4
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_discoverer.rb +3 -4
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_index.rb +1 -1
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +7 -12
- data/plugins/rigor-activestorage/lib/rigor-activestorage.rb +1 -1
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/effects.rb +1 -1
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/symbolize_keys.rb +102 -0
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +19 -6
- data/plugins/rigor-activesupport-core-ext/sig/active_support/core_ext.rbs +26 -13
- data/plugins/rigor-alba/lib/rigor/plugin/alba/resource_index.rb +3 -3
- data/plugins/rigor-devise/lib/rigor/plugin/devise.rb +5 -3
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +1 -3
- data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +6 -6
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +5 -6
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +7 -6
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/params_shape.rb +2 -3
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +5 -8
- data/plugins/rigor-ethon/lib/rigor/plugin/ethon.rb +0 -1
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +1 -1
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +10 -18
- data/plugins/rigor-ffi/lib/rigor/plugin/ffi/analyzer.rb +0 -1
- data/plugins/rigor-ffi/lib/rigor/plugin/ffi/discoverer.rb +0 -2
- data/plugins/rigor-ffi/lib/rigor/plugin/ffi.rb +4 -5
- data/plugins/rigor-grape/lib/rigor/plugin/grape.rb +0 -2
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +6 -7
- data/plugins/rigor-hanami/lib/rigor/plugin/hanami/action_checker.rb +2 -4
- data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +2 -5
- data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +2 -2
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +6 -6
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +2 -1
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +3 -8
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +2 -3
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +5 -8
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +1 -3
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +2 -3
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +1 -1
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +4 -11
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +1 -1
- data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +2 -1
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +102 -11
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +2 -2
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +3 -4
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +6 -8
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +5 -2
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +4 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +6 -7
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +1 -1
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +2 -2
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +17 -21
- data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +2 -3
- data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer/serializer_discoverer.rb +3 -2
- data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer/serializer_index.rb +4 -4
- data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer.rb +1 -1
- data/sig/rigor/analysis/baseline.rbs +0 -2
- data/sig/rigor/analysis/fact_store.rbs +1 -0
- data/sig/rigor/analysis/reachability/scan_cache.rbs +1 -1
- data/sig/rigor/cli/diff_command.rbs +1 -1
- data/sig/rigor/cli/explain_command.rbs +1 -1
- data/sig/rigor/effects/file_collection.rbs +5 -6
- data/sig/rigor/effects/registry.rbs +8 -6
- data/sig/rigor/effects/summary.rbs +6 -5
- data/sig/rigor/environment.rbs +5 -3
- data/sig/rigor/inference/optimistic_origin.rbs +11 -0
- data/sig/rigor/inference.rbs +10 -1
- data/sig/rigor/plugin/additional_initializer.rbs +0 -5
- data/sig/rigor/plugin/base.rbs +1 -0
- data/sig/rigor/plugin/effect_ancestry.rbs +6 -4
- data/sig/rigor/plugin/effect_attribution.rbs +25 -10
- data/sig/rigor/plugin/effect_edge.rbs +12 -5
- data/sig/rigor/plugin/effect_entry_points.rbs +8 -3
- data/sig/rigor/plugin/io_boundary.rbs +6 -5
- data/sig/rigor/plugin/manifest.rbs +16 -18
- data/sig/rigor/plugin/protocol_contract.rbs +6 -9
- data/sig/rigor/plugin/registry.rbs +1 -1
- data/sig/rigor/scope.rbs +51 -50
- data/sig/rigor/type.rbs +0 -6
- data/skills/rigor-plugin-author/SKILL.md +4 -4
- data/skills/rigor-plugin-author/references/02-walker-and-types.md +5 -5
- data/skills/rigor-plugin-review/SKILL.md +3 -3
- data/skills/rigor-project-init/references/03-baseline-and-bugs.md +12 -1
- metadata +55 -3
|
@@ -5,6 +5,17 @@ module Rigor
|
|
|
5
5
|
# (sig.skipped.untyped-return). The answer is the recorded `true` / `false` / `nil`, or the `UNKNOWN_MISS`
|
|
6
6
|
# sentinel; declaring it is what lets sig-gen type `Scope#optimistic_local_miss` / `#optimistic_ivar_miss`.
|
|
7
7
|
def self?.bound_miss: (untyped mark) -> Object?
|
|
8
|
+
|
|
9
|
+
class BoundMark < ::Data
|
|
10
|
+
# sig-gen gap: #1150 — a `Data.define` member; sig-gen proposes `untyped`. The cause a mark records.
|
|
11
|
+
def cause: () -> Symbol
|
|
12
|
+
# sig-gen gap: #1150 — a `Data.define` member; the recorded miss answer.
|
|
13
|
+
def miss: () -> bool?
|
|
14
|
+
# sig-gen gap: #1150 — the `Data.define` constructor; sig-gen types its members `untyped`.
|
|
15
|
+
def self.new: (cause: Symbol, miss: bool?) -> instance | (Symbol cause, bool? miss) -> instance
|
|
16
|
+
# sig-gen gap: #1150 — as above.
|
|
17
|
+
def self.[]: (cause: Symbol, miss: bool?) -> instance | (Symbol cause, bool? miss) -> instance
|
|
18
|
+
end
|
|
8
19
|
end
|
|
9
20
|
end
|
|
10
21
|
end
|
data/sig/rigor/inference.rbs
CHANGED
|
@@ -3,7 +3,8 @@ module Rigor
|
|
|
3
3
|
type closure_classification = :non_escaping | :escaping | :unknown
|
|
4
4
|
|
|
5
5
|
class ExpressionTyper
|
|
6
|
-
def self.harvest_return_memo: () -> Hash[untyped, Array[untyped]]
|
|
6
|
+
def self.harvest_return_memo: (?Hash[untyped, Hash[untyped, untyped]]? bucket) -> Hash[untyped, Array[untyped]]
|
|
7
|
+
def self.current_return_memo: () -> Hash[untyped, Hash[untyped, untyped]]?
|
|
7
8
|
def initialize: (scope: Scope, ?tracer: FallbackTracer?) -> void
|
|
8
9
|
def type_of: (untyped node) -> Type::t
|
|
9
10
|
def return_type_for: (untyped def_node, Type::t receiver, Array[Type::t] arg_types) -> Type::t?
|
|
@@ -172,8 +173,16 @@ module Rigor
|
|
|
172
173
|
def self?.collect_class_decls: (untyped node, Array[String] qualified_prefix, Hash[String, Type::t] accumulator) -> void
|
|
173
174
|
def self?.constant_writes_for_file: (untyped root) -> Hash[String, untyped]
|
|
174
175
|
def self?.constant_literal_value: (untyped rvalue) -> Array[untyped]?
|
|
176
|
+
# authored: the `Set[String]` values are source paths by contract; a Set's element type stays `untyped` in sig-gen (#2177, #2317), so the generator
|
|
177
|
+
# would never propose it.
|
|
175
178
|
def self?.finalize_constant_writes: (Hash[String, Hash[String, untyped]] writes) -> [Hash[String, Type::Constant], Hash[String, Set[String]]]
|
|
176
179
|
def self?.propagate: (untyped node, Hash[untyped, Scope] table, Scope parent_scope) -> void
|
|
180
|
+
|
|
181
|
+
class LayeredDefNestings
|
|
182
|
+
def initialize: (Hash[untyped, Array[String]] file, Scope::DiscoveryIndex::def_nestings seed) -> void
|
|
183
|
+
def []: (untyped def_node) -> Array[String]?
|
|
184
|
+
def empty?: () -> bool
|
|
185
|
+
end
|
|
177
186
|
end
|
|
178
187
|
|
|
179
188
|
class CoverageScanner
|
|
@@ -4,15 +4,10 @@ module Rigor
|
|
|
4
4
|
# the read-before-write nil soundness gate does not widen their ivars. See
|
|
5
5
|
# lib/rigor/plugin/additional_initializer.rb for the full contract.
|
|
6
6
|
class AdditionalInitializer
|
|
7
|
-
# sig-gen gap: #1154 — `attr_reader` rows over ivars assigned from `initialize` parameters are
|
|
8
|
-
# skipped (untyped return); the constructor validates `receiver_constraint` is a non-empty
|
|
9
|
-
# String and normalizes both lists with `map(&:to_sym)`, so the stored types are hand-written.
|
|
10
7
|
attr_reader receiver_constraint: String
|
|
11
8
|
|
|
12
|
-
# sig-gen gap: #1154 — as above.
|
|
13
9
|
attr_reader methods: Array[Symbol]
|
|
14
10
|
|
|
15
|
-
# sig-gen gap: #1154 — as above.
|
|
16
11
|
attr_reader block_methods: Array[Symbol]
|
|
17
12
|
|
|
18
13
|
# The validators accept Symbol or non-empty String elements; `initialize` normalizes to
|
data/sig/rigor/plugin/base.rbs
CHANGED
|
@@ -84,5 +84,6 @@ class Rigor::Plugin::Base
|
|
|
84
84
|
def effect_ancestry: () -> Array[Rigor::Plugin::EffectAncestry]
|
|
85
85
|
def io_boundary: () -> Rigor::Plugin::IoBoundary
|
|
86
86
|
def cache_for: (untyped producer_id, ?params: untyped, ?descriptor: untyped) -> Proc
|
|
87
|
+
# authored: returns Rigor::Cache::Descriptor::PluginEntry, which has no RBS declaration yet (#2404); stays `untyped` until it is declared
|
|
87
88
|
def plugin_entry: () -> untyped
|
|
88
89
|
end
|
|
@@ -5,12 +5,14 @@ module Rigor
|
|
|
5
5
|
# immediate superclass. Bundled plugins only — `Effects::PluginFacts` enforces it. Frozen value
|
|
6
6
|
# object.
|
|
7
7
|
class EffectAncestry
|
|
8
|
-
# sig-gen gap: #
|
|
9
|
-
#
|
|
8
|
+
# sig-gen gap: #2312 — `child:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
9
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`, then a class-name
|
|
10
|
+
# check), and `initialize` stores the private `validate_class_name!` helper's result (#2312).
|
|
10
11
|
attr_reader child: String
|
|
11
|
-
# sig-gen gap: #
|
|
12
|
+
# sig-gen gap: #2312 — same shape as `child`.
|
|
12
13
|
attr_reader parent: String
|
|
13
|
-
# sig-gen gap: #
|
|
14
|
+
# sig-gen gap: #2312 — same shape; `why:` is `untyped` and the private `validate_why!` helper (#2312) requires
|
|
15
|
+
# it non-empty.
|
|
14
16
|
attr_reader why: String
|
|
15
17
|
|
|
16
18
|
def initialize: (child: untyped, parent: untyped, why: untyped) -> void
|
|
@@ -15,28 +15,43 @@ module Rigor
|
|
|
15
15
|
# The taint causes a plugin row may name — a closed subset of `Effects::TaintCause::ALL`.
|
|
16
16
|
TAINT_CAUSES: Array[String]
|
|
17
17
|
|
|
18
|
-
# sig-gen gap: #
|
|
19
|
-
#
|
|
18
|
+
# sig-gen gap: #2312 — `receiver:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
19
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), and `initialize`
|
|
20
|
+
# stores the private `validate_receiver!` helper's result (#2312).
|
|
20
21
|
attr_reader receiver: String
|
|
21
|
-
# sig-gen gap: #
|
|
22
|
+
# sig-gen gap: #2325 — `method:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
23
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `String | Symbol`), stored as
|
|
24
|
+
# `method.to_sym`.
|
|
22
25
|
attr_reader method: Symbol
|
|
23
26
|
attr_reader singleton: bool
|
|
24
|
-
# sig-gen gap: #
|
|
27
|
+
# sig-gen gap: #2312 — `labels:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
28
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `Array()` of anything
|
|
29
|
+
# answering `to_s`), stored from the private `normalize_labels` helper (#2312).
|
|
25
30
|
attr_reader labels: Array[String]
|
|
26
|
-
# sig-gen gap: #
|
|
31
|
+
# sig-gen gap: #2325 — `narrow:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
32
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`, nil kept).
|
|
27
33
|
attr_reader narrow: String?
|
|
28
34
|
attr_reader discharge: bool
|
|
29
|
-
# sig-gen gap: #
|
|
35
|
+
# sig-gen gap: #2312 — `within:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
36
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), stored from the
|
|
37
|
+
# private `validate_within!` helper (#2312).
|
|
30
38
|
attr_reader within: String?
|
|
31
39
|
attr_reader on_result: bool
|
|
32
|
-
# sig-gen gap: #
|
|
40
|
+
# sig-gen gap: #2312 — `taint:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
41
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), stored from the
|
|
42
|
+
# private `validate_taint!` helper (#2312).
|
|
33
43
|
attr_reader taint: String?
|
|
34
|
-
# sig-gen gap: #
|
|
44
|
+
# sig-gen gap: #2325 — `callee:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
45
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`, nil kept).
|
|
35
46
|
attr_reader callee: String?
|
|
36
|
-
# sig-gen gap: #
|
|
47
|
+
# sig-gen gap: #2312 — `callee_fallbacks:` is `untyped` (input `untyped`, looks deliberate; a declared type is
|
|
48
|
+
# authoring intent tracked by #2325, and only then does this row generate; coercion-facing: a Hash of coercible
|
|
49
|
+
# names), stored from the private `validate_callee_fallbacks!` helper (#2312).
|
|
37
50
|
attr_reader callee_fallbacks: Hash[String, Array[String]]?
|
|
38
51
|
attr_reader responds: bool
|
|
39
|
-
# sig-gen gap: #
|
|
52
|
+
# sig-gen gap: #2312 — `why:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
53
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), stored from the
|
|
54
|
+
# private `validate_why!` helper (#2312).
|
|
40
55
|
attr_reader why: String
|
|
41
56
|
|
|
42
57
|
# The coercion-facing constructor: every parameter is `to_s`/`to_sym`/`Array()`-normalized,
|
|
@@ -7,15 +7,22 @@ module Rigor
|
|
|
7
7
|
# The closed set of framework-edge strategies the engine implements.
|
|
8
8
|
TARGETS: Array[Symbol]
|
|
9
9
|
|
|
10
|
-
# sig-gen gap: #
|
|
11
|
-
#
|
|
10
|
+
# sig-gen gap: #2312 — `receiver:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
11
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), and `initialize`
|
|
12
|
+
# stores the result of the private `validate_receiver!` helper (#2312).
|
|
12
13
|
attr_reader receiver: String
|
|
13
|
-
# sig-gen gap: #
|
|
14
|
+
# sig-gen gap: #2325 — `method:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
15
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `String | Symbol | nil`),
|
|
16
|
+
# stored as `method&.to_sym`.
|
|
14
17
|
attr_reader method: Symbol?
|
|
15
18
|
attr_reader singleton: bool
|
|
16
|
-
# sig-gen gap: #
|
|
19
|
+
# sig-gen gap: #2312 — `target:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
20
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: a Symbol or String checked
|
|
21
|
+
# against `TARGETS`), stored from the private `validate_target!` helper (#2312).
|
|
17
22
|
attr_reader target: (:activerecord_callbacks | :perform_now | :mailer_body)
|
|
18
|
-
# sig-gen gap: #
|
|
23
|
+
# sig-gen gap: #2312 — `why:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
24
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), stored from the
|
|
25
|
+
# private `validate_why!` helper (#2312).
|
|
19
26
|
attr_reader why: String
|
|
20
27
|
|
|
21
28
|
def initialize: (receiver: untyped, target: untyped, why: untyped, ?method: untyped,
|
|
@@ -4,11 +4,16 @@ module Rigor
|
|
|
4
4
|
# framework entry points (ADR-103 WD6). Frozen value object; {#globs} are deduplicated and
|
|
5
5
|
# sorted in `initialize`.
|
|
6
6
|
class EffectEntryPoints
|
|
7
|
-
# sig-gen gap: #
|
|
7
|
+
# sig-gen gap: #2325 — `initialize` declares `name:` `untyped` (input `untyped`, looks deliberate; a declared
|
|
8
|
+
# type is authoring intent tracked by #2325, and only then does this row generate; coercion-facing: it takes
|
|
9
|
+
# anything that answers `to_s`), so no input type reaches the reader.
|
|
8
10
|
attr_reader name: String
|
|
9
|
-
# sig-gen gap: #
|
|
11
|
+
# sig-gen gap: #2325 — `globs:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
12
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `Array(globs)`, each `to_s`),
|
|
13
|
+
# deduplicated and sorted in `initialize`.
|
|
10
14
|
attr_reader globs: Array[String]
|
|
11
|
-
# sig-gen gap: #
|
|
15
|
+
# sig-gen gap: #2325 — `why:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
|
|
16
|
+
# intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`).
|
|
12
17
|
attr_reader why: String
|
|
13
18
|
|
|
14
19
|
def initialize: (name: untyped, globs: untyped, ?why: untyped) -> void
|
|
@@ -4,17 +4,18 @@ class Rigor::Plugin::IoBoundary
|
|
|
4
4
|
def file?: (untyped) -> bool
|
|
5
5
|
def directory?: (untyped) -> bool
|
|
6
6
|
def list_directory: (untyped) -> Array[String]
|
|
7
|
-
def list_directory_kinds: (untyped) -> Hash[String,
|
|
7
|
+
def list_directory_kinds: (untyped) -> Hash[String, Symbol]
|
|
8
8
|
# Records a `:names` glob row (membership only); a caller needing a match's content `read_file`s it. A `..`
|
|
9
9
|
# segment, a brace or a backslash in `pattern` raises `AccessDeniedError`.
|
|
10
10
|
def glob: (untyped root, untyped pattern) -> Array[String]
|
|
11
|
-
# sig-gen gap: #
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
11
|
+
# sig-gen gap: #2312 — the proposal leaves both string fields untyped. `nearest_root` comes from `@policy`, a bare
|
|
12
|
+
# assignment of the `policy:` parameter, declared `untyped` above (a `TrustPolicy`; typing it is authoring work,
|
|
13
|
+
# tracked by #2325); `first_path` comes from `@first_refused_path`, written from the private `record_refusal(path)`,
|
|
14
|
+
# whose parameter is undeclared.
|
|
15
15
|
def refusal_summary: () -> { count: Integer, first_path: String?, nearest_root: String? }?
|
|
16
16
|
def open_url: (untyped url) -> String
|
|
17
17
|
# Returns a frozen `Rigor::Cache::Descriptor` (no RBS yet -> untyped).
|
|
18
|
+
# authored: returns Rigor::Cache::Descriptor, which has no RBS declaration yet (#2404); stays `untyped` until it is declared
|
|
18
19
|
def cache_descriptor: () -> untyped
|
|
19
20
|
def replay: (untyped descriptor) -> nil
|
|
20
21
|
end
|
|
@@ -3,7 +3,7 @@ class Rigor::Plugin::Manifest::Consumption
|
|
|
3
3
|
end
|
|
4
4
|
|
|
5
5
|
class Rigor::Plugin::Manifest
|
|
6
|
-
def initialize: (id: untyped, version: untyped, ?description: untyped, ?config_schema: untyped, ?target_gems: untyped, ?produces: untyped, ?consumes: untyped, ?owns_receivers: untyped, ?open_receivers: untyped, ?rbs_complete_ancestors: untyped, ?type_node_resolvers: untyped, ?block_as_methods: untyped, ?heredoc_templates: untyped, ?nested_class_templates: untyped, ?trait_registries: untyped, ?hkt_registrations: untyped, ?hkt_definitions: untyped, ?signature_paths: untyped, ?protocol_contracts: Array[Rigor::Plugin::ProtocolContract], ?source_rbs_synthesizer: untyped, ?additional_initializers: Array[Rigor::Plugin::AdditionalInitializer], ?effect_root: String?, ?effect_labels: Array[String], ?effect_attributions: Array[Rigor::Plugin::EffectAttribution], ?effect_edges: Array[Rigor::Plugin::EffectEdge], ?effect_entry_points: Array[Rigor::Plugin::EffectEntryPoints], ?effect_ancestry: Array[Rigor::Plugin::EffectAncestry], ?template_globs:
|
|
6
|
+
def initialize: (id: untyped, version: untyped, ?description: untyped, ?config_schema: untyped, ?target_gems: untyped, ?produces: untyped, ?consumes: untyped, ?owns_receivers: untyped, ?open_receivers: untyped, ?rbs_complete_ancestors: untyped, ?type_node_resolvers: untyped, ?block_as_methods: untyped, ?heredoc_templates: untyped, ?nested_class_templates: untyped, ?trait_registries: untyped, ?hkt_registrations: untyped, ?hkt_definitions: untyped, ?signature_paths: untyped, ?protocol_contracts: Array[Rigor::Plugin::ProtocolContract], ?source_rbs_synthesizer: untyped, ?additional_initializers: Array[Rigor::Plugin::AdditionalInitializer], ?effect_root: String?, ?effect_labels: Array[String], ?effect_attributions: Array[Rigor::Plugin::EffectAttribution], ?effect_edges: Array[Rigor::Plugin::EffectEdge], ?effect_entry_points: Array[Rigor::Plugin::EffectEntryPoints], ?effect_ancestry: Array[Rigor::Plugin::EffectAncestry], ?template_globs: Array[String], ?per_invocation_classes: Array[String], ?per_invocation_non_action_macros: Array[Symbol | String]) -> void
|
|
7
7
|
|
|
8
8
|
# Public attribute readers (the full `attr_reader` surface). Plugins
|
|
9
9
|
# read `manifest.id` / `manifest.protocol_contracts` etc.; declaring
|
|
@@ -18,9 +18,9 @@ class Rigor::Plugin::Manifest
|
|
|
18
18
|
def config_schema: () -> untyped
|
|
19
19
|
def config_defaults: () -> Hash[String, untyped]
|
|
20
20
|
def target_gems: () -> Array[String]
|
|
21
|
-
# sig-gen gap: #
|
|
22
|
-
#
|
|
23
|
-
#
|
|
21
|
+
# sig-gen gap: #2418 — written by a private `assign_*` helper whose parameters are undeclared (`initialize` hands
|
|
22
|
+
# its fields to such helpers); each write is a derived expression (`dup.freeze`, `map`), so the helper's parameter
|
|
23
|
+
# types alone would not generate it.
|
|
24
24
|
def template_globs: () -> Array[String]
|
|
25
25
|
def produces: () -> Array[Symbol]
|
|
26
26
|
def consumes: () -> Array[Rigor::Plugin::Manifest::Consumption]
|
|
@@ -35,33 +35,31 @@ class Rigor::Plugin::Manifest
|
|
|
35
35
|
def hkt_registrations: () -> untyped
|
|
36
36
|
def hkt_definitions: () -> untyped
|
|
37
37
|
def signature_paths: () -> Array[String]
|
|
38
|
-
# sig-gen gap: #
|
|
39
|
-
# `
|
|
38
|
+
# sig-gen gap: #2418 — same shape as `template_globs`: `validate_protocol_contracts!` requires every element
|
|
39
|
+
# `is_a?(ProtocolContract)`.
|
|
40
40
|
def protocol_contracts: () -> Array[Rigor::Plugin::ProtocolContract]
|
|
41
41
|
# ADR-32 WD6/WD12 — any object responding to `call`, and its result is a documented multi-shape
|
|
42
42
|
# outcome (`String` / nil / `[:error, msg]` / `[:ok, src, msgs]`), not `String?` — `untyped` is the
|
|
43
43
|
# honest claim until the outcome has a sig'd shape.
|
|
44
44
|
def source_rbs_synthesizer: () -> untyped
|
|
45
|
-
# sig-gen gap: #
|
|
46
|
-
#
|
|
47
|
-
# `is_a?(AdditionalInitializer)`, so the element type is hand-written.
|
|
45
|
+
# sig-gen gap: #2418 — same shape as `template_globs`: the validator (`validate_additional_initializers!`) requires
|
|
46
|
+
# every element `is_a?(AdditionalInitializer)`, so the element type is hand-written.
|
|
48
47
|
def additional_initializers: () -> Array[Rigor::Plugin::AdditionalInitializer]
|
|
49
48
|
|
|
50
|
-
# sig-gen gap: #
|
|
51
|
-
# (`to_s`-normalized); `validate_effect_root!` bounds the spelling.
|
|
49
|
+
# sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_root!` bounds the spelling.
|
|
52
50
|
def effect_root: () -> String?
|
|
53
|
-
# sig-gen gap: #
|
|
54
|
-
#
|
|
51
|
+
# sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_labels!` requires non-empty `String`
|
|
52
|
+
# elements.
|
|
55
53
|
def effect_labels: () -> Array[String]
|
|
56
|
-
# sig-gen gap: #
|
|
57
|
-
# `
|
|
54
|
+
# sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_attributions!` requires every element
|
|
55
|
+
# `is_a?(EffectAttribution)`.
|
|
58
56
|
def effect_attributions: () -> Array[Rigor::Plugin::EffectAttribution]
|
|
59
|
-
# sig-gen gap: #
|
|
57
|
+
# sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_edges!` requires `is_a?(EffectEdge)`.
|
|
60
58
|
def effect_edges: () -> Array[Rigor::Plugin::EffectEdge]
|
|
61
|
-
# sig-gen gap: #
|
|
59
|
+
# sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_entry_points!` requires
|
|
62
60
|
# `is_a?(EffectEntryPoints)`.
|
|
63
61
|
def effect_entry_points: () -> Array[Rigor::Plugin::EffectEntryPoints]
|
|
64
|
-
# sig-gen gap: #
|
|
62
|
+
# sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_ancestry!` requires `is_a?(EffectAncestry)`.
|
|
65
63
|
def effect_ancestry: () -> Array[Rigor::Plugin::EffectAncestry]
|
|
66
64
|
|
|
67
65
|
# The identity opening a root when this plugin's labels join the run's vocabulary: the
|
|
@@ -23,26 +23,23 @@ module Rigor
|
|
|
23
23
|
def self.[]: (index: Integer, type_name: String) -> instance | (Integer index, String type_name) -> instance
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
# sig-gen gap: #1154 — `attr_reader` rows over ivars assigned in `initialize`; each is
|
|
27
|
-
# validated/normalized first (`dup.freeze`/`to_sym`/truthiness collapse/coerce), so the
|
|
28
|
-
# stored types are hand-written.
|
|
29
26
|
attr_reader path_glob: String
|
|
30
27
|
|
|
31
|
-
# sig-gen gap: #1154 — as above (`to_sym` normalizes the accepted Symbol|String).
|
|
32
28
|
attr_reader method_name: Symbol
|
|
33
29
|
|
|
34
30
|
# `singleton ? true : false` collapses any truthy input to bool — sig-gen already infers
|
|
35
|
-
# `false | true`, so this row is generated-equivalent rather than a
|
|
31
|
+
# `false | true`, so this row is generated-equivalent rather than a gap.
|
|
36
32
|
attr_reader singleton: bool
|
|
37
33
|
|
|
38
|
-
# sig-gen gap: #
|
|
34
|
+
# sig-gen gap: #2312 — `initialize` stores what the private `coerce_param_types` helper returns, whose
|
|
35
|
+
# parameters are undeclared (it guarantees `Array[ParamType]`).
|
|
39
36
|
attr_reader param_types: Array[ParamType]
|
|
40
37
|
|
|
41
|
-
# sig-gen gap: #1154 — as above (nil or a non-empty `dup.freeze`d String).
|
|
42
38
|
attr_reader return_type_name: String?
|
|
43
39
|
|
|
44
|
-
#
|
|
45
|
-
# to the three
|
|
40
|
+
# authored: the declared literal union is intent. `initialize` stores `severity.to_sym` after
|
|
41
|
+
# `validate_severity!` bounds it to `VALID_SEVERITIES`, so the value is one of the three literals, but sig-gen
|
|
42
|
+
# generates `Symbol` for it, not the union.
|
|
46
43
|
attr_reader severity: :error | :warning | :info
|
|
47
44
|
|
|
48
45
|
# `method_name`/`severity` accept String too (both are `to_sym`'d); `param_types` entries are
|
|
@@ -18,7 +18,7 @@ class Rigor::Plugin::Registry
|
|
|
18
18
|
|
|
19
19
|
# Newly declared — the attr_reader was absent from the sig. `compile_aggregates` builds the ivar
|
|
20
20
|
# with `flat_map` over the manifests (not from an `initialize` parameter, so this is unmarked
|
|
21
|
-
# residue like the `rbs_complete_ancestors` sibling rather than a
|
|
21
|
+
# residue like the `rbs_complete_ancestors` sibling rather than a parameter-credit row); the element type is
|
|
22
22
|
# `AdditionalInitializer`, enforced per manifest by `validate_additional_initializers!`.
|
|
23
23
|
attr_reader additional_initializers: Array[Rigor::Plugin::AdditionalInitializer]
|
|
24
24
|
|