Skip to content
Merged
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
2 changes: 2 additions & 0 deletions lib/typeprof/core/env/module_entity.rb
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,8 @@ def on_parent_modules_changed(genv)
end

def on_ancestors_updated(genv, base_mod)
# `include` and `extend` can form a cycle in valid Ruby
return if base_mod == self
@child_modules.each_key {|child_mod| child_mod.on_ancestors_updated(genv, base_mod || self) }
@static_reads.each_value do |static_reads|
static_reads.each do |static_read|
Expand Down
20 changes: 20 additions & 0 deletions scenario/class/extend-cycle.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
## update
module Foo
module Util
include Foo
def helper = "h"
end
extend Util
end

def f = Foo.helper

## assert
module Foo
module Util
def helper: -> String
end
end
class Object
def f: -> String
end
77 changes: 77 additions & 0 deletions scenario/class/extend.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
## update
module A
def a = 1
end
module B
def b = "s"
end
class C
extend A
extend B
end

def f = [C.a, C.b]

## assert
module A
def a: -> Integer
end
module B
def b: -> String
end
class C
extend A
extend B
end
class Object
def f: -> [Integer, String]
end

## update
module M
def hi = "from M"
end
class C
extend M
def self.hi = 42
end

def f = C.hi

## assert
module M
def hi: -> String
end
class C
extend M
def self.hi: -> Integer
end
class Object
def f: -> Integer
end

## update
module Inner
def deep = 1.0
end
module Outer
include Inner
end
class C
extend Outer
end

def f = C.deep

## assert
module Inner
def deep: -> Float
end
module Outer
end
class C
extend Outer
end
class Object
def f: -> Float
end
Loading