From 33b59ca218f150f3fd7b8f4cfdefbb1d61978de8 Mon Sep 17 00:00:00 2001 From: tompng Date: Thu, 2 Nov 2023 18:28:54 +0900 Subject: [PATCH] Fix bug of [*] {**} [**] --- lib/katakata_irb/type_analyzer.rb | 6 +++++- test/test_type_analyze.rb | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/katakata_irb/type_analyzer.rb b/lib/katakata_irb/type_analyzer.rb index ed6c288..4a31cdc 100644 --- a/lib/katakata_irb/type_analyzer.rb +++ b/lib/katakata_irb/type_analyzer.rb @@ -172,6 +172,8 @@ def evaluate_hash(node, scope) keys << evaluate(assoc.key, scope) values << evaluate(assoc.value, scope) when Prism::AssocSplatNode + next unless assoc.value # def f(**); {**} + hash = evaluate assoc.value, scope unless hash.is_a?(KatakataIrb::Types::InstanceType) && hash.klass == Hash hash = method_call hash, :to_hash, [], nil, nil, scope @@ -1083,13 +1085,15 @@ def evaluate_multi_write_receiver(node, scope, evaluated_receivers) def evaluate_list_splat_items(list, scope) items = list.flat_map do |node| if node.is_a? Prism::SplatNode + next unless node.expression # def f(*); [*] + splat = evaluate node.expression, scope array_elem, non_array = partition_to_array splat.nonnillable, :to_a [*array_elem, *non_array] else evaluate node, scope end - end.uniq + end.compact.uniq KatakataIrb::Types::UnionType[*items] end diff --git a/test/test_type_analyze.rb b/test/test_type_analyze.rb index 89cad03..d2b6237 100644 --- a/test/test_type_analyze.rb +++ b/test/test_type_analyze.rb @@ -366,6 +366,8 @@ def test_def assert_call('def f(a,...); 1.', include: Integer) assert_call('def f(...); g(...); 1.', include: Integer) assert_call('def f(*,**,&); g(*,**,&); 1.', include: Integer) + assert_call('def f(*,**,&); {**}.', include: Hash) + assert_call('def f(*,**,&); [*,**].', include: Array) assert_call('class Array; def f; self.', include: Array) end