diff --git a/lib/typeprof/core/ast/call.rb b/lib/typeprof/core/ast/call.rb index d228e823..96685150 100644 --- a/lib/typeprof/core/ast/call.rb +++ b/lib/typeprof/core/ast/call.rb @@ -270,6 +270,20 @@ def narrowings else super end + when :nil? + if @recv.is_a?(LocalVariableReadNode) + [ + Narrowing.new({ @recv.var => Narrowing::NilConstraint.new(true) }), + Narrowing.new({ @recv.var => Narrowing::NilConstraint.new(false) }) + ] + elsif @recv.is_a?(InstanceVariableReadNode) + [ + Narrowing.new({ @recv.var => Narrowing::NilConstraint.new(true) }), + Narrowing.new({ @recv.var => Narrowing::NilConstraint.new(false) }) + ] + else + super + end when :! then_narrowing, else_narrowing = @recv.narrowings [else_narrowing, then_narrowing] diff --git a/scenario/flow/nil_check.rb b/scenario/flow/nil_check.rb new file mode 100644 index 00000000..6920817d --- /dev/null +++ b/scenario/flow/nil_check.rb @@ -0,0 +1,13 @@ +## update +def foo(x) + unless x.nil? + x.to_sym + end +end +foo(nil) +foo("hello") + +## assert +class Object + def foo: (String?) -> Symbol? +end