rigortype 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/docs/manual/04-diagnostics.md +7 -4
- data/docs/manual/06-baseline.md +5 -2
- data/docs/manual/15-type-protection-coverage.md +6 -4
- data/lib/rigor/analysis/baseline.rb +56 -96
- data/lib/rigor/analysis/buffer_binding.rb +13 -20
- data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +29 -48
- data/lib/rigor/analysis/check_rules/dead_assignment_collector.rb +35 -54
- data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +23 -37
- data/lib/rigor/analysis/check_rules/main_pass_collector.rb +16 -23
- data/lib/rigor/analysis/check_rules/rule_walk.rb +48 -71
- data/lib/rigor/analysis/check_rules/self_closedness_scanner.rb +19 -28
- data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +48 -67
- data/lib/rigor/analysis/check_rules.rb +174 -274
- data/lib/rigor/analysis/dependency_recorder.rb +26 -38
- data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +13 -25
- data/lib/rigor/analysis/dependency_source_inference/builder.rb +17 -30
- data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +15 -26
- data/lib/rigor/analysis/dependency_source_inference/index.rb +45 -76
- data/lib/rigor/analysis/dependency_source_inference/return_type_heuristic.rb +23 -40
- data/lib/rigor/analysis/dependency_source_inference/walker.rb +50 -83
- data/lib/rigor/analysis/dependency_source_inference.rb +6 -10
- data/lib/rigor/analysis/diagnostic.rb +48 -75
- data/lib/rigor/analysis/erb_template_detector.rb +13 -18
- data/lib/rigor/analysis/fact_store.rb +12 -22
- data/lib/rigor/analysis/incremental.rb +47 -63
- data/lib/rigor/analysis/incremental_session.rb +74 -100
- data/lib/rigor/analysis/project_scan.rb +12 -23
- data/lib/rigor/analysis/result.rb +3 -5
- data/lib/rigor/analysis/rule_catalog.rb +67 -95
- data/lib/rigor/analysis/run_stats.rb +38 -61
- data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +101 -160
- data/lib/rigor/analysis/runner/pool_coordinator.rb +121 -188
- data/lib/rigor/analysis/runner/project_pre_passes.rb +62 -96
- data/lib/rigor/analysis/runner/run_snapshots.rb +12 -18
- data/lib/rigor/analysis/runner.rb +220 -333
- data/lib/rigor/analysis/self_call_resolution_recorder.rb +30 -43
- data/lib/rigor/analysis/worker_session.rb +64 -102
- data/lib/rigor/ast/type_node.rb +6 -8
- data/lib/rigor/ast.rb +6 -10
- data/lib/rigor/bleeding_edge.rb +27 -35
- data/lib/rigor/builtins/hkt_builtins.rb +7 -14
- data/lib/rigor/builtins/imported_refinements.rb +106 -149
- data/lib/rigor/builtins/predefined_constant_refinements.rb +51 -65
- data/lib/rigor/builtins/regex_refinement.rb +32 -43
- data/lib/rigor/builtins/static_return_refinements.rb +57 -81
- data/lib/rigor/cache/descriptor.rb +58 -94
- data/lib/rigor/cache/incremental_snapshot.rb +32 -48
- data/lib/rigor/cache/rbs_cache_producer.rb +10 -15
- data/lib/rigor/cache/rbs_class_ancestor_table.rb +10 -16
- data/lib/rigor/cache/rbs_class_type_param_names.rb +10 -16
- data/lib/rigor/cache/rbs_constant_table.rb +8 -13
- data/lib/rigor/cache/rbs_descriptor.rb +8 -13
- data/lib/rigor/cache/rbs_environment.rb +11 -19
- data/lib/rigor/cache/rbs_environment_marshal_patch.rb +11 -19
- data/lib/rigor/cache/rbs_known_class_names.rb +8 -12
- data/lib/rigor/cache/store.rb +96 -151
- data/lib/rigor/cli/annotate_command.rb +51 -88
- data/lib/rigor/cli/baseline_command.rb +10 -17
- data/lib/rigor/cli/check_command.rb +121 -199
- data/lib/rigor/cli/check_runner_factory.rb +8 -14
- data/lib/rigor/cli/ci_detector.rb +9 -14
- data/lib/rigor/cli/command.rb +8 -14
- data/lib/rigor/cli/coverage_command.rb +19 -26
- data/lib/rigor/cli/coverage_mutation.rb +14 -19
- data/lib/rigor/cli/coverage_report.rb +0 -2
- data/lib/rigor/cli/coverage_scan.rb +7 -11
- data/lib/rigor/cli/diagnostic_formats.rb +43 -62
- data/lib/rigor/cli/diff_command.rb +10 -20
- data/lib/rigor/cli/docs_command.rb +26 -40
- data/lib/rigor/cli/doctor_command.rb +8 -9
- data/lib/rigor/cli/explain_command.rb +4 -7
- data/lib/rigor/cli/fused_protection_renderer.rb +4 -5
- data/lib/rigor/cli/fused_protection_report.rb +6 -8
- data/lib/rigor/cli/lsp_command.rb +11 -19
- data/lib/rigor/cli/mcp_command.rb +4 -6
- data/lib/rigor/cli/mutation_protection_renderer.rb +3 -4
- data/lib/rigor/cli/mutation_protection_report.rb +6 -9
- data/lib/rigor/cli/options.rb +11 -19
- data/lib/rigor/cli/plugin_command.rb +18 -30
- data/lib/rigor/cli/plugins_command.rb +29 -51
- data/lib/rigor/cli/plugins_renderer.rb +12 -20
- data/lib/rigor/cli/prism_colorizer.rb +13 -19
- data/lib/rigor/cli/protection_renderer.rb +5 -7
- data/lib/rigor/cli/protection_report.rb +27 -17
- data/lib/rigor/cli/renderable.rb +4 -6
- data/lib/rigor/cli/show_bleedingedge_command.rb +5 -8
- data/lib/rigor/cli/sig_gen_command.rb +14 -26
- data/lib/rigor/cli/skill_command.rb +30 -47
- data/lib/rigor/cli/skill_describe.rb +40 -64
- data/lib/rigor/cli/trace_command.rb +9 -16
- data/lib/rigor/cli/trace_renderer.rb +35 -51
- data/lib/rigor/cli/triage_command.rb +6 -10
- data/lib/rigor/cli/triage_renderer.rb +1 -2
- data/lib/rigor/cli/type_of_command.rb +14 -23
- data/lib/rigor/cli/type_of_renderer.rb +3 -5
- data/lib/rigor/cli/type_scan_command.rb +6 -10
- data/lib/rigor/cli/type_scan_renderer.rb +3 -5
- data/lib/rigor/cli/type_scan_report.rb +2 -3
- data/lib/rigor/cli/upgrade_command.rb +2 -3
- data/lib/rigor/cli.rb +16 -28
- data/lib/rigor/config_audit.rb +35 -44
- data/lib/rigor/configuration/dependencies.rb +41 -70
- data/lib/rigor/configuration/severity_profile.rb +28 -42
- data/lib/rigor/configuration.rb +150 -241
- data/lib/rigor/environment/bundle_sig_discovery.rb +74 -118
- data/lib/rigor/environment/class_registry.rb +19 -26
- data/lib/rigor/environment/constant_type_cache_holder.rb +14 -21
- data/lib/rigor/environment/hkt_registry_holder.rb +6 -12
- data/lib/rigor/environment/lockfile_resolver.rb +31 -47
- data/lib/rigor/environment/rbs_collection_discovery.rb +39 -63
- data/lib/rigor/environment/rbs_coverage_report.rb +24 -42
- data/lib/rigor/environment/rbs_loader.rb +420 -518
- data/lib/rigor/environment/reflection.rb +28 -53
- data/lib/rigor/environment/reporters.rb +13 -24
- data/lib/rigor/environment.rb +176 -291
- data/lib/rigor/flow_contribution/conflict.rb +16 -27
- data/lib/rigor/flow_contribution/element.rb +7 -12
- data/lib/rigor/flow_contribution/fact.rb +33 -57
- data/lib/rigor/flow_contribution/merge_result.rb +6 -9
- data/lib/rigor/flow_contribution/merger.rb +32 -47
- data/lib/rigor/flow_contribution.rb +37 -55
- data/lib/rigor/inference/acceptance.rb +133 -219
- data/lib/rigor/inference/block_parameter_binder.rb +52 -82
- data/lib/rigor/inference/body_fixpoint.rb +22 -30
- data/lib/rigor/inference/budget_trace.rb +43 -63
- data/lib/rigor/inference/builtins/array_catalog.rb +4 -6
- data/lib/rigor/inference/builtins/comparable_catalog.rb +4 -6
- data/lib/rigor/inference/builtins/complex_catalog.rb +13 -19
- data/lib/rigor/inference/builtins/date_catalog.rb +38 -67
- data/lib/rigor/inference/builtins/encoding_catalog.rb +22 -36
- data/lib/rigor/inference/builtins/enumerable_catalog.rb +4 -6
- data/lib/rigor/inference/builtins/exception_catalog.rb +38 -57
- data/lib/rigor/inference/builtins/hash_catalog.rb +9 -14
- data/lib/rigor/inference/builtins/method_catalog.rb +29 -48
- data/lib/rigor/inference/builtins/numeric_catalog.rb +13 -18
- data/lib/rigor/inference/builtins/pathname_catalog.rb +8 -13
- data/lib/rigor/inference/builtins/proc_catalog.rb +38 -62
- data/lib/rigor/inference/builtins/random_catalog.rb +21 -32
- data/lib/rigor/inference/builtins/range_catalog.rb +12 -21
- data/lib/rigor/inference/builtins/rational_catalog.rb +9 -15
- data/lib/rigor/inference/builtins/re_catalog.rb +29 -48
- data/lib/rigor/inference/builtins/set_catalog.rb +18 -27
- data/lib/rigor/inference/builtins/string_catalog.rb +12 -19
- data/lib/rigor/inference/builtins/struct_catalog.rb +18 -30
- data/lib/rigor/inference/builtins/time_catalog.rb +28 -44
- data/lib/rigor/inference/closure_escape_analyzer.rb +44 -67
- data/lib/rigor/inference/coverage_scanner.rb +13 -18
- data/lib/rigor/inference/def_return_typer.rb +8 -14
- data/lib/rigor/inference/dynamic_origin.rb +23 -20
- data/lib/rigor/inference/expression_typer.rb +774 -1152
- data/lib/rigor/inference/fallback.rb +8 -12
- data/lib/rigor/inference/fallback_tracer.rb +4 -10
- data/lib/rigor/inference/flow_tracer.rb +25 -36
- data/lib/rigor/inference/hkt_body.rb +45 -68
- data/lib/rigor/inference/hkt_body_parser.rb +33 -52
- data/lib/rigor/inference/hkt_reducer.rb +38 -59
- data/lib/rigor/inference/hkt_registry.rb +50 -76
- data/lib/rigor/inference/indexed_narrowing.rb +55 -81
- data/lib/rigor/inference/macro_block_self_type.rb +21 -34
- data/lib/rigor/inference/method_dispatcher/array_to_h_folding.rb +11 -18
- data/lib/rigor/inference/method_dispatcher/block_folding.rb +49 -83
- data/lib/rigor/inference/method_dispatcher/call_context.rb +16 -23
- data/lib/rigor/inference/method_dispatcher/cgi_folding.rb +13 -22
- data/lib/rigor/inference/method_dispatcher/constant_folding.rb +307 -454
- data/lib/rigor/inference/method_dispatcher/data_folding.rb +24 -34
- data/lib/rigor/inference/method_dispatcher/file_folding.rb +22 -37
- data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +52 -81
- data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +51 -78
- data/lib/rigor/inference/method_dispatcher/literal_string_folding.rb +60 -97
- data/lib/rigor/inference/method_dispatcher/math_folding.rb +23 -34
- data/lib/rigor/inference/method_dispatcher/member_shape_projection.rb +18 -26
- data/lib/rigor/inference/method_dispatcher/method_folding.rb +37 -71
- data/lib/rigor/inference/method_dispatcher/overload_selector.rb +114 -182
- data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +122 -193
- data/lib/rigor/inference/method_dispatcher/receiver_affinity.rb +15 -24
- data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +64 -93
- data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +31 -45
- data/lib/rigor/inference/method_dispatcher/set_folding.rb +6 -9
- data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +356 -511
- data/lib/rigor/inference/method_dispatcher/shellwords_folding.rb +22 -32
- data/lib/rigor/inference/method_dispatcher/singleton_folding.rb +15 -21
- data/lib/rigor/inference/method_dispatcher/struct_folding.rb +66 -82
- data/lib/rigor/inference/method_dispatcher/time_folding.rb +10 -15
- data/lib/rigor/inference/method_dispatcher/uri_folding.rb +9 -13
- data/lib/rigor/inference/method_dispatcher.rb +378 -524
- data/lib/rigor/inference/method_parameter_binder.rb +81 -114
- data/lib/rigor/inference/multi_target_binder.rb +51 -68
- data/lib/rigor/inference/mutation_widening.rb +115 -158
- data/lib/rigor/inference/narrowing.rb +509 -727
- data/lib/rigor/inference/origin_lookup.rb +38 -0
- data/lib/rigor/inference/parameter_inference_collector.rb +100 -100
- data/lib/rigor/inference/precision_scanner.rb +26 -35
- data/lib/rigor/inference/project_patched_methods.rb +20 -32
- data/lib/rigor/inference/project_patched_scanner.rb +23 -37
- data/lib/rigor/inference/protection_scanner.rb +16 -18
- data/lib/rigor/inference/rbs_type_translator.rb +49 -66
- data/lib/rigor/inference/scope_indexer.rb +473 -817
- data/lib/rigor/inference/statement_evaluator.rb +706 -1111
- data/lib/rigor/inference/struct_fold_safety.rb +34 -48
- data/lib/rigor/inference/synthetic_method.rb +9 -16
- data/lib/rigor/inference/synthetic_method_index.rb +20 -35
- data/lib/rigor/inference/synthetic_method_scanner.rb +63 -103
- data/lib/rigor/language_server/buffer_resolution.rb +6 -9
- data/lib/rigor/language_server/buffer_table.rb +11 -18
- data/lib/rigor/language_server/completion_provider.rb +69 -116
- data/lib/rigor/language_server/debouncer.rb +16 -25
- data/lib/rigor/language_server/diagnostic_publisher.rb +26 -40
- data/lib/rigor/language_server/document_symbol_provider.rb +14 -19
- data/lib/rigor/language_server/folding_range_provider.rb +11 -19
- data/lib/rigor/language_server/hover_provider.rb +8 -11
- data/lib/rigor/language_server/hover_renderer.rb +56 -93
- data/lib/rigor/language_server/loop.rb +14 -19
- data/lib/rigor/language_server/project_context.rb +46 -74
- data/lib/rigor/language_server/selection_range_provider.rb +9 -12
- data/lib/rigor/language_server/server.rb +55 -83
- data/lib/rigor/language_server/signature_help_provider.rb +29 -46
- data/lib/rigor/language_server/synchronized_writer.rb +4 -7
- data/lib/rigor/language_server/uri.rb +8 -13
- data/lib/rigor/language_server.rb +4 -6
- data/lib/rigor/mcp/loop.rb +2 -3
- data/lib/rigor/mcp/server.rb +4 -7
- data/lib/rigor/mcp.rb +3 -6
- data/lib/rigor/plugin/access_denied_error.rb +5 -8
- data/lib/rigor/plugin/additional_initializer.rb +21 -31
- data/lib/rigor/plugin/base.rb +335 -518
- data/lib/rigor/plugin/blueprint.rb +14 -23
- data/lib/rigor/plugin/box.rb +18 -29
- data/lib/rigor/plugin/fact_store.rb +16 -26
- data/lib/rigor/plugin/inflector.rb +37 -53
- data/lib/rigor/plugin/io_boundary.rb +33 -56
- data/lib/rigor/plugin/isolation.rb +42 -55
- data/lib/rigor/plugin/load_error.rb +10 -15
- data/lib/rigor/plugin/loader.rb +30 -49
- data/lib/rigor/plugin/macro/block_as_method.rb +20 -32
- data/lib/rigor/plugin/macro/heredoc_template.rb +35 -58
- data/lib/rigor/plugin/macro/nested_class_template.rb +22 -36
- data/lib/rigor/plugin/macro/trait_registry.rb +34 -51
- data/lib/rigor/plugin/macro.rb +10 -15
- data/lib/rigor/plugin/manifest.rb +85 -144
- data/lib/rigor/plugin/node_context.rb +14 -22
- data/lib/rigor/plugin/node_rule_walk.rb +49 -74
- data/lib/rigor/plugin/protocol_contract.rb +25 -39
- data/lib/rigor/plugin/registry.rb +132 -205
- data/lib/rigor/plugin/services.rb +21 -33
- data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +11 -19
- data/lib/rigor/plugin/trust_policy.rb +24 -38
- data/lib/rigor/plugin/type_node_resolver.rb +15 -24
- data/lib/rigor/protection/diagnostic_oracle.rb +11 -13
- data/lib/rigor/protection/mutation_scanner.rb +27 -35
- data/lib/rigor/protection/mutator.rb +50 -70
- data/lib/rigor/protection/test_suite_oracle.rb +20 -27
- data/lib/rigor/rbs_extended/conformance_checker.rb +48 -68
- data/lib/rigor/rbs_extended/hkt_directives.rb +28 -54
- data/lib/rigor/rbs_extended/reporter.rb +24 -40
- data/lib/rigor/rbs_extended.rb +107 -197
- data/lib/rigor/reflection.rb +68 -86
- data/lib/rigor/scope/discovery_index.rb +14 -19
- data/lib/rigor/scope.rb +255 -310
- data/lib/rigor/sig_gen/classification.rb +6 -10
- data/lib/rigor/sig_gen/generator.rb +197 -323
- data/lib/rigor/sig_gen/layout_index.rb +12 -20
- data/lib/rigor/sig_gen/method_candidate.rb +12 -17
- data/lib/rigor/sig_gen/observation_collector.rb +38 -70
- data/lib/rigor/sig_gen/observed_call.rb +13 -23
- data/lib/rigor/sig_gen/path_mapper.rb +17 -29
- data/lib/rigor/sig_gen/renderer.rb +7 -13
- data/lib/rigor/sig_gen/type_elaborator.rb +15 -28
- data/lib/rigor/sig_gen/write_result.rb +8 -16
- data/lib/rigor/sig_gen/writer.rb +95 -174
- data/lib/rigor/sig_gen.rb +3 -6
- data/lib/rigor/signature_path_audit.rb +24 -30
- data/lib/rigor/source/constant_path.rb +10 -14
- data/lib/rigor/source/literals.rb +31 -45
- data/lib/rigor/source/node_locator.rb +9 -11
- data/lib/rigor/source/node_walker.rb +9 -13
- data/lib/rigor/source.rb +3 -4
- data/lib/rigor/testing.rb +16 -20
- data/lib/rigor/triage/catalogue.rb +38 -62
- data/lib/rigor/triage.rb +31 -52
- data/lib/rigor/trinary.rb +9 -13
- data/lib/rigor/type/acceptance_router.rb +4 -6
- data/lib/rigor/type/accepts_result.rb +10 -14
- data/lib/rigor/type/app.rb +19 -27
- data/lib/rigor/type/bot.rb +4 -6
- data/lib/rigor/type/bound_method.rb +10 -15
- data/lib/rigor/type/combinator.rb +165 -257
- data/lib/rigor/type/constant.rb +23 -34
- data/lib/rigor/type/data_class.rb +10 -15
- data/lib/rigor/type/data_instance.rb +14 -20
- data/lib/rigor/type/difference.rb +21 -32
- data/lib/rigor/type/dynamic.rb +3 -5
- data/lib/rigor/type/hash_shape.rb +32 -18
- data/lib/rigor/type/integer_range.rb +11 -16
- data/lib/rigor/type/intersection.rb +27 -42
- data/lib/rigor/type/nominal.rb +10 -15
- data/lib/rigor/type/plain_lattice.rb +9 -13
- data/lib/rigor/type/refined.rb +67 -114
- data/lib/rigor/type/singleton.rb +4 -6
- data/lib/rigor/type/struct_class.rb +11 -16
- data/lib/rigor/type/struct_instance.rb +15 -21
- data/lib/rigor/type/tuple.rb +14 -19
- data/lib/rigor/type/union.rb +30 -42
- data/lib/rigor/type_node/generic.rb +14 -26
- data/lib/rigor/type_node/identifier.rb +12 -19
- data/lib/rigor/type_node.rb +3 -12
- data/lib/rigor/value_semantics.rb +16 -21
- data/lib/rigor/version.rb +1 -1
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/analyzer.rb +18 -30
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +16 -29
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +12 -23
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +22 -39
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/analyzer.rb +26 -46
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +51 -87
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +10 -17
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +26 -39
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +118 -176
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_discoverer.rb +30 -51
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +57 -92
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +71 -108
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/analyzer.rb +13 -22
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_discoverer.rb +15 -25
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_index.rb +8 -13
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +16 -24
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/analyzer.rb +30 -47
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +79 -129
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +36 -57
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +27 -41
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_table.rb +16 -24
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +148 -235
- data/plugins/rigor-activerecord/lib/rigor-activerecord.rb +3 -5
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/analyzer.rb +8 -14
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_discoverer.rb +9 -15
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_index.rb +4 -7
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +23 -41
- data/plugins/rigor-activestorage/lib/rigor-activestorage.rb +3 -5
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +6 -10
- data/plugins/rigor-activesupport-core-ext/lib/rigor-activesupport-core-ext.rb +8 -11
- data/plugins/rigor-devise/lib/rigor/plugin/devise.rb +30 -45
- data/plugins/rigor-devise/lib/rigor-devise.rb +3 -5
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +43 -69
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema.rb +26 -35
- data/plugins/rigor-dry-schema/lib/rigor-dry-schema.rb +3 -5
- data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +30 -47
- data/plugins/rigor-dry-struct/lib/rigor-dry-struct.rb +3 -5
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +67 -113
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +29 -46
- data/plugins/rigor-dry-types/lib/rigor-dry-types.rb +3 -5
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/contract_scanner.rb +13 -20
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +14 -23
- data/plugins/rigor-dry-validation/lib/rigor-dry-validation.rb +2 -3
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/analyzer.rb +22 -37
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +28 -46
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_index.rb +13 -17
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +30 -47
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +52 -80
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql.rb +21 -31
- data/plugins/rigor-graphql/lib/rigor-graphql.rb +3 -5
- data/plugins/rigor-hanami/lib/rigor/plugin/hanami/action_checker.rb +11 -17
- data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +20 -34
- data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +45 -75
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +22 -36
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest.rb +22 -41
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/analyzer.rb +17 -32
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +6 -12
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_index.rb +4 -8
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit.rb +17 -32
- data/plugins/rigor-rails/lib/rigor-rails.rb +11 -18
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +58 -92
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +20 -34
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +20 -31
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n.rb +49 -82
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +55 -92
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +51 -90
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/doorkeeper_routes.rb +17 -30
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +38 -70
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_table.rb +42 -74
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +280 -497
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +54 -89
- data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +32 -54
- data/plugins/rigor-rbs-inline/lib/rigor-rbs-inline.rb +8 -13
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/analyzer.rb +9 -16
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_scope_index.rb +24 -39
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_type_resolver.rb +13 -22
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +34 -56
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/scope_walker.rb +22 -42
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +43 -75
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/have_http_status_analyzer.rb +27 -39
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/http_status_codes.rb +14 -19
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +20 -34
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +28 -47
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers.rb +21 -37
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/analyzer.rb +13 -22
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_discoverer.rb +18 -31
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_index.rb +6 -10
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +14 -29
- data/plugins/rigor-sinatra/lib/rigor/plugin/sinatra.rb +23 -41
- data/plugins/rigor-sinatra/lib/rigor-sinatra.rb +3 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +23 -38
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +57 -96
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +22 -35
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog_walker.rb +41 -69
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/method_signature.rb +6 -10
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +24 -41
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sigil_detector.rb +29 -50
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/type_translator.rb +55 -88
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +159 -262
- data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +21 -29
- data/plugins/rigor-statesman/lib/rigor-statesman.rb +3 -5
- data/plugins/rigor-typescript-utility-types/lib/rigor/plugin/typescript_utility_types.rb +23 -37
- data/plugins/rigor-typescript-utility-types/lib/rigor-typescript-utility-types.rb +4 -6
- data/sig/rigor/scope.rbs +6 -0
- metadata +2 -1
|
@@ -12,23 +12,19 @@ require_relative "../project_scan"
|
|
|
12
12
|
module Rigor
|
|
13
13
|
module Analysis
|
|
14
14
|
class Runner
|
|
15
|
-
# Owns every project-wide pre-pass that runs once per run before
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
# the
|
|
19
|
-
# class discovery, and the ADR-24 def-node + visibility index.
|
|
20
|
-
# Also owns the {ProjectScan} snapshot adopt / build paths the LSP
|
|
21
|
-
# uses.
|
|
15
|
+
# Owns every project-wide pre-pass that runs once per run before per-file analysis: plugin load +
|
|
16
|
+
# `#prepare`, the ADR-10 dependency-source index, the ADR-16 synthetic-method scanner, the ADR-17
|
|
17
|
+
# project-patched (`pre_eval:`) scanner, cross-file class discovery, and the ADR-24 def-node +
|
|
18
|
+
# visibility index. Also owns the {ProjectScan} snapshot adopt / build paths the LSP uses.
|
|
22
19
|
#
|
|
23
|
-
# The collaborator produces a frozen {Result} bundle; the {Runner}
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
# the Runner) so this collaborator never calls back into it.
|
|
20
|
+
# The collaborator produces a frozen {Result} bundle; the {Runner} assigns each slot onto its own
|
|
21
|
+
# ivar surface, preserving the exact assignment order and timing the inline body had. The `pool_mode`
|
|
22
|
+
# predicate is injected (it keys on `@workers` / `@buffer`, owned by the Runner) so this collaborator
|
|
23
|
+
# never calls back into it.
|
|
28
24
|
class ProjectPrePasses
|
|
29
|
-
# Frozen bundle of the project-wide state the pre-passes produce.
|
|
30
|
-
#
|
|
31
|
-
#
|
|
25
|
+
# Frozen bundle of the project-wide state the pre-passes produce. Mirrors the ivars
|
|
26
|
+
# `run_project_pre_passes` / `adopt_prebuilt` set on the {Runner}, in the same order they were
|
|
27
|
+
# assigned.
|
|
32
28
|
Result = Data.define(
|
|
33
29
|
:plugin_registry,
|
|
34
30
|
:dependency_source_index,
|
|
@@ -62,29 +58,23 @@ module Rigor
|
|
|
62
58
|
@pool_mode_reader = pool_mode
|
|
63
59
|
end
|
|
64
60
|
|
|
65
|
-
# Internal: drives every project-wide pre-pass and returns the
|
|
66
|
-
#
|
|
67
|
-
# body expects. Extracted so `#prepare_project_scan` and the
|
|
61
|
+
# Internal: drives every project-wide pre-pass and returns the results bundled in {Result} in the
|
|
62
|
+
# order the downstream `#run` body expects. Extracted so `#prepare_project_scan` and the
|
|
68
63
|
# prebuilt-less `#run` path share one implementation.
|
|
69
64
|
def run(expansion:) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
70
65
|
plugin_registry = load_plugins
|
|
71
66
|
dependency_source_index = DependencySourceInference::Builder.build(@configuration.dependencies)
|
|
72
|
-
# ADR-18 slice 3 — plugin prepare MUST run before the
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
# the
|
|
76
|
-
#
|
|
77
|
-
# captured here so `pre_file_diagnostics` can re-emit
|
|
78
|
-
# them in the existing order without invoking prepare
|
|
79
|
-
# twice. Pool mode still re-runs prepare per worker
|
|
80
|
-
# (workers don't see this early invocation), preserving
|
|
67
|
+
# ADR-18 slice 3 — plugin prepare MUST run before the synthetic-method scanner so cross-plugin
|
|
68
|
+
# facts (`:dry_type_aliases` etc.) are already published when the scanner resolves Tier C
|
|
69
|
+
# `returns_from_arg:` lookups. The diagnostics produced by prepare are captured here so
|
|
70
|
+
# `pre_file_diagnostics` can re-emit them in the existing order without invoking prepare twice.
|
|
71
|
+
# Pool mode still re-runs prepare per worker (workers don't see this early invocation), preserving
|
|
81
72
|
# the existing Phase 4b contract.
|
|
82
73
|
cached_plugin_prepare_diagnostics =
|
|
83
74
|
pool_mode? ? [] : plugin_prepare_diagnostics(plugin_registry)
|
|
84
|
-
# ADR-16 slice 2b — Tier C pre-pass. Built once per run
|
|
85
|
-
#
|
|
86
|
-
#
|
|
87
|
-
# visible cross-file when per-file inference dispatches.
|
|
75
|
+
# ADR-16 slice 2b — Tier C pre-pass. Built once per run against the resolved file set + the loaded
|
|
76
|
+
# plugin registry's `heredoc_templates` so synthetic methods are visible cross-file when per-file
|
|
77
|
+
# inference dispatches.
|
|
88
78
|
synthetic_method_index = Inference::SyntheticMethodScanner.scan(
|
|
89
79
|
plugin_registry: plugin_registry,
|
|
90
80
|
paths: expansion.fetch(:files),
|
|
@@ -92,36 +82,27 @@ module Rigor
|
|
|
92
82
|
fact_store: shared_fact_store(plugin_registry),
|
|
93
83
|
buffer: @buffer
|
|
94
84
|
)
|
|
95
|
-
# ADR-17 slice 2 — pre-eval pre-pass. Built once per run
|
|
96
|
-
#
|
|
97
|
-
#
|
|
98
|
-
#
|
|
99
|
-
#
|
|
100
|
-
# is consulted by the dispatcher tier between plugins
|
|
101
|
-
# and dependency-source inference so project-side
|
|
102
|
-
# patches resolve cross-file.
|
|
85
|
+
# ADR-17 slice 2 — pre-eval pre-pass. Built once per run from the `pre_eval:` entries that exist
|
|
86
|
+
# on disk (slice-1's `pre-eval.file-not-found` `:error` already surfaced any missing entries; the
|
|
87
|
+
# scanner skips them here). The resulting {ProjectPatchedMethods} registry is consulted by the
|
|
88
|
+
# dispatcher tier between plugins and dependency-source inference so project-side patches resolve
|
|
89
|
+
# cross-file.
|
|
103
90
|
existing_pre_eval = @configuration.pre_eval.select { |path| File.file?(path) }
|
|
104
91
|
pre_eval_outcome = Inference::ProjectPatchedScanner.scan(existing_pre_eval, buffer: @buffer)
|
|
105
92
|
project_patched_methods = pre_eval_outcome.registry
|
|
106
93
|
pre_eval_diagnostics_from_scanner = pre_eval_outcome.diagnostics
|
|
107
|
-
# Cross-file class discovery — walks every project file
|
|
108
|
-
#
|
|
109
|
-
#
|
|
110
|
-
#
|
|
111
|
-
#
|
|
112
|
-
#
|
|
113
|
-
#
|
|
114
|
-
# `Google::Cloud::Storage::File`). Cost is one extra
|
|
115
|
-
# parse pass over the project; small projects pay
|
|
116
|
-
# tens of ms, larger projects ~1s. Future optimisation
|
|
117
|
-
# can share parses with the existing scanner passes.
|
|
94
|
+
# Cross-file class discovery — walks every project file for `class Foo` / `module Bar`
|
|
95
|
+
# declarations so a `Foo.method_call` receiver in one file resolves a `class Foo` declared in a
|
|
96
|
+
# sibling file. Without this pre-pass each file's `discovered_classes` was per-file only, and
|
|
97
|
+
# lexical lookup fell back to stdlib `::Foo` for any user class shadowing a stdlib name (e.g.
|
|
98
|
+
# `Google::Cloud::Storage::File`). Cost is one extra parse pass over the project; small projects
|
|
99
|
+
# pay tens of ms, larger projects ~1s. Future optimisation can share parses with the existing
|
|
100
|
+
# scanner passes.
|
|
118
101
|
discovered_classes =
|
|
119
102
|
Inference::ScopeIndexer.discovered_classes_for_paths(expansion.fetch(:files), buffer: @buffer)
|
|
120
|
-
# ADR-24 slice 2 — cross-file def-node + class->superclass
|
|
121
|
-
#
|
|
122
|
-
#
|
|
123
|
-
# file. One extra parse pass over the project; shares
|
|
124
|
-
# the cost profile of the class-discovery pass above.
|
|
103
|
+
# ADR-24 slice 2 — cross-file def-node + class->superclass index so an implicit-self call inside a
|
|
104
|
+
# subclass resolves a superclass `def` declared in a sibling file. One extra parse pass over the
|
|
105
|
+
# project; shares the cost profile of the class-discovery pass above.
|
|
125
106
|
def_index =
|
|
126
107
|
Inference::ScopeIndexer.discovered_def_index_for_paths(expansion.fetch(:files), buffer: @buffer)
|
|
127
108
|
Result.new(
|
|
@@ -145,11 +126,9 @@ module Rigor
|
|
|
145
126
|
)
|
|
146
127
|
end
|
|
147
128
|
|
|
148
|
-
# Builds the LSP-facing {ProjectScan} snapshot from a fresh
|
|
149
|
-
#
|
|
150
|
-
#
|
|
151
|
-
# populated `services.fact_store`) is the one the snapshot
|
|
152
|
-
# carries.
|
|
129
|
+
# Builds the LSP-facing {ProjectScan} snapshot from a fresh pre-pass run. The runner adopts `result`
|
|
130
|
+
# onto its ivars first so the same registry object that ran `#prepare` (and so the populated
|
|
131
|
+
# `services.fact_store`) is the one the snapshot carries.
|
|
153
132
|
def build_project_scan(result)
|
|
154
133
|
ProjectScan.new(
|
|
155
134
|
plugin_registry: result.plugin_registry,
|
|
@@ -161,12 +140,10 @@ module Rigor
|
|
|
161
140
|
)
|
|
162
141
|
end
|
|
163
142
|
|
|
164
|
-
# Translates a prebuilt {ProjectScan} snapshot supplied to
|
|
165
|
-
#
|
|
166
|
-
# the
|
|
167
|
-
#
|
|
168
|
-
# empty project scope), so they stay at their frozen-empty
|
|
169
|
-
# constructor defaults.
|
|
143
|
+
# Translates a prebuilt {ProjectScan} snapshot supplied to `Runner.new(prebuilt: ...)` into a
|
|
144
|
+
# {Result} the runner adopts the same way it adopts a fresh pre-pass run. The discovery tables are
|
|
145
|
+
# not part of the snapshot (the LSP path seeds an empty project scope), so they stay at their
|
|
146
|
+
# frozen-empty constructor defaults.
|
|
170
147
|
def adopt_prebuilt(scan)
|
|
171
148
|
Result.new(
|
|
172
149
|
plugin_registry: scan.plugin_registry,
|
|
@@ -189,11 +166,9 @@ module Rigor
|
|
|
189
166
|
)
|
|
190
167
|
end
|
|
191
168
|
|
|
192
|
-
# Returns the per-run shared `Plugin::FactStore` instance.
|
|
193
|
-
#
|
|
194
|
-
#
|
|
195
|
-
# threaded by `Plugin::Loader.load`). Returns `nil` when
|
|
196
|
-
# no plugins are loaded.
|
|
169
|
+
# Returns the per-run shared `Plugin::FactStore` instance. All loaded plugins share this store
|
|
170
|
+
# through their respective `Plugin::Services` (the same instance is threaded by
|
|
171
|
+
# `Plugin::Loader.load`). Returns `nil` when no plugins are loaded.
|
|
197
172
|
def shared_fact_store(plugin_registry)
|
|
198
173
|
return nil if plugin_registry.nil? || plugin_registry.empty?
|
|
199
174
|
|
|
@@ -206,13 +181,11 @@ module Rigor
|
|
|
206
181
|
@pool_mode_reader.call
|
|
207
182
|
end
|
|
208
183
|
|
|
209
|
-
# Loads project-configured plugins through {Rigor::Plugin::Loader}
|
|
210
|
-
#
|
|
211
|
-
#
|
|
212
|
-
#
|
|
213
|
-
#
|
|
214
|
-
# protocol hooks are inert in slice 1; later v0.1.0 slices
|
|
215
|
-
# wire the contribution merger through this registry.
|
|
184
|
+
# Loads project-configured plugins through {Rigor::Plugin::Loader} and returns the resulting
|
|
185
|
+
# {Rigor::Plugin::Registry}. Loader failures are isolated: each surfaces as a `:plugin_loader`
|
|
186
|
+
# diagnostic on the run's `Result` rather than aborting the analysis. Plugins that load successfully
|
|
187
|
+
# but contribute no protocol hooks are inert in slice 1; later v0.1.0 slices wire the contribution
|
|
188
|
+
# merger through this registry.
|
|
216
189
|
def load_plugins
|
|
217
190
|
return Plugin::Registry::EMPTY if @configuration.plugins.empty?
|
|
218
191
|
|
|
@@ -230,14 +203,11 @@ module Rigor
|
|
|
230
203
|
end
|
|
231
204
|
end
|
|
232
205
|
|
|
233
|
-
# Builds the {Rigor::Plugin::TrustPolicy} for this run. Trusted
|
|
234
|
-
#
|
|
235
|
-
#
|
|
236
|
-
#
|
|
237
|
-
#
|
|
238
|
-
# extras the user listed under `plugins_io.allowed_paths`.
|
|
239
|
-
# Slice 2 keeps `network_policy` `:disabled` — the only value
|
|
240
|
-
# the configuration accepts today.
|
|
206
|
+
# Builds the {Rigor::Plugin::TrustPolicy} for this run. Trusted gems are the gem-name half of every
|
|
207
|
+
# entry in `Configuration#plugins`. Allowed read roots default to the project root (CWD), the
|
|
208
|
+
# project's signature_paths, and each trusted gem's `Gem::Specification#full_gem_path`, plus any
|
|
209
|
+
# extras the user listed under `plugins_io.allowed_paths`. Slice 2 keeps `network_policy` `:disabled`
|
|
210
|
+
# — the only value the configuration accepts today.
|
|
241
211
|
def build_trust_policy
|
|
242
212
|
trusted_gems = @configuration.plugins.map { |entry| trusted_gem_name(entry) }.uniq
|
|
243
213
|
roots = [Dir.pwd]
|
|
@@ -272,18 +242,14 @@ module Rigor
|
|
|
272
242
|
nil
|
|
273
243
|
end
|
|
274
244
|
|
|
275
|
-
# ADR-9 slice 3 — invokes every loaded plugin's `#prepare`
|
|
276
|
-
#
|
|
277
|
-
#
|
|
278
|
-
#
|
|
279
|
-
# `services.fact_store`. Failures isolate as
|
|
280
|
-
# `:plugin_loader runtime-error` diagnostics, mirroring the
|
|
281
|
-
# `#diagnostics_for_file` raise envelope in
|
|
245
|
+
# ADR-9 slice 3 — invokes every loaded plugin's `#prepare` hook once per run, after the loader's
|
|
246
|
+
# `#init` pass and before per-file iteration. Plugins publish facts here for cross-plugin
|
|
247
|
+
# consumption via the shared `services.fact_store`. Failures isolate as `:plugin_loader
|
|
248
|
+
# runtime-error` diagnostics, mirroring the `#diagnostics_for_file` raise envelope in
|
|
282
249
|
# `plugin_runtime_error_diagnostic`.
|
|
283
250
|
#
|
|
284
|
-
# `Plugin::Loader` returns plugins in topological order by
|
|
285
|
-
#
|
|
286
|
-
# always run before consumers.
|
|
251
|
+
# `Plugin::Loader` returns plugins in topological order by `manifest(consumes:)` (ADR-9 slice 5), so
|
|
252
|
+
# producers always run before consumers.
|
|
287
253
|
def plugin_prepare_diagnostics(plugin_registry)
|
|
288
254
|
return [] if plugin_registry.empty?
|
|
289
255
|
|
|
@@ -3,27 +3,22 @@
|
|
|
3
3
|
module Rigor
|
|
4
4
|
module Analysis
|
|
5
5
|
class Runner
|
|
6
|
-
# Mutable per-run holder for the four end-of-pass snapshots that
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# list, and the `conforms-to` scan results (consumed by the
|
|
11
|
-
# diagnostic aggregator).
|
|
6
|
+
# Mutable per-run holder for the four end-of-pass snapshots that the analysis paths compute as a side
|
|
7
|
+
# effect and the rest of the run reads back: the RBS `class_decl_paths` / `signature_paths` tables
|
|
8
|
+
# (consumed by {RunStats}), the synthesized-namespace name list, and the `conforms-to` scan results
|
|
9
|
+
# (consumed by the diagnostic aggregator).
|
|
12
10
|
#
|
|
13
|
-
# The snapshots are written by whichever analysis path ran
|
|
14
|
-
#
|
|
15
|
-
# the
|
|
16
|
-
#
|
|
17
|
-
# ivars (the same pattern the reporter accumulators use) while
|
|
18
|
-
# letting the writer and readers live in separate objects without a
|
|
11
|
+
# The snapshots are written by whichever analysis path ran ({PoolCoordinator} sequential / fork-pool /
|
|
12
|
+
# fallback) and read by the {Runner} and {DiagnosticAggregator}. A shared mutable holder keeps the
|
|
13
|
+
# write/read timing bit-for-bit with the original inline ivars (the same pattern the reporter
|
|
14
|
+
# accumulators use) while letting the writer and readers live in separate objects without a
|
|
19
15
|
# back-reference cycle.
|
|
20
16
|
class RunSnapshots
|
|
21
17
|
attr_accessor :class_decl_paths, :signature_paths,
|
|
22
18
|
:synthesized_namespaces, :conformance_results
|
|
23
19
|
|
|
24
|
-
# Constructor defaults match the {Runner} constructor: the
|
|
25
|
-
#
|
|
26
|
-
# before the first analysis path runs are frozen empties.
|
|
20
|
+
# Constructor defaults match the {Runner} constructor: the pre-seed values `build_run_stats` /
|
|
21
|
+
# `pre_file_diagnostics` read before the first analysis path runs are frozen empties.
|
|
27
22
|
def initialize
|
|
28
23
|
@class_decl_paths = {}.freeze
|
|
29
24
|
@signature_paths = [].freeze
|
|
@@ -31,9 +26,8 @@ module Rigor
|
|
|
31
26
|
@conformance_results = [].freeze
|
|
32
27
|
end
|
|
33
28
|
|
|
34
|
-
# Per-`#run` reset. Mirrors the original `#run` body, which reset
|
|
35
|
-
#
|
|
36
|
-
# constructor defaults) at the top of each run.
|
|
29
|
+
# Per-`#run` reset. Mirrors the original `#run` body, which reset these to NON-frozen empties (distinct
|
|
30
|
+
# from the frozen constructor defaults) at the top of each run.
|
|
37
31
|
def reset_for_run
|
|
38
32
|
@class_decl_paths = {}.freeze
|
|
39
33
|
@signature_paths = []
|