@@ -231,7 +231,6 @@ def evaluate_reference_read(node, scope)
231231
232232
233233 def evaluate_call_node ( node , scope )
234- is_field_assign = node . name . match? ( /[^<>=!\] ]=\z / ) || ( node . name == :[]= && !node . call_operator )
235234 receiver_type = node . receiver ? evaluate ( node . receiver , scope ) : scope . self_type
236235 evaluate_method = lambda do |scope |
237236 args_types , kwargs_types , block_sym_node , has_block = evaluate_call_node_arguments node , scope
@@ -254,16 +253,15 @@ def evaluate_call_node(node, scope)
254253 elsif node . block . is_a? Prism ::BlockNode
255254 call_block_proc = -> ( block_args , block_self_type ) do
256255 scope . conditional do |s |
257- numbered_parameters = node . block . locals . grep ( /\A _[1-9]/ ) . map ( &:to_s )
258256 params_table = node . block . locals . to_h { [ _1 . to_s , Types ::NIL ] }
259257 table = { **params_table , Scope ::BREAK_RESULT => nil , Scope ::NEXT_RESULT => nil }
260258 block_scope = Scope . new s , table , self_type : block_self_type , trace_ivar : !block_self_type
261259 # TODO kwargs
262- if node . block . parameters &.parameters
263- # node.block.parameters is Prism::BlockParametersNode
260+ case node . block . parameters
261+ when Prism ::NumberedParametersNode
262+ assign_numbered_parameters node . block . parameters . maximum , block_scope , block_args , { }
263+ when Prism ::BlockParametersNode
264264 assign_parameters node . block . parameters . parameters , block_scope , block_args , { }
265- elsif !numbered_parameters . empty?
266- assign_numbered_parameters numbered_parameters , block_scope , block_args , { }
267265 end
268266 result = node . block . body ? evaluate ( node . block . body , block_scope ) : Types ::NIL
269267 block_scope . merge_jumps
@@ -281,7 +279,7 @@ def evaluate_call_node(node, scope)
281279 call_block_proc = -> ( _block_args , _self_type ) { Types ::OBJECT }
282280 end
283281 result = method_call receiver_type , node . name , args_types , kwargs_types , call_block_proc , scope
284- if is_field_assign
282+ if node . attribute_write?
285283 args_types . last || Types ::NIL
286284 else
287285 result
@@ -583,8 +581,8 @@ def evaluate_rescue_node(node, scope)
583581 case node . reference
584582 when Prism ::LocalVariableTargetNode , Prism ::InstanceVariableTargetNode , Prism ::ClassVariableTargetNode , Prism ::GlobalVariableTargetNode , Prism ::ConstantTargetNode
585583 s [ node . reference . name . to_s ] = error_type
586- when Prism ::CallNode
587- evaluate node . reference , s
584+ when Prism ::CallTargetNode , Prism :: IndexTargetNode
585+ evaluate_multi_write_receiver node . reference , s , nil
588586 end
589587 end
590588 node . statements ? evaluate ( node . statements , s ) : Types ::NIL
@@ -904,7 +902,6 @@ def assign_parameters(node, scope, args, kwargs)
904902 args = sized_splat ( args . first , :to_ary , size ) if size >= 2 && args . size == 1
905903 reqs = args . shift node . requireds . size
906904 if node . rest
907- # node.rest is Prism::RestParameterNode
908905 posts = [ ]
909906 opts = args . shift node . optionals . size
910907 rest = args
@@ -925,8 +922,8 @@ def assign_parameters(node, scope, args, kwargs)
925922 node . posts . zip posts do |n , v |
926923 assign_required_parameter n , v , scope
927924 end
928- if node . rest &. name
929- # node.rest is Prism::RestParameterNode
925+ # Prism::ImplicitRestNode (tap{|a,|}) does not have a name
926+ if node . rest . is_a? ( Prism ::RestParameterNode ) && node . rest . name
930927 scope [ node . rest . name . to_s ] = Types . array_of ( *rest )
931928 end
932929 node . keywords . each do |n |
@@ -946,16 +943,13 @@ def assign_parameters(node, scope, args, kwargs)
946943 end
947944 end
948945
949- def assign_numbered_parameters ( numbered_parameters , scope , args , _kwargs )
950- return if numbered_parameters . empty?
951- max_num = numbered_parameters . map { _1 [ 1 ] . to_i } . max
952- if max_num == 1
946+ def assign_numbered_parameters ( maximum , scope , args , _kwargs )
947+ if maximum == 1
953948 scope [ '_1' ] = args . first || Types ::NIL
954949 else
955- args = sized_splat ( args . first , :to_ary , max_num ) if args . size == 1
956- numbered_parameters . each do |name |
957- index = name [ 1 ] . to_i - 1
958- scope [ name ] = args [ index ] || Types ::NIL
950+ args = sized_splat ( args . first , :to_ary , maximum ) if args . size == 1
951+ maximum . times do |index |
952+ scope [ "_#{ index + 1 } " ] = args [ index ] || Types ::NIL
959953 end
960954 end
961955 end
@@ -1038,16 +1032,15 @@ def evaluate_write(node, value, scope, evaluated_receivers)
10381032 case node
10391033 when Prism ::MultiTargetNode
10401034 evaluate_multi_write node , value , scope , evaluated_receivers
1041- when Prism ::CallNode
1042- evaluated_receivers &.[]( node . receiver ) || evaluate ( node . receiver , scope ) if node . receiver
1035+ when Prism ::CallTargetNode , Prism :: IndexTargetNode
1036+ evaluated_receivers &.[]( node . receiver ) || evaluate_multi_write_receiver ( node , scope , nil )
10431037 when Prism ::SplatNode
10441038 evaluate_write node . expression , Types . array_of ( value ) , scope , evaluated_receivers if node . expression
10451039 when Prism ::LocalVariableTargetNode , Prism ::GlobalVariableTargetNode , Prism ::InstanceVariableTargetNode , Prism ::ClassVariableTargetNode , Prism ::ConstantTargetNode
10461040 scope [ node . name . to_s ] = value
10471041 when Prism ::ConstantPathTargetNode
10481042 receiver = evaluated_receivers &.[]( node . parent ) || evaluate ( node . parent , scope ) if node . parent
10491043 const_path_write receiver , node . child . name . to_s , value , scope
1050- value
10511044 end
10521045 end
10531046
@@ -1070,20 +1063,24 @@ def evaluate_multi_write_receiver(node, scope, evaluated_receivers)
10701063 when Prism ::MultiWriteNode , Prism ::MultiTargetNode
10711064 targets = [ *node . lefts , *node . rest , *node . rights ]
10721065 targets . each { evaluate_multi_write_receiver _1 , scope , evaluated_receivers }
1073- when Prism ::CallNode
1074- if node . receiver
1075- receiver = evaluate ( node . receiver , scope )
1076- evaluated_receivers [ node . receiver ] = receiver if evaluated_receivers
1077- end
1066+ when Prism ::CallTargetNode , Prism ::CallNode
1067+ receiver = evaluate ( node . receiver , scope )
1068+ evaluated_receivers [ node . receiver ] = receiver if evaluated_receivers
1069+ receiver
1070+ when Prism ::IndexTargetNode
1071+ receiver = evaluate ( node . receiver , scope )
1072+ evaluated_receivers [ node . receiver ] = receiver if evaluated_receivers
10781073 if node . arguments
10791074 node . arguments . arguments &.each do |arg |
10801075 if arg . is_a? Prism ::SplatNode
1081- evaluate arg . expression , scope
1076+ evaluate arg . expression , scope if arg . expression
10821077 else
10831078 evaluate arg , scope
10841079 end
10851080 end
10861081 end
1082+ evaluate node . block . expression , scope if node . block &.expression
1083+ receiver
10871084 when Prism ::SplatNode
10881085 evaluate_multi_write_receiver node . expression , scope , evaluated_receivers if node . expression
10891086 end
0 commit comments