rigortype 0.3.1 → 0.3.3

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.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -10
  3. data/data/core_overlay/pathname.rbs +5 -0
  4. data/data/core_overlay/resolv.rbs +31 -0
  5. data/data/core_overlay/string_scanner.rbs +5 -0
  6. data/data/gem_overlay/activesupport/core_ext.rbs +10 -6
  7. data/data/vendored_gem_sigs/bundler/bundler.rbs +39 -27
  8. data/data/vendored_gem_sigs/cgi/cgi_extras.rbs +6 -0
  9. data/data/vendored_gem_sigs/prism/prism_supplement.rbs +7 -0
  10. data/data/vendored_gem_sigs/racc/racc.rbs +67 -0
  11. data/data/vendored_gem_sigs/rubygems/rubygems_extras.rbs +20 -9
  12. data/docs/manual/02-cli-reference.md +71 -11
  13. data/docs/manual/03-configuration.md +16 -1
  14. data/docs/manual/04-diagnostics.md +8 -0
  15. data/docs/manual/12-caching.md +17 -5
  16. data/docs/manual/15-type-protection-coverage.md +122 -1
  17. data/docs/manual/plugins/rigor-rbs-inline.md +22 -0
  18. data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +8 -0
  19. data/lib/rigor/analysis/check_rules/declaration_sourced_guard.rb +53 -0
  20. data/lib/rigor/analysis/check_rules/rule_ids.rb +1 -0
  21. data/lib/rigor/analysis/check_rules/rule_walk.rb +7 -0
  22. data/lib/rigor/analysis/check_rules.rb +107 -28
  23. data/lib/rigor/analysis/incremental_session.rb +156 -11
  24. data/lib/rigor/analysis/plugin_fact_fingerprint.rb +14 -0
  25. data/lib/rigor/analysis/rule_catalog.rb +5 -1
  26. data/lib/rigor/analysis/run_cache_key.rb +17 -1
  27. data/lib/rigor/analysis/runner/buffer_pool_dispatcher.rb +201 -0
  28. data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +28 -10
  29. data/lib/rigor/analysis/runner/pool_coordinator.rb +7 -10
  30. data/lib/rigor/analysis/runner/project_pre_passes.rb +3 -1
  31. data/lib/rigor/analysis/runner.rb +78 -7
  32. data/lib/rigor/analysis/severity_stamp.rb +2 -1
  33. data/lib/rigor/bleeding_edge.rb +132 -7
  34. data/lib/rigor/cache/descriptor.rb +6 -1
  35. data/lib/rigor/cache/engine_source.rb +162 -0
  36. data/lib/rigor/cache/incremental_snapshot.rb +87 -18
  37. data/lib/rigor/cli/check_command.rb +49 -28
  38. data/lib/rigor/cli/coverage_command.rb +15 -2
  39. data/lib/rigor/cli/coverage_mutation.rb +242 -11
  40. data/lib/rigor/cli/fused_protection_renderer.rb +10 -0
  41. data/lib/rigor/cli/fused_protection_report.rb +12 -3
  42. data/lib/rigor/cli/mutation_fork_scan.rb +64 -0
  43. data/lib/rigor/cli/mutation_protection_renderer.rb +12 -0
  44. data/lib/rigor/cli/mutation_protection_report.rb +26 -5
  45. data/lib/rigor/cli/protection_renderer.rb +13 -0
  46. data/lib/rigor/cli/protection_report.rb +11 -3
  47. data/lib/rigor/cli/show_bleedingedge_command.rb +17 -4
  48. data/lib/rigor/cli/sig_gen_command.rb +5 -4
  49. data/lib/rigor/configuration.rb +45 -6
  50. data/lib/rigor/environment/bundle_sig_discovery.rb +2 -1
  51. data/lib/rigor/environment/rbs_coverage_report.rb +1 -1
  52. data/lib/rigor/environment/rbs_loader.rb +434 -75
  53. data/lib/rigor/environment.rb +28 -13
  54. data/lib/rigor/inference/anonymous_meta_class.rb +81 -0
  55. data/lib/rigor/inference/expression_typer.rb +62 -4
  56. data/lib/rigor/inference/fork_map.rb +47 -4
  57. data/lib/rigor/inference/method_dispatcher/constant_folding.rb +50 -2
  58. data/lib/rigor/inference/method_dispatcher/data_folding.rb +1 -1
  59. data/lib/rigor/inference/method_dispatcher/member_shape_projection.rb +35 -1
  60. data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +158 -12
  61. data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +64 -5
  62. data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +234 -11
  63. data/lib/rigor/inference/method_dispatcher/struct_folding.rb +3 -2
  64. data/lib/rigor/inference/method_dispatcher/uri_folding.rb +124 -1
  65. data/lib/rigor/inference/method_dispatcher.rb +41 -10
  66. data/lib/rigor/inference/mutation_widening.rb +30 -25
  67. data/lib/rigor/inference/narrowing.rb +3 -1
  68. data/lib/rigor/inference/optimistic_origin.rb +123 -0
  69. data/lib/rigor/inference/protection_scanner.rb +18 -2
  70. data/lib/rigor/inference/receiver_alias.rb +57 -0
  71. data/lib/rigor/inference/scope_indexer.rb +197 -55
  72. data/lib/rigor/inference/singleton_object_constant.rb +63 -0
  73. data/lib/rigor/inference/statement_evaluator.rb +55 -4
  74. data/lib/rigor/language_server/buffer_table.rb +22 -0
  75. data/lib/rigor/language_server/diagnostic_publisher.rb +203 -4
  76. data/lib/rigor/language_server/project_context.rb +45 -0
  77. data/lib/rigor/language_server/publish_batcher.rb +82 -0
  78. data/lib/rigor/language_server/server.rb +20 -1
  79. data/lib/rigor/language_server.rb +1 -0
  80. data/lib/rigor/plugin/node_rule_walk.rb +6 -0
  81. data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +9 -3
  82. data/lib/rigor/protection/closure_kill_oracle.rb +190 -0
  83. data/lib/rigor/protection/dependency_closure.rb +59 -0
  84. data/lib/rigor/protection/diagnostic_oracle.rb +12 -8
  85. data/lib/rigor/protection/discovery_seed.rb +116 -0
  86. data/lib/rigor/protection/kill_signature.rb +31 -0
  87. data/lib/rigor/protection/mutation_cache.rb +355 -0
  88. data/lib/rigor/protection/mutation_scanner.rb +55 -11
  89. data/lib/rigor/protection/mutator.rb +26 -4
  90. data/lib/rigor/runtime/jit.rb +63 -1
  91. data/lib/rigor/scope/discovery_index.rb +9 -0
  92. data/lib/rigor/scope.rb +114 -10
  93. data/lib/rigor/sig_gen/generator.rb +130 -31
  94. data/lib/rigor/sig_gen/layout_index.rb +6 -0
  95. data/lib/rigor/sig_gen/meta_class_shape.rb +84 -0
  96. data/lib/rigor/sig_gen/renderer.rb +20 -1
  97. data/lib/rigor/sig_gen/write_result.rb +6 -4
  98. data/lib/rigor/sig_gen/writer.rb +12 -0
  99. data/lib/rigor/sig_gen.rb +1 -0
  100. data/lib/rigor/source/node_walker.rb +12 -0
  101. data/lib/rigor/type/anonymous_class_name.rb +40 -0
  102. data/lib/rigor/type/nominal.rb +5 -2
  103. data/lib/rigor/type/singleton.rb +4 -1
  104. data/lib/rigor/version.rb +1 -1
  105. data/plugins/rigor-activesupport-core-ext/sig/active_support/core_ext.rbs +6 -6
  106. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/result_shape.rb +146 -0
  107. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +177 -12
  108. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema.rb +74 -7
  109. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/contract_scanner.rb +257 -0
  110. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/params_shape.rb +69 -0
  111. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +87 -11
  112. data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +34 -4
  113. data/sig/rigor/inference/void_origin.rbs +6 -3
  114. data/sig/rigor/scope.rbs +12 -0
  115. data/sig/rigor.rbs +4 -0
  116. metadata +21 -1
@@ -1,8 +1,8 @@
1
1
  module Rigor
2
2
  module Inference
3
- # `VoidOrigin = Data.define(:class_name, :method_name, :kind)`. Declared as a `::Data` subclass because
4
- # that is the shape the runtime actually builds; `sig-gen` cannot yet read a `Data.define` assignment
5
- # (it reports the block body's `#label` against the enclosing namespace and drops the members).
3
+ # `VoidOrigin = Data.define(:class_name, :method_name, :kind)`. Declared as a `::Data` subclass because that
4
+ # is the shape the runtime actually builds. `sig-gen` reads this form since #227 and generates the same
5
+ # structure; the member types are hand-narrowed from the `untyped` only `--params=observed` could improve on.
6
6
  class VoidOrigin < ::Data
7
7
  attr_reader class_name: String
8
8
  attr_reader method_name: Symbol
@@ -11,6 +11,9 @@ module Rigor
11
11
  def self.new: (class_name: String, method_name: Symbol, kind: Symbol) -> instance
12
12
  | (String class_name, Symbol method_name, Symbol kind) -> instance
13
13
 
14
+ def self.[]: (class_name: String, method_name: Symbol, kind: Symbol) -> instance
15
+ | (String class_name, Symbol method_name, Symbol kind) -> instance
16
+
14
17
  # A human-facing `Class#method` / `Class.method` label for the diagnostic message.
15
18
  def label: () -> String
16
19
  end
data/sig/rigor/scope.rbs CHANGED
@@ -12,10 +12,14 @@ module Rigor
12
12
  attr_reader local_origins: Hash[Symbol, Symbol]
13
13
  attr_reader ivar_origins: Hash[Symbol, Symbol]
14
14
  attr_reader void_origins: Hash[untyped, Inference::VoidOrigin]
15
+ attr_reader optimistic_origins: Hash[untyped, Symbol]
16
+ attr_reader optimistic_locals: Hash[Symbol, Symbol]
17
+ attr_reader optimistic_ivars: Hash[Symbol, Symbol]
15
18
  attr_reader indexed_narrowings: Hash[IndexedKey, Type::t]
16
19
  attr_reader method_chain_narrowings: Hash[ChainKey, Type::t]
17
20
  attr_reader source_path: String?
18
21
  attr_reader struct_fold_safe_locals: Set[Symbol]
22
+ attr_reader opaque_block_self: bool
19
23
 
20
24
  # ADR-53 Track A — the seed-time discovery tables live on the
21
25
  # DiscoveryIndex; Scope keeps per-table readers as delegates.
@@ -39,6 +43,7 @@ module Rigor
39
43
  def param_inferred_types: () -> Hash[[String, Symbol, Symbol], Hash[Symbol, Type::t]]
40
44
  def run_generation: () -> Object?
41
45
  def record_dynamic_origin: (untyped node, Symbol cause) -> Scope
46
+ def record_optimistic_origin: (untyped node, Symbol cause) -> Scope
42
47
 
43
48
  def record_void_origin: (untyped node, Inference::VoidOrigin origin) -> Scope
44
49
 
@@ -86,6 +91,8 @@ module Rigor
86
91
  def with_source_path: (String? path) -> Scope
87
92
  def with_struct_fold_safe: (Set[Symbol] locals) -> Scope
88
93
  def struct_fold_safe?: (String | Symbol name) -> bool
94
+ def entering_opaque_block: () -> Scope
95
+ def opaque_block_self?: () -> bool
89
96
  def with_discovery: (DiscoveryIndex index) -> Scope
90
97
  def local: (String | Symbol name) -> Type::t?
91
98
  def ivar: (String | Symbol name) -> Type::t?
@@ -93,9 +100,13 @@ module Rigor
93
100
  def global: (String | Symbol name) -> Type::t?
94
101
  def local_origin: (String | Symbol name) -> Symbol?
95
102
  def ivar_origin: (String | Symbol name) -> Symbol?
103
+ def optimistic_local: (String | Symbol name) -> Symbol?
104
+ def optimistic_ivar: (String | Symbol name) -> Symbol?
96
105
  def with_local: (String | Symbol name, Type::t type) -> Scope
97
106
  def with_ivar: (String | Symbol name, Type::t type) -> Scope
98
107
  def with_local_origin: (String | Symbol name, Symbol? cause) -> Scope
108
+ def with_optimistic_local: (String | Symbol name, Symbol? cause) -> Scope
109
+ def with_optimistic_ivar: (String | Symbol name, Symbol? cause) -> Scope
99
110
  def with_ivar_origin: (String | Symbol name, Symbol? cause) -> Scope
100
111
  def with_cvar: (String | Symbol name, Type::t type) -> Scope
101
112
  def with_global: (String | Symbol name, Type::t type) -> Scope
@@ -115,6 +126,7 @@ module Rigor
115
126
  def singleton_def_for: (String | Symbol class_name, String | Symbol method_name) -> untyped?
116
127
  def user_def_site_for: (String | Symbol class_name, String | Symbol method_name) -> String?
117
128
  def top_level_def_for: (String | Symbol method_name) -> untyped?
129
+ def bindable_top_level_def_for: (String | Symbol method_name) -> untyped?
118
130
  def toplevel?: () -> bool
119
131
  def discovered_method_visibility: (String | Symbol class_name, String | Symbol method_name) -> Symbol?
120
132
  def superclass_of: (String | Symbol class_name) -> String?
data/sig/rigor.rbs CHANGED
@@ -58,6 +58,10 @@ module Rigor
58
58
  # `node` / `location` are Prism values, received as `untyped`).
59
59
  def self.from_node: (untyped node, path: String, message: String, ?severity: Symbol, ?rule: String?, ?source_family: String, ?receiver_type: untyped, ?method_name: untyped, ?project_definition_site: untyped) -> Rigor::Analysis::Diagnostic
60
60
  def self.from_location: (untyped location, path: String, message: String, ?severity: Symbol, ?rule: String?, ?source_family: String, ?receiver_type: untyped, ?method_name: untyped, ?project_definition_site: untyped) -> Rigor::Analysis::Diagnostic
61
+ # `from_message_loc` / `from_name_loc` forward `**` to `from_location`, so their keyword surface is
62
+ # `from_location`'s; only the positional node differs.
63
+ def self.from_message_loc: (untyped node, path: String, message: String, ?severity: Symbol, ?rule: String?, ?source_family: String, ?receiver_type: untyped, ?method_name: untyped, ?project_definition_site: untyped) -> Rigor::Analysis::Diagnostic
64
+ def self.from_name_loc: (untyped node, path: String, message: String, ?severity: Symbol, ?rule: String?, ?source_family: String, ?receiver_type: untyped, ?method_name: untyped, ?project_definition_site: untyped) -> Rigor::Analysis::Diagnostic
61
65
  end
62
66
 
63
67
  class Result
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rigortype
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rigor contributors
@@ -290,6 +290,7 @@ files:
290
290
  - data/core_overlay/numeric.rbs
291
291
  - data/core_overlay/pathname.rbs
292
292
  - data/core_overlay/psych.rbs
293
+ - data/core_overlay/resolv.rbs
293
294
  - data/core_overlay/string_scanner.rbs
294
295
  - data/gem_overlay/activesupport/core_ext.rbs
295
296
  - data/vendored_gem_sigs/ast/ast.rbs
@@ -306,6 +307,7 @@ files:
306
307
  - data/vendored_gem_sigs/nokogiri/nokogiri_html5.rbs
307
308
  - data/vendored_gem_sigs/pg/pg.rbs
308
309
  - data/vendored_gem_sigs/prism/prism_supplement.rbs
310
+ - data/vendored_gem_sigs/racc/racc.rbs
309
311
  - data/vendored_gem_sigs/redis/errors.rbs
310
312
  - data/vendored_gem_sigs/redis/future.rbs
311
313
  - data/vendored_gem_sigs/redis/redis.rbs
@@ -395,6 +397,7 @@ files:
395
397
  - lib/rigor/analysis/check_rules.rb
396
398
  - lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb
397
399
  - lib/rigor/analysis/check_rules/dead_assignment_collector.rb
400
+ - lib/rigor/analysis/check_rules/declaration_sourced_guard.rb
398
401
  - lib/rigor/analysis/check_rules/duplicate_hash_key_collector.rb
399
402
  - lib/rigor/analysis/check_rules/inferred_param_guard.rb
400
403
  - lib/rigor/analysis/check_rules/ivar_write_collector.rb
@@ -428,6 +431,7 @@ files:
428
431
  - lib/rigor/analysis/run_cache_probe.rb
429
432
  - lib/rigor/analysis/run_stats.rb
430
433
  - lib/rigor/analysis/runner.rb
434
+ - lib/rigor/analysis/runner/buffer_pool_dispatcher.rb
431
435
  - lib/rigor/analysis/runner/diagnostic_aggregator.rb
432
436
  - lib/rigor/analysis/runner/pool_coordinator.rb
433
437
  - lib/rigor/analysis/runner/project_pre_passes.rb
@@ -444,6 +448,7 @@ files:
444
448
  - lib/rigor/builtins/regex_refinement.rb
445
449
  - lib/rigor/builtins/static_return_refinements.rb
446
450
  - lib/rigor/cache/descriptor.rb
451
+ - lib/rigor/cache/engine_source.rb
447
452
  - lib/rigor/cache/file_digest.rb
448
453
  - lib/rigor/cache/incremental_snapshot.rb
449
454
  - lib/rigor/cache/rbs_cache_producer.rb
@@ -477,6 +482,7 @@ files:
477
482
  - lib/rigor/cli/fused_protection_report.rb
478
483
  - lib/rigor/cli/lsp_command.rb
479
484
  - lib/rigor/cli/mcp_command.rb
485
+ - lib/rigor/cli/mutation_fork_scan.rb
480
486
  - lib/rigor/cli/mutation_protection_renderer.rb
481
487
  - lib/rigor/cli/mutation_protection_report.rb
482
488
  - lib/rigor/cli/options.rb
@@ -529,6 +535,7 @@ files:
529
535
  - lib/rigor/flow_contribution/merge_result.rb
530
536
  - lib/rigor/flow_contribution/merger.rb
531
537
  - lib/rigor/inference/acceptance.rb
538
+ - lib/rigor/inference/anonymous_meta_class.rb
532
539
  - lib/rigor/inference/block_parameter_binder.rb
533
540
  - lib/rigor/inference/body_fixpoint.rb
534
541
  - lib/rigor/inference/budget_trace.rb
@@ -599,6 +606,7 @@ files:
599
606
  - lib/rigor/inference/multi_target_binder.rb
600
607
  - lib/rigor/inference/mutation_widening.rb
601
608
  - lib/rigor/inference/narrowing.rb
609
+ - lib/rigor/inference/optimistic_origin.rb
602
610
  - lib/rigor/inference/origin_lookup.rb
603
611
  - lib/rigor/inference/parameter_inference_collector.rb
604
612
  - lib/rigor/inference/precision_scanner.rb
@@ -606,7 +614,9 @@ files:
606
614
  - lib/rigor/inference/project_patched_scanner.rb
607
615
  - lib/rigor/inference/protection_scanner.rb
608
616
  - lib/rigor/inference/rbs_type_translator.rb
617
+ - lib/rigor/inference/receiver_alias.rb
609
618
  - lib/rigor/inference/scope_indexer.rb
619
+ - lib/rigor/inference/singleton_object_constant.rb
610
620
  - lib/rigor/inference/statement_evaluator.rb
611
621
  - lib/rigor/inference/struct_fold_safety.rb
612
622
  - lib/rigor/inference/synthetic_method.rb
@@ -627,6 +637,7 @@ files:
627
637
  - lib/rigor/language_server/incremental_sync.rb
628
638
  - lib/rigor/language_server/loop.rb
629
639
  - lib/rigor/language_server/project_context.rb
640
+ - lib/rigor/language_server/publish_batcher.rb
630
641
  - lib/rigor/language_server/selection_range_provider.rb
631
642
  - lib/rigor/language_server/server.rb
632
643
  - lib/rigor/language_server/signature_help_provider.rb
@@ -661,7 +672,12 @@ files:
661
672
  - lib/rigor/plugin/source_rbs_synthesis_reporter.rb
662
673
  - lib/rigor/plugin/trust_policy.rb
663
674
  - lib/rigor/plugin/type_node_resolver.rb
675
+ - lib/rigor/protection/closure_kill_oracle.rb
676
+ - lib/rigor/protection/dependency_closure.rb
664
677
  - lib/rigor/protection/diagnostic_oracle.rb
678
+ - lib/rigor/protection/discovery_seed.rb
679
+ - lib/rigor/protection/kill_signature.rb
680
+ - lib/rigor/protection/mutation_cache.rb
665
681
  - lib/rigor/protection/mutation_scanner.rb
666
682
  - lib/rigor/protection/mutator.rb
667
683
  - lib/rigor/protection/test_suite_oracle.rb
@@ -677,6 +693,7 @@ files:
677
693
  - lib/rigor/sig_gen/classification.rb
678
694
  - lib/rigor/sig_gen/generator.rb
679
695
  - lib/rigor/sig_gen/layout_index.rb
696
+ - lib/rigor/sig_gen/meta_class_shape.rb
680
697
  - lib/rigor/sig_gen/method_candidate.rb
681
698
  - lib/rigor/sig_gen/observation_collector.rb
682
699
  - lib/rigor/sig_gen/observed_call.rb
@@ -701,6 +718,7 @@ files:
701
718
  - lib/rigor/type.rb
702
719
  - lib/rigor/type/acceptance_router.rb
703
720
  - lib/rigor/type/accepts_result.rb
721
+ - lib/rigor/type/anonymous_class_name.rb
704
722
  - lib/rigor/type/app.rb
705
723
  - lib/rigor/type/bot.rb
706
724
  - lib/rigor/type/bound_method.rb
@@ -776,6 +794,7 @@ files:
776
794
  - plugins/rigor-devise/lib/rigor/plugin/devise.rb
777
795
  - plugins/rigor-dry-schema/lib/rigor-dry-schema.rb
778
796
  - plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema.rb
797
+ - plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/result_shape.rb
779
798
  - plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb
780
799
  - plugins/rigor-dry-struct/lib/rigor-dry-struct.rb
781
800
  - plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb
@@ -785,6 +804,7 @@ files:
785
804
  - plugins/rigor-dry-validation/lib/rigor-dry-validation.rb
786
805
  - plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb
787
806
  - plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/contract_scanner.rb
807
+ - plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/params_shape.rb
788
808
  - plugins/rigor-dry-validation/sig/dry_validation.rbs
789
809
  - plugins/rigor-factorybot/lib/rigor-factorybot.rb
790
810
  - plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb