@@ -625,7 +625,7 @@ class StringScanner
625625 # scanner.check(/nope/) # => nil
626626 # match_values_cleared?(scanner) # => true
627627 #
628- def check : (Regexp) -> String?
628+ def check : (Regexp | String ) -> String?
629629
630630 # <!--
631631 # rdoc-file=ext/strscan/strscan.c
@@ -673,7 +673,7 @@ class StringScanner
673673 # scanner.check_until(/nope/) # => nil
674674 # match_values_cleared?(scanner) # => true
675675 #
676- def check_until : (Regexp) -> String
676+ def check_until : (Regexp | String ) -> String?
677677
678678 # <!--
679679 # rdoc-file=ext/strscan/strscan.c
@@ -760,7 +760,7 @@ class StringScanner
760760 # scanner.exist?(/nope/) # => nil
761761 # match_values_cleared?(scanner) # => true
762762 #
763- def exist? : (Regexp) -> Integer?
763+ def exist? : (Regexp | String ) -> Integer?
764764
765765 # <!--
766766 # rdoc-file=ext/strscan/strscan.c
@@ -913,7 +913,7 @@ class StringScanner
913913 # scanner.match?(/nope/) # => nil
914914 # match_values_cleared?(scanner) # => true
915915 #
916- def match? : (Regexp) -> Integer?
916+ def match? : (Regexp | String ) -> Integer?
917917
918918 # <!--
919919 # rdoc-file=ext/strscan/strscan.c
@@ -973,6 +973,29 @@ class StringScanner
973973 #
974974 def matched_size : () -> Integer?
975975
976+ # <!--
977+ # rdoc-file=ext/strscan/strscan.c
978+ # - named_captures -> hash
979+ # -->
980+ # Returns the array of captured match values at indexes (1..)
981+ # if the most recent match attempt succeeded, or nil otherwise;
982+ # see [Captured Match Values](rdoc-ref:StringScanner@Captured+Match+Values):
983+ # scanner = StringScanner.new('Fri Dec 12 1975 14:39')
984+ # scanner.named_captures # => {}
985+ #
986+ # pattern = /(?<wday>\w+) (?<month>\w+) (?<day>\d+) /
987+ # scanner.match?(pattern)
988+ # scanner.named_captures # => {"wday"=>"Fri", "month"=>"Dec", "day"=>"12"}
989+ #
990+ # scanner.string = 'nope'
991+ # scanner.match?(pattern)
992+ # scanner.named_captures # => {"wday"=>nil, "month"=>nil, "day"=>nil}
993+ #
994+ # scanner.match?(/nosuch/)
995+ # scanner.named_captures # => {}
996+ #
997+ def named_captures : () -> Hash[String, String?]
998+
976999 # <!--
9771000 # rdoc-file=ext/strscan/strscan.c
9781001 # - peek(length) -> substring
@@ -988,6 +1011,17 @@ class StringScanner
9881011 #
9891012 def peek : (Integer) -> String
9901013
1014+ # <!--
1015+ # rdoc-file=ext/strscan/strscan.c
1016+ # - peek_byte()
1017+ # -->
1018+ # Peeks at the current byte and returns it as an integer.
1019+ #
1020+ # s = StringScanner.new('ab')
1021+ # s.peek_byte # => 97
1022+ #
1023+ def peek_byte : () -> Integer?
1024+
9911025 # <!-- rdoc-file=ext/strscan/strscan.c -->
9921026 # call-seq:
9931027 # pos -> byte_position
@@ -1092,7 +1126,7 @@ class StringScanner
10921126 # scanner.match?(/nope/) # => nil
10931127 # scanner.post_match # => nil
10941128 #
1095- def post_match : () -> String
1129+ def post_match : () -> String?
10961130
10971131 # <!--
10981132 # rdoc-file=ext/strscan/strscan.c
@@ -1112,7 +1146,7 @@ class StringScanner
11121146 # scanner.exist?(/nope/) # => nil
11131147 # scanner.pre_match # => nil
11141148 #
1115- def pre_match : () -> String
1149+ def pre_match : () -> String?
11161150
11171151 # <!--
11181152 # rdoc-file=ext/strscan/strscan.c
@@ -1134,7 +1168,7 @@ class StringScanner
11341168 # # => nil
11351169 # match_values_cleared?(scanner) # => true
11361170 #
1137- def reset : () -> void
1171+ def reset : () -> self
11381172
11391173 # <!--
11401174 # rdoc-file=ext/strscan/strscan.c
@@ -1235,7 +1269,16 @@ class StringScanner
12351269 # scanner.scan(/nope/) # => nil
12361270 # match_values_cleared?(scanner) # => true
12371271 #
1238- def scan : (Regexp) -> String?
1272+ def scan : (Regexp | String) -> String?
1273+
1274+ # <!--
1275+ # rdoc-file=ext/strscan/strscan.c
1276+ # - scan_byte -> integer_byte
1277+ # -->
1278+ # Scans one byte and returns it as an integer. This method is not multibyte
1279+ # character sensitive. See also: #getch.
1280+ #
1281+ def scan_byte : () -> Integer?
12391282
12401283 # <!--
12411284 # rdoc-file=ext/strscan/strscan.c
@@ -1247,7 +1290,22 @@ class StringScanner
12471290 #
12481291 # "full" means "#scan with full parameters".
12491292 #
1250- def scan_full : (Regexp pattern, bool advance_pointer_p, bool return_string_p) -> untyped
1293+ def scan_full : (Regexp | String pattern, bool advance_pointer_p, bool return_string_p) -> (String | Integer)?
1294+
1295+ # <!--
1296+ # rdoc-file=ext/strscan/lib/strscan/strscan.rb
1297+ # - scan_integer(base: 10)
1298+ # -->
1299+ # If `base` isn't provided or is `10`, then it is equivalent to calling
1300+ # <code>#scan</code> with a `[+-]?d+` pattern, and returns an Integer or nil.
1301+ #
1302+ # If `base` is `16`, then it is equivalent to calling <code>#scan</code> with a
1303+ # `[+-]?(0x)?[0-9a-fA-F]+` pattern, and returns an Integer or nil.
1304+ #
1305+ # The scanned string must be encoded with an ASCII compatible encoding,
1306+ # otherwise Encoding::CompatibilityError will be raised.
1307+ #
1308+ def scan_integer : (?base: Integer) -> Integer?
12511309
12521310 # <!--
12531311 # rdoc-file=ext/strscan/strscan.c
@@ -1300,7 +1358,7 @@ class StringScanner
13001358 # scanner.scan_until(/nope/) # => nil
13011359 # match_values_cleared?(scanner) # => true
13021360 #
1303- def scan_until : (Regexp) -> String?
1361+ def scan_until : (Regexp | String ) -> String?
13041362
13051363 # <!--
13061364 # rdoc-file=ext/strscan/strscan.c
@@ -1311,7 +1369,7 @@ class StringScanner
13111369 # `return_string_p` is true, otherwise returns the number of bytes advanced.
13121370 # This method does affect the match register.
13131371 #
1314- def search_full : (Regexp pattern, bool advance_pointer_p, bool return_string_p) -> untyped
1372+ def search_full : (Regexp | String pattern, bool advance_pointer_p, bool return_string_p) -> (String | Integer)?
13151373
13161374 # <!--
13171375 # rdoc-file=ext/strscan/strscan.c
@@ -1331,7 +1389,7 @@ class StringScanner
13311389 # scanner.match?(/nope/) # => nil
13321390 # scanner.size # => nil
13331391 #
1334- def size : () -> Integer
1392+ def size : () -> Integer?
13351393
13361394 # <!--
13371395 # rdoc-file=ext/strscan/strscan.c
@@ -1379,7 +1437,7 @@ class StringScanner
13791437 # scanner.skip(/nope/) # => nil
13801438 # match_values_cleared?(scanner) # => true
13811439 #
1382- def skip : (Regexp) -> Integer?
1440+ def skip : (Regexp | String ) -> Integer?
13831441
13841442 # <!--
13851443 # rdoc-file=ext/strscan/strscan.c
@@ -1427,7 +1485,7 @@ class StringScanner
14271485 # scanner.skip_until(/nope/) # => nil
14281486 # match_values_cleared?(scanner) # => true
14291487 #
1430- def skip_until : (Regexp) -> Integer?
1488+ def skip_until : (Regexp | String ) -> Integer?
14311489
14321490 # <!--
14331491 # rdoc-file=ext/strscan/strscan.c
@@ -1501,7 +1559,7 @@ class StringScanner
15011559 # # rest_size: 0
15021560 # match_values_cleared?(scanner) # => true
15031561 #
1504- def terminate : () -> void
1562+ def terminate : () -> self
15051563
15061564 # <!--
15071565 # rdoc-file=ext/strscan/strscan.c
@@ -1532,7 +1590,7 @@ class StringScanner
15321590 # match_values_cleared?(scanner) # => true
15331591 # scanner.unscan # Raises StringScanner::Error.
15341592 #
1535- def unscan : () -> void
1593+ def unscan : () -> self
15361594
15371595 # <!--
15381596 # rdoc-file=ext/strscan/strscan.c
@@ -1547,7 +1605,7 @@ class StringScanner
15471605 # scanner.values_at(*0..3) # => ["Fri Dec 12 ", "Fri", "Dec", "12"]
15481606 # scanner.values_at(*%i[wday month day]) # => ["Fri", "Dec", "12"]
15491607 #
1550- def values_at : (*Integer) -> Array[String]?
1608+ def values_at : (*Integer | String | Symbol ) -> Array[String]?
15511609
15521610 private
15531611
@@ -1570,7 +1628,7 @@ class StringScanner
15701628 # # rest: "foobarbaz"
15711629 # # rest_size: 9
15721630 #
1573- def initialize : (String, ?bool dup, ? fixed_anchor: bool ) -> untyped
1631+ def initialize : (String, ?fixed_anchor: bool ) -> void
15741632
15751633 # <!--
15761634 # rdoc-file=ext/strscan/strscan.c
0 commit comments