mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Do not autosplat when calling procs that accept rest and keywords
When providing a single array to a block that takes a splat, pass the array as one argument of the splat instead of as the splat itself, even if the block also accepts keyword arguments. Previously, this behavior was only used for blocks that did not accept keywords. Implements [Feature#16166]
This commit is contained in:
parent
040cfc89b9
commit
f4394bbca3
Notes:
git
2020-03-09 12:49:36 +09:00
4 changed files with 61 additions and 20 deletions
|
@ -76,18 +76,18 @@ describe "A block yielded a single" do
|
|||
result.should == [1, 2, [3], {x: 9}, 2, {}]
|
||||
end
|
||||
|
||||
it "does not treat final Hash as keyword arguments" do
|
||||
it "does not treat final Hash as keyword arguments and does not autosplat" do
|
||||
result = m(["a" => 1, a: 10]) { |a=nil, **b| [a, b] }
|
||||
result.should == [{"a" => 1, a: 10}, {}]
|
||||
result.should == [[{"a" => 1, a: 10}], {}]
|
||||
end
|
||||
|
||||
it "does not call #to_hash on final argument to get keyword arguments" do
|
||||
it "does not call #to_hash on final argument to get keyword arguments and does not autosplat" do
|
||||
suppress_keyword_warning do
|
||||
obj = mock("coerce block keyword arguments")
|
||||
obj.should_not_receive(:to_hash)
|
||||
|
||||
result = m([obj]) { |a=nil, **b| [a, b] }
|
||||
result.should == [obj, {}]
|
||||
result.should == [[obj], {}]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -113,12 +113,12 @@ describe "A block yielded a single" do
|
|||
end
|
||||
|
||||
ruby_version_is "2.8" do
|
||||
it "does not call #to_hash on the argument when optional argument and keyword argument accepted" do
|
||||
it "does not call #to_hash on the argument when optional argument and keyword argument accepted and does not autosplat" do
|
||||
obj = mock("coerce block keyword arguments")
|
||||
obj.should_not_receive(:to_hash)
|
||||
|
||||
result = m([obj]) { |a=nil, **b| [a, b] }
|
||||
result.should == [obj, {}]
|
||||
result.should == [[obj], {}]
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -132,18 +132,27 @@ describe "A block yielded a single" do
|
|||
end
|
||||
end
|
||||
ruby_version_is "2.8" do
|
||||
it "does not separates non-symbol keys and symbol keys" do
|
||||
it "does not separate non-symbol keys and symbol keys and does not autosplat" do
|
||||
suppress_keyword_warning do
|
||||
result = m(["a" => 10, b: 2]) { |a=nil, **b| [a, b] }
|
||||
result.should == [{"a" => 10, b: 2}, {}]
|
||||
result.should == [[{"a" => 10, b: 2}], {}]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "does not treat hashes with string keys as keyword arguments" do
|
||||
result = m(["a" => 10]) { |a = nil, **b| [a, b] }
|
||||
result.should == [{"a" => 10}, {}]
|
||||
ruby_version_is ""..."2.8" do
|
||||
it "does not treat hashes with string keys as keyword arguments" do
|
||||
result = m(["a" => 10]) { |a = nil, **b| [a, b] }
|
||||
result.should == [{"a" => 10}, {}]
|
||||
end
|
||||
end
|
||||
|
||||
ruby_version_is "2.8" do
|
||||
it "does not treat hashes with string keys as keyword arguments and does not autosplat" do
|
||||
result = m(["a" => 10]) { |a = nil, **b| [a, b] }
|
||||
result.should == [[{"a" => 10}], {}]
|
||||
end
|
||||
end
|
||||
|
||||
ruby_version_is ''...'2.8' do
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue