From 0cd665d18b3ca62b2afda63ae509c517f628b9cf Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Sun, 11 Aug 2024 02:48:26 +0900 Subject: [PATCH] Remove unneeded intermediate vertexes for rbs --- lib/typeprof/core/ast/call.rb | 4 +- lib/typeprof/core/ast/sig_type.rb | 190 +++++++++--------- lib/typeprof/core/env/method.rb | 7 +- .../{misc => regressions}/array-as-self.rb | 0 scenario/regressions/array-zip.rb | 8 + .../regressions/double-edge-record-block.rb | 8 + .../{misc => regressions}/iasgn-multi-edge.rb | 0 .../include-enumerable.rb | 0 .../{misc => regressions}/ivar-stuck-case.rb | 0 scenario/regressions/splat-block.rb | 13 ++ 10 files changed, 132 insertions(+), 98 deletions(-) rename scenario/{misc => regressions}/array-as-self.rb (100%) create mode 100644 scenario/regressions/array-zip.rb create mode 100644 scenario/regressions/double-edge-record-block.rb rename scenario/{misc => regressions}/iasgn-multi-edge.rb (100%) rename scenario/{misc => regressions}/include-enumerable.rb (100%) rename scenario/{misc => regressions}/ivar-stuck-case.rb (100%) create mode 100644 scenario/regressions/splat-block.rb diff --git a/lib/typeprof/core/ast/call.rb b/lib/typeprof/core/ast/call.rb index 88fc9f999..a3a39b0fb 100644 --- a/lib/typeprof/core/ast/call.rb +++ b/lib/typeprof/core/ast/call.rb @@ -114,7 +114,9 @@ def install0(genv) @changes.add_edge(genv, @block_body.lenv.get_var(var), @lenv.get_var(var)) end - block = Block.new(self, blk_f_args, @block_body.lenv.next_boxes) + blk_f_ary_arg = Vertex.new(self) + @changes.add_masgn_box(genv, blk_f_ary_arg, blk_f_args, nil, nil) # TODO: support splat "do |a, *b, c|" + block = Block.new(self, blk_f_ary_arg, blk_f_args, @block_body.lenv.next_boxes) blk_ty = Source.new(Type::Proc.new(genv, block)) elsif @block_pass blk_ty = @block_pass.install(genv) diff --git a/lib/typeprof/core/ast/sig_type.rb b/lib/typeprof/core/ast/sig_type.rb index 6033ebcec..7ab9634a4 100644 --- a/lib/typeprof/core/ast/sig_type.rb +++ b/lib/typeprof/core/ast/sig_type.rb @@ -79,26 +79,15 @@ def attrs = { type_params:, block_required: } end class SigTyNode < Node - def covariant_vertex(genv, changes, subst) - vtx = changes.new_covariant_vertex(genv, self) - covariant_vertex0(genv, changes, vtx, subst) - vtx - end - - def contravariant_vertex(genv, changes, subst) - vtx = changes.new_contravariant_vertex(genv, self) - contravariant_vertex0(genv, changes, vtx, subst) - vtx - end end class SigTyBaseBoolNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(genv.true_type, genv.false_type), vtx) + def covariant_vertex(genv, changes, subst) + Source.new(genv.true_type, genv.false_type) end - def contravariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(genv.true_type, genv.false_type), vtx) + def contravariant_vertex(genv, changes, subst) + Source.new(genv.true_type, genv.false_type) end def show @@ -107,12 +96,12 @@ def show end class SigTyBaseNilNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(genv.nil_type), vtx) + def covariant_vertex(genv, changes, subst) + Source.new(genv.nil_type) end - def contravariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(genv.nil_type), vtx) + def contravariant_vertex(genv, changes, subst) + Source.new(genv.nil_type) end def show @@ -121,12 +110,12 @@ def show end class SigTyBaseSelfNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, subst[:"*self"], vtx) + def covariant_vertex(genv, changes, subst) + subst[:"*self"] end - def contravariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, subst[:"*self"], vtx) + def contravariant_vertex(genv, changes, subst) + subst[:"*self"] end def show @@ -135,12 +124,12 @@ def show end class SigTyBaseVoidNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(genv.obj_type), vtx) + def covariant_vertex(genv, changes, subst) + Source.new(genv.obj_type) end - def contravariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(genv.obj_type), vtx) + def contravariant_vertex(genv, changes, subst) + Source.new(genv.obj_type) end def show @@ -149,11 +138,12 @@ def show end class SigTyBaseAnyNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) + Source.new() end - def contravariant_vertex0(genv, changes, vtx, subst) - #Source.new(genv.obj_type).add_edge(genv, vtx) # TODO + def contravariant_vertex(genv, changes, subst) + Source.new() end def show @@ -162,12 +152,12 @@ def show end class SigTyBaseTopNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - # TODO + def covariant_vertex(genv, changes, subst) + Source.new() # TODO end - def contravariant_vertex0(genv, changes, vtx, subst) - # TODO + def contravariant_vertex(genv, changes, subst) + Source.new() # TODO end def show @@ -176,12 +166,12 @@ def show end class SigTyBaseBottomNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(Type::Bot.new(genv)), vtx) + def covariant_vertex(genv, changes, subst) + Source.new(Type::Bot.new(genv)) end - def contravariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(Type::Bot.new(genv)), vtx) + def contravariant_vertex(genv, changes, subst) + Source.new(Type::Bot.new(genv)) end def show @@ -190,12 +180,12 @@ def show end class SigTyBaseInstanceNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, subst[:"*instance"], vtx) + def covariant_vertex(genv, changes, subst) + subst[:"*instance"] end - def contravariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, subst[:"*instance"], vtx) + def contravariant_vertex(genv, changes, subst) + subst[:"*instance"] end def show @@ -204,12 +194,12 @@ def show end class SigTyBaseClassNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, subst[:"*class"], vtx) + def covariant_vertex(genv, changes, subst) + subst[:"*class"] end - def contravariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, subst[:"*class"], vtx) + def contravariant_vertex(genv, changes, subst) + subst[:"*class"] end def show @@ -254,7 +244,7 @@ def undefine0(genv) @args.each {|arg| arg.undefine(genv) } end - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) changes.add_depended_static_read(@static_ret.last) tae = @static_ret.last.type_alias_entity if tae && tae.exist? @@ -265,11 +255,13 @@ def covariant_vertex0(genv, changes, vtx, subst) decl.params.zip(@args) do |param, arg| subst0[param] = arg.covariant_vertex(genv, changes, subst0) # passing subst0 is ok? end - tae.type.covariant_vertex0(genv, changes, vtx, subst0) + tae.type.covariant_vertex(genv, changes, subst0) + else + Source.new() end end - def contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) changes.add_depended_static_read(@static_ret.last) tae = @static_ret.last.type_alias_entity if tae && tae.exist? @@ -280,7 +272,9 @@ def contravariant_vertex0(genv, changes, vtx, subst) decl.params.zip(@args) do |param, arg| subst0[param] = arg.contravariant_vertex(genv, changes, subst0) end - tae.type.contravariant_vertex0(genv, changes, vtx, subst0) + tae.type.contravariant_vertex(genv, changes, subst0) + else + Source.new() end end @@ -299,16 +293,20 @@ def initialize(raw_decl, lenv) def subnodes = { types: } - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) + vtx = changes.new_covariant_vertex(genv, self) @types.each do |type| - type.covariant_vertex0(genv, changes, vtx, subst) + changes.add_edge(genv, type.covariant_vertex(genv, changes, subst), vtx) end + vtx end - def contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) + vtx = changes.new_contravariant_vertex(genv, self) @types.each do |type| - type.contravariant_vertex0(genv, changes, vtx, subst) + changes.add_edge(genv, type.contravariant_vertex(genv, changes, subst), vtx) end + vtx end def show @@ -317,12 +315,12 @@ def show end class SigTyIntersectionNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) - #raise NotImplementedError + def covariant_vertex(genv, changes, subst) + Source.new # TODO end - def contravariant_vertex0(genv, changes, vtx, subst) - #raise NotImplementedError + def contravariant_vertex(genv, changes, subst) + Source.new # TODO end def show @@ -360,22 +358,22 @@ def undefine0(genv) end end - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) # TODO: type.args changes.add_depended_static_read(@static_ret.last) cpath = @static_ret.last.cpath return unless cpath mod = genv.resolve_cpath(cpath) - changes.add_edge(genv, Source.new(Type::Singleton.new(genv, mod)), vtx) + Source.new(Type::Singleton.new(genv, mod)) end - def contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) # TODO: type.args changes.add_depended_static_read(@static_ret.last) cpath = @static_ret.last.cpath return unless cpath mod = genv.resolve_cpath(cpath) - changes.add_edge(genv, Source.new(Type::Singleton.new(genv, mod)), vtx) + Source.new(Type::Singleton.new(genv, mod)) end def show @@ -421,22 +419,22 @@ def undefine0(genv) @args.each {|arg| arg.undefine(genv) } end - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) changes.add_depended_static_read(@static_ret.last) cpath = @static_ret.last.cpath - return unless cpath + return Source.new() unless cpath mod = genv.resolve_cpath(cpath) args = @args.map {|arg| arg.covariant_vertex(genv, changes, subst) } - changes.add_edge(genv, Source.new(Type::Instance.new(genv, mod, args)), vtx) + Source.new(Type::Instance.new(genv, mod, args)) end - def contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) changes.add_depended_static_read(@static_ret.last) cpath = @static_ret.last.cpath - return unless cpath + return Source.new() unless cpath mod = genv.resolve_cpath(cpath) args = @args.map {|arg| arg.contravariant_vertex(genv, changes, subst) } - changes.add_edge(genv, Source.new(Type::Instance.new(genv, mod, args)), vtx) + Source.new(Type::Instance.new(genv, mod, args)) end def show @@ -457,24 +455,24 @@ def initialize(raw_decl, lenv) attr_reader :types def subnodes = { types: } - def covariant_vertex0(genv, changes, vtx, subst) - unified_elem = changes.new_covariant_vertex(genv, [self, :Elem]) # TODO + def covariant_vertex(genv, changes, subst) + unified_elem = changes.new_covariant_vertex(genv, self) # TODO elems = @types.map do |type| nvtx = type.covariant_vertex(genv, changes, subst) changes.add_edge(genv, nvtx, unified_elem) nvtx end - changes.add_edge(genv, Source.new(Type::Array.new(genv, elems, genv.gen_ary_type(unified_elem))), vtx) + Source.new(Type::Array.new(genv, elems, genv.gen_ary_type(unified_elem))) end - def contravariant_vertex0(genv, changes, vtx, subst) - unified_elem = changes.new_contravariant_vertex(genv, [self, :Elem]) # TODO + def contravariant_vertex(genv, changes, subst) + unified_elem = changes.new_contravariant_vertex(genv, self) # TODO elems = @types.map do |type| nvtx = type.contravariant_vertex(genv, changes, subst) changes.add_edge(genv, nvtx, unified_elem) nvtx end - changes.add_edge(genv, Source.new(Type::Array.new(genv, elems, genv.gen_ary_type(unified_elem))), vtx) + Source.new(Type::Array.new(genv, elems, genv.gen_ary_type(unified_elem))) end def show @@ -483,11 +481,11 @@ def show end class SigTyRecordNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) raise NotImplementedError end - def contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) raise NotImplementedError end @@ -506,14 +504,14 @@ def initialize(raw_decl, lenv) def attrs = { var: } - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) raise "unknown type variable: #{ @var }" unless subst[@var] - changes.add_edge(genv, subst[@var], vtx) + subst[@var] end - def contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) raise "unknown type variable: #{ @var }" unless subst[@var] - changes.add_edge(genv, Source.new(Type::Var.new(genv, @var, subst[@var])), vtx) + Source.new(Type::Var.new(genv, @var, subst[@var])) end def show @@ -530,14 +528,18 @@ def initialize(raw_decl, lenv) attr_reader :type def subnodes = { type: } - def covariant_vertex0(genv, changes, vtx, subst) - @type.covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) + vtx = changes.new_covariant_vertex(genv, self) + changes.add_edge(genv, @type.covariant_vertex(genv, changes, subst), vtx) changes.add_edge(genv, Source.new(genv.nil_type), vtx) + vtx end - def contravariant_vertex0(genv, changes, vtx, subst) - @type.contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) + vtx = changes.new_contravariant_vertex(genv, self) + changes.add_edge(genv, @type.contravariant_vertex(genv, changes, subst), vtx) changes.add_edge(genv, Source.new(genv.nil_type), vtx) + vtx end def show @@ -571,12 +573,12 @@ def get_type(genv) end end - def covariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(get_type(genv)), vtx) + def covariant_vertex(genv, changes, subst) + Source.new(get_type(genv)) end - def contravariant_vertex0(genv, changes, vtx, subst) - changes.add_edge(genv, Source.new(get_type(genv)), vtx) + def contravariant_vertex(genv, changes, subst) + Source.new(get_type(genv)) end def show @@ -585,11 +587,11 @@ def show end class SigTyProcNode < SigTyNode - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) raise NotImplementedError end - def contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) Source.new() end @@ -633,22 +635,22 @@ def undefine0(genv) @args.each {|arg| arg.undefine(genv) } end - def covariant_vertex0(genv, changes, vtx, subst) + def covariant_vertex(genv, changes, subst) changes.add_depended_static_read(@static_ret.last) cpath = @static_ret.last.cpath return unless cpath mod = genv.resolve_cpath(cpath) args = @args.map {|arg| arg.covariant_vertex(genv, changes, subst) } - changes.add_edge(genv, Source.new(Type::Instance.new(genv, mod, args)), vtx) + Source.new(Type::Instance.new(genv, mod, args)) end - def contravariant_vertex0(genv, changes, vtx, subst) + def contravariant_vertex(genv, changes, subst) changes.add_depended_static_read(@static_ret.last) cpath = @static_ret.last.cpath return unless cpath mod = genv.resolve_cpath(cpath) args = @args.map {|arg| arg.contravariant_vertex(genv, changes, subst) } - changes.add_edge(genv, Source.new(Type::Instance.new(genv, mod, args)), vtx) + Source.new(Type::Instance.new(genv, mod, args)) end def show diff --git a/lib/typeprof/core/env/method.rb b/lib/typeprof/core/env/method.rb index 8c7642bdf..ed6640c06 100644 --- a/lib/typeprof/core/env/method.rb +++ b/lib/typeprof/core/env/method.rb @@ -82,8 +82,9 @@ def get_keyword_arg(genv, changes, name) end class Block - def initialize(node, f_args, next_boxes) + def initialize(node, f_ary_arg, f_args, next_boxes) @node = node + @f_ary_arg = f_ary_arg @f_args = f_args @next_boxes = next_boxes end @@ -93,7 +94,7 @@ def initialize(node, f_args, next_boxes) def accept_args(genv, changes, caller_positionals, caller_ret, ret_check) if caller_positionals.size == 1 && @f_args.size >= 2 # TODO: support splat "do |a, *b, c|" - changes.add_masgn_box(genv, caller_positionals[0], @f_args, nil, nil) + changes.add_edge(genv, caller_positionals[0].new_vertex(genv, @node), @f_ary_arg) else caller_positionals.zip(@f_args) do |a_arg, f_arg| changes.add_edge(genv, a_arg, f_arg) if f_arg @@ -128,7 +129,7 @@ def get_f_arg(i) def accept_args(genv, changes, caller_positionals, caller_ret, ret_check) @used = true caller_positionals.each_with_index do |a_arg, i| - changes.add_edge(genv, a_arg, get_f_arg(i)) + changes.add_edge(genv, a_arg.new_vertex(genv, @node), get_f_arg(i)) end changes.add_edge(genv, caller_ret, @ret) end diff --git a/scenario/misc/array-as-self.rb b/scenario/regressions/array-as-self.rb similarity index 100% rename from scenario/misc/array-as-self.rb rename to scenario/regressions/array-as-self.rb diff --git a/scenario/regressions/array-zip.rb b/scenario/regressions/array-zip.rb new file mode 100644 index 000000000..c925ad9c6 --- /dev/null +++ b/scenario/regressions/array-zip.rb @@ -0,0 +1,8 @@ +## update: test.rb +class Foo + def foo(cond, bar) + foo = cond ? [] : [] + foo.zip(bar) do |expr, vtx| + end + end +end diff --git a/scenario/regressions/double-edge-record-block.rb b/scenario/regressions/double-edge-record-block.rb new file mode 100644 index 000000000..6fd9b6000 --- /dev/null +++ b/scenario/regressions/double-edge-record-block.rb @@ -0,0 +1,8 @@ +## update +def foo(&blk) + obj = [1] + obj.each(&blk) + obj.each(&blk) +end + +foo {|x, y|} diff --git a/scenario/misc/iasgn-multi-edge.rb b/scenario/regressions/iasgn-multi-edge.rb similarity index 100% rename from scenario/misc/iasgn-multi-edge.rb rename to scenario/regressions/iasgn-multi-edge.rb diff --git a/scenario/misc/include-enumerable.rb b/scenario/regressions/include-enumerable.rb similarity index 100% rename from scenario/misc/include-enumerable.rb rename to scenario/regressions/include-enumerable.rb diff --git a/scenario/misc/ivar-stuck-case.rb b/scenario/regressions/ivar-stuck-case.rb similarity index 100% rename from scenario/misc/ivar-stuck-case.rb rename to scenario/regressions/ivar-stuck-case.rb diff --git a/scenario/regressions/splat-block.rb b/scenario/regressions/splat-block.rb new file mode 100644 index 000000000..4d170c513 --- /dev/null +++ b/scenario/regressions/splat-block.rb @@ -0,0 +1,13 @@ +## update: test.rbs +class Foo[X] + def self.get1: -> Foo[:a] + def self.get2: -> Foo[:b] + def foo: [U] (U) { ([ U, Integer ]) -> void } -> void +end + +## update: test.rb +def check(cond) + a = cond ? Foo.get1 : Foo.get2 + a.foo(1) do |x, y| + end +end