@@ -702,19 +702,31 @@ def evaluate_for_node(node, scope)
702702 end
703703
704704 def evaluate_case_node ( node , scope )
705- target = evaluate ( node . predicate , scope ) if node . predicate
705+ evaluate ( node . predicate , scope ) if node . predicate
706706 # TODO
707707 branches = node . conditions . map do |condition |
708- -> ( s ) { evaluate_case_match target , condition , s }
708+ -> ( s ) { evaluate_case_when_condition condition , s }
709709 end
710710 if node . consequent
711711 branches << -> ( s ) { evaluate node . consequent , s }
712- elsif node . conditions . any? { _1 . is_a? Prism :: WhenNode }
712+ else
713713 branches << -> ( _s ) { Types ::NIL }
714714 end
715715 Types ::UnionType [ *scope . run_branches ( *branches ) ]
716716 end
717717
718+ def evaluate_case_match_node ( node , scope )
719+ target = evaluate ( node . predicate , scope )
720+ # TODO
721+ branches = node . conditions . map do |condition |
722+ -> ( s ) { evaluate_case_in_condition target , condition , s }
723+ end
724+ if node . consequent
725+ branches << -> ( s ) { evaluate node . consequent , s }
726+ end
727+ Types ::UnionType [ *scope . run_branches ( *branches ) ]
728+ end
729+
718730 def evaluate_match_required_node ( node , scope )
719731 value_type = evaluate node . value , scope
720732 evaluate_match_pattern value_type , node . pattern , scope
@@ -764,7 +776,8 @@ def evaluate_implicit_node(node, scope)
764776 def evaluate_match_write_node ( node , scope )
765777 # /(?<a>)(?<b>)/ =~ string
766778 evaluate node . call , scope
767- node . locals . each { scope [ _1 . to_s ] = Types ::UnionType [ Types ::STRING , Types ::NIL ] }
779+ locals = node . targets . map ( &:name )
780+ locals . each { scope [ _1 . to_s ] = Types ::UnionType [ Types ::STRING , Types ::NIL ] }
768781 Types ::BOOLEAN
769782 end
770783
@@ -947,21 +960,20 @@ def assign_numbered_parameters(numbered_parameters, scope, args, _kwargs)
947960 end
948961 end
949962
950- def evaluate_case_match ( target , node , scope )
951- case node
952- when Prism ::WhenNode
953- node . conditions . each { evaluate _1 , scope }
954- node . statements ? evaluate ( node . statements , scope ) : Types ::NIL
955- when Prism ::InNode
956- pattern = node . pattern
957- if pattern . is_a? ( Prism ::IfNode ) || pattern . is_a? ( Prism ::UnlessNode )
958- cond_node = pattern . predicate
959- pattern = pattern . statements . body . first
960- end
961- evaluate_match_pattern ( target , pattern , scope )
962- evaluate cond_node , scope if cond_node # TODO: conditional branch
963- node . statements ? evaluate ( node . statements , scope ) : Types ::NIL
963+ def evaluate_case_when_condition ( node , scope )
964+ node . conditions . each { evaluate _1 , scope }
965+ node . statements ? evaluate ( node . statements , scope ) : Types ::NIL
966+ end
967+
968+ def evaluate_case_in_condition ( target , node , scope )
969+ pattern = node . pattern
970+ if pattern . is_a? ( Prism ::IfNode ) || pattern . is_a? ( Prism ::UnlessNode )
971+ cond_node = pattern . predicate
972+ pattern = pattern . statements . body . first
964973 end
974+ evaluate_match_pattern ( target , pattern , scope )
975+ evaluate cond_node , scope if cond_node # TODO: conditional branch
976+ node . statements ? evaluate ( node . statements , scope ) : Types ::NIL
965977 end
966978
967979 def evaluate_match_pattern ( value , pattern , scope )
0 commit comments