Skip to content

Commit ae69a95

Browse files
committed
Fix {Proc,Method,UnboundMethod}#parameters to return proper parameter names
1 parent dd0c59d commit ae69a95

File tree

8 files changed

+44
-18
lines changed

8 files changed

+44
-18
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Compatibility:
5454
* Limit maximum encoding set size by 256 (#3039, @thomasmarshall, @goyox86).
5555
* Remove deprecated methods `Dir.exists?`, `File.exists?`, and `Kernel#=~` (#3039, @patricklinpl, @nirvdrum).
5656
* Remove deprecated `FileTest.exists?` method (#3039, @andrykonchin).
57+
* Fix {Method,Proc}#parameters and return `*`, `**` and `&` names for anonymous parameters (@andrykonchin).
5758

5859
Performance:
5960

spec/ruby/core/method/parameters_spec.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ def one_splat_one_block(*args, &block)
2222
local_is_not_parameter = {}
2323
end
2424

25+
def forward_parameters(...) end
26+
2527
def underscore_parameters(_, _, _ = 1, *_, _:, _: 2, **_, &_); end
2628

2729
define_method(:one_optional_defined_method) {|x = 1|}
@@ -267,6 +269,20 @@ def object.foo(&)
267269
end
268270
end
269271

272+
ruby_version_is ""..."3.1" do
273+
it "returns [:rest, :*], [:block, :&] for forward parameters operator" do
274+
m = MethodSpecs::Methods.new
275+
m.method(:forward_parameters).parameters.should == [[:rest, :*], [:block, :&]]
276+
end
277+
end
278+
279+
ruby_version_is "3.1" do
280+
it "returns [:rest, :*], [:keyrest, :**], [:block, :&] for forward parameters operator" do
281+
m = MethodSpecs::Methods.new
282+
m.method(:forward_parameters).parameters.should == [[:rest, :*], [:keyrest, :**], [:block, :&]]
283+
end
284+
end
285+
270286
it "returns the args and block for a splat and block argument" do
271287
m = MethodSpecs::Methods.new
272288
m.method(:one_splat_one_block).parameters.should == [[:rest, :args], [:block, :block]]

spec/ruby/core/proc/parameters_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,8 @@
170170
[:block, :_]
171171
]
172172
end
173+
174+
it "returns :nokey for **nil parameter" do
175+
proc { |**nil| }.parameters.should == [[:nokey]]
176+
end
173177
end

spec/tags/core/method/parameters_tags.txt

Lines changed: 0 additions & 3 deletions
This file was deleted.

spec/tags/core/proc/parameters_tags.txt

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/main/java/org/truffleruby/language/arguments/ArgumentDescriptorUtils.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@
1515
import org.truffleruby.RubyLanguage;
1616
import org.truffleruby.core.array.ArrayHelpers;
1717
import org.truffleruby.core.array.RubyArray;
18+
import org.truffleruby.core.symbol.RubySymbol;
1819
import org.truffleruby.parser.ArgumentDescriptor;
1920
import org.truffleruby.parser.ArgumentType;
2021

2122
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
22-
import org.truffleruby.parser.TranslatorEnvironment;
23+
24+
import static org.truffleruby.parser.TranslatorEnvironment.FORWARDED_BLOCK_NAME;
25+
import static org.truffleruby.parser.TranslatorEnvironment.FORWARDED_KEYWORD_REST_NAME;
26+
import static org.truffleruby.parser.TranslatorEnvironment.FORWARDED_REST_NAME;
2327

2428
public final class ArgumentDescriptorUtils {
2529

@@ -44,16 +48,22 @@ private static RubyArray toArray(RubyLanguage language, RubyContext context, Arg
4448

4549
private static RubyArray toArray(RubyLanguage language, RubyContext context, ArgumentType argType, String name) {
4650
final Object[] store;
51+
final RubySymbol typeSymbol = language.getSymbol(argType.symbolicName);
4752

48-
if (argType.anonymous || name == null) {
49-
store = new Object[]{ language.getSymbol(argType.symbolicName) };
53+
if (argType == ArgumentType.anonrest) {
54+
store = new Object[]{ typeSymbol, language.getSymbol("*") };
55+
} else if (argType == ArgumentType.anonkeyrest) {
56+
store = new Object[]{ typeSymbol, language.getSymbol("**") };
57+
} else if (argType == ArgumentType.rest && name.equals(FORWARDED_REST_NAME)) {
58+
store = new Object[]{ typeSymbol, language.getSymbol("*") };
59+
} else if (argType == ArgumentType.keyrest && name.equals(FORWARDED_KEYWORD_REST_NAME)) {
60+
store = new Object[]{ typeSymbol, language.getSymbol("**") };
61+
} else if (argType == ArgumentType.block && name.equals(FORWARDED_BLOCK_NAME)) {
62+
store = new Object[]{ typeSymbol, language.getSymbol("&") };
63+
} else if (argType.anonymous || name == null) {
64+
store = new Object[]{ typeSymbol };
5065
} else {
51-
// make sure to normalize parameter names to "_" if they start with "_$"
52-
if (name.startsWith(TranslatorEnvironment.UNDERSCORE_PREFIX)) {
53-
name = "_";
54-
}
55-
56-
store = new Object[]{ language.getSymbol(argType.symbolicName), language.getSymbol(name) };
66+
store = new Object[]{ typeSymbol, language.getSymbol(name) };
5767
}
5868

5969
return ArrayHelpers.createArray(context, language, store);

src/main/java/org/truffleruby/parser/ArgumentType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public enum ArgumentType {
3939
anonopt("opt", true),
4040
anonrest("rest", true),
4141
anonkeyrest("keyrest", true),
42+
anonblock("block", true),
4243
nokey("nokey", true); // **nil
4344

4445
ArgumentType(String symbolicName, boolean anonymous) {

src/main/java/org/truffleruby/parser/TranslatorEnvironment.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ public final class TranslatorEnvironment {
5757
static final String DEFAULT_KEYWORD_REST_NAME = Layouts.TEMP_PREFIX + "kwrest";
5858

5959
/** local variable name for * parameter caused by desugaring ... parameter (forward-everything) */
60-
static final String FORWARDED_REST_NAME = Layouts.TEMP_PREFIX + "forward_rest";
60+
public static final String FORWARDED_REST_NAME = Layouts.TEMP_PREFIX + "forward_rest";
6161
/** local variable name for ** parameter caused by desugaring ... parameter (forward-everything) */
62-
static final String FORWARDED_KEYWORD_REST_NAME = Layouts.TEMP_PREFIX + "forward_kwrest";
62+
public static final String FORWARDED_KEYWORD_REST_NAME = Layouts.TEMP_PREFIX + "forward_kwrest";
6363
/** local variable name for & parameter caused by desugaring ... parameter (forward-everything) */
64-
static final String FORWARDED_BLOCK_NAME = Layouts.TEMP_PREFIX + "forward_block";
64+
public static final String FORWARDED_BLOCK_NAME = Layouts.TEMP_PREFIX + "forward_block";
6565

6666
/** A prefix for duplicated '_' local variables to build unique names */
6767
public static final String UNDERSCORE_PREFIX = "_$";

0 commit comments

Comments
 (0)