Skip to content

Commit da70891

Browse files
authored
Merge pull request #1958 from zverok/range-step-behavior-change
Support Range#step behavior change in Ruby 3.4
2 parents e80f75b + bc6b2b0 commit da70891

File tree

4 files changed

+26
-2
lines changed

4 files changed

+26
-2
lines changed

core/range.rbs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,8 +1017,10 @@ class Range[out Elem] < Object
10171017
# ('a'..'e').step { p _1 }
10181018
# # Default step 1; prints: a, b, c, d, e
10191019
#
1020-
def step: (?Numeric | int n) -> Enumerator[Elem, self]
1021-
| (?Numeric | int n) { (Elem element) -> void } -> self
1020+
def step: (?Numeric | int) -> Enumerator[Elem, self]
1021+
| (?Numeric | int) { (Elem element) -> void } -> self
1022+
| (untyped) -> Enumerator[Elem, self]
1023+
| (untyped) { (Elem element) -> void } -> self
10221024

10231025
# <!--
10241026
# rdoc-file=range.c

test/stdlib/Range_test.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,15 @@ def test_size
110110
def test_step
111111
(1..10).step
112112
(1..10).step(2)
113+
113114
if_ruby(..."3.4.0", skip: false) do
114115
('A'...'Z').step { |s| s.downcase }
115116
('A'...'Z').step(2) { |s| s.downcase }
116117
end
118+
119+
if_ruby("3.4.0"..., skip: false) do
120+
('A'...'AAA').step('A') { |s| s.downcase }
121+
end
117122
end
118123

119124
def test_to_s
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
D = Steep::Diagnostic
2+
3+
target :test do
4+
signature "."
5+
check "."
6+
configure_code_diagnostics(D::Ruby.all_error)
7+
end

test/typecheck/range_step/test.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# These are valid because step is a number.
2+
3+
(1...3).step(1) { }
4+
("A".."C").step(1) { }
5+
6+
# This works because "A" + "" is valid.
7+
("A".."C").step("") { }
8+
9+
# This doesn't work but the type checker cannot detect it.
10+
("A".."C").step(Exception.new) { }

0 commit comments

Comments
 (0)