@@ -582,8 +582,8 @@ def evaluate_rescue_node(node, scope)
582582 case node . reference
583583 when Prism ::LocalVariableTargetNode , Prism ::InstanceVariableTargetNode , Prism ::ClassVariableTargetNode , Prism ::GlobalVariableTargetNode , Prism ::ConstantTargetNode
584584 s [ node . reference . name . to_s ] = error_type
585- when Prism ::CallNode
586- evaluate node . reference , s
585+ when Prism ::CallTargetNode , Prism :: IndexTargetNode
586+ evaluate_multi_write_receiver node . reference , s , nil
587587 end
588588 end
589589 node . statements ? evaluate ( node . statements , s ) : Types ::NIL
@@ -1034,16 +1034,15 @@ def evaluate_write(node, value, scope, evaluated_receivers)
10341034 case node
10351035 when Prism ::MultiTargetNode
10361036 evaluate_multi_write node , value , scope , evaluated_receivers
1037- when Prism ::CallNode
1038- evaluated_receivers &.[]( node . receiver ) || evaluate ( node . receiver , scope ) if node . receiver
1037+ when Prism ::CallTargetNode , Prism :: IndexTargetNode
1038+ evaluated_receivers &.[]( node . receiver ) || evaluate_multi_write_receiver ( node , scope , nil )
10391039 when Prism ::SplatNode
10401040 evaluate_write node . expression , Types . array_of ( value ) , scope , evaluated_receivers if node . expression
10411041 when Prism ::LocalVariableTargetNode , Prism ::GlobalVariableTargetNode , Prism ::InstanceVariableTargetNode , Prism ::ClassVariableTargetNode , Prism ::ConstantTargetNode
10421042 scope [ node . name . to_s ] = value
10431043 when Prism ::ConstantPathTargetNode
10441044 receiver = evaluated_receivers &.[]( node . parent ) || evaluate ( node . parent , scope ) if node . parent
10451045 const_path_write receiver , node . child . name . to_s , value , scope
1046- value
10471046 end
10481047 end
10491048
@@ -1066,20 +1065,24 @@ def evaluate_multi_write_receiver(node, scope, evaluated_receivers)
10661065 when Prism ::MultiWriteNode , Prism ::MultiTargetNode
10671066 targets = [ *node . lefts , *node . rest , *node . rights ]
10681067 targets . each { evaluate_multi_write_receiver _1 , scope , evaluated_receivers }
1069- when Prism ::CallNode
1070- if node . receiver
1071- receiver = evaluate ( node . receiver , scope )
1072- evaluated_receivers [ node . receiver ] = receiver if evaluated_receivers
1073- end
1068+ when Prism ::CallTargetNode , Prism ::CallNode
1069+ receiver = evaluate ( node . receiver , scope )
1070+ evaluated_receivers [ node . receiver ] = receiver if evaluated_receivers
1071+ receiver
1072+ when Prism ::IndexTargetNode
1073+ receiver = evaluate ( node . receiver , scope )
1074+ evaluated_receivers [ node . receiver ] = receiver if evaluated_receivers
10741075 if node . arguments
10751076 node . arguments . arguments &.each do |arg |
10761077 if arg . is_a? Prism ::SplatNode
1077- evaluate arg . expression , scope
1078+ evaluate arg . expression , scope if arg . expression
10781079 else
10791080 evaluate arg , scope
10801081 end
10811082 end
10821083 end
1084+ evaluate node . block . expression , scope if node . block &.expression
1085+ receiver
10831086 when Prism ::SplatNode
10841087 evaluate_multi_write_receiver node . expression , scope , evaluated_receivers if node . expression
10851088 end
0 commit comments