rbs 3.3.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -5
  3. data/.github/workflows/ruby.yml +7 -8
  4. data/.github/workflows/typecheck.yml +37 -0
  5. data/CHANGELOG.md +65 -0
  6. data/Gemfile +1 -1
  7. data/Gemfile.lock +11 -11
  8. data/README.md +1 -0
  9. data/Rakefile +2 -2
  10. data/Steepfile +2 -2
  11. data/core/array.rbs +19 -49
  12. data/core/basic_object.rbs +2 -2
  13. data/core/comparable.rbs +17 -8
  14. data/core/complex.rbs +82 -43
  15. data/core/data.rbs +2 -4
  16. data/core/dir.rbs +635 -295
  17. data/core/enumerable.rbs +11 -18
  18. data/core/enumerator.rbs +37 -31
  19. data/core/errors.rbs +4 -0
  20. data/core/false_class.rbs +34 -15
  21. data/core/fiber.rbs +23 -0
  22. data/core/file.rbs +329 -120
  23. data/core/float.rbs +17 -32
  24. data/core/gc.rbs +17 -11
  25. data/core/hash.rbs +22 -44
  26. data/core/integer.rbs +82 -113
  27. data/core/io/buffer.rbs +90 -47
  28. data/core/io.rbs +54 -121
  29. data/core/kernel.rbs +442 -489
  30. data/core/match_data.rbs +55 -56
  31. data/core/module.rbs +45 -1
  32. data/core/nil_class.rbs +98 -35
  33. data/core/numeric.rbs +22 -32
  34. data/core/object_space/weak_key_map.rbs +102 -0
  35. data/core/process.rbs +1242 -655
  36. data/core/ractor.rbs +139 -120
  37. data/core/range.rbs +100 -4
  38. data/core/rational.rbs +0 -4
  39. data/core/rbs/unnamed/argf.rbs +16 -8
  40. data/core/rbs/unnamed/env_class.rbs +0 -24
  41. data/core/refinement.rbs +8 -0
  42. data/core/regexp.rbs +1149 -598
  43. data/core/ruby_vm.rbs +126 -12
  44. data/core/rubygems/platform.rbs +9 -0
  45. data/core/rubygems/rubygems.rbs +1 -1
  46. data/core/rubygems/version.rbs +5 -1
  47. data/core/set.rbs +20 -22
  48. data/core/signal.rbs +4 -4
  49. data/core/string.rbs +283 -230
  50. data/core/string_io.rbs +2 -14
  51. data/core/struct.rbs +404 -24
  52. data/core/symbol.rbs +1 -19
  53. data/core/thread.rbs +29 -12
  54. data/core/time.rbs +227 -104
  55. data/core/trace_point.rbs +2 -5
  56. data/core/true_class.rbs +54 -21
  57. data/core/warning.rbs +14 -11
  58. data/docs/data_and_struct.md +29 -0
  59. data/docs/gem.md +58 -0
  60. data/docs/syntax.md +3 -5
  61. data/docs/tools.md +1 -0
  62. data/ext/rbs_extension/lexer.c +643 -559
  63. data/ext/rbs_extension/lexer.re +5 -1
  64. data/ext/rbs_extension/parser.c +12 -3
  65. data/ext/rbs_extension/unescape.c +7 -47
  66. data/lib/rbs/cli/diff.rb +4 -1
  67. data/lib/rbs/cli/validate.rb +280 -0
  68. data/lib/rbs/cli.rb +2 -194
  69. data/lib/rbs/collection/config.rb +5 -6
  70. data/lib/rbs/collection/sources/git.rb +1 -1
  71. data/lib/rbs/collection.rb +1 -0
  72. data/lib/rbs/diff.rb +7 -4
  73. data/lib/rbs/errors.rb +11 -0
  74. data/lib/rbs/test/errors.rb +10 -2
  75. data/lib/rbs/test/guaranteed.rb +2 -3
  76. data/lib/rbs/test/type_check.rb +15 -10
  77. data/lib/rbs/test.rb +3 -3
  78. data/lib/rbs/types.rb +29 -0
  79. data/lib/rbs/unit_test/convertibles.rb +176 -0
  80. data/lib/rbs/unit_test/spy.rb +136 -0
  81. data/lib/rbs/unit_test/type_assertions.rb +341 -0
  82. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  83. data/lib/rbs/unit_test.rb +6 -0
  84. data/lib/rbs/version.rb +1 -1
  85. data/sig/cli/validate.rbs +43 -0
  86. data/sig/diff.rbs +3 -1
  87. data/sig/errors.rbs +8 -0
  88. data/sig/rbs.rbs +1 -1
  89. data/sig/test/errors.rbs +52 -0
  90. data/sig/test/guranteed.rbs +9 -0
  91. data/sig/test/type_check.rbs +19 -0
  92. data/sig/test.rbs +82 -0
  93. data/sig/types.rbs +6 -1
  94. data/sig/unit_test/convertibles.rbs +154 -0
  95. data/sig/unit_test/spy.rbs +28 -0
  96. data/sig/unit_test/type_assertions.rbs +194 -0
  97. data/sig/unit_test/with_aliases.rbs +136 -0
  98. data/stdlib/base64/0/base64.rbs +307 -45
  99. data/stdlib/bigdecimal/0/big_decimal.rbs +35 -15
  100. data/stdlib/coverage/0/coverage.rbs +2 -2
  101. data/stdlib/csv/0/csv.rbs +25 -55
  102. data/stdlib/date/0/date.rbs +1 -43
  103. data/stdlib/date/0/date_time.rbs +1 -13
  104. data/stdlib/delegate/0/delegator.rbs +186 -0
  105. data/stdlib/delegate/0/kernel.rbs +47 -0
  106. data/stdlib/delegate/0/simple_delegator.rbs +98 -0
  107. data/stdlib/did_you_mean/0/did_you_mean.rbs +1 -1
  108. data/stdlib/erb/0/erb.rbs +2 -2
  109. data/stdlib/fileutils/0/fileutils.rbs +0 -19
  110. data/stdlib/io-console/0/io-console.rbs +12 -1
  111. data/stdlib/ipaddr/0/ipaddr.rbs +2 -1
  112. data/stdlib/json/0/json.rbs +320 -81
  113. data/stdlib/logger/0/logger.rbs +9 -5
  114. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +6 -6
  115. data/stdlib/monitor/0/monitor.rbs +78 -0
  116. data/stdlib/net-http/0/net-http.rbs +1880 -543
  117. data/stdlib/objspace/0/objspace.rbs +19 -13
  118. data/stdlib/openssl/0/openssl.rbs +508 -127
  119. data/stdlib/optparse/0/optparse.rbs +25 -11
  120. data/stdlib/pathname/0/pathname.rbs +1 -1
  121. data/stdlib/pp/0/pp.rbs +2 -5
  122. data/stdlib/prettyprint/0/prettyprint.rbs +2 -2
  123. data/stdlib/pstore/0/pstore.rbs +2 -4
  124. data/stdlib/rdoc/0/comment.rbs +1 -2
  125. data/stdlib/resolv/0/resolv.rbs +4 -2
  126. data/stdlib/socket/0/socket.rbs +2 -2
  127. data/stdlib/socket/0/unix_socket.rbs +2 -2
  128. data/stdlib/strscan/0/string_scanner.rbs +3 -2
  129. data/stdlib/tempfile/0/tempfile.rbs +1 -1
  130. data/stdlib/uri/0/common.rbs +245 -123
  131. metadata +24 -4
  132. data/lib/rbs/test/spy.rb +0 -6
data/core/string.rbs CHANGED
@@ -81,7 +81,7 @@
81
81
  # * `\k<name>` refers to the named capture `name`.
82
82
  #
83
83
  #
84
- # See regexp.rdoc for details.
84
+ # See Regexp for details.
85
85
  #
86
86
  # Note that within the string `replacement`, a character combination such as
87
87
  # `$&` is treated as ordinary text, and not as a special match variable.
@@ -92,10 +92,10 @@
92
92
  # text.
93
93
  # * `\'` corresponds to `$'`, which contains string after match.
94
94
  # * `\`` corresponds to `$``, which contains string before match.
95
- # * `+` corresponds to `$+`, which contains last capture group.
95
+ # * `\+` corresponds to `$+`, which contains last capture group.
96
96
  #
97
97
  #
98
- # See regexp.rdoc for details.
98
+ # See Regexp for details.
99
99
  #
100
100
  # Note that `\\\` is interpreted as an escape, i.e., a single backslash.
101
101
  #
@@ -279,7 +279,7 @@
279
279
  #
280
280
  # If argument `capture` is given and not `0`, it should be either an capture
281
281
  # group index (integer) or a capture group name (string or symbol); the slice is
282
- # the specified capture (see Regexp@Capturing):
282
+ # the specified capture (see Regexp@Groups+and+Captures):
283
283
  #
284
284
  # s = 'hello there'
285
285
  # s[/[aeiou](.)\1/, 1] # => "l"
@@ -629,6 +629,9 @@
629
629
  class String
630
630
  include Comparable
631
631
 
632
+ # A `selector` is a special type of string, used within methods like `String#tr`.
633
+ type selector = string
634
+
632
635
  # <!--
633
636
  # rdoc-file=string.c
634
637
  # - String.try_convert(object) -> object, new_string, or nil
@@ -642,9 +645,76 @@ class String
642
645
  #
643
646
  # Raises an exception unless `object.to_str` returns a String object.
644
647
  #
645
- def self.try_convert: (untyped obj) -> String?
648
+ def self.try_convert: (String object) -> String # technically will return `object` unchanged.
649
+ | (_ToStr object) -> String
650
+ | (untyped object) -> String?
651
+
652
+ # <!--
653
+ # rdoc-file=string.c
654
+ # - String.new(string = '', **opts) -> new_string
655
+ # -->
656
+ # Returns a new String that is a copy of `string`.
657
+ #
658
+ # With no arguments, returns the empty string with the Encoding `ASCII-8BIT`:
659
+ #
660
+ # s = String.new
661
+ # s # => ""
662
+ # s.encoding # => #<Encoding:ASCII-8BIT>
663
+ #
664
+ # With optional argument `string` and no keyword arguments, returns a copy of
665
+ # `string` with the same encoding:
666
+ #
667
+ # String.new('foo') # => "foo"
668
+ # String.new('тест') # => "тест"
669
+ # String.new('こんにちは') # => "こんにちは"
670
+ #
671
+ # (Unlike String.new, a [string
672
+ # literal](rdoc-ref:syntax/literals.rdoc@String+Literals) like `''` or a [here
673
+ # document literal](rdoc-ref:syntax/literals.rdoc@Here+Document+Literals) always
674
+ # has [script encoding](rdoc-ref:encodings.rdoc@Script+Encoding).)
675
+ #
676
+ # With optional keyword argument `encoding`, returns a copy of `string` with the
677
+ # specified encoding; the `encoding` may be an Encoding object, an encoding
678
+ # name, or an encoding name alias:
679
+ #
680
+ # String.new('foo', encoding: Encoding::US_ASCII).encoding # => #<Encoding:US-ASCII>
681
+ # String.new('foo', encoding: 'US-ASCII').encoding # => #<Encoding:US-ASCII>
682
+ # String.new('foo', encoding: 'ASCII').encoding # => #<Encoding:US-ASCII>
683
+ #
684
+ # The given encoding need not be valid for the string's content, and that
685
+ # validity is not checked:
686
+ #
687
+ # s = String.new('こんにちは', encoding: 'ascii')
688
+ # s.valid_encoding? # => false
689
+ #
690
+ # But the given `encoding` itself is checked:
691
+ #
692
+ # String.new('foo', encoding: 'bar') # Raises ArgumentError.
693
+ #
694
+ # With optional keyword argument `capacity`, returns a copy of `string` (or an
695
+ # empty string, if `string` is not given); the given `capacity` is advisory
696
+ # only, and may or may not set the size of the internal buffer, which may in
697
+ # turn affect performance:
698
+ #
699
+ # String.new(capacity: 1)
700
+ # String.new('foo', capacity: 4096)
701
+ #
702
+ # The `string`, `encoding`, and `capacity` arguments may all be used together:
703
+ #
704
+ # String.new('hello', encoding: 'UTF-8', capacity: 25)
705
+ #
706
+ def initialize: (?string source, ?encoding: encoding?, ?capacity: int?) -> self
646
707
 
647
- public
708
+ # <!--
709
+ # rdoc-file=string.c
710
+ # - replace(other_string) -> self
711
+ # -->
712
+ # Replaces the contents of `self` with the contents of `other_string`:
713
+ #
714
+ # s = 'foo' # => "foo"
715
+ # s.replace('bar') # => "bar"
716
+ #
717
+ alias initialize_copy replace
648
718
 
649
719
  # <!--
650
720
  # rdoc-file=string.c
@@ -662,8 +732,8 @@ class String
662
732
  # "foo = %{foo}" % {foo: 'bar'} # => "foo = bar"
663
733
  # "foo = %{foo}, baz = %{baz}" % {foo: 'bar', baz: 'bat'} # => "foo = bar, baz = bat"
664
734
  #
665
- def %: (Hash[Symbol, untyped]) -> String
666
- | (Array[untyped]) -> String
735
+ def %: (array[untyped] positional_args) -> String
736
+ | (hash[Symbol, untyped] named_args) -> String
667
737
  | (untyped arg) -> String
668
738
 
669
739
  # <!--
@@ -675,7 +745,7 @@ class String
675
745
  # "Ho! " * 3 # => "Ho! Ho! Ho! "
676
746
  # "Ho! " * 0 # => ""
677
747
  #
678
- def *: (int n) -> String
748
+ def *: (int amount) -> String
679
749
 
680
750
  # <!--
681
751
  # rdoc-file=string.c
@@ -685,7 +755,7 @@ class String
685
755
  #
686
756
  # "Hello from " + self.to_s # => "Hello from main"
687
757
  #
688
- def +: (string other_str) -> String
758
+ def +: (string other_string) -> String
689
759
 
690
760
  # <!--
691
761
  # rdoc-file=string.c
@@ -695,20 +765,28 @@ class String
695
765
  #
696
766
  # Otherwise returns `self.dup`, which is not frozen.
697
767
  #
698
- def +@: () -> String
768
+ def +@: () -> self
699
769
 
700
770
  # <!--
701
771
  # rdoc-file=string.c
702
772
  # - -string -> frozen_string
773
+ # - dedup -> frozen_string
703
774
  # -->
704
775
  # Returns a frozen, possibly pre-existing copy of the string.
705
776
  #
706
777
  # The returned String will be deduplicated as long as it does not have any
707
778
  # instance variables set on it and is not a String subclass.
708
779
  #
709
- # String#dedup is an alias for String#-@.
780
+ # Note that `-string` variant is more convenient for defining constants:
781
+ #
782
+ # FILENAME = -'config/database.yml'
783
+ #
784
+ # while `dedup` is better suitable for using the method in chains of
785
+ # calculations:
786
+ #
787
+ # @url_list.concat(urls.map(&:dedup))
710
788
  #
711
- def -@: () -> String
789
+ def -@: () -> self
712
790
 
713
791
  # <!--
714
792
  # rdoc-file=string.c
@@ -728,7 +806,7 @@ class String
728
806
  #
729
807
  # Related: String#concat, which takes multiple arguments.
730
808
  #
731
- def <<: (string | Integer str_or_codepoint) -> String
809
+ def <<: (string | Integer str_or_codepoint) -> self
732
810
 
733
811
  # <!--
734
812
  # rdoc-file=string.c
@@ -751,8 +829,8 @@ class String
751
829
  # 'foo' <=> 'FOO' # => 1
752
830
  # 'foo' <=> 1 # => nil
753
831
  #
754
- def <=>: (string other) -> Integer
755
- | (untyped other) -> Integer?
832
+ def <=>: (string) -> (-1 | 0 | 1)
833
+ | (untyped) -> (-1 | 0 | 1)?
756
834
 
757
835
  # <!--
758
836
  # rdoc-file=string.c
@@ -773,7 +851,7 @@ class String
773
851
  # If `object` is not an instance of String but responds to `to_str`, then the
774
852
  # two strings are compared using `object.==`.
775
853
  #
776
- def ==: (untyped obj) -> bool
854
+ def ==: (untyped other) -> bool
777
855
 
778
856
  # <!-- rdoc-file=string.c -->
779
857
  # Returns `true` if `object` has the same length and content; as `self`; `false`
@@ -790,7 +868,7 @@ class String
790
868
  # If `object` is not an instance of String but responds to `to_str`, then the
791
869
  # two strings are compared using `object.==`.
792
870
  #
793
- def ===: (untyped obj) -> bool
871
+ alias === ==
794
872
 
795
873
  # <!--
796
874
  # rdoc-file=string.c
@@ -804,7 +882,7 @@ class String
804
882
  # 'foo' =~ /o/ # => 1
805
883
  # 'foo' =~ /x/ # => nil
806
884
  #
807
- # Note: also updates Regexp@Special+global+variables.
885
+ # Note: also updates Regexp@Global+Variables.
808
886
  #
809
887
  # If the given `object` is not a Regexp, returns the value returned by `object
810
888
  # =~ self`.
@@ -818,7 +896,12 @@ class String
818
896
  # /(?<number>\d+)/ =~ "no. 9"
819
897
  # number #=> "9"
820
898
  #
821
- def =~: (untyped obj) -> Integer?
899
+ def =~: (Regexp regex) -> Integer?
900
+ | [T] (_MatchAgainst[self, T] object) -> T
901
+
902
+ interface _MatchAgainst[O, T]
903
+ def =~: (O string) -> T
904
+ end
822
905
 
823
906
  # <!--
824
907
  # rdoc-file=string.c
@@ -831,12 +914,10 @@ class String
831
914
  # Returns the substring of `self` specified by the arguments. See examples at
832
915
  # [String Slices](rdoc-ref:String@String+Slices).
833
916
  #
834
- def []: (int index) -> String?
835
- | (int start, int length) -> String?
836
- | (Range[Integer] | Range[Integer?] range) -> String?
837
- | (Regexp regexp) -> String?
838
- | (Regexp regexp, int | String capture) -> String?
839
- | (String match_str) -> String?
917
+ def []: (int start, ?int length) -> String?
918
+ | (range[int?] range) -> String?
919
+ | (Regexp regexp, ?MatchData::capture backref) -> String?
920
+ | (String substring) -> String?
840
921
 
841
922
  # <!--
842
923
  # rdoc-file=string.c
@@ -863,15 +944,12 @@ class String
863
944
  # s['lly'] = 'ncial' # => "ncial"
864
945
  # s # => "financial"
865
946
  #
866
- # String#slice is an alias for String#[].
867
- #
868
- def []=: (int pos, String new_str) -> String
869
- | (int begin_pos, int end_pos, String new_str) -> String
870
- | (Range[Integer] | Range[Integer?] range, String new_str) -> String
871
- | (Regexp regexp, String new_str) -> String
872
- | (Regexp regexp, int capture, String new_str) -> String
873
- | (Regexp regexp, String name, String new_str) -> String
874
- | (String other_str, String new_str) -> String
947
+ def []=: [T < _ToStr] (int index, T replacement) -> T
948
+ | [T < _ToStr] (int start, int length, T replacement) -> T
949
+ | [T < _ToStr] (range[int?] range, T replacement) -> T
950
+ | [T < _ToStr] (Regexp regexp, T replacement) -> T
951
+ | [T < _ToStr] (Regexp regexp, MatchData::capture backref, T replacement) -> T
952
+ | [T < _ToStr] (String substring, T replacement) -> T
875
953
 
876
954
  # <!--
877
955
  # rdoc-file=string.c
@@ -945,7 +1023,7 @@ class String
945
1023
  #
946
1024
  # Related: String#index, String#byterindex.
947
1025
  #
948
- def byteindex: (Regexp | string substr_or_regexp, ?int offset) -> Integer?
1026
+ def byteindex: (Regexp | string pattern, ?int offset) -> Integer?
949
1027
 
950
1028
  # <!--
951
1029
  # rdoc-file=string.c
@@ -1006,7 +1084,7 @@ class String
1006
1084
  #
1007
1085
  # Related: String#byteindex.
1008
1086
  #
1009
- def byterindex: (Regexp | string substr_or_regexp, ?int offset) -> Integer?
1087
+ def byterindex: (Regexp | string pattern, ?int offset) -> Integer?
1010
1088
 
1011
1089
  # <!--
1012
1090
  # rdoc-file=string.c
@@ -1020,7 +1098,7 @@ class String
1020
1098
  # # => [227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175]
1021
1099
  #
1022
1100
  def bytes: () -> Array[Integer]
1023
- | () { (Integer byte) -> void } -> String
1101
+ | () { (Integer byte) -> void } -> self
1024
1102
 
1025
1103
  # <!--
1026
1104
  # rdoc-file=string.c
@@ -1082,24 +1160,34 @@ class String
1082
1160
  # s.byteslice(4).encoding # => #<Encoding:UTF-8>
1083
1161
  #
1084
1162
  def byteslice: (int start, ?int length) -> String?
1085
- | (Range[Integer] | Range[Integer?] range) -> String?
1163
+ | (range[int?] range) -> String?
1086
1164
 
1087
1165
  # <!--
1088
1166
  # rdoc-file=string.c
1089
1167
  # - bytesplice(index, length, str) -> string
1090
- # - bytesplice(range, str) -> string
1168
+ # - bytesplice(index, length, str, str_index, str_length) -> string
1169
+ # - bytesplice(range, str) -> string
1170
+ # - bytesplice(range, str, str_range) -> string
1091
1171
  # -->
1092
1172
  # Replaces some or all of the content of `self` with `str`, and returns `self`.
1093
1173
  # The portion of the string affected is determined using the same criteria as
1094
1174
  # String#byteslice, except that `length` cannot be omitted. If the replacement
1095
1175
  # string is not the same length as the text it is replacing, the string will be
1096
- # adjusted accordingly. The form that take an Integer will raise an IndexError
1097
- # if the value is out of range; the Range form will raise a RangeError. If the
1098
- # beginning or ending offset does not land on character (codepoint) boundary, an
1099
- # IndexError will be raised.
1176
+ # adjusted accordingly.
1177
+ #
1178
+ # If `str_index` and `str_length`, or `str_range` are given, the content of
1179
+ # `self` is replaced by str.byteslice(str_index, str_length) or
1180
+ # str.byteslice(str_range); however the substring of `str` is not allocated as a
1181
+ # new string.
1182
+ #
1183
+ # The form that take an Integer will raise an IndexError if the value is out of
1184
+ # range; the Range form will raise a RangeError. If the beginning or ending
1185
+ # offset does not land on character (codepoint) boundary, an IndexError will be
1186
+ # raised.
1100
1187
  #
1101
- def bytesplice: (int index, int length, string str) -> String
1102
- | (Range[int?], string str) -> String
1188
+ def bytesplice: (int start, int length, string str) -> String
1189
+ | (int start, int length, string str, int str_start, int str_length) -> String
1190
+ | (range[int?] range, string str, ?range[int?] str_range) -> String
1103
1191
 
1104
1192
  # <!--
1105
1193
  # rdoc-file=string.c
@@ -1138,10 +1226,10 @@ class String
1138
1226
  #
1139
1227
  # Related: String#capitalize.
1140
1228
  #
1141
- def capitalize!: () -> String?
1142
- | (:ascii | :lithuanian | :turkic) -> String?
1143
- | (:lithuanian, :turkic) -> String?
1144
- | (:turkic, :lithuanian) -> String?
1229
+ def capitalize!: () -> self?
1230
+ | (:ascii | :lithuanian | :turkic) -> self?
1231
+ | (:lithuanian, :turkic) -> self?
1232
+ | (:turkic, :lithuanian) -> self?
1145
1233
 
1146
1234
  # <!--
1147
1235
  # rdoc-file=string.c
@@ -1168,7 +1256,8 @@ class String
1168
1256
  #
1169
1257
  # Related: String#casecmp?.
1170
1258
  #
1171
- def casecmp: (untyped other) -> Integer?
1259
+ def casecmp: (string other) -> (-1 | 0 | 1)
1260
+ | (untyped) -> (-1 | 0 | 1)?
1172
1261
 
1173
1262
  # <!--
1174
1263
  # rdoc-file=string.c
@@ -1191,7 +1280,8 @@ class String
1191
1280
  #
1192
1281
  # Related: String#casecmp.
1193
1282
  #
1194
- def casecmp?: (untyped other) -> bool?
1283
+ def casecmp?: (string other) -> bool
1284
+ | (untyped) -> bool?
1195
1285
 
1196
1286
  # <!--
1197
1287
  # rdoc-file=string.c
@@ -1216,7 +1306,7 @@ class String
1216
1306
  #
1217
1307
  # Related: String#ljust, String#rjust.
1218
1308
  #
1219
- def center: (int width, ?string padstr) -> String
1309
+ def center: (int width, ?string pad_string) -> String
1220
1310
 
1221
1311
  # <!--
1222
1312
  # rdoc-file=string.c
@@ -1229,7 +1319,7 @@ class String
1229
1319
  # 'こんにちは'.chars # => ["こ", "ん", "に", "ち", "は"]
1230
1320
  #
1231
1321
  def chars: () -> Array[String]
1232
- | () { (String char) -> void } -> String
1322
+ | () { (String char) -> void } -> self
1233
1323
 
1234
1324
  # <!--
1235
1325
  # rdoc-file=string.c
@@ -1264,7 +1354,7 @@ class String
1264
1354
  # 'abcd'.chomp('d') # => "abc"
1265
1355
  # 'abcdd'.chomp('d') # => "abcd"
1266
1356
  #
1267
- def chomp: (?string separator) -> String
1357
+ def chomp: (?string? separator) -> String
1268
1358
 
1269
1359
  # <!--
1270
1360
  # rdoc-file=string.c
@@ -1273,7 +1363,9 @@ class String
1273
1363
  # Like String#chomp, but modifies `self` in place; returns `nil` if no
1274
1364
  # modification made, `self` otherwise.
1275
1365
  #
1276
- def chomp!: (?string separator) -> String?
1366
+ def chomp!: (nil) -> nil
1367
+ # | (?string separator) -> self? # https://github.com/ruby/rbs/pull/1672#discussion_r1423324796
1368
+ | (?string? separator) -> self?
1277
1369
 
1278
1370
  # <!--
1279
1371
  # rdoc-file=string.c
@@ -1309,7 +1401,7 @@ class String
1309
1401
  #
1310
1402
  # Related: String#chomp!.
1311
1403
  #
1312
- def chop!: () -> String?
1404
+ def chop!: () -> self?
1313
1405
 
1314
1406
  # <!--
1315
1407
  # rdoc-file=string.c
@@ -1331,7 +1423,7 @@ class String
1331
1423
  # s = 'foo' # => "foo"
1332
1424
  # s.clear # => ""
1333
1425
  #
1334
- def clear: () -> String
1426
+ def clear: () -> self
1335
1427
 
1336
1428
  # <!--
1337
1429
  # rdoc-file=string.c
@@ -1344,8 +1436,8 @@ class String
1344
1436
  # 'тест'.codepoints # => [1090, 1077, 1089, 1090]
1345
1437
  # 'こんにちは'.codepoints # => [12371, 12435, 12395, 12385, 12399]
1346
1438
  #
1347
- def codepoints: () -> ::Array[Integer]
1348
- | () { (Integer codepoint) -> void } -> String
1439
+ def codepoints: () -> Array[Integer]
1440
+ | () { (Integer codepoint) -> void } -> self
1349
1441
 
1350
1442
  # <!--
1351
1443
  # rdoc-file=string.c
@@ -1365,7 +1457,7 @@ class String
1365
1457
  #
1366
1458
  # Related: String#<<, which takes a single argument.
1367
1459
  #
1368
- def concat: (*string | Integer str_or_codepoint) -> String
1460
+ def concat: (*string | Integer string_or_codepoints) -> self
1369
1461
 
1370
1462
  # <!--
1371
1463
  # rdoc-file=string.c
@@ -1389,7 +1481,7 @@ class String
1389
1481
  # c.count "\\A" #=> 0
1390
1482
  # c.count "X-\\w" #=> 3
1391
1483
  #
1392
- def count: (string other_str, *string other_strs) -> Integer
1484
+ def count: (selector selector_0, *selector more_selectors) -> Integer
1393
1485
 
1394
1486
  # <!--
1395
1487
  # rdoc-file=string.c
@@ -1453,7 +1545,14 @@ class String
1453
1545
  # The returned String will be deduplicated as long as it does not have any
1454
1546
  # instance variables set on it and is not a String subclass.
1455
1547
  #
1456
- # String#dedup is an alias for String#-@.
1548
+ # Note that `-string` variant is more convenient for defining constants:
1549
+ #
1550
+ # FILENAME = -'config/database.yml'
1551
+ #
1552
+ # while `dedup` is better suitable for using the method in chains of
1553
+ # calculations:
1554
+ #
1555
+ # @url_list.concat(urls.map(&:dedup))
1457
1556
  #
1458
1557
  alias dedup -@
1459
1558
 
@@ -1470,7 +1569,7 @@ class String
1470
1569
  # "hello".delete "aeiou", "^e" #=> "hell"
1471
1570
  # "hello".delete "ej-m" #=> "ho"
1472
1571
  #
1473
- def delete: (string other_str, *string other_strs) -> String
1572
+ def delete: (selector selector_0, *selector more_selectors) -> String
1474
1573
 
1475
1574
  # <!--
1476
1575
  # rdoc-file=string.c
@@ -1479,7 +1578,7 @@ class String
1479
1578
  # Like String#delete, but modifies `self` in place. Returns `self` if any
1480
1579
  # changes were made, `nil` otherwise.
1481
1580
  #
1482
- def delete!: (string other_str, *string other_strs) -> String?
1581
+ def delete!: (selector selector_0, *selector more_selectors) -> self?
1483
1582
 
1484
1583
  # <!--
1485
1584
  # rdoc-file=string.c
@@ -1503,7 +1602,7 @@ class String
1503
1602
  # Like String#delete_prefix, except that `self` is modified in place. Returns
1504
1603
  # `self` if the prefix is removed, `nil` otherwise.
1505
1604
  #
1506
- def delete_prefix!: (string prefix) -> String?
1605
+ def delete_prefix!: (string prefix) -> self?
1507
1606
 
1508
1607
  # <!--
1509
1608
  # rdoc-file=string.c
@@ -1527,7 +1626,7 @@ class String
1527
1626
  # Like String#delete_suffix, except that `self` is modified in place. Returns
1528
1627
  # `self` if the suffix is removed, `nil` otherwise.
1529
1628
  #
1530
- def delete_suffix!: (string suffix) -> String?
1629
+ def delete_suffix!: (string suffix) -> self?
1531
1630
 
1532
1631
  # <!--
1533
1632
  # rdoc-file=string.c
@@ -1565,10 +1664,10 @@ class String
1565
1664
  #
1566
1665
  # Related: String#downcase, String#upcase, String#upcase!.
1567
1666
  #
1568
- def downcase!: () -> String?
1569
- | (:ascii | :fold | :lithuanian | :turkic) -> String?
1570
- | (:lithuanian, :turkic) -> String?
1571
- | (:turkic, :lithuanian) -> String?
1667
+ def downcase!: () -> self?
1668
+ | (:ascii | :fold | :lithuanian | :turkic) -> self?
1669
+ | (:lithuanian, :turkic) -> self?
1670
+ | (:turkic, :lithuanian) -> self?
1572
1671
 
1573
1672
  # <!--
1574
1673
  # rdoc-file=string.c
@@ -1607,8 +1706,8 @@ class String
1607
1706
  #
1608
1707
  # Returns an enumerator if no block is given.
1609
1708
  #
1610
- def each_byte: () { (Integer byte) -> void } -> self
1611
- | () -> ::Enumerator[Integer, self]
1709
+ def each_byte: () -> Enumerator[Integer, self]
1710
+ | () { (Integer byte) -> void } -> self
1612
1711
 
1613
1712
  # <!--
1614
1713
  # rdoc-file=string.c
@@ -1633,8 +1732,8 @@ class String
1633
1732
  #
1634
1733
  # Returns an enumerator if no block is given.
1635
1734
  #
1636
- def each_char: () { (String char) -> void } -> self
1637
- | () -> ::Enumerator[String, self]
1735
+ def each_char: () -> Enumerator[String, self]
1736
+ | () { (String char) -> void } -> self
1638
1737
 
1639
1738
  # <!--
1640
1739
  # rdoc-file=string.c
@@ -1659,8 +1758,8 @@ class String
1659
1758
  #
1660
1759
  # Returns an enumerator if no block is given.
1661
1760
  #
1662
- def each_codepoint: () { (Integer codepoint) -> void } -> self
1663
- | () -> ::Enumerator[Integer, self]
1761
+ def each_codepoint: () -> Enumerator[Integer, self]
1762
+ | () { (Integer codepoint) -> void } -> self
1664
1763
 
1665
1764
  # <!--
1666
1765
  # rdoc-file=string.c
@@ -1681,8 +1780,8 @@ class String
1681
1780
  #
1682
1781
  # Returns an enumerator if no block is given.
1683
1782
  #
1684
- def each_grapheme_cluster: () { (String grapheme) -> void } -> self
1685
- | () -> ::Enumerator[String, self]
1783
+ def each_grapheme_cluster: () -> Enumerator[String, self]
1784
+ | () { (String grapheme_cluter) -> void } -> self
1686
1785
 
1687
1786
  # <!--
1688
1787
  # rdoc-file=string.c
@@ -1747,8 +1846,8 @@ class String
1747
1846
  #
1748
1847
  # With no block given, returns an enumerator.
1749
1848
  #
1750
- def each_line: (?string separator, ?chomp: boolish) { (String line) -> void } -> self
1751
- | (?string separator, ?chomp: boolish) -> Enumerator[String, self]
1849
+ def each_line: (?string? separator, ?chomp: boolish) -> Enumerator[String, self]
1850
+ | (?string? separator, ?chomp: boolish) { (String line) -> void } -> self
1752
1851
 
1753
1852
  # <!--
1754
1853
  # rdoc-file=string.c
@@ -1763,7 +1862,7 @@ class String
1763
1862
  def empty?: () -> bool
1764
1863
 
1765
1864
  # <!--
1766
- # rdoc-file=transcode.rdoc
1865
+ # rdoc-file=transcode.c
1767
1866
  # - encode(dst_encoding = Encoding.default_internal, **enc_opts) -> string
1768
1867
  # - encode(dst_encoding, src_encoding, **enc_opts) -> string
1769
1868
  # -->
@@ -1809,7 +1908,30 @@ class String
1809
1908
  # Optional keyword arguments `enc_opts` specify encoding options; see [Encoding
1810
1909
  # Options](rdoc-ref:encodings.rdoc@Encoding+Options).
1811
1910
  #
1812
- def encode: (?encoding encoding, ?encoding from_encoding, ?invalid: :replace ?, ?undef: :replace ?, ?replace: String, ?fallback: String::encode_fallback, ?xml: :text | :attr, ?universal_newline: true, ?cr_newline: true, ?crlf_newline: true) -> String
1911
+ # Please note that, unless `invalid: :replace` option is given, conversion from
1912
+ # an encoding `enc` to the same encoding `enc` (independent of whether `enc` is
1913
+ # given explicitly or implicitly) is a no-op, i.e. the string is simply copied
1914
+ # without any changes, and no exceptions are raised, even if there are invalid
1915
+ # bytes.
1916
+ #
1917
+ def encode: (
1918
+ ?encoding source_encoding,
1919
+ ?encoding? from_encoding,
1920
+ ?invalid: :replace ?,
1921
+ ?undef: :replace ?,
1922
+ ?replace: string?,
1923
+ ?xml: (:text | :attr)?,
1924
+ ?newline: (:universal | :crlf | :cr | :lf)?,
1925
+ ?universal_newline: boolish,
1926
+ ?cr_newline: boolish,
1927
+ ?crlf_newline: boolish,
1928
+ ?lf_newline: boolish,
1929
+ ?fallback: ^(String) -> string? | Method | _EncodeFallbackAref
1930
+ ) -> instance
1931
+
1932
+ interface _EncodeFallbackAref
1933
+ def []: (String) -> string?
1934
+ end
1813
1935
 
1814
1936
  # <!--
1815
1937
  # rdoc-file=transcode.c
@@ -1818,7 +1940,20 @@ class String
1818
1940
  # -->
1819
1941
  # Like #encode, but applies encoding changes to `self`; returns `self`.
1820
1942
  #
1821
- def encode!: (?encoding encoding, ?encoding from_encoding, ?invalid: :replace ?, ?undef: :replace ?, ?replace: String, ?fallback: String::encode_fallback, ?xml: :text | :attr, ?universal_newline: true, ?cr_newline: true, ?crlf_newline: true) -> self
1943
+ def encode!: (
1944
+ ?encoding source_encoding,
1945
+ ?encoding? from_encoding,
1946
+ ?invalid: :replace ?,
1947
+ ?undef: :replace ?,
1948
+ ?replace: string?,
1949
+ ?xml: (:text | :attr)?,
1950
+ ?newline: (:universal | :crlf | :cr | :lf)?,
1951
+ ?universal_newline: boolish,
1952
+ ?cr_newline: boolish,
1953
+ ?crlf_newline: boolish,
1954
+ ?lf_newline: boolish,
1955
+ ?fallback: ^(String) -> string? | Method | _EncodeFallbackAref
1956
+ ) -> self
1822
1957
 
1823
1958
  # <!--
1824
1959
  # rdoc-file=string.c
@@ -1888,7 +2023,7 @@ class String
1888
2023
  # s.force_encoding(Encoding::UTF_8) # => "łał"
1889
2024
  # s.valid_encoding? # => true
1890
2025
  #
1891
- def force_encoding: (string | Encoding encoding) -> self
2026
+ def force_encoding: (encoding enc) -> self
1892
2027
 
1893
2028
  # <!--
1894
2029
  # rdoc-file=string.c
@@ -1926,7 +2061,8 @@ class String
1926
2061
  # s.grapheme_clusters
1927
2062
  # # => ["ä", "-", "p", "q", "r", "-", "b̈", "-", "x", "y", "z", "-", "c̈"]
1928
2063
  #
1929
- def grapheme_clusters: () -> ::Array[::String]
2064
+ def grapheme_clusters: () -> Array[String]
2065
+ | () { (String grapheme_cluter) -> void } -> self
1930
2066
 
1931
2067
  # <!--
1932
2068
  # rdoc-file=string.c
@@ -1942,10 +2078,9 @@ class String
1942
2078
  #
1943
2079
  # Related: String#sub, String#sub!, String#gsub!.
1944
2080
  #
1945
- def gsub: (Regexp | string pattern, string replacement) -> String
1946
- | (Regexp | string pattern, Hash[String, String] hash) -> String
2081
+ def gsub: (Regexp | string pattern, string | hash[String, _ToS] replacement) -> String
2082
+ | (Regexp | string pattern) -> Enumerator[String, String]
1947
2083
  | (Regexp | string pattern) { (String match) -> _ToS } -> String
1948
- | (Regexp | string pattern) -> ::Enumerator[String, self]
1949
2084
 
1950
2085
  # <!--
1951
2086
  # rdoc-file=string.c
@@ -1962,10 +2097,9 @@ class String
1962
2097
  #
1963
2098
  # Related: String#sub, String#gsub, String#sub!.
1964
2099
  #
1965
- def gsub!: (Regexp | string pattern, string replacement) -> String?
1966
- | (Regexp | string pattern, Hash[String, String] hash) -> String?
1967
- | (Regexp | string pattern) { (String match) -> _ToS } -> String?
1968
- | (Regexp | string pattern) -> ::Enumerator[String, self]
2100
+ def gsub!: (Regexp | string pattern, string | hash[String, _ToS] replacement) -> self?
2101
+ | (Regexp | string pattern) -> Enumerator[String, self]
2102
+ | (Regexp | string pattern) { (String match) -> _ToS } -> self?
1969
2103
 
1970
2104
  # <!--
1971
2105
  # rdoc-file=string.c
@@ -2006,7 +2140,7 @@ class String
2006
2140
  # s.include?('fo') # => true
2007
2141
  # s.include?('food') # => false
2008
2142
  #
2009
- def include?: (string other_str) -> bool
2143
+ def include?: (string other_string) -> bool
2010
2144
 
2011
2145
  # <!--
2012
2146
  # rdoc-file=string.c
@@ -2052,7 +2186,7 @@ class String
2052
2186
  #
2053
2187
  # Related: String#rindex.
2054
2188
  #
2055
- def index: (Regexp | string substr_or_regexp, ?int offset) -> Integer?
2189
+ def index: (Regexp | string pattern, ?int offset) -> Integer?
2056
2190
 
2057
2191
  # <!--
2058
2192
  # rdoc-file=string.c
@@ -2069,7 +2203,7 @@ class String
2069
2203
  #
2070
2204
  # 'foo'.insert(-2, 'bar') # => "fobaro"
2071
2205
  #
2072
- def insert: (int index, string other_str) -> String
2206
+ def insert: (int index, string other_str) -> self
2073
2207
 
2074
2208
  # <!--
2075
2209
  # rdoc-file=string.c
@@ -2121,8 +2255,6 @@ class String
2121
2255
  # 'тест'.bytesize # => 8
2122
2256
  # 'こんにちは'.bytesize # => 15
2123
2257
  #
2124
- # String#size is an alias for String#length.
2125
- #
2126
2258
  def length: () -> Integer
2127
2259
 
2128
2260
  # <!--
@@ -2132,7 +2264,8 @@ class String
2132
2264
  # Forms substrings ("lines") of `self` according to the given arguments (see
2133
2265
  # String#each_line for details); returns the lines in an array.
2134
2266
  #
2135
- def lines: (?string separator, ?chomp: boolish) -> Array[String]
2267
+ def lines: (?string? separator, ?chomp: boolish) -> Array[String]
2268
+ | (?string? separator, ?chomp: boolish) { (String line) -> void } -> self
2136
2269
 
2137
2270
  # <!--
2138
2271
  # rdoc-file=string.c
@@ -2157,7 +2290,7 @@ class String
2157
2290
  #
2158
2291
  # Related: String#rjust, String#center.
2159
2292
  #
2160
- def ljust: (int integer, ?string padstr) -> String
2293
+ def ljust: (int size, ?string pad_string) -> String
2161
2294
 
2162
2295
  # <!--
2163
2296
  # rdoc-file=string.c
@@ -2193,7 +2326,7 @@ class String
2193
2326
  # -->
2194
2327
  # Returns a MatchData object (or `nil`) based on `self` and the given `pattern`.
2195
2328
  #
2196
- # Note: also updates Regexp@Special+global+variables.
2329
+ # Note: also updates Regexp@Global+Variables.
2197
2330
  #
2198
2331
  # * Computes `regexp` by converting `pattern` (if not already a Regexp).
2199
2332
  # regexp = Regexp.new(pattern)
@@ -2221,8 +2354,8 @@ class String
2221
2354
  # 'foo'.match(/x/) {|matchdata| matchdata } # => nil
2222
2355
  # 'foo'.match(/f/, 1) {|matchdata| matchdata } # => nil
2223
2356
  #
2224
- def match: (Regexp | string pattern, ?int pos) -> MatchData?
2225
- | [A] (Regexp | string pattern, ?int pos) { (MatchData) -> A } -> A
2357
+ def match: (Regexp | string pattern, ?int offset) -> MatchData?
2358
+ | [T] (Regexp | string pattern, ?int offset) { (MatchData matchdata) -> T } -> T?
2226
2359
 
2227
2360
  # <!--
2228
2361
  # rdoc-file=string.c
@@ -2231,7 +2364,7 @@ class String
2231
2364
  # Returns `true` or `false` based on whether a match is found for `self` and
2232
2365
  # `pattern`.
2233
2366
  #
2234
- # Note: does not update Regexp@Special+global+variables.
2367
+ # Note: does not update Regexp@Global+Variables.
2235
2368
  #
2236
2369
  # Computes `regexp` by converting `pattern` (if not already a Regexp).
2237
2370
  # regexp = Regexp.new(pattern)
@@ -2247,7 +2380,7 @@ class String
2247
2380
  # 'foo'.match?('f', 1) # => false
2248
2381
  # 'foo'.match?('o', 1) # => true
2249
2382
  #
2250
- def match?: (Regexp | string pattern, ?int pos) -> bool
2383
+ def match?: (Regexp | string pattern, ?int offset) -> bool
2251
2384
 
2252
2385
  # <!-- rdoc-file=string.c -->
2253
2386
  # Returns the successor to `self`. The successor is calculated by incrementing
@@ -2301,16 +2434,12 @@ class String
2301
2434
  #
2302
2435
  # ''.succ # => ""
2303
2436
  #
2304
- # String#next is an alias for String#succ.
2305
- #
2306
- def next: () -> String
2437
+ alias next succ
2307
2438
 
2308
2439
  # <!-- rdoc-file=string.c -->
2309
2440
  # Equivalent to String#succ, but modifies `self` in place; returns `self`.
2310
2441
  #
2311
- # String#next! is an alias for String#succ!.
2312
- #
2313
- def next!: () -> self
2442
+ alias next! succ!
2314
2443
 
2315
2444
  # <!--
2316
2445
  # rdoc-file=string.c
@@ -2373,7 +2502,7 @@ class String
2373
2502
  #
2374
2503
  # Related: String#rpartition, String#split.
2375
2504
  #
2376
- def partition: (Regexp | string sep_or_regexp) -> [ String, String, String ]
2505
+ def partition: (Regexp | string pattern) -> [String, String, String]
2377
2506
 
2378
2507
  # <!--
2379
2508
  # rdoc-file=string.c
@@ -2387,7 +2516,7 @@ class String
2387
2516
  #
2388
2517
  # Related: String#concat.
2389
2518
  #
2390
- def prepend: (*string other_strs) -> String
2519
+ def prepend: (*string other_strings) -> self
2391
2520
 
2392
2521
  # <!-- rdoc-file=string.c -->
2393
2522
  # Replaces the contents of `self` with the contents of `other_string`:
@@ -2395,7 +2524,7 @@ class String
2395
2524
  # s = 'foo' # => "foo"
2396
2525
  # s.replace('bar') # => "bar"
2397
2526
  #
2398
- def replace: (string other_str) -> String
2527
+ def replace: (string other_string) -> self
2399
2528
 
2400
2529
  # <!--
2401
2530
  # rdoc-file=string.c
@@ -2475,7 +2604,7 @@ class String
2475
2604
  #
2476
2605
  # Related: String#index.
2477
2606
  #
2478
- def rindex: (string | Regexp substr_or_regexp, ?int pos) -> Integer?
2607
+ def rindex: (Regexp | string pattern, ?int offset) -> Integer?
2479
2608
 
2480
2609
  # <!--
2481
2610
  # rdoc-file=string.c
@@ -2500,7 +2629,7 @@ class String
2500
2629
  #
2501
2630
  # Related: String#ljust, String#center.
2502
2631
  #
2503
- def rjust: (int integer, ?string padstr) -> String
2632
+ def rjust: (int size, ?string pad_string) -> String
2504
2633
 
2505
2634
  # <!--
2506
2635
  # rdoc-file=string.c
@@ -2532,7 +2661,7 @@ class String
2532
2661
  #
2533
2662
  # Related: String#partition, String#split.
2534
2663
  #
2535
- def rpartition: (string | Regexp sep_or_regexp) -> [ String, String, String ]
2664
+ def rpartition: (Regexp | string pattern) -> [String, String, String]
2536
2665
 
2537
2666
  # <!--
2538
2667
  # rdoc-file=string.c
@@ -2601,9 +2730,9 @@ class String
2601
2730
  # rceu lowlr
2602
2731
  #
2603
2732
  def scan: (Regexp pattern) -> Array[String | Array[String]]
2604
- | (Regexp pattern) { (String | Array[String]) -> void } -> self
2733
+ | (Regexp pattern) { (String | Array[String] matches) -> void } -> self
2605
2734
  | (string pattern) -> Array[String]
2606
- | (string pattern) { (String) -> void } -> self
2735
+ | (string pattern) { (String match) -> void } -> self
2607
2736
 
2608
2737
  # <!--
2609
2738
  # rdoc-file=string.c
@@ -2635,8 +2764,8 @@ class String
2635
2764
  # "\x81"
2636
2765
  # "\x81"
2637
2766
  #
2638
- def scrub: (?string repl) -> String
2639
- | () { (String bytes) -> string } -> String
2767
+ def scrub: (?string? replacement) -> String
2768
+ | (?nil) { (String bytes) -> string } -> String
2640
2769
 
2641
2770
  # <!--
2642
2771
  # rdoc-file=string.c
@@ -2646,8 +2775,8 @@ class String
2646
2775
  # -->
2647
2776
  # Like String#scrub, except that any replacements are made in `self`.
2648
2777
  #
2649
- def scrub!: (?string repl) -> self
2650
- | () { (String bytes) -> string } -> self
2778
+ def scrub!: (?string? replacement) -> self
2779
+ | (?nil) { (String bytes) -> string } -> self
2651
2780
 
2652
2781
  # <!--
2653
2782
  # rdoc-file=string.c
@@ -2661,7 +2790,7 @@ class String
2661
2790
  #
2662
2791
  # Related: String#getbyte.
2663
2792
  #
2664
- def setbyte: (int index, int integer) -> int
2793
+ def setbyte: [T < _ToInt] (int index, T byte) -> T
2665
2794
 
2666
2795
  # <!-- rdoc-file=string.c -->
2667
2796
  # Returns the count of characters (not bytes) in `self`:
@@ -2676,8 +2805,6 @@ class String
2676
2805
  # 'тест'.bytesize # => 8
2677
2806
  # 'こんにちは'.bytesize # => 15
2678
2807
  #
2679
- # String#size is an alias for String#length.
2680
- #
2681
2808
  alias size length
2682
2809
 
2683
2810
  # <!-- rdoc-file=string.c -->
@@ -2706,10 +2833,10 @@ class String
2706
2833
  # string.slice!("r") #=> "r"
2707
2834
  # string #=> "Thing"
2708
2835
  #
2709
- def slice!: (int integer, ?int integer) -> String?
2710
- | (Range[Integer] | Range[Integer?] range) -> String?
2711
- | (Regexp regexp, ?int | String capture) -> String?
2712
- | (String other_str) -> String?
2836
+ def slice!: (int index, ?int length) -> String?
2837
+ | (range[int?] range) -> String?
2838
+ | (String substring) -> String?
2839
+ | (Regexp regexp, ?MatchData::capture backref) -> String?
2713
2840
 
2714
2841
  # <!--
2715
2842
  # rdoc-file=string.c
@@ -2797,8 +2924,8 @@ class String
2797
2924
  #
2798
2925
  # Related: String#partition, String#rpartition.
2799
2926
  #
2800
- def split: (?Regexp | string pattern, ?int limit) -> Array[String]
2801
- | (?Regexp | string pattern, ?int limit) { (String) -> void } -> self
2927
+ def split: (?Regexp | string | nil pattern, ?int limit) -> Array[String]
2928
+ | (?Regexp | string | nil pattern, ?int limit) { (String substring) -> void } -> self
2802
2929
 
2803
2930
  # <!--
2804
2931
  # rdoc-file=string.c
@@ -2816,7 +2943,7 @@ class String
2816
2943
  # " now is the".squeeze(" ") #=> " now is the"
2817
2944
  # "putters shoot balls".squeeze("m-z") #=> "puters shot balls"
2818
2945
  #
2819
- def squeeze: (*string other_str) -> String
2946
+ def squeeze: (*selector selectors) -> String
2820
2947
 
2821
2948
  # <!--
2822
2949
  # rdoc-file=string.c
@@ -2825,7 +2952,7 @@ class String
2825
2952
  # Like String#squeeze, but modifies `self` in place. Returns `self` if any
2826
2953
  # changes were made, `nil` otherwise.
2827
2954
  #
2828
- def squeeze!: (*string other_str) -> self?
2955
+ def squeeze!: (*selector selectors) -> self?
2829
2956
 
2830
2957
  # <!--
2831
2958
  # rdoc-file=string.c
@@ -2851,7 +2978,7 @@ class String
2851
2978
  #
2852
2979
  # Related: String#end_with?.
2853
2980
  #
2854
- def start_with?: (*string prefixes) -> bool
2981
+ def start_with?: (*Regexp | string prefixes) -> bool
2855
2982
 
2856
2983
  # <!--
2857
2984
  # rdoc-file=string.c
@@ -2892,7 +3019,7 @@ class String
2892
3019
  #
2893
3020
  # Related: String#sub!, String#gsub, String#gsub!.
2894
3021
  #
2895
- def sub: (Regexp | string pattern, string | Hash[String, String] replacement) -> String
3022
+ def sub: (Regexp | string pattern, string | hash[String, _ToS] replacement) -> String
2896
3023
  | (Regexp | string pattern) { (String match) -> _ToS } -> String
2897
3024
 
2898
3025
  # <!--
@@ -2907,8 +3034,8 @@ class String
2907
3034
  #
2908
3035
  # Related: String#sub, String#gsub, String#gsub!.
2909
3036
  #
2910
- def sub!: (Regexp | string pattern, string | Hash[String, String] replacement) -> self?
2911
- | (Regexp | string pattern) { (String match) -> _ToS } -> String?
3037
+ def sub!: (Regexp | string pattern, string | hash[String, _ToS] replacement) -> self?
3038
+ | (Regexp | string pattern) { (String match) -> _ToS } -> self?
2912
3039
 
2913
3040
  # <!--
2914
3041
  # rdoc-file=string.c
@@ -2965,8 +3092,6 @@ class String
2965
3092
  #
2966
3093
  # ''.succ # => ""
2967
3094
  #
2968
- # String#next is an alias for String#succ.
2969
- #
2970
3095
  def succ: () -> String
2971
3096
 
2972
3097
  # <!--
@@ -2975,9 +3100,7 @@ class String
2975
3100
  # -->
2976
3101
  # Equivalent to String#succ, but modifies `self` in place; returns `self`.
2977
3102
  #
2978
- # String#next! is an alias for String#succ!.
2979
- #
2980
- def succ!: () -> String
3103
+ def succ!: () -> self
2981
3104
 
2982
3105
  # <!--
2983
3106
  # rdoc-file=string.c
@@ -2994,7 +3117,7 @@ class String
2994
3117
  #
2995
3118
  # This is not a particularly strong checksum.
2996
3119
  #
2997
- def sum: (?int n) -> Integer
3120
+ def sum: (?int bits) -> Integer
2998
3121
 
2999
3122
  # <!--
3000
3123
  # rdoc-file=string.c
@@ -3117,7 +3240,7 @@ class String
3117
3240
  # 'abcdef'.to_i # => 0
3118
3241
  # '2'.to_i(2) # => 0
3119
3242
  #
3120
- def to_i: (?int base) -> Integer
3243
+ def to_i: (?int radix) -> Integer
3121
3244
 
3122
3245
  # <!--
3123
3246
  # rdoc-file=rational.c
@@ -3155,17 +3278,13 @@ class String
3155
3278
  # Returns `self` if `self` is a String, or `self` converted to a String if
3156
3279
  # `self` is a subclass of String.
3157
3280
  #
3158
- # String#to_str is an alias for String#to_s.
3159
- #
3160
3281
  def to_s: () -> String
3161
3282
 
3162
3283
  # <!-- rdoc-file=string.c -->
3163
3284
  # Returns `self` if `self` is a String, or `self` converted to a String if
3164
3285
  # `self` is a subclass of String.
3165
3286
  #
3166
- # String#to_str is an alias for String#to_s.
3167
- #
3168
- def to_str: () -> String
3287
+ alias to_str to_s
3169
3288
 
3170
3289
  # <!-- rdoc-file=string.c -->
3171
3290
  # Returns the Symbol corresponding to *str*, creating the symbol if it did not
@@ -3182,7 +3301,7 @@ class String
3182
3301
  #
3183
3302
  # 'cat and dog'.to_sym #=> :"cat and dog"
3184
3303
  #
3185
- def to_sym: () -> Symbol
3304
+ alias to_sym intern
3186
3305
 
3187
3306
  # <!--
3188
3307
  # rdoc-file=string.c
@@ -3222,7 +3341,7 @@ class String
3222
3341
  # 'i-b-m'.tr('b\-z', 'a-z') # => "ibabm" # Escaped embedded hyphen.
3223
3342
  # 'foo\\bar'.tr('ab\\', 'XYZ') # => "fooZYXr" # Escaped backslash.
3224
3343
  #
3225
- def tr: (string from_str, string to_str) -> String
3344
+ def tr: (selector source, string relpacement) -> String
3226
3345
 
3227
3346
  # <!--
3228
3347
  # rdoc-file=string.c
@@ -3231,7 +3350,7 @@ class String
3231
3350
  # Like String#tr, but modifies `self` in place. Returns `self` if any changes
3232
3351
  # were made, `nil` otherwise.
3233
3352
  #
3234
- def tr!: (string from_str, string to_str) -> String?
3353
+ def tr!: (selector source, string relpacement) -> self?
3235
3354
 
3236
3355
  # <!--
3237
3356
  # rdoc-file=string.c
@@ -3246,7 +3365,7 @@ class String
3246
3365
  #
3247
3366
  # Related: String#squeeze.
3248
3367
  #
3249
- def tr_s: (string from_str, string to_str) -> String
3368
+ def tr_s: (selector source, string replacement) -> String
3250
3369
 
3251
3370
  # <!--
3252
3371
  # rdoc-file=string.c
@@ -3257,7 +3376,7 @@ class String
3257
3376
  #
3258
3377
  # Related: String#squeeze!.
3259
3378
  #
3260
- def tr_s!: (string from_str, string to_str) -> String?
3379
+ def tr_s!: (selector source, string replacement) -> self?
3261
3380
 
3262
3381
  # <!--
3263
3382
  # rdoc-file=string.c
@@ -3309,7 +3428,7 @@ class String
3309
3428
  #
3310
3429
  # Related: String#unicode_normalize!, String#unicode_normalized?.
3311
3430
  #
3312
- def unicode_normalize: (?:nfc | :nfd | :nfkc | :nfkd) -> String
3431
+ def unicode_normalize: (?:nfc | :nfd | :nfkc | :nfkd form) -> self
3313
3432
 
3314
3433
  # <!--
3315
3434
  # rdoc-file=string.c
@@ -3320,7 +3439,7 @@ class String
3320
3439
  #
3321
3440
  # Related String#unicode_normalized?.
3322
3441
  #
3323
- def unicode_normalize!: (?:nfc | :nfd | :nfkc | :nfkd) -> String
3442
+ def unicode_normalize!: (?:nfc | :nfd | :nfkc | :nfkd form) -> self
3324
3443
 
3325
3444
  # <!--
3326
3445
  # rdoc-file=string.c
@@ -3353,7 +3472,8 @@ class String
3353
3472
  # Extracts data from `self`, forming objects that become the elements of a new
3354
3473
  # array; returns that array. See [Packed Data](rdoc-ref:packed_data.rdoc).
3355
3474
  #
3356
- def unpack: (String format, ?offset: Integer) -> Array[Integer | Float | String | nil]
3475
+ def unpack: (string template, ?offset: int) -> Array[Integer | Float | String | nil]
3476
+ | (string template, ?offset: int) { (Integer | Float | String | nil value) -> void } -> nil
3357
3477
 
3358
3478
  # <!--
3359
3479
  # rdoc-file=pack.rb
@@ -3362,7 +3482,7 @@ class String
3362
3482
  # Like String#unpack, but unpacks and returns only the first extracted object.
3363
3483
  # See [Packed Data](rdoc-ref:packed_data.rdoc).
3364
3484
  #
3365
- def unpack1: (String format) -> (Integer | Float | String | nil)
3485
+ def unpack1: (string template, ?offset: int) -> (Integer | Float | String)?
3366
3486
 
3367
3487
  # <!--
3368
3488
  # rdoc-file=string.c
@@ -3439,8 +3559,8 @@ class String
3439
3559
  #
3440
3560
  # 'a8'.upto('b6') # => #<Enumerator: "a8":upto("b6")>
3441
3561
  #
3442
- def upto: (string other_str, ?boolish exclusive) -> Enumerator[String, self]
3443
- | (string other_str, ?boolish exclusive) { (String s) -> void } -> self
3562
+ def upto: (string other_string, ?boolish exclusive) -> Enumerator[String, self]
3563
+ | (string other_string, ?boolish exclusive) { (String s) -> void } -> self
3444
3564
 
3445
3565
  # <!--
3446
3566
  # rdoc-file=string.c
@@ -3453,79 +3573,12 @@ class String
3453
3573
  # "\x80".force_encoding("UTF-8").valid_encoding? # => false
3454
3574
  #
3455
3575
  def valid_encoding?: () -> bool
3456
-
3457
- private
3458
-
3459
- # <!--
3460
- # rdoc-file=string.c
3461
- # - String.new(string = '', **opts) -> new_string
3462
- # -->
3463
- # Returns a new String that is a copy of `string`.
3464
- #
3465
- # With no arguments, returns the empty string with the Encoding `ASCII-8BIT`:
3466
- #
3467
- # s = String.new
3468
- # s # => ""
3469
- # s.encoding # => #<Encoding:ASCII-8BIT>
3470
- #
3471
- # With optional argument `string` and no keyword arguments, returns a copy of
3472
- # `string` with the same encoding:
3473
- #
3474
- # String.new('foo') # => "foo"
3475
- # String.new('тест') # => "тест"
3476
- # String.new('こんにちは') # => "こんにちは"
3477
- #
3478
- # (Unlike String.new, a [string
3479
- # literal](rdoc-ref:syntax/literals.rdoc@String+Literals) like `''` or a [here
3480
- # document literal](rdoc-ref:syntax/literals.rdoc@Here+Document+Literals) always
3481
- # has [script encoding](rdoc-ref:encodings.rdoc@Script+Encoding).)
3482
- #
3483
- # With optional keyword argument `encoding`, returns a copy of `string` with the
3484
- # specified encoding; the `encoding` may be an Encoding object, an encoding
3485
- # name, or an encoding name alias:
3486
- #
3487
- # String.new('foo', encoding: Encoding::US_ASCII).encoding # => #<Encoding:US-ASCII>
3488
- # String.new('foo', encoding: 'US-ASCII').encoding # => #<Encoding:US-ASCII>
3489
- # String.new('foo', encoding: 'ASCII').encoding # => #<Encoding:US-ASCII>
3490
- #
3491
- # The given encoding need not be valid for the string's content, and that
3492
- # validity is not checked:
3493
- #
3494
- # s = String.new('こんにちは', encoding: 'ascii')
3495
- # s.valid_encoding? # => false
3496
- #
3497
- # But the given `encoding` itself is checked:
3498
- #
3499
- # String.new('foo', encoding: 'bar') # Raises ArgumentError.
3500
- #
3501
- # With optional keyword argument `capacity`, returns a copy of `string` (or an
3502
- # empty string, if `string` is not given); the given `capacity` is advisory
3503
- # only, and may or may not set the size of the internal buffer, which may in
3504
- # turn affect performance:
3505
- #
3506
- # String.new(capacity: 1)
3507
- # String.new('foo', capacity: 4096)
3508
- #
3509
- # The `string`, `encoding`, and `capacity` arguments may all be used together:
3510
- #
3511
- # String.new('hello', encoding: 'UTF-8', capacity: 25)
3512
- #
3513
- def initialize: (?string str, ?encoding: encoding, ?capacity: int) -> void
3514
-
3515
- # <!--
3516
- # rdoc-file=string.c
3517
- # - replace(other_string) -> self
3518
- # -->
3519
- # Replaces the contents of `self` with the contents of `other_string`:
3520
- #
3521
- # s = 'foo' # => "foo"
3522
- # s.replace('bar') # => "bar"
3523
- #
3524
- alias initialize_copy replace
3525
3576
  end
3526
3577
 
3578
+ %a{steep:deprecated}
3527
3579
  interface _ArefFromStringToString
3528
3580
  def []: (String) -> String
3529
3581
  end
3530
3582
 
3583
+ %a{steep:deprecated}
3531
3584
  type String::encode_fallback = Hash[String, String] | Proc | Method | _ArefFromStringToString