@@ -229,6 +229,11 @@ def evaluate_reference_read(node, scope)
229229 alias evaluate_class_variable_read_node evaluate_reference_read
230230 alias evaluate_instance_variable_read_node evaluate_reference_read
231231
232+ def evaluate_it_local_variable_read_node ( _node , scope )
233+ # `it` is not a normal local variable. It can be overridden like `tap{p it; it=1}`.
234+ # Use the name `_1` instead of `it` to avoid conflict.
235+ scope [ '_1' ] || Types ::NIL
236+ end
232237
233238 def evaluate_call_node ( node , scope )
234239 receiver_type = node . receiver ? evaluate ( node . receiver , scope ) : scope . self_type
@@ -262,6 +267,8 @@ def evaluate_call_node(node, scope)
262267 assign_numbered_parameters node . block . parameters . maximum , block_scope , block_args , { }
263268 when Prism ::BlockParametersNode
264269 assign_parameters node . block . parameters . parameters , block_scope , block_args , { }
270+ when Prism ::ItParametersNode
271+ scope [ '_1' ] = block_args . first || Types ::NIL
265272 end
266273 result = node . block . body ? evaluate ( node . block . body , block_scope ) : Types ::NIL
267274 block_scope . merge_jumps
@@ -425,9 +432,14 @@ def evaluate_constant_path_write_node(node, scope)
425432
426433 def evaluate_lambda_node ( node , scope )
427434 local_table = node . locals . to_h { [ _1 . to_s , Types ::OBJECT ] }
435+
436+ # `it` is not added to local_table because it is not a normal local variable.
437+ # We need to explicitly add it to the scope.
438+ local_table [ '_1' ] = Types ::OBJECT if node . parameters . is_a? ( Prism ::ItParametersNode )
439+
428440 block_scope = Scope . new scope , { **local_table , Scope ::BREAK_RESULT => nil , Scope ::NEXT_RESULT => nil , Scope ::RETURN_RESULT => nil }
429441 block_scope . conditional do |s |
430- assign_parameters node . parameters . parameters , s , [ ] , { } if node . parameters & .parameters
442+ assign_parameters node . parameters . parameters , s , [ ] , { } if node . parameters . is_a? ( Prism :: ParametersNode ) && node . parameters . parameters
431443 evaluate node . body , s if node . body
432444 end
433445 block_scope . merge_jumps
0 commit comments