@@ -38,12 +38,21 @@ module Crystal
38
38
def define_method_from_method_missing (method_missing, signature, original_call)
39
39
name_node = StringLiteral .new(signature.name)
40
40
args_nodes = [] of ASTNode
41
+ named_args_nodes = nil
41
42
args_nodes_names = Set (String ).new
42
43
signature.arg_types.each_index do |index |
43
44
arg_node_name = " _arg#{ index } "
44
45
args_nodes << MacroId .new(arg_node_name)
45
46
args_nodes_names << arg_node_name
46
47
end
48
+ if named_args = signature.named_args
49
+ args_nodes_names << " "
50
+ named_args.try & .each do |named_arg |
51
+ named_args_nodes ||= [] of NamedArgument
52
+ named_args_nodes << NamedArgument .new(named_arg.name, MacroId .new(named_arg.name))
53
+ args_nodes_names << named_arg.name
54
+ end
55
+ end
47
56
args_node = ArrayLiteral .new(args_nodes)
48
57
if block = signature.block
49
58
block_vars = block.args.map_with_index do |var , index |
@@ -57,8 +66,12 @@ module Crystal
57
66
end
58
67
59
68
a_def = Def .new(signature.name, args_nodes_names.map { |name | Arg .new(name) })
69
+ a_def.splat_index = signature.arg_types.size if signature.named_args
60
70
61
- call = Call .new(nil , signature.name, args: args_nodes, block: block_node.is_a?(Block ) ? block_node : nil )
71
+ call = Call .new(nil , signature.name,
72
+ args: args_nodes,
73
+ named_args: named_args_nodes,
74
+ block: block_node.is_a?(Block ) ? block_node : nil )
62
75
fake_call = Call .new(nil , " method_missing" , [call] of ASTNode )
63
76
64
77
expanded_macro = program.expand_macro method_missing, fake_call, self , self
0 commit comments