rigortype 0.3.8 → 0.4.0
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/capability_roles/capability_roles.rbs +36 -0
- data/data/core_overlay/enumerable.rbs +51 -0
- data/data/core_overlay/enumerator.rbs +84 -0
- data/data/core_overlay/hash_rbs3.rbs +41 -0
- data/data/core_overlay/process.rbs +40 -0
- data/data/core_overlay/string_io.rbs +33 -0
- data/data/effects/core.yml +3 -3
- data/data/gem_overlay/activesupport/core_ext.rbs +236 -17
- data/docs/handbook/02-everyday-types.md +17 -14
- data/docs/handbook/03-narrowing.md +132 -14
- data/docs/handbook/04-tuples-and-shapes.md +8 -6
- data/docs/handbook/05-methods-and-blocks.md +1 -1
- data/docs/handbook/06-classes.md +2 -2
- data/docs/handbook/07-rbs-and-extended.md +19 -1
- data/docs/handbook/10-sorbet.md +9 -10
- data/docs/handbook/11-sig-gen.md +525 -13
- data/docs/handbook/README.md +1 -1
- data/docs/handbook/appendix-elixir.md +2 -2
- data/docs/handbook/appendix-go.md +2 -2
- data/docs/handbook/appendix-java-csharp.md +2 -2
- data/docs/handbook/appendix-mypy.md +2 -2
- data/docs/handbook/appendix-phpstan.md +1 -1
- data/docs/handbook/appendix-rust.md +1 -1
- data/docs/handbook/appendix-type-theory.md +4 -4
- data/docs/handbook/appendix-typescript.md +1 -1
- data/docs/llms.txt +2 -0
- data/docs/manual/02-cli-reference.md +95 -6
- data/docs/manual/03-configuration.md +18 -0
- data/docs/manual/04-diagnostics.md +15 -0
- data/docs/manual/07-plugins.md +15 -5
- data/docs/manual/08-skills.md +23 -2
- data/docs/manual/10-mcp-server.md +3 -2
- data/docs/manual/11-ci.md +9 -0
- data/docs/manual/15-type-protection-coverage.md +8 -0
- data/docs/manual/16-rbs-extended-annotations.md +46 -8
- data/docs/manual/18-removing-dead-code.md +10 -8
- data/docs/manual/19-effect-labels.md +10 -0
- data/docs/manual/plugins/README.md +7 -0
- data/docs/manual/plugins/rigor-actioncable.md +8 -1
- data/docs/manual/plugins/rigor-actionmailer.md +7 -0
- data/docs/manual/plugins/rigor-actionpack.md +261 -0
- data/docs/manual/plugins/rigor-active-model-serializers.md +153 -0
- data/docs/manual/plugins/rigor-activejob.md +7 -0
- data/docs/manual/plugins/rigor-activerecord.md +138 -4
- data/docs/manual/plugins/rigor-activestorage.md +8 -1
- data/docs/manual/plugins/rigor-activesupport-core-ext.md +43 -7
- data/docs/manual/plugins/rigor-grape.md +106 -0
- data/docs/manual/plugins/rigor-graphql.md +23 -2
- data/docs/manual/plugins/rigor-pundit.md +8 -1
- data/docs/manual/plugins/rigor-rails-i18n.md +10 -5
- data/docs/manual/plugins/rigor-rails-routes.md +7 -0
- data/docs/manual/plugins/rigor-rbs-inline.md +229 -1
- data/docs/manual/plugins/rigor-sidekiq.md +8 -1
- data/docs/manual/plugins/rigor-sorbet.md +21 -5
- data/exe/rigor +19 -4
- data/lib/rigor/analysis/baseline.rb +3 -3
- data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +1 -1
- data/lib/rigor/analysis/check_rules/dead_version_guard_arms.rb +1 -5
- data/lib/rigor/analysis/check_rules/declaration_sourced_guard.rb +167 -2
- data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +10 -2
- data/lib/rigor/analysis/check_rules/lexical_method_sites.rb +189 -0
- data/lib/rigor/analysis/check_rules/main_pass_collector.rb +6 -4
- data/lib/rigor/analysis/check_rules/published_constant_guard.rb +15 -6
- data/lib/rigor/analysis/check_rules/rule_ids.rb +21 -6
- data/lib/rigor/analysis/check_rules/rule_walk.rb +41 -5
- data/lib/rigor/analysis/check_rules/self_closedness_scanner.rb +1 -1
- data/lib/rigor/analysis/check_rules/shadowed_rescue_collector.rb +1 -1
- data/lib/rigor/analysis/check_rules/source_arity.rb +323 -0
- data/lib/rigor/analysis/check_rules/special_global_setters.rb +146 -0
- data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +38 -4
- data/lib/rigor/analysis/check_rules/void_value_use_collector.rb +0 -1
- data/lib/rigor/analysis/check_rules.rb +718 -79
- data/lib/rigor/analysis/crash_signature.rb +8 -24
- data/lib/rigor/analysis/dependency_recorder.rb +23 -0
- data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +1 -1
- data/lib/rigor/analysis/dependency_source_inference/builder.rb +0 -2
- data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +0 -2
- data/lib/rigor/analysis/dependency_source_inference/index.rb +5 -5
- data/lib/rigor/analysis/dependency_source_inference/return_type_heuristic.rb +1 -2
- data/lib/rigor/analysis/dependency_source_inference/walker.rb +4 -4
- data/lib/rigor/analysis/effects_cache_probe.rb +3 -4
- data/lib/rigor/analysis/erb_template_detector.rb +1 -2
- data/lib/rigor/analysis/fact_store.rb +15 -1
- data/lib/rigor/analysis/incremental.rb +42 -0
- data/lib/rigor/analysis/incremental_session.rb +117 -26
- data/lib/rigor/analysis/plugin_fact_fingerprint.rb +0 -1
- data/lib/rigor/analysis/project_scan.rb +11 -1
- data/lib/rigor/analysis/reachability/graph.rb +3 -5
- data/lib/rigor/analysis/reachability/plugin_roots.rb +5 -5
- data/lib/rigor/analysis/reachability/project_files.rb +2 -2
- data/lib/rigor/analysis/reachability/scan.rb +5 -5
- data/lib/rigor/analysis/reachability/scan_cache.rb +3 -2
- data/lib/rigor/analysis/reachability/signature_scan.rb +2 -2
- data/lib/rigor/analysis/result.rb +1 -3
- data/lib/rigor/analysis/rule_catalog.rb +131 -1
- data/lib/rigor/analysis/run_cache_key.rb +21 -12
- data/lib/rigor/analysis/run_cache_probe.rb +3 -5
- data/lib/rigor/analysis/runner/buffer_pool_dispatcher.rb +6 -8
- data/lib/rigor/analysis/runner/declaration_position.rb +1 -2
- data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +340 -33
- data/lib/rigor/analysis/runner/effect_annotation_residual_pass.rb +2 -3
- data/lib/rigor/analysis/runner/effect_envelope_pass.rb +18 -14
- data/lib/rigor/analysis/runner/pool_coordinator.rb +357 -97
- data/lib/rigor/analysis/runner/project_pre_passes.rb +38 -13
- data/lib/rigor/analysis/runner/run_snapshots.rb +6 -1
- data/lib/rigor/analysis/runner.rb +407 -51
- data/lib/rigor/analysis/template_unit_collector.rb +303 -0
- data/lib/rigor/analysis/template_unit_paths.rb +91 -0
- data/lib/rigor/analysis/template_unit_positions.rb +293 -0
- data/lib/rigor/analysis/template_units.rb +399 -0
- data/lib/rigor/analysis/worker_session.rb +62 -20
- data/lib/rigor/bleeding_edge.rb +10 -24
- data/lib/rigor/builtins/hkt_builtins.rb +3 -2
- data/lib/rigor/builtins/imported_refinements.rb +159 -21
- data/lib/rigor/builtins/predefined_constant_refinements.rb +5 -7
- data/lib/rigor/builtins/regex_refinement.rb +21 -13
- data/lib/rigor/builtins/static_return_refinements.rb +7 -6
- data/lib/rigor/cache/annotation_location.rb +2 -4
- data/lib/rigor/cache/descriptor.rb +63 -20
- data/lib/rigor/cache/engine_source.rb +33 -5
- data/lib/rigor/cache/file_digest.rb +9 -1
- data/lib/rigor/cache/incremental_snapshot.rb +72 -6
- data/lib/rigor/cache/rbs_cache_producer.rb +4 -0
- data/lib/rigor/cache/rbs_class_ancestor_table.rb +0 -3
- data/lib/rigor/cache/rbs_class_type_param_names.rb +0 -3
- data/lib/rigor/cache/rbs_constant_table.rb +0 -3
- data/lib/rigor/cache/rbs_descriptor.rb +112 -14
- data/lib/rigor/cache/rbs_environment.rb +8 -4
- data/lib/rigor/cache/rbs_known_class_names.rb +0 -3
- data/lib/rigor/cache/store.rb +76 -32
- data/lib/rigor/ci_detector.rb +1 -0
- data/lib/rigor/cli/annotate_command.rb +5 -6
- data/lib/rigor/cli/check_command.rb +57 -10
- data/lib/rigor/cli/check_invocation.rb +6 -11
- data/lib/rigor/cli/check_runner_factory.rb +1 -5
- data/lib/rigor/cli/coverage_command.rb +1 -1
- data/lib/rigor/cli/coverage_mutation.rb +12 -3
- data/lib/rigor/cli/coverage_scan.rb +1 -5
- data/lib/rigor/cli/diff_command.rb +1 -1
- data/lib/rigor/cli/doc_links.rb +4 -4
- data/lib/rigor/cli/docs_command.rb +6 -6
- data/lib/rigor/cli/doctor_command.rb +85 -38
- data/lib/rigor/cli/effects_command.rb +2 -2
- data/lib/rigor/cli/effects_diff_renderer.rb +3 -3
- data/lib/rigor/cli/effects_snapshot_command.rb +1 -1
- data/lib/rigor/cli/explain_command.rb +34 -1
- data/lib/rigor/cli/fused_protection_report.rb +7 -1
- data/lib/rigor/cli/lsp_command.rb +1 -1
- data/lib/rigor/cli/mcp_command.rb +1 -1
- data/lib/rigor/cli/measurement_integrity_warning.rb +4 -5
- data/lib/rigor/cli/mutation_fork_scan.rb +6 -6
- data/lib/rigor/cli/mutation_protection_report.rb +7 -1
- data/lib/rigor/cli/plugin_command.rb +4 -4
- data/lib/rigor/cli/plugins_command.rb +2 -1
- data/lib/rigor/cli/prism_colorizer.rb +1 -2
- data/lib/rigor/cli/protection_fork_scan.rb +6 -6
- data/lib/rigor/cli/show_bleedingedge_command.rb +1 -1
- data/lib/rigor/cli/sig_gen_command.rb +212 -31
- data/lib/rigor/cli/skill_command.rb +2 -2
- data/lib/rigor/cli/skill_deep_probe.rb +4 -4
- data/lib/rigor/cli/skill_describe.rb +35 -35
- data/lib/rigor/cli/trace_command.rb +4 -4
- data/lib/rigor/cli/trace_renderer.rb +5 -6
- data/lib/rigor/cli/triage_command.rb +1 -1
- data/lib/rigor/cli/type_of_command.rb +29 -11
- data/lib/rigor/cli/type_of_renderer.rb +20 -9
- data/lib/rigor/cli/type_of_template_probe.rb +189 -0
- data/lib/rigor/cli/type_scan_command.rb +4 -4
- data/lib/rigor/cli/unused_command.rb +11 -3
- data/lib/rigor/cli/upgrade_command.rb +1 -1
- data/lib/rigor/cli.rb +89 -9
- data/lib/rigor/config_audit.rb +30 -5
- data/lib/rigor/configuration/severity_profile.rb +25 -9
- data/lib/rigor/configuration.rb +109 -7
- data/lib/rigor/effects/ancestry_recorder.rb +191 -0
- data/lib/rigor/effects/attribution.rb +12 -5
- data/lib/rigor/effects/callee_rule.rb +368 -0
- data/lib/rigor/effects/catalog.rb +7 -4
- data/lib/rigor/effects/collector.rb +11 -5
- data/lib/rigor/effects/config_envelopes.rb +15 -10
- data/lib/rigor/effects/definition_context.rb +179 -0
- data/lib/rigor/effects/definition_lines.rb +25 -6
- data/lib/rigor/effects/effect_table.rb +11 -4
- data/lib/rigor/effects/entry_points.rb +0 -2
- data/lib/rigor/effects/envelope_check.rb +9 -9
- data/lib/rigor/effects/envelope_index.rb +20 -8
- data/lib/rigor/effects/file_collection.rb +59 -5
- data/lib/rigor/effects/framework_units.rb +5 -7
- data/lib/rigor/effects/identity.rb +20 -6
- data/lib/rigor/effects/inline_anchor.rb +7 -7
- data/lib/rigor/effects/label_intent.rb +3 -4
- data/lib/rigor/effects/liskov_check.rb +8 -8
- data/lib/rigor/effects/local_ownership.rb +38 -12
- data/lib/rigor/effects/method_key.rb +22 -1
- data/lib/rigor/effects/mutation_classifier.rb +23 -12
- data/lib/rigor/effects/plugin_facts.rb +47 -37
- data/lib/rigor/effects/propagator.rb +297 -19
- data/lib/rigor/effects/registry.rb +1 -1
- data/lib/rigor/effects/scanner.rb +122 -73
- data/lib/rigor/effects/signature_sources.rb +4 -6
- data/lib/rigor/effects/snapshot.rb +12 -11
- data/lib/rigor/effects/snapshot_diff.rb +1 -1
- data/lib/rigor/effects/summary.rb +27 -4
- data/lib/rigor/effects/unit_scan.rb +393 -38
- data/lib/rigor/effects/unknown_label_check.rb +3 -8
- data/lib/rigor/effects/unknown_label_report.rb +3 -4
- data/lib/rigor/effects/visibility.rb +101 -0
- data/lib/rigor/environment/bundle_sig_discovery.rb +6 -6
- data/lib/rigor/environment/class_registry.rb +3 -1
- data/lib/rigor/environment/failure_slot.rb +2 -2
- data/lib/rigor/environment/installed_gem_set.rb +85 -0
- data/lib/rigor/environment/lockfile_resolver.rb +68 -4
- data/lib/rigor/environment/member_consistency/comparator.rb +708 -0
- data/lib/rigor/environment/member_consistency.rb +298 -0
- data/lib/rigor/environment/missing_gem_constant_index.rb +4 -4
- data/lib/rigor/environment/rbs_collection_discovery.rb +5 -5
- data/lib/rigor/environment/rbs_coverage_report.rb +5 -5
- data/lib/rigor/environment/rbs_hierarchy.rb +3 -1
- data/lib/rigor/environment/rbs_loader.rb +674 -79
- data/lib/rigor/environment.rb +174 -24
- data/lib/rigor/flow_contribution/merger.rb +0 -2
- data/lib/rigor/flow_contribution.rb +11 -13
- data/lib/rigor/hashing/xxh3.rb +264 -0
- data/lib/rigor/inference/acceptance.rb +292 -17
- data/lib/rigor/inference/block_auto_splat.rb +216 -0
- data/lib/rigor/inference/block_call_timing.rb +338 -0
- data/lib/rigor/inference/block_parameter_binder.rb +75 -30
- data/lib/rigor/inference/block_repetition.rb +71 -0
- data/lib/rigor/inference/body_fixpoint.rb +7 -6
- data/lib/rigor/inference/budget_trace.rb +3 -6
- data/lib/rigor/inference/builtins/method_catalog.rb +2 -1
- data/lib/rigor/inference/builtins/string_catalog.rb +1 -1
- data/lib/rigor/inference/captured_locals.rb +389 -18
- data/lib/rigor/inference/closure_escape_analyzer.rb +159 -17
- data/lib/rigor/inference/content_join.rb +200 -27
- data/lib/rigor/inference/coverage_scanner.rb +4 -6
- data/lib/rigor/inference/def_return_typer.rb +11 -7
- data/lib/rigor/inference/define_method_block_self.rb +64 -0
- data/lib/rigor/inference/dynamic_origin.rb +1 -1
- data/lib/rigor/inference/element_read_widening.rb +180 -0
- data/lib/rigor/inference/error_info.rb +196 -0
- data/lib/rigor/inference/expression_typer.rb +2124 -468
- data/lib/rigor/inference/external_ancestor_resolution.rb +267 -0
- data/lib/rigor/inference/fork_map.rb +5 -7
- data/lib/rigor/inference/fresh_frame_blocks.rb +127 -0
- data/lib/rigor/inference/global_write_census.rb +239 -0
- data/lib/rigor/inference/guard_rebinding.rb +447 -0
- data/lib/rigor/inference/hash_lookup_mutation.rb +88 -0
- data/lib/rigor/inference/hkt_reducer.rb +2 -3
- data/lib/rigor/inference/hkt_registry.rb +4 -7
- data/lib/rigor/inference/index_write_widening.rb +16 -7
- data/lib/rigor/inference/indexed_narrowing.rb +61 -9
- data/lib/rigor/inference/jump_targets.rb +82 -0
- data/lib/rigor/inference/last_line/implicit_self.rb +210 -0
- data/lib/rigor/inference/last_line/self_evidence.rb +329 -0
- data/lib/rigor/inference/last_line.rb +340 -0
- data/lib/rigor/inference/last_status.rb +144 -0
- data/lib/rigor/inference/macro_block_self_type.rb +168 -21
- data/lib/rigor/inference/match_rebinding/calls.rb +281 -0
- data/lib/rigor/inference/match_rebinding/frame.rb +148 -0
- data/lib/rigor/inference/match_rebinding/operands.rb +236 -0
- data/lib/rigor/inference/match_rebinding/self_calls.rb +83 -0
- data/lib/rigor/inference/match_rebinding.rb +392 -0
- data/lib/rigor/inference/method_dispatcher/alias_strict_nominals.rb +36 -0
- data/lib/rigor/inference/method_dispatcher/block_folding.rb +87 -33
- data/lib/rigor/inference/method_dispatcher/cgi_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/constant_folding.rb +305 -19
- data/lib/rigor/inference/method_dispatcher/data_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/facet_distribution.rb +147 -0
- data/lib/rigor/inference/method_dispatcher/file_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/hash_transform_keys_folding.rb +191 -0
- data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +6 -2
- data/lib/rigor/inference/method_dispatcher/json_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +7 -1
- data/lib/rigor/inference/method_dispatcher/match_data_folding.rb +159 -0
- data/lib/rigor/inference/method_dispatcher/math_folding.rb +41 -3
- data/lib/rigor/inference/method_dispatcher/method_folding.rb +2 -5
- data/lib/rigor/inference/method_dispatcher/overload_selector.rb +165 -111
- data/lib/rigor/inference/method_dispatcher/process_folding.rb +56 -0
- data/lib/rigor/inference/method_dispatcher/proven_overload.rb +72 -0
- data/lib/rigor/inference/method_dispatcher/random_folding.rb +82 -0
- data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +1046 -69
- data/lib/rigor/inference/method_dispatcher/receiver_affinity.rb +25 -4
- data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +2 -8
- data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/self_substitute.rb +142 -0
- data/lib/rigor/inference/method_dispatcher/set_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +129 -54
- data/lib/rigor/inference/method_dispatcher/shellwords_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/singleton_mixin_dispatch.rb +1 -2
- data/lib/rigor/inference/method_dispatcher/struct_folding.rb +5 -6
- data/lib/rigor/inference/method_dispatcher/struct_materialization.rb +85 -4
- data/lib/rigor/inference/method_dispatcher/time_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/universal_object_dispatch.rb +1 -2
- data/lib/rigor/inference/method_dispatcher/uri_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher.rb +225 -25
- data/lib/rigor/inference/method_parameter_binder.rb +12 -9
- data/lib/rigor/inference/multi_target_binder.rb +341 -55
- data/lib/rigor/inference/mutation_rejoin.rb +171 -0
- data/lib/rigor/inference/mutation_widening.rb +156 -85
- data/lib/rigor/inference/narrowing.rb +835 -162
- data/lib/rigor/inference/operand_effects.rb +167 -0
- data/lib/rigor/inference/operand_walk.rb +88 -0
- data/lib/rigor/inference/optimistic_origin.rb +153 -16
- data/lib/rigor/inference/origin_lookup.rb +2 -3
- data/lib/rigor/inference/parameter_inference_collector.rb +7 -7
- data/lib/rigor/inference/pre_eval_constants.rb +6 -5
- data/lib/rigor/inference/precision_scanner.rb +3 -4
- data/lib/rigor/inference/project_method_ownership.rb +136 -0
- data/lib/rigor/inference/project_patched_methods.rb +9 -4
- data/lib/rigor/inference/project_patched_scanner.rb +10 -6
- data/lib/rigor/inference/protection_scanner.rb +1 -2
- data/lib/rigor/inference/range_constant.rb +57 -0
- data/lib/rigor/inference/rbs_type_translator.rb +49 -11
- data/lib/rigor/inference/receiver_alias.rb +93 -4
- data/lib/rigor/inference/receiver_blind_block.rb +219 -0
- data/lib/rigor/inference/refinement_mutation.rb +76 -0
- data/lib/rigor/inference/repeated_or_writes.rb +463 -0
- data/lib/rigor/inference/return_barrier.rb +54 -0
- data/lib/rigor/inference/rewrite_mutation.rb +120 -0
- data/lib/rigor/inference/scope_indexer.rb +5228 -627
- data/lib/rigor/inference/statement_evaluator.rb +3452 -595
- data/lib/rigor/inference/stored_block_call.rb +54 -0
- data/lib/rigor/inference/string_mutation.rb +97 -0
- data/lib/rigor/inference/struct_fold_safety.rb +6 -7
- data/lib/rigor/inference/synthetic_method_index.rb +1 -2
- data/lib/rigor/inference/synthetic_method_scanner.rb +4 -6
- data/lib/rigor/inference/unknown_store_widening.rb +200 -0
- data/lib/rigor/inference/unthreaded_rebinds.rb +282 -0
- data/lib/rigor/inference/version_guard.rb +28 -21
- data/lib/rigor/inference/void_origin.rb +3 -3
- data/lib/rigor/inference/void_tail_summary.rb +2 -4
- data/lib/rigor/language_server/buffer_table.rb +4 -4
- data/lib/rigor/language_server/completion_provider.rb +1 -1
- data/lib/rigor/language_server/debouncer.rb +0 -1
- data/lib/rigor/language_server/diagnostic_publisher.rb +7 -6
- data/lib/rigor/language_server/document_symbol_provider.rb +1 -1
- data/lib/rigor/language_server/folding_range_provider.rb +1 -1
- data/lib/rigor/language_server/hover_provider.rb +1 -1
- data/lib/rigor/language_server/hover_renderer.rb +4 -4
- data/lib/rigor/language_server/incremental_sync.rb +6 -6
- data/lib/rigor/language_server/project_context.rb +7 -8
- data/lib/rigor/language_server/publish_batcher.rb +2 -2
- data/lib/rigor/language_server/selection_range_provider.rb +2 -2
- data/lib/rigor/language_server/server.rb +9 -9
- data/lib/rigor/language_server/signature_help_provider.rb +1 -1
- data/lib/rigor/language_server/uri.rb +1 -1
- data/lib/rigor/mcp/server.rb +2 -1
- data/lib/rigor/plugin/base.rb +258 -26
- data/lib/rigor/plugin/box_probe.rb +91 -0
- data/lib/rigor/plugin/bundled_catalog.rb +167 -0
- data/lib/rigor/plugin/effect_attribution.rb +65 -11
- data/lib/rigor/plugin/effect_entry_points.rb +3 -3
- data/lib/rigor/plugin/fact_store.rb +6 -6
- data/lib/rigor/plugin/io_boundary.rb +93 -8
- data/lib/rigor/plugin/isolation.rb +29 -6
- data/lib/rigor/plugin/loader.rb +33 -13
- data/lib/rigor/plugin/macro/block_as_method.rb +45 -6
- data/lib/rigor/plugin/macro/heredoc_template.rb +1 -1
- data/lib/rigor/plugin/macro/trait_registry.rb +1 -1
- data/lib/rigor/plugin/manifest.rb +94 -11
- data/lib/rigor/plugin/registry.rb +76 -12
- data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +21 -4
- data/lib/rigor/plugin/template_unit.rb +196 -0
- data/lib/rigor/plugin/trust_policy.rb +2 -4
- data/lib/rigor/plugin/type_node_resolver.rb +3 -3
- data/lib/rigor/plugin.rb +1 -0
- data/lib/rigor/plugin_gap_advisory.rb +96 -0
- data/lib/rigor/project_environment.rb +138 -0
- data/lib/rigor/protection/analysis_guard.rb +93 -14
- data/lib/rigor/protection/closure_kill_oracle.rb +67 -23
- data/lib/rigor/protection/dependency_closure.rb +5 -8
- data/lib/rigor/protection/diagnostic_oracle.rb +2 -2
- data/lib/rigor/protection/discovery_seed.rb +14 -12
- data/lib/rigor/protection/kill_signature.rb +1 -4
- data/lib/rigor/protection/measurement_integrity.rb +1 -3
- data/lib/rigor/protection/mutation_cache.rb +7 -11
- data/lib/rigor/protection/mutation_scanner.rb +12 -15
- data/lib/rigor/protection/mutator.rb +2 -1
- data/lib/rigor/protection/test_suite_oracle.rb +5 -5
- data/lib/rigor/rbs_extended/conformance_checker.rb +4 -3
- data/lib/rigor/rbs_extended/envelope_scanner.rb +4 -6
- data/lib/rigor/rbs_extended/reporter.rb +36 -10
- data/lib/rigor/rbs_extended.rb +88 -21
- data/lib/rigor/reflection/constant_ancestors.rb +97 -0
- data/lib/rigor/reflection/constant_path.rb +139 -0
- data/lib/rigor/reflection.rb +93 -110
- data/lib/rigor/runtime/jit.rb +6 -8
- data/lib/rigor/scope/discovery_index.rb +165 -2
- data/lib/rigor/scope.rb +1041 -32
- data/lib/rigor/sig_gen/alias_index.rb +289 -0
- data/lib/rigor/sig_gen/classification.rb +22 -5
- data/lib/rigor/sig_gen/declaration_equivalence.rb +127 -0
- data/lib/rigor/sig_gen/effect_annotation.rb +202 -0
- data/lib/rigor/sig_gen/generator.rb +673 -53
- data/lib/rigor/sig_gen/inline_declarations.rb +184 -0
- data/lib/rigor/sig_gen/layout_index.rb +3 -4
- data/lib/rigor/sig_gen/meta_class_shape.rb +3 -5
- data/lib/rigor/sig_gen/method_candidate.rb +47 -3
- data/lib/rigor/sig_gen/observation_collector.rb +18 -16
- data/lib/rigor/sig_gen/path_mapper.rb +4 -6
- data/lib/rigor/sig_gen/rbs_validity.rb +4 -4
- data/lib/rigor/sig_gen/renderer.rb +128 -14
- data/lib/rigor/sig_gen/skip_reason_catalog.rb +154 -0
- data/lib/rigor/sig_gen/superclass_spelling.rb +27 -0
- data/lib/rigor/sig_gen/type_elaborator.rb +1 -3
- data/lib/rigor/sig_gen/write_result.rb +19 -3
- data/lib/rigor/sig_gen/writer.rb +189 -41
- data/lib/rigor/sig_gen.rb +3 -0
- data/lib/rigor/signature_path_audit.rb +153 -6
- data/lib/rigor/source/literals.rb +0 -23
- data/lib/rigor/source/node_children.rb +0 -2
- data/lib/rigor/source/node_locator.rb +5 -11
- data/lib/rigor/source/node_walker.rb +0 -6
- data/lib/rigor/source/parameter_envelope.rb +72 -0
- data/lib/rigor/source.rb +1 -0
- data/lib/rigor/triage/catalogue.rb +1 -3
- data/lib/rigor/triage.rb +3 -5
- data/lib/rigor/type/accepts_result.rb +24 -6
- data/lib/rigor/type/combinator.rb +144 -5
- data/lib/rigor/type/data_class.rb +2 -2
- data/lib/rigor/type/data_instance.rb +4 -4
- data/lib/rigor/type/difference.rb +1 -0
- data/lib/rigor/type/float_range.rb +128 -0
- data/lib/rigor/type/hash_shape.rb +6 -6
- data/lib/rigor/type/integer_range.rb +13 -8
- data/lib/rigor/type/nominal.rb +8 -2
- data/lib/rigor/type/refined.rb +4 -3
- data/lib/rigor/type/struct_class.rb +3 -3
- data/lib/rigor/type/struct_instance.rb +4 -4
- data/lib/rigor/type.rb +1 -0
- data/lib/rigor/type_node/generic.rb +1 -1
- data/lib/rigor/type_node/range_literal.rb +25 -0
- data/lib/rigor/type_node/resolver_chain.rb +1 -1
- data/lib/rigor/type_node.rb +1 -0
- data/lib/rigor/version.rb +1 -1
- data/lib/rigor.rb +1 -0
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/analyzer.rb +0 -4
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +0 -1
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +0 -2
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/effects.rb +1 -0
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +10 -5
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/analyzer.rb +0 -4
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +3 -5
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +1 -4
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +14 -4
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +32 -30
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_discoverer.rb +0 -1
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +1 -3
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_scan.rb +96 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/effects.rb +65 -8
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/erb_compiler.rb +270 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/render_locals.rb +402 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/view_assigns.rb +370 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/view_units.rb +132 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +264 -3
- data/plugins/rigor-actionpack/sig/action_controller.rbs +71 -0
- data/plugins/rigor-actionpack/sig/action_view.rbs +43 -0
- data/plugins/rigor-active-model-serializers/lib/rigor/plugin/active_model_serializers/serializer_discoverer.rb +220 -0
- data/plugins/rigor-active-model-serializers/lib/rigor/plugin/active_model_serializers/serializer_index.rb +56 -0
- data/plugins/rigor-active-model-serializers/lib/rigor/plugin/active_model_serializers.rb +263 -0
- data/plugins/rigor-active-model-serializers/lib/rigor-active-model-serializers.rb +7 -0
- data/plugins/rigor-active-model-serializers/sig/active_model_serializers.rbs +45 -0
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/analyzer.rb +0 -4
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/effects.rb +2 -1
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_discoverer.rb +0 -1
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_index.rb +0 -2
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/recurring_scan.rb +1 -1
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +10 -5
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/analyzer.rb +35 -3
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/effects.rb +72 -12
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +383 -7
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +14 -6
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +1 -2
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/structure_sql_parser.rb +1 -2
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +322 -41
- data/plugins/rigor-activerecord/sig/active_record/framework.rbs +123 -0
- data/plugins/rigor-activerecord/sig/active_record/relation.rbs +206 -31
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +26 -14
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/effects.rb +9 -2
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +9 -2
- data/plugins/rigor-activesupport-core-ext/sig/active_support/core_ext.rbs +290 -19
- data/plugins/rigor-devise/lib/rigor/plugin/devise.rb +1 -0
- data/plugins/rigor-dry-monads/lib/rigor/plugin/dry_monads.rb +3 -0
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +9 -7
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema.rb +7 -3
- data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +1 -0
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +8 -6
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +11 -7
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/contract_scanner.rb +13 -11
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +9 -4
- data/plugins/rigor-ethon/lib/rigor/plugin/ethon.rb +2 -0
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/analyzer.rb +0 -5
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +0 -1
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_index.rb +0 -1
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +8 -1
- data/plugins/rigor-ffi/lib/rigor/plugin/ffi/types.rb +1 -1
- data/plugins/rigor-ffi/lib/rigor/plugin/ffi.rb +36 -4
- data/plugins/rigor-ffi-rzmq/lib/rigor/plugin/ffi_rzmq.rb +1 -0
- data/plugins/rigor-grape/lib/rigor/plugin/grape.rb +141 -0
- data/plugins/rigor-grape/lib/rigor-grape.rb +6 -0
- data/plugins/rigor-grape/sig/grape.rbs +263 -0
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +8 -6
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql.rb +78 -5
- data/plugins/rigor-graphql/sig/graphql.rbs +485 -0
- data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +1 -0
- data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +2 -1
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +2 -3
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest.rb +1 -0
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/analyzer.rb +0 -5
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/authorization_scan.rb +2 -2
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +0 -1
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_index.rb +0 -1
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit.rb +12 -7
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +0 -12
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +1 -3
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +0 -1
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n.rb +36 -37
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/acronyms.rb +5 -5
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +0 -10
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +5 -3
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/doorkeeper_routes.rb +3 -2
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/grape_api_discoverer.rb +2 -2
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +2 -2
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_table.rb +9 -10
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +2 -3
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +10 -17
- data/plugins/rigor-railties/lib/rigor/plugin/railties.rb +1 -0
- data/plugins/rigor-rbnacl/lib/rigor/plugin/rbnacl.rb +13 -1
- data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline/same_line_annotations.rb +149 -0
- data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +324 -18
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/analyzer.rb +0 -3
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_scope_index.rb +0 -3
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_type_resolver.rb +1 -5
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +2 -3
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +1 -0
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/have_http_status_analyzer.rb +0 -3
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +1 -0
- data/plugins/rigor-sassc/lib/rigor/plugin/sassc.rb +1 -0
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +1 -9
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers.rb +1 -0
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/analyzer.rb +0 -4
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/effects.rb +1 -1
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/schedule_scan.rb +2 -1
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_discoverer.rb +0 -1
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_index.rb +0 -2
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +10 -5
- data/plugins/rigor-sinatra/lib/rigor/plugin/sinatra.rb +1 -0
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +2 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +1 -4
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +3 -9
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog_walker.rb +4 -4
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +1 -2
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sigil_detector.rb +3 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/type_translator.rb +7 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +51 -6
- data/plugins/rigor-sorbet/sig/sorbet.rbs +277 -0
- data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +1 -0
- data/sig/rigor/analysis/baseline.rbs +69 -7
- data/sig/rigor/analysis/fact_store.rbs +1 -1
- data/sig/rigor/analysis/project_scan.rbs +74 -0
- data/sig/rigor/analysis/reachability/scan_cache.rbs +12 -0
- data/sig/rigor/cache.rbs +2 -3
- data/sig/rigor/effects/config_envelopes.rbs +100 -0
- data/sig/rigor/effects/effect_table.rbs +60 -0
- data/sig/rigor/effects/envelope.rbs +97 -0
- data/sig/rigor/effects/envelope_index.rbs +33 -0
- data/sig/rigor/effects/file_collection.rbs +81 -0
- data/sig/rigor/effects/label.rbs +26 -0
- data/sig/rigor/effects/label_set.rbs +46 -0
- data/sig/rigor/effects/method_key.rbs +24 -0
- data/sig/rigor/effects/origin.rbs +50 -0
- data/sig/rigor/effects/plugin_facts.rbs +141 -0
- data/sig/rigor/effects/registry.rbs +68 -0
- data/sig/rigor/effects/summary.rbs +50 -0
- data/sig/rigor/effects/taint_cause.rbs +12 -0
- data/sig/rigor/environment.rbs +17 -10
- data/sig/rigor/inference/optimistic_origin.rbs +10 -0
- data/sig/rigor/inference.rbs +9 -14
- data/sig/rigor/plugin/additional_initializer.rbs +36 -0
- data/sig/rigor/plugin/base.rbs +30 -7
- data/sig/rigor/plugin/effect_ancestry.rbs +27 -0
- data/sig/rigor/plugin/effect_attribution.rbs +66 -0
- data/sig/rigor/plugin/effect_edge.rbs +33 -0
- data/sig/rigor/plugin/effect_entry_points.rbs +25 -0
- data/sig/rigor/plugin/io_boundary.rbs +4 -0
- data/sig/rigor/plugin/loader.rbs +3 -3
- data/sig/rigor/plugin/manifest.rbs +51 -11
- data/sig/rigor/plugin/protocol_contract.rbs +68 -0
- data/sig/rigor/plugin/registry.rbs +62 -1
- data/sig/rigor/plugin.rbs +1 -1
- data/sig/rigor/rbs_extended.rbs +1 -1
- data/sig/rigor/reflection.rbs +9 -6
- data/sig/rigor/scope.rbs +148 -12
- data/sig/rigor/sig_gen/skip_reason_catalog.rbs +21 -0
- data/sig/rigor/source.rbs +4 -4
- data/sig/rigor/testing.rbs +10 -4
- data/sig/rigor/type.rbs +33 -1
- data/sig/rigor.rbs +39 -20
- data/skills/rigor-ask/SKILL.md +16 -11
- data/skills/rigor-baseline-reduce/SKILL.md +4 -6
- data/skills/rigor-ci-setup/SKILL.md +17 -21
- data/skills/rigor-doctor/SKILL.md +24 -22
- data/skills/rigor-doctor/references/01-checks.md +97 -33
- data/skills/rigor-editor-setup/SKILL.md +6 -4
- data/skills/rigor-mcp-setup/SKILL.md +5 -4
- data/skills/rigor-monkeypatch-resolve/SKILL.md +5 -3
- data/skills/rigor-next-steps/SKILL.md +4 -2
- data/skills/rigor-plugin-author/SKILL.md +19 -23
- data/skills/rigor-plugin-author/references/01-plan-and-scaffold.md +9 -8
- data/skills/rigor-plugin-author/references/02-walker-and-types.md +25 -27
- data/skills/rigor-plugin-author/references/03-test-and-ship.md +6 -8
- data/skills/rigor-plugin-review/SKILL.md +6 -4
- data/skills/rigor-plugin-review/references/01-best-practices-checklist.md +2 -1
- data/skills/rigor-plugin-tune/SKILL.md +4 -2
- data/skills/rigor-project-init/SKILL.md +15 -10
- data/skills/rigor-project-init/references/01-detect.md +13 -9
- data/skills/rigor-project-init/references/02-configure.md +43 -14
- data/skills/rigor-project-init/references/03-baseline-and-bugs.md +14 -14
- data/skills/rigor-project-init/references/04-sig-uplift.md +27 -14
- data/skills/rigor-project-init/references/06-agent-contract.md +67 -0
- data/skills/rigor-protection-uplift/SKILL.md +4 -6
- data/skills/rigor-rbs-setup/SKILL.md +4 -2
- data/skills/rigor-type-oracle/SKILL.md +226 -0
- data/skills/rigor-type-oracle/references/01-oracle-commands.md +265 -0
- data/skills/rigor-type-oracle/references/02-agents-md-fragment.md +52 -0
- data/skills/rigor-type-oracle/references/03-gap-protocol.md +125 -0
- data/skills/rigor-unused-adjudicate/SKILL.md +12 -7
- data/skills/rigor-upgrade/SKILL.md +13 -8
- metadata +133 -3
- data/lib/rigor/cli/probe_environment.rb +0 -85
- data/sig/rigor/inference/builtins/numeric_catalog.rbs +0 -3
|
@@ -4,6 +4,7 @@ require "prism"
|
|
|
4
4
|
|
|
5
5
|
require_relative "../type"
|
|
6
6
|
require_relative "mutation_widening"
|
|
7
|
+
require_relative "unknown_store_widening"
|
|
7
8
|
|
|
8
9
|
module Rigor
|
|
9
10
|
module Inference
|
|
@@ -35,9 +36,8 @@ module Rigor
|
|
|
35
36
|
# - The receiver variable is rebound (handled inside `Scope#with_local` / `Scope#with_ivar`).
|
|
36
37
|
# - An intervening `receiver[key] = value` writes the same slot — `:[]=` could rebind the
|
|
37
38
|
# slot to nil; conservative drop.
|
|
38
|
-
# - An intervening mutator from {MutationWidening::
|
|
39
|
-
#
|
|
40
|
-
# `params.clear`).
|
|
39
|
+
# - An intervening mutator from {MutationWidening::SHAPE_MUTATORS} runs against the receiver
|
|
40
|
+
# (e.g. `params.delete(:f)`, `params.clear`, `params.default = 0`, `buf.delete_prefix!("x")`).
|
|
41
41
|
#
|
|
42
42
|
# All three are implemented in `StatementEvaluator#eval_call`'s post-dispatch path through
|
|
43
43
|
# {.invalidate_after_call}.
|
|
@@ -116,15 +116,17 @@ module Rigor
|
|
|
116
116
|
#
|
|
117
117
|
# - `receiver[key] = value` (a `:[]=` against a stable address): drop the specific
|
|
118
118
|
# `(receiver, key)` entry.
|
|
119
|
-
# - Any mutator from `
|
|
120
|
-
#
|
|
119
|
+
# - Any mutator from `SHAPE_MUTATORS` against a stable receiver: drop EVERY entry rooted at
|
|
120
|
+
# that receiver, because the mutator could rebind any slot. A {HashLookupMutation} name
|
|
121
|
+
# rebinds none, but it changes what a read of one answers — a missing slot's default, or
|
|
122
|
+
# whether a literal key still finds its pair — so it drops them too.
|
|
121
123
|
#
|
|
122
124
|
# Returns the updated scope. Always-safe (only forgets; never invents).
|
|
123
125
|
def invalidate_after_call(call_node:, current_scope:)
|
|
124
126
|
return current_scope unless call_node.is_a?(Prism::CallNode)
|
|
125
127
|
|
|
126
128
|
if call_node.name == :[]=
|
|
127
|
-
invalidate_indexed_write(call_node, current_scope)
|
|
129
|
+
widen_mutated_slot(call_node, invalidate_indexed_write(call_node, current_scope))
|
|
128
130
|
elsif mutator?(call_node.name)
|
|
129
131
|
invalidate_mutator(call_node, current_scope)
|
|
130
132
|
else
|
|
@@ -132,9 +134,9 @@ module Rigor
|
|
|
132
134
|
end
|
|
133
135
|
end
|
|
134
136
|
|
|
137
|
+
# The String table too: `s[0] ||= "x"; s.delete_prefix!("x")` leaves `s[0]` nil.
|
|
135
138
|
def mutator?(method_name)
|
|
136
|
-
MutationWidening::
|
|
137
|
-
MutationWidening::ARRAY_MUTATORS.include?(method_name)
|
|
139
|
+
MutationWidening::SHAPE_MUTATORS.include?(method_name)
|
|
138
140
|
end
|
|
139
141
|
|
|
140
142
|
def invalidate_indexed_write(call_node, current_scope)
|
|
@@ -149,11 +151,61 @@ module Rigor
|
|
|
149
151
|
|
|
150
152
|
def invalidate_mutator(call_node, current_scope)
|
|
151
153
|
receiver = stable_receiver(call_node.receiver)
|
|
152
|
-
return current_scope if receiver.nil?
|
|
154
|
+
return widen_mutated_slot(call_node, current_scope) if receiver.nil?
|
|
153
155
|
|
|
154
156
|
current_scope.without_indexed_narrowings_for(*receiver)
|
|
155
157
|
end
|
|
156
158
|
|
|
159
|
+
# A mutator whose receiver is the element a `(receiver, key)` narrowing records — `h[k] << x`,
|
|
160
|
+
# `h[k][:x] = v`, or `(h[k] ||= []) << x`, whose value is that element — changes the object the
|
|
161
|
+
# narrowing holds, so the narrowing is widened as the mutator widens that value, or dropped when the
|
|
162
|
+
# widening declines.
|
|
163
|
+
# Without it `groups[:a] ||= []; groups[:a] << 1` kept reading `groups[:a]` as `[]` and folded
|
|
164
|
+
# `groups[:a].size == 0`; issue #1223's threading of a receiver's write made the parenthesised spelling
|
|
165
|
+
# record the same narrowing.
|
|
166
|
+
def widen_mutated_slot(call_node, current_scope)
|
|
167
|
+
address = element_address(call_node.receiver)
|
|
168
|
+
return current_scope if address.nil?
|
|
169
|
+
|
|
170
|
+
recorded = current_scope.indexed_narrowing(*address)
|
|
171
|
+
return current_scope if recorded.nil?
|
|
172
|
+
|
|
173
|
+
widened = MutationWidening.widen_for_mutator(recorded, call_node.name) ||
|
|
174
|
+
string_slot_floor(recorded, call_node.name)
|
|
175
|
+
return current_scope.without_indexed_narrowing(*address) if widened.nil?
|
|
176
|
+
|
|
177
|
+
current_scope.with_indexed_narrowing(*address, widened)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# A String mutator the widening declines on a String slot — a `String` nominal it may not grow, a refinement it
|
|
181
|
+
# does not model — still leaves the same object in the slot, so the `||=` proof that the slot is non-nil stands.
|
|
182
|
+
# The narrowing is kept, floored to `String` so no value or refinement pin outlives the rewrite. Dropping it read
|
|
183
|
+
# `h[:name]` back as the declared `String?` after `h[:name].strip!` and reported a nil receiver on correct code.
|
|
184
|
+
def string_slot_floor(recorded, method_name)
|
|
185
|
+
return nil unless StringMutation::MUTATORS.include?(method_name)
|
|
186
|
+
|
|
187
|
+
members = recorded.is_a?(Type::Union) ? recorded.members : [recorded]
|
|
188
|
+
return nil unless members.all? { |member| UnknownStoreWidening.carrier_class(member) == "String" }
|
|
189
|
+
|
|
190
|
+
Type::Combinator.nominal_of("String")
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
ELEMENT_WRITE_NODES = [Prism::IndexOrWriteNode, Prism::IndexAndWriteNode, Prism::IndexOperatorWriteNode].freeze
|
|
194
|
+
private_constant :ELEMENT_WRITE_NODES
|
|
195
|
+
|
|
196
|
+
# The `(receiver, key)` address of a single-key element read `h[k]`, or of an index compound write
|
|
197
|
+
# (`h[k] ||= v`) whose value is that element, bare or parenthesised on its own; nil otherwise.
|
|
198
|
+
def element_address(node)
|
|
199
|
+
while node.is_a?(Prism::ParenthesesNode) && node.body.is_a?(Prism::StatementsNode) && node.body.body.size == 1
|
|
200
|
+
node = node.body.body.first
|
|
201
|
+
end
|
|
202
|
+
return nil unless (node.is_a?(Prism::CallNode) && node.name == :[] && node.block.nil?) ||
|
|
203
|
+
ELEMENT_WRITE_NODES.include?(node.class)
|
|
204
|
+
|
|
205
|
+
args = node.arguments&.arguments
|
|
206
|
+
args&.size == 1 ? stable_address(node.receiver, args.first) : nil
|
|
207
|
+
end
|
|
208
|
+
|
|
157
209
|
# Companion invalidator for single-hop method-chain narrowings (ROADMAP § Future cycles —
|
|
158
210
|
# "Method-call receiver narrowing across stable receivers", B2 from the slice's design
|
|
159
211
|
# notes). Drops every `(receiver, *)` chain narrowing rooted at the call's OUTER stable
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "prism"
|
|
4
|
+
|
|
5
|
+
require_relative "../source/node_children"
|
|
6
|
+
|
|
7
|
+
module Rigor
|
|
8
|
+
module Inference
|
|
9
|
+
# The `break` / `next` nodes that target a construct: the ones reachable from its body without crossing a
|
|
10
|
+
# construct that retargets them — a nested block, lambda, `def`, loop, or class body. `ExpressionTyper`'s
|
|
11
|
+
# block-return passes (issues #841 and #853) and `StatementEvaluator`'s loop and block joins all key on this set,
|
|
12
|
+
# and each used to carry its own copy of the scan with a different boundary list (issue #1198). The class-body
|
|
13
|
+
# nodes are a boundary only nominally: Ruby rejects a `next` or `break` directly inside one.
|
|
14
|
+
module JumpTargets
|
|
15
|
+
BOUNDARY_NODES = Set[
|
|
16
|
+
Prism::BlockNode, Prism::LambdaNode, Prism::DefNode,
|
|
17
|
+
Prism::WhileNode, Prism::UntilNode, Prism::ForNode,
|
|
18
|
+
Prism::ClassNode, Prism::ModuleNode, Prism::SingletonClassNode
|
|
19
|
+
].freeze
|
|
20
|
+
|
|
21
|
+
module_function
|
|
22
|
+
|
|
23
|
+
# True when `node` retargets the jumps below it.
|
|
24
|
+
def boundary?(node)
|
|
25
|
+
BOUNDARY_NODES.include?(node.class)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# True when a `jump_class` node targets the construct whose body is `node`. Allocation-free and early-exiting:
|
|
29
|
+
# both typers ask it of every block body, and the overwhelming majority answer false.
|
|
30
|
+
def any?(node, jump_class)
|
|
31
|
+
return false if node.nil?
|
|
32
|
+
return true if node.is_a?(jump_class)
|
|
33
|
+
|
|
34
|
+
node.rigor_each_child do |child|
|
|
35
|
+
next if boundary?(child)
|
|
36
|
+
return true if any?(child, jump_class)
|
|
37
|
+
end
|
|
38
|
+
false
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Which of `jump_classes` target the construct whose body is `node`, found in one walk and answered as a bit
|
|
42
|
+
# mask (bit `i` for `jump_classes[i]`), so a loop asks for its `next`, `break` and `redo` together without
|
|
43
|
+
# allocating. The walk stops descending once every class is found.
|
|
44
|
+
def kinds(node, jump_classes)
|
|
45
|
+
kind_mask(node, jump_classes, 0, (1 << jump_classes.size) - 1)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def kind_mask(node, jump_classes, mask, full)
|
|
49
|
+
return mask if node.nil? || mask == full
|
|
50
|
+
|
|
51
|
+
index = jump_classes.index(node.class)
|
|
52
|
+
mask |= 1 << index if index
|
|
53
|
+
node.rigor_each_child do |child|
|
|
54
|
+
mask = kind_mask(child, jump_classes, mask, full) unless boundary?(child)
|
|
55
|
+
end
|
|
56
|
+
mask
|
|
57
|
+
end
|
|
58
|
+
private_class_method :kind_mask
|
|
59
|
+
|
|
60
|
+
# Every `jump_class` node that targets the construct whose body is `node`, as an identity-keyed Hash used as a
|
|
61
|
+
# membership set: the jump sinks also collect jumps belonging to nested constructs, and their consumers filter
|
|
62
|
+
# against this set.
|
|
63
|
+
def of(node, jump_class)
|
|
64
|
+
found = {}.compare_by_identity
|
|
65
|
+
collect(node, jump_class, found)
|
|
66
|
+
found
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def collect(node, jump_class, found)
|
|
70
|
+
return if node.nil?
|
|
71
|
+
|
|
72
|
+
found[node] = true if node.is_a?(jump_class)
|
|
73
|
+
node.rigor_each_child do |child|
|
|
74
|
+
next if boundary?(child)
|
|
75
|
+
|
|
76
|
+
collect(child, jump_class, found)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
private_class_method :collect
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../reflection"
|
|
4
|
+
require_relative "../../type"
|
|
5
|
+
require_relative "self_evidence"
|
|
6
|
+
|
|
7
|
+
module Rigor
|
|
8
|
+
module Inference
|
|
9
|
+
module LastLine
|
|
10
|
+
# Issue #1415 (ADR-117 WD5) — whether an implicit-self or `self.` `gets` is the C reader, `Kernel`'s or a
|
|
11
|
+
# reopened `IO`'s, under WD4's assumption that the readers a program relies on are the core ones. It is when
|
|
12
|
+
# the file gives the reader a `self` ({SelfEvidence#context}) and that `self`'s ancestry holds no Ruby reader the
|
|
13
|
+
# analyzer can see:
|
|
14
|
+
#
|
|
15
|
+
# - in the script body, a top-level method or a top-level `class << self`, whose `self` is `main`, while no file
|
|
16
|
+
# of the program records a mixin into `Object`, `Kernel` or `BasicObject` ({.root_mixin?}). A top-level method
|
|
17
|
+
# run with another `self`, a file loaded under `load(file, M)` and a DSL's `instance_eval(File.read(f))` are
|
|
18
|
+
# assumed away, as WD4 assumes a replacement the file does not show.
|
|
19
|
+
# - in a class body and its methods, and in a module body and its singleton methods, while the class or module
|
|
20
|
+
# `self` names, and every ancestor the program records for it, resolves to a project class or to a class or
|
|
21
|
+
# module RBS knows ({.instance_side?}, {.class_side?}), none of them dirty ({SelfEvidence#dirty?}). A project
|
|
22
|
+
# ancestor adds its own ancestry; a superclass that is not a constant (`DelegateClass(File)`), or a class a
|
|
23
|
+
# constant write makes (`W = Class.new(CSV)`), records none, and declines, as does an ancestor name the
|
|
24
|
+
# program writes as a constant (`File = RubyReaderClass`). An ancestor RBS knows must place both readers in
|
|
25
|
+
# `Kernel`, `IO` or its kin (`CSV` places `readline` in `CSV`, and `OpenSSL::Buffering` both), or declare
|
|
26
|
+
# neither when it is a module, be no `Tempfile` or `CSV`, whose readers are Ruby though RBS places one or both
|
|
27
|
+
# in `IO` or `Kernel`, and have no RBS ancestor the program mixes a module into (`class IO; prepend M; end`
|
|
28
|
+
# reaches every `File`). A class object also declines on a mixin into `Module` or `Class`. A subclass the
|
|
29
|
+
# method runs on is assumed away, as a top-level method run with another `self` is.
|
|
30
|
+
#
|
|
31
|
+
# With dependency recording on (ADR-46), each project class the walk reads is an edge to its declarations, and
|
|
32
|
+
# each root, RBS ancestor and constant name it asks about is a name edge, so a file that later mixes into one,
|
|
33
|
+
# reopens one or writes one re-checks this one.
|
|
34
|
+
module ImplicitSelf
|
|
35
|
+
# `Kernel` answers for every object that inherits it, and for a reader RBS leaves out, which the checks on
|
|
36
|
+
# the ancestry below answer for instead.
|
|
37
|
+
OWNERS = (READER_OWNERS | Set["::Kernel"]).freeze
|
|
38
|
+
RUBY_READER_CLASSES = (DELEGATING_CLASSES + %w[CSV]).freeze
|
|
39
|
+
# The classes a mixin reaches every object from, and every class and module object from.
|
|
40
|
+
INSTANCE_ROOTS = %w[Object Kernel BasicObject].freeze
|
|
41
|
+
CLASS_ROOTS = %w[Module Class].freeze
|
|
42
|
+
# The ancestry walk's node cap, as `Scope::ANCESTOR_WALK_LIMIT` caps the project walks.
|
|
43
|
+
WALK_LIMIT = 100
|
|
44
|
+
private_constant :OWNERS, :RUBY_READER_CLASSES, :INSTANCE_ROOTS, :CLASS_ROOTS, :WALK_LIMIT
|
|
45
|
+
|
|
46
|
+
module_function
|
|
47
|
+
|
|
48
|
+
def reader?(call_node, scope)
|
|
49
|
+
evidence = scope.discovery.implicit_self_evidence
|
|
50
|
+
context = evidence&.context(call_node)
|
|
51
|
+
return false if context.nil? || root_mixin?(scope, INSTANCE_ROOTS)
|
|
52
|
+
|
|
53
|
+
self_type = scope.self_type
|
|
54
|
+
return self_type.nil? if context == SelfEvidence::MAIN
|
|
55
|
+
|
|
56
|
+
case self_type
|
|
57
|
+
when Type::Nominal then instance_side?(self_type.class_name, scope, evidence, {})
|
|
58
|
+
when Type::Singleton
|
|
59
|
+
!root_mixin?(scope, CLASS_ROOTS) && class_side?(self_type.class_name, scope, evidence, {})
|
|
60
|
+
else false
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# A mixin into one of `roots` any file of the program records (`class Object; include M; end`), which reaches
|
|
65
|
+
# every object's methods, or every class object's for `Module` and `Class`.
|
|
66
|
+
def root_mixin?(scope, roots)
|
|
67
|
+
roots.any? do |name|
|
|
68
|
+
record_name(:class, name)
|
|
69
|
+
!scope.includes_of(name).empty? || scope.discovered_extends.key?(name)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# The instance side of `name`: its readers, and those of every ancestor the program records for it.
|
|
74
|
+
def instance_side?(name, scope, evidence, seen)
|
|
75
|
+
return true if seen.key?(name)
|
|
76
|
+
return false if seen.size >= WALK_LIMIT || evidence.dirty?(name) || ruby_reader_class?(name, scope)
|
|
77
|
+
|
|
78
|
+
seen[name] = true
|
|
79
|
+
known = Reflection.rbs_class_known?(name, scope: scope)
|
|
80
|
+
if project_class?(name, scope)
|
|
81
|
+
return false if unnamed_superclass?(name, scope)
|
|
82
|
+
|
|
83
|
+
ancestors = scope.includes_of(name) + Array(scope.superclass_of(name))
|
|
84
|
+
return false unless ancestors.all? { |raw| instance_ancestor?(name, raw, scope, evidence, seen) }
|
|
85
|
+
return true unless known
|
|
86
|
+
end
|
|
87
|
+
known && rbs_readers?(name, scope) && rbs_ancestry?(name, scope, evidence, seen, :instance)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# The class object `name`: the modules it and its superclasses extend, and their superclasses' class sides.
|
|
91
|
+
def class_side?(name, scope, evidence, seen)
|
|
92
|
+
return true if seen.key?(name)
|
|
93
|
+
return false if seen.size >= WALK_LIMIT || evidence.dirty?(name)
|
|
94
|
+
|
|
95
|
+
seen[name] = true
|
|
96
|
+
known = Reflection.rbs_class_known?(name, scope: scope)
|
|
97
|
+
if project_class?(name, scope)
|
|
98
|
+
return false if unnamed_superclass?(name, scope)
|
|
99
|
+
return false unless extensions?(name, scope, evidence)
|
|
100
|
+
|
|
101
|
+
superclass = scope.superclass_of(name)
|
|
102
|
+
return false unless superclass.nil? || class_ancestor?(name, superclass, scope, evidence, seen)
|
|
103
|
+
return true unless known
|
|
104
|
+
end
|
|
105
|
+
known && rbs_class_readers?(name, scope) && rbs_ancestry?(name, scope, evidence, seen, :singleton)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def extensions?(name, scope, evidence)
|
|
109
|
+
(scope.discovered_extends[name] || []).all? { |raw| instance_ancestor?(name, raw, scope, evidence, {}) }
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def instance_ancestor?(owner, raw, scope, evidence, seen)
|
|
113
|
+
ancestor = resolve(owner, raw, scope)
|
|
114
|
+
!ancestor.nil? && instance_side?(ancestor, scope, evidence, seen)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def class_ancestor?(owner, raw, scope, evidence, seen)
|
|
118
|
+
ancestor = resolve(owner, raw, scope)
|
|
119
|
+
!ancestor.nil? && class_side?(ancestor, scope, evidence, seen)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# The ancestors RBS gives `name`, none dirty in the file, and none that the program mixes a module into, on
|
|
123
|
+
# the instance side, or extends, on the class side, unless each module is clear itself: a class body that
|
|
124
|
+
# reopens a core class (`class IO; prepend M; end`) reaches every class below it.
|
|
125
|
+
def rbs_ancestry?(name, scope, evidence, seen, side)
|
|
126
|
+
loader = scope.environment.rbs_loader
|
|
127
|
+
return true if loader.nil?
|
|
128
|
+
|
|
129
|
+
loader.ancestor_names_for(name).all? do |ancestor|
|
|
130
|
+
next true if ancestor == name && project_class?(name, scope)
|
|
131
|
+
|
|
132
|
+
record_name(:class, ancestor)
|
|
133
|
+
next false if evidence.dirty?(ancestor)
|
|
134
|
+
|
|
135
|
+
mixins = side == :instance ? scope.includes_of(ancestor) : scope.discovered_extends[ancestor] || []
|
|
136
|
+
mixins.all? { |raw| instance_ancestor?(ancestor, raw, scope, evidence, side == :instance ? seen : {}) }
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def project_class?(name, scope)
|
|
141
|
+
scope.discovered_classes.key?(name) || scope.known_user_class?(name)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# A superclass the discovery tables do not name: an expression other than a constant (`class W <
|
|
145
|
+
# DelegateClass(File)`), which the superclass table keeps as its key with no name, and whatever a constant
|
|
146
|
+
# write makes the class from (`W = Class.new(CSV)`, `W = DelegateClass(File)`), which only the in-source
|
|
147
|
+
# constant table and, across files, the census of written constant names record.
|
|
148
|
+
def unnamed_superclass?(name, scope)
|
|
149
|
+
return true if written_constant?(name, scope)
|
|
150
|
+
|
|
151
|
+
scope.discovered_superclasses.key?(name) && scope.superclass_of(name).nil?
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# The ancestor `raw`, as `owner`'s declaration writes it, as the first candidate the program or RBS knows, or
|
|
155
|
+
# nil when neither knows one or when a candidate before it is a constant the program writes, which shadows an
|
|
156
|
+
# RBS name (`module Wrap; File = RubyReaderClass; class Src < File`) with whatever value it holds.
|
|
157
|
+
def resolve(owner, raw, scope)
|
|
158
|
+
scope.ancestor_name_candidates(owner, raw).each do |candidate|
|
|
159
|
+
return nil if written_constant?(candidate, scope)
|
|
160
|
+
return candidate if project_class?(candidate, scope) || Reflection.rbs_class_known?(candidate, scope: scope)
|
|
161
|
+
end
|
|
162
|
+
nil
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# A name the file's in-source constant table holds, or one the project's census of written constant names
|
|
166
|
+
# spells, exactly, as a `*::` wildcard of its last segment, or as a path relative to a namespace the census
|
|
167
|
+
# does not record (`module P; Q::Qux = Class.new(CSV); end` spells `Q::Qux` for `P::Q::Qux`), which a
|
|
168
|
+
# same-named constant elsewhere also matches, and only declines.
|
|
169
|
+
def written_constant?(name, scope)
|
|
170
|
+
record_name(:constant, name.split("::").last)
|
|
171
|
+
return true if scope.in_source_constants.key?(name)
|
|
172
|
+
|
|
173
|
+
scope.bound_constant_names(name).any? do |written|
|
|
174
|
+
written == name || written.start_with?("*::") || name.end_with?("::#{written}")
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Both readers in `Kernel`, `IO` or its kin; a module may declare neither, while a class without one is a
|
|
179
|
+
# `BasicObject` lineage (`Delegator`), whose reader is a `method_missing` forwarder.
|
|
180
|
+
def rbs_readers?(name, scope)
|
|
181
|
+
READERS.all? do |reader|
|
|
182
|
+
definition = Reflection.instance_method_definition(name, reader, scope: scope)
|
|
183
|
+
definition.nil? ? scope.environment.rbs_module?(name) : OWNERS.include?(definition.defined_in.to_s)
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def rbs_class_readers?(name, scope)
|
|
188
|
+
READERS.all? do |reader|
|
|
189
|
+
definition = Reflection.singleton_method_definition(name, reader, scope: scope)
|
|
190
|
+
!definition.nil? && OWNERS.include?(definition.defined_in.to_s)
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def ruby_reader_class?(name, scope)
|
|
195
|
+
RUBY_READER_CLASSES.any? do |klass|
|
|
196
|
+
DELEGATING_ORDERINGS.include?(scope.environment.class_ordering(name, klass))
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def record_name(kind, name)
|
|
201
|
+
Analysis::DependencyRecorder.read_name(kind, name) if Analysis::DependencyRecorder.active?
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
private_class_method :root_mixin?, :instance_side?, :class_side?, :extensions?, :instance_ancestor?,
|
|
205
|
+
:class_ancestor?, :rbs_ancestry?, :project_class?, :unnamed_superclass?, :resolve,
|
|
206
|
+
:written_constant?, :rbs_readers?, :rbs_class_readers?, :ruby_reader_class?, :record_name
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|