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
|
@@ -5,41 +5,31 @@ require_relative "../diagnostic"
|
|
|
5
5
|
module Rigor
|
|
6
6
|
module Analysis
|
|
7
7
|
class Runner
|
|
8
|
-
# Builds and orders every project-level diagnostic stream the
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
# the three reporter drains), and the final severity stamp.
|
|
8
|
+
# Builds and orders every project-level diagnostic stream the {Runner} surfaces — the pre-file
|
|
9
|
+
# streams (plugin load / prepare, ADR-10 dependency-source, pre-eval, RBS coverage, path errors), the
|
|
10
|
+
# post-analysis streams (synthesized namespaces, conforms-to, the three reporter drains), and the
|
|
11
|
+
# final severity stamp.
|
|
13
12
|
#
|
|
14
|
-
# Constraint: the relative order of every stream below is the
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
# streams the {Runner} drains after `analyze_files`.
|
|
13
|
+
# Constraint: the relative order of every stream below is the diagnostic output contract — callers
|
|
14
|
+
# MUST NOT reorder the concatenation in `pre_file_diagnostics` or the post-analysis streams the
|
|
15
|
+
# {Runner} drains after `analyze_files`.
|
|
18
16
|
#
|
|
19
|
-
# The collaborator holds the immutable per-run inputs (the
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
# read through injected reader procs so this collaborator never
|
|
25
|
-
# calls back into the {Runner} and the read happens at the exact
|
|
26
|
-
# point in the run the original inline read did.
|
|
17
|
+
# The collaborator holds the immutable per-run inputs (the configuration and the three mutable
|
|
18
|
+
# reporter accumulators, which are shared instances the dispatcher records into). The per-run varying
|
|
19
|
+
# state produced by other passes (the plugin registry, the dependency-source index, and the four
|
|
20
|
+
# end-of-pass snapshots) is read through injected reader procs so this collaborator never calls back
|
|
21
|
+
# into the {Runner} and the read happens at the exact point in the run the original inline read did.
|
|
27
22
|
class DiagnosticAggregator # rubocop:disable Metrics/ClassLength
|
|
28
23
|
# @param configuration [Rigor::Configuration]
|
|
29
24
|
# @param rbs_extended_reporter [RbsExtended::Reporter]
|
|
30
|
-
# @param boundary_cross_reporter
|
|
31
|
-
#
|
|
32
|
-
# @param
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
# {Plugin::Registry} (varies per run).
|
|
36
|
-
# @param dependency_source_index [#call] reader returning the
|
|
37
|
-
# current {DependencySourceInference::Index}.
|
|
25
|
+
# @param boundary_cross_reporter [DependencySourceInference::BoundaryCrossReporter]
|
|
26
|
+
# @param source_rbs_synthesis_reporter [Plugin::SourceRbsSynthesisReporter]
|
|
27
|
+
# @param plugin_registry [#call] reader returning the current {Plugin::Registry} (varies per run).
|
|
28
|
+
# @param dependency_source_index [#call] reader returning the current
|
|
29
|
+
# {DependencySourceInference::Index}.
|
|
38
30
|
# @param pool_mode [#call] reader returning the pool-mode flag.
|
|
39
|
-
# @param cached_plugin_prepare_diagnostics [#call] reader
|
|
40
|
-
#
|
|
41
|
-
# @param pre_eval_diagnostics_from_scanner [#call] reader
|
|
42
|
-
# returning the pre-eval scanner diagnostics.
|
|
31
|
+
# @param cached_plugin_prepare_diagnostics [#call] reader returning the prepare-diagnostic snapshot.
|
|
32
|
+
# @param pre_eval_diagnostics_from_scanner [#call] reader returning the pre-eval scanner diagnostics.
|
|
43
33
|
# @param synthesized_namespaces_snapshot [#call] reader.
|
|
44
34
|
# @param conformance_results_snapshot [#call] reader.
|
|
45
35
|
def initialize(configuration:, rbs_extended_reporter:, boundary_cross_reporter:, # rubocop:disable Metrics/ParameterLists
|
|
@@ -60,29 +50,21 @@ module Rigor
|
|
|
60
50
|
@conformance_results_snapshot_reader = conformance_results_snapshot
|
|
61
51
|
end
|
|
62
52
|
|
|
63
|
-
# Pre-file diagnostic streams that fire once per run rather
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
# exist or aren't `.rb`. Aggregated here so `#run` stays
|
|
68
|
-
# under the ABC budget.
|
|
53
|
+
# Pre-file diagnostic streams that fire once per run rather than per analyzed file: plugin load /
|
|
54
|
+
# prepare envelopes, the ADR-10 dependency-source resolution surface, and the `expand_paths` errors
|
|
55
|
+
# for `paths:` entries that don't exist or aren't `.rb`. Aggregated here so `#run` stays under the
|
|
56
|
+
# ABC budget.
|
|
69
57
|
#
|
|
70
|
-
# ADR-15 Phase 4b — `plugin_prepare_diagnostics` runs on
|
|
71
|
-
#
|
|
72
|
-
#
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
# {#analyze_files_in_pool}). Skipping the coordinator
|
|
77
|
-
# prepare in pool mode avoids double-running `#prepare`
|
|
78
|
-
# against the coordinator-side plugin instances (which
|
|
79
|
-
# the pool path never consults for per-file analysis).
|
|
58
|
+
# ADR-15 Phase 4b — `plugin_prepare_diagnostics` runs on the coordinator's plugin registry under
|
|
59
|
+
# sequential mode; under pool mode each worker re-runs `prepare` against its own plugin instances,
|
|
60
|
+
# so the pool path drains the first worker's prepare-diagnostic snapshot into the aggregated
|
|
61
|
+
# diagnostic stream instead (see {#analyze_files_in_pool}). Skipping the coordinator prepare in pool
|
|
62
|
+
# mode avoids double-running `#prepare` against the coordinator-side plugin instances (which the
|
|
63
|
+
# pool path never consults for per-file analysis).
|
|
80
64
|
def pre_file_diagnostics(expansion)
|
|
81
|
-
# ADR-18 slice 3 — prepare diagnostics are captured
|
|
82
|
-
#
|
|
83
|
-
# so
|
|
84
|
-
# We re-surface the captured diagnostics here so the
|
|
85
|
-
# existing pre_file_diagnostics ordering is preserved.
|
|
65
|
+
# ADR-18 slice 3 — prepare diagnostics are captured earlier in #run (before the synthetic-method
|
|
66
|
+
# scanner) so cross-plugin facts are available to the scanner. We re-surface the captured
|
|
67
|
+
# diagnostics here so the existing pre_file_diagnostics ordering is preserved.
|
|
86
68
|
prepare = pool_mode? ? [] : cached_plugin_prepare_diagnostics
|
|
87
69
|
plugin_load_diagnostics +
|
|
88
70
|
prepare +
|
|
@@ -94,17 +76,13 @@ module Rigor
|
|
|
94
76
|
expansion.fetch(:errors)
|
|
95
77
|
end
|
|
96
78
|
|
|
97
|
-
# ADR-17 slice 1 — surface a `:error` diagnostic for each
|
|
98
|
-
# `
|
|
99
|
-
#
|
|
100
|
-
# a missing pre_eval path is a configuration mistake the
|
|
101
|
-
# user must fix before analysis is meaningful.
|
|
79
|
+
# ADR-17 slice 1 — surface a `:error` diagnostic for each `pre_eval:` entry whose resolved path
|
|
80
|
+
# doesn't exist on disk. Loud failure mode (`:error`, not `:warning`): a missing pre_eval path is a
|
|
81
|
+
# configuration mistake the user must fix before analysis is meaningful.
|
|
102
82
|
#
|
|
103
|
-
# Slice 2 adds the `:warning` `pre-eval.parse-error`
|
|
104
|
-
#
|
|
105
|
-
#
|
|
106
|
-
# merged here so both diagnostics flow through the same
|
|
107
|
-
# severity / ordering pipeline.
|
|
83
|
+
# Slice 2 adds the `:warning` `pre-eval.parse-error` stream from the pre-pass scanner — accumulated
|
|
84
|
+
# as `@pre_eval_diagnostics_from_scanner` during {#run} and merged here so both diagnostics flow
|
|
85
|
+
# through the same severity / ordering pipeline.
|
|
108
86
|
def pre_eval_diagnostics
|
|
109
87
|
not_found = @configuration.pre_eval.filter_map do |path|
|
|
110
88
|
next if File.file?(path)
|
|
@@ -144,14 +122,11 @@ module Rigor
|
|
|
144
122
|
end
|
|
145
123
|
end
|
|
146
124
|
|
|
147
|
-
# ADR-10 § "Diagnostic prefix family" — surfaces gems
|
|
148
|
-
#
|
|
149
|
-
#
|
|
150
|
-
#
|
|
151
|
-
#
|
|
152
|
-
# an unresolvable gem usually means a typo or a missing
|
|
153
|
-
# `bundle install` rather than a project-blocking problem;
|
|
154
|
-
# the severity profile still re-stamps it.
|
|
125
|
+
# ADR-10 § "Diagnostic prefix family" — surfaces gems listed in `dependencies.source_inference`
|
|
126
|
+
# that RubyGems could not resolve. The run continues; the gem simply contributes nothing this
|
|
127
|
+
# session, mirroring the plugin-load error envelope. Authored `:warning` because an unresolvable
|
|
128
|
+
# gem usually means a typo or a missing `bundle install` rather than a project-blocking problem; the
|
|
129
|
+
# severity profile still re-stamps it.
|
|
155
130
|
def dependency_source_diagnostics
|
|
156
131
|
dependency_source_index.unresolvable.map do |entry|
|
|
157
132
|
Diagnostic.new(
|
|
@@ -167,23 +142,16 @@ module Rigor
|
|
|
167
142
|
end
|
|
168
143
|
end
|
|
169
144
|
|
|
170
|
-
# ADR-10 § "Budget interaction" / slice 4 — emits one
|
|
171
|
-
#
|
|
172
|
-
#
|
|
173
|
-
#
|
|
174
|
-
#
|
|
175
|
-
#
|
|
176
|
-
#
|
|
177
|
-
#
|
|
178
|
-
#
|
|
179
|
-
#
|
|
180
|
-
# `Configuration::Dependencies` warnings accumulated
|
|
181
|
-
# during `from_h` deduplication of the `includes:`-chain
|
|
182
|
-
# source_inference array. Each warning describes a
|
|
183
|
-
# per-gem mode conflict that the merge resolved
|
|
184
|
-
# right-wins; the user sees one diagnostic per conflict.
|
|
185
|
-
# `:warning` matches the user's "warn but don't block"
|
|
186
|
-
# preference per the design discussion.
|
|
145
|
+
# ADR-10 § "Budget interaction" / slice 4 — emits one `:warning` per gem whose Walker run hit the
|
|
146
|
+
# `dependencies.budget_per_gem` cap. The cap is a Walker- side guard rail (slice 4 picks the (α)
|
|
147
|
+
# semantics from ADR-10 WD4: harvesting stops, the dispatcher behaves exactly as before for
|
|
148
|
+
# unrecorded methods). The diagnostic names the gem and points the user at the three remediations:
|
|
149
|
+
# ship RBS, reduce `mode:` from `full` to `when_missing`, or de-list the gem.
|
|
150
|
+
# ADR-10 § "config-conflict diagnostic" / 5d — surfaces `Configuration::Dependencies` warnings
|
|
151
|
+
# accumulated during `from_h` deduplication of the `includes:`-chain source_inference array. Each
|
|
152
|
+
# warning describes a per-gem mode conflict that the merge resolved right-wins; the user sees one
|
|
153
|
+
# diagnostic per conflict. `:warning` matches the user's "warn but don't block" preference per the
|
|
154
|
+
# design discussion.
|
|
187
155
|
def dependency_source_config_conflict_diagnostics
|
|
188
156
|
@configuration.dependencies.warnings.map do |message|
|
|
189
157
|
Diagnostic.new(
|
|
@@ -216,20 +184,15 @@ module Rigor
|
|
|
216
184
|
end
|
|
217
185
|
end
|
|
218
186
|
|
|
219
|
-
# O4 Layer 3 slice 3 — graceful-degradation coverage
|
|
220
|
-
#
|
|
221
|
-
#
|
|
222
|
-
# the
|
|
223
|
-
# `
|
|
224
|
-
#
|
|
225
|
-
# single `:info` diagnostic summarising the uncovered set
|
|
226
|
-
# so the user can act on it (run `rbs collection install`,
|
|
227
|
-
# opt the gem into `dependencies.source_inference:`, or
|
|
228
|
-
# accept the `Dynamic[T]` fallback).
|
|
187
|
+
# O4 Layer 3 slice 3 — graceful-degradation coverage report. When the project has a `Gemfile.lock`
|
|
188
|
+
# (slice 1) and one or more locked gems are not covered by ANY of the four RBS resolution paths
|
|
189
|
+
# (`DEFAULT_LIBRARIES`, `data/vendored_gem_sigs/`, slice-1 bundle-shipped `sig/`, slice-2
|
|
190
|
+
# `rbs_collection.lock.yaml`), emit a single `:info` diagnostic summarising the uncovered set so the
|
|
191
|
+
# user can act on it (run `rbs collection install`, opt the gem into `dependencies.source_inference:`,
|
|
192
|
+
# or accept the `Dynamic[T]` fallback).
|
|
229
193
|
#
|
|
230
|
-
# Suppressed when the lockfile is empty, when every gem
|
|
231
|
-
#
|
|
232
|
-
# discovery returned nothing (no lockfile to read).
|
|
194
|
+
# Suppressed when the lockfile is empty, when every gem is covered, or when slice 1's
|
|
195
|
+
# `bundler.lockfile` discovery returned nothing (no lockfile to read).
|
|
233
196
|
def rbs_coverage_diagnostics
|
|
234
197
|
locked = Environment::LockfileResolver.locked_gems(
|
|
235
198
|
lockfile_path: @configuration.bundler_lockfile,
|
|
@@ -261,14 +224,12 @@ module Rigor
|
|
|
261
224
|
[build_rbs_coverage_missing_diagnostic(missing)]
|
|
262
225
|
end
|
|
263
226
|
|
|
264
|
-
# Robustness uplift companion (ADR-5) — when the project's
|
|
265
|
-
#
|
|
266
|
-
#
|
|
267
|
-
# `
|
|
268
|
-
#
|
|
269
|
-
# sig set
|
|
270
|
-
# at the source. Authored `:info`: the analysis already succeeded;
|
|
271
|
-
# this is advisory, never a gate. Empty for a well-formed sig set.
|
|
227
|
+
# Robustness uplift companion (ADR-5) — when the project's `signature_paths:` RBS declared
|
|
228
|
+
# qualified names without their enclosing namespace, `RbsLoader` synthesizes the missing `module`s
|
|
229
|
+
# so the otherwise-inert signatures resolve. Surface a single `:info` diagnostic naming them so the
|
|
230
|
+
# user knows their sig set is malformed (`rbs validate` rejects it) and can fix it at the source.
|
|
231
|
+
# Authored `:info`: the analysis already succeeded; this is advisory, never a gate. Empty for a
|
|
232
|
+
# well-formed sig set.
|
|
272
233
|
def rbs_synthesized_namespace_diagnostics
|
|
273
234
|
synthesized = synthesized_namespaces_snapshot
|
|
274
235
|
return [] if synthesized.nil? || synthesized.empty?
|
|
@@ -276,16 +237,12 @@ module Rigor
|
|
|
276
237
|
[build_rbs_synthesized_namespace_diagnostic(synthesized)]
|
|
277
238
|
end
|
|
278
239
|
|
|
279
|
-
# Maps the per-run `rigor:v1:conforms-to` scan results into
|
|
280
|
-
#
|
|
281
|
-
#
|
|
282
|
-
#
|
|
283
|
-
#
|
|
284
|
-
#
|
|
285
|
-
# `:info` (the same fail-soft channel the other directive
|
|
286
|
-
# parsers use). Empty for a project with no directive, a
|
|
287
|
-
# well-formed conformance, or a non-sequential pool run (the
|
|
288
|
-
# snapshot mirrors `synthesized_namespaces`).
|
|
240
|
+
# Maps the per-run `rigor:v1:conforms-to` scan results into diagnostics (spec: `rbs-extended.md` §
|
|
241
|
+
# "Explicit conformance directive"). A class that declares `conforms-to _Interface` but is missing
|
|
242
|
+
# a required interface method surfaces as `rbs_extended.unsatisfied-conformance`; an unresolvable
|
|
243
|
+
# interface name surfaces as `dynamic.rbs-extended.unresolved` `:info` (the same fail-soft channel
|
|
244
|
+
# the other directive parsers use). Empty for a project with no directive, a well-formed
|
|
245
|
+
# conformance, or a non-sequential pool run (the snapshot mirrors `synthesized_namespaces`).
|
|
289
246
|
def conforms_to_diagnostics
|
|
290
247
|
results = conformance_results_snapshot
|
|
291
248
|
return [] if results.nil? || results.empty?
|
|
@@ -381,22 +338,18 @@ module Rigor
|
|
|
381
338
|
)
|
|
382
339
|
end
|
|
383
340
|
|
|
384
|
-
# ADR-13 slice 3b — drains the per-run
|
|
385
|
-
# {RbsExtended::Reporter} into one diagnostic per accumulated
|
|
341
|
+
# ADR-13 slice 3b — drains the per-run {RbsExtended::Reporter} into one diagnostic per accumulated
|
|
386
342
|
# event:
|
|
387
343
|
#
|
|
388
|
-
# - `dynamic.rbs-extended.unresolved` for every annotation
|
|
389
|
-
#
|
|
390
|
-
#
|
|
391
|
-
#
|
|
392
|
-
#
|
|
393
|
-
# type function (`pick_of`, …) applied to a carrier that
|
|
394
|
-
# loses precision (anything other than `HashShape` / `Tuple`).
|
|
344
|
+
# - `dynamic.rbs-extended.unresolved` for every annotation payload the parser could not turn into a
|
|
345
|
+
# {Rigor::Type}. Surfaces typos and references to plugin-supplied names the project did not
|
|
346
|
+
# enable.
|
|
347
|
+
# - `dynamic.shape.lossy-projection` for every shape-projection type function (`pick_of`, …) applied
|
|
348
|
+
# to a carrier that loses precision (anything other than `HashShape` / `Tuple`).
|
|
395
349
|
#
|
|
396
|
-
# Both are authored `:info`; the severity profile re-stamps
|
|
397
|
-
#
|
|
398
|
-
#
|
|
399
|
-
# to `.rigor.yml`-style file-level attribution otherwise.
|
|
350
|
+
# Both are authored `:info`; the severity profile re-stamps them per project taste. Path / line /
|
|
351
|
+
# column come from the annotation's `RBS::Location` when available, falling back to
|
|
352
|
+
# `.rigor.yml`-style file-level attribution otherwise.
|
|
400
353
|
def rbs_extended_reporter_diagnostics
|
|
401
354
|
return [] if @rbs_extended_reporter.empty?
|
|
402
355
|
|
|
@@ -423,16 +376,12 @@ module Rigor
|
|
|
423
376
|
unresolved + lossy
|
|
424
377
|
end
|
|
425
378
|
|
|
426
|
-
# ADR-32 WD6 — drains the per-run
|
|
427
|
-
#
|
|
428
|
-
#
|
|
429
|
-
#
|
|
430
|
-
#
|
|
431
|
-
#
|
|
432
|
-
# plugin (currently only `rigor-rbs-inline`) treats a
|
|
433
|
-
# parse failure as a no-contribution event so analysis
|
|
434
|
-
# continues; this stream surfaces the failure so the user
|
|
435
|
-
# can see which files contributed nothing and why.
|
|
379
|
+
# ADR-32 WD6 — drains the per-run {Plugin::SourceRbsSynthesisReporter} into
|
|
380
|
+
# `source-rbs-synthesis-failed` `:info` diagnostics. Each entry names the plugin that owns the
|
|
381
|
+
# synthesizer, the source file the rbs-inline parser couldn't process, and the upstream error
|
|
382
|
+
# message. The synthesizer-emitting plugin (currently only `rigor-rbs-inline`) treats a parse
|
|
383
|
+
# failure as a no-contribution event so analysis continues; this stream surfaces the failure so the
|
|
384
|
+
# user can see which files contributed nothing and why.
|
|
436
385
|
#
|
|
437
386
|
# Severity profile re-stamps the rule per project taste.
|
|
438
387
|
def source_rbs_synthesis_diagnostics
|
|
@@ -452,23 +401,17 @@ module Rigor
|
|
|
452
401
|
end
|
|
453
402
|
end
|
|
454
403
|
|
|
455
|
-
# ADR-10 slice 5c — drains the per-run
|
|
456
|
-
#
|
|
457
|
-
# `
|
|
458
|
-
#
|
|
459
|
-
# dispatch
|
|
460
|
-
#
|
|
461
|
-
# the same `(class_name, method_name)` — i.e., both
|
|
462
|
-
# contracts have an opinion. RBS still wins on the
|
|
463
|
-
# dispatch result; the diagnostic is purely advisory so
|
|
464
|
-
# the user can verify the two contracts haven't drifted.
|
|
404
|
+
# ADR-10 slice 5c — drains the per-run {DependencySourceInference::BoundaryCrossReporter} into
|
|
405
|
+
# `dynamic.dependency-source.boundary-cross` `:info` diagnostics. Each event flags a call site
|
|
406
|
+
# where RBS dispatch produced a concrete answer AND a `mode: :full` opt-in gem's source catalog
|
|
407
|
+
# ALSO contains an entry for the same `(class_name, method_name)` — i.e., both contracts have an
|
|
408
|
+
# opinion. RBS still wins on the dispatch result; the diagnostic is purely advisory so the user can
|
|
409
|
+
# verify the two contracts haven't drifted.
|
|
465
410
|
#
|
|
466
|
-
# Severity profile re-stamps the rule per project taste.
|
|
467
|
-
#
|
|
468
|
-
#
|
|
469
|
-
#
|
|
470
|
-
# like the other `dependency-source.*` diagnostics that
|
|
471
|
-
# report on opt-in configuration.
|
|
411
|
+
# Severity profile re-stamps the rule per project taste. The diagnostic carries no `path` / `line`
|
|
412
|
+
# / `column` because the crossing is per-method-per-gem, not per-call-site — the diagnostic anchors
|
|
413
|
+
# at `.rigor.yml` like the other `dependency-source.*` diagnostics that report on opt-in
|
|
414
|
+
# configuration.
|
|
472
415
|
def boundary_cross_diagnostics
|
|
473
416
|
return [] if @boundary_cross_reporter.empty?
|
|
474
417
|
|
|
@@ -513,11 +456,9 @@ module Rigor
|
|
|
513
456
|
name.empty? ? ".rigor.yml" : name
|
|
514
457
|
end
|
|
515
458
|
|
|
516
|
-
# ADR-8 § "Severity profile" — re-stamps each diagnostic's
|
|
517
|
-
# severity
|
|
518
|
-
#
|
|
519
|
-
# profile is the final filter. Diagnostics whose resolved
|
|
520
|
-
# severity is `:off` are dropped from the run result.
|
|
459
|
+
# ADR-8 § "Severity profile" — re-stamps each diagnostic's severity from the configured profile +
|
|
460
|
+
# per-rule overrides. Rules emit with their authored severity; the profile is the final filter.
|
|
461
|
+
# Diagnostics whose resolved severity is `:off` are dropped from the run result.
|
|
521
462
|
def apply_severity_profile(diagnostics)
|
|
522
463
|
diagnostics.filter_map { |diagnostic| stamp_severity(diagnostic) }
|
|
523
464
|
end
|