Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions lib/typeprof/core/graph/change_set.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ def initialize(node, target)
@new_vertexes = {}
@covariant_types = {}
@contravariant_types = {}
@edges = []
@new_edges = []
@edges = {}
@new_edges = {}
@boxes = {}
@new_boxes = {}
@diagnostics = []
Expand Down Expand Up @@ -62,7 +62,14 @@ def new_contravariant_vertex(genv, sig_type_node)
end

def add_edge(genv, src, dst)
@new_edges << [src, dst]
key = [src, dst]
return if @new_edges[key]
@new_edges[key] = @edges[key] || begin
bridge = Vertex.new(@node)
src.add_edge(genv, bridge)
bridge.add_edge(genv, dst)
bridge
end
end

# TODO: if an edge is removed during one analysis, we may need to remove sub-boxes?
Expand Down Expand Up @@ -158,12 +165,12 @@ def add_depended_superclass(mod)
end

def reinstall(genv)
@new_edges.uniq!
@new_edges.each do |src, dst|
src.add_edge(genv, dst) unless @edges.include?([src, dst])
end
@edges.each do |src, dst|
src.remove_edge(genv, dst) unless @new_edges.include?([src, dst])
@edges.each do |key, bridge|
unless @new_edges.key?(key)
src, dst = key
src.remove_edge(genv, bridge)
bridge.remove_edge(genv, dst)
end
end
@edges, @new_edges = @new_edges, @edges
@new_edges.clear
Expand Down
67 changes: 67 additions & 0 deletions scenario/control/break2.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
## update
def foo
count = 0
loop do
count += 1
break count if count == 3
end
end

## assert
class Object
def foo: -> Integer
end

## update
def foo
count = 0
loop do
count += 1
begin
break count if count == 3
rescue
break count
end
end
end

## assert
class Object
def foo: -> Integer
end

## update
def foo
count = 0
loop do
count += 1
begin
break count if count == 3
rescue
break 'str'
end
end
end

## assert
class Object
def foo: -> (Integer | String)
end

## update
def foo
count = 0
loop do
count += 1
begin
# break count if count == 3
rescue
break 'str'
end
end
end

## assert
class Object
def foo: -> String
end