From: nobu@... Date: 2021-07-15T14:35:47+00:00 Subject: [ruby-core:104620] [Ruby master Bug#18011] `Method#parameters` is incorrect for forwarded arguments Issue #18011 has been updated by nobu (Nobuyoshi Nakada). Changing `parameters` broke rbs test. https://github.com/nobu/ruby/runs/3076547487?check_suite_focus=true#step:15:350 ``` Failure: test_argument_forwarding(RBS::RuntimePrototypeTest) /home/runner/work/ruby/ruby/src/gems/src/rbs/test/test_helper.rb:194:in `assert_write' /home/runner/work/ruby/ruby/src/gems/src/rbs/test/rbs/runtime_prototype_test.rb:231:in `block (2 levels) in test_argument_forwarding' 228: manager.build do |env| 229: p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::TestForArgumentForwarding"], env: env, merge: true) 230: => 231: assert_write p.decls, <<-EOF 232: class RBS::RuntimePrototypeTest::TestForArgumentForwarding 233: public 234: /home/runner/work/ruby/ruby/src/gems/src/rbs/test/test_helper.rb:158:in `block in build' /home/runner/work/ruby/ruby/src/lib/tmpdir.rb:96:in `mktmpdir' /home/runner/work/ruby/ruby/src/gems/src/rbs/test/test_helper.rb:139:in `build' /home/runner/work/ruby/ruby/src/gems/src/rbs/test/rbs/runtime_prototype_test.rb:228:in `block in test_argument_forwarding' /home/runner/work/ruby/ruby/src/gems/src/rbs/test/test_helper.rb:73:in `new' /home/runner/work/ruby/ruby/src/gems/src/rbs/test/rbs/runtime_prototype_test.rb:227:in `test_argument_forwarding' <"class RBS::RuntimePrototypeTest::TestForArgumentForwarding\n" + " public\n" + "\n" + " def foo: (*untyped) { (*untyped) -> untyped } -> untyped\n" + "end\n"> expected but was <"class RBS::RuntimePrototypeTest::TestForArgumentForwarding\n" + " public\n" + "\n" + " def foo: (*untyped, **untyped) { (*untyped) -> untyped } -> untyped\n" + "end\n"> diff: class RBS::RuntimePrototypeTest::TestForArgumentForwarding public ? def foo: (*untyped) { (*untyped) -> untyped } -> untyped ? (*untyped, **untyped) { -> } ? ++++++++++++++++++++++++ ???? ? ------------- end ``` `Method#ruby2_keywords?` may be needed, I guess. ---------------------------------------- Bug #18011: `Method#parameters` is incorrect for forwarded arguments https://bugs.ruby-lang.org/issues/18011#change-92912 * Author: josh.cheek (Josh Cheek) * Status: Open * Priority: Normal * ruby -v: ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [arm64-darwin20] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- When asking a method about its parameters, forwarded arguments say they are a rest and a block (`wrapper1` in the example below). However, when we use that signature, it raises an ArgumentError (`wrapper2` in the example below). When I add a keyrest to the signature, it works as expected (`wrapper3` in the example below). So I think forwarded arguments should include a keyrest in the output of `Method#parameters` ```ruby def wrapped(ord, kw:) = [ord, {kw: kw}] methods = [ def wrapper1(...) = wrapped(...), def wrapper2(*r, &b) = wrapped(*r, &b), def wrapper3(*r, **k, &b) = wrapped(*r, **k, &b), ] methods.each do |name| puts File.read(__FILE__)[/#{name}\(.*?\)/] puts " params: #{method(name).parameters.inspect}" puts " result: #{(method(name).call 123, kw: 456 rescue $!).inspect}" puts end ``` Output: ``` wrapper1(...) params: [[:rest, :*], [:block, :&]] result: [123, {:kw=>456}] wrapper2(*r, &b) params: [[:rest, :r], [:block, :b]] result: # wrapper3(*r, **k, &b) params: [[:rest, :r], [:keyrest, :k], [:block, :b]] result: [123, {:kw=>456}] ``` -- https://bugs.ruby-lang.org/ Unsubscribe: