From 9299c10f7fe495fc71f4cba58fde97cbedce6141 Mon Sep 17 00:00:00 2001 From: Takumi Shotoku Date: Sat, 26 Sep 2026 15:28:07 +0900 Subject: [PATCH] Skip the subclass method lookup for calls on Object Top-level calls like `get` in Rails routes passed their arguments to unrelated methods such as Faraday's `get`, and walking every class on each call made the analysis of large projects like rubygems.org much slower. --- lib/typeprof/core/graph/box.rb | 2 ++ scenario/method/subclass-methods-toplevel.rb | 27 ++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 scenario/method/subclass-methods-toplevel.rb diff --git a/lib/typeprof/core/graph/box.rb b/lib/typeprof/core/graph/box.rb index 8d531caff..0756be630 100644 --- a/lib/typeprof/core/graph/box.rb +++ b/lib/typeprof/core/graph/box.rb @@ -1214,6 +1214,8 @@ def resolve_subclasses(genv, changes) base_ty = ty.base_type(genv) singleton = base_ty.is_a?(Type::Singleton) mod = base_ty.mod + # Every class descends from Object, so this would only find unrelated methods + next if mod.cpath.empty? mod.each_descendant do |desc_mod| next if mod == desc_mod me = desc_mod.get_method(singleton, @mid) diff --git a/scenario/method/subclass-methods-toplevel.rb b/scenario/method/subclass-methods-toplevel.rb new file mode 100644 index 000000000..0ebd22b0c --- /dev/null +++ b/scenario/method/subclass-methods-toplevel.rb @@ -0,0 +1,27 @@ +## update +class Object + def foo(n) = n + def self.bar(n) = n + + bar(1) +end + +foo(1) + +class C + def foo(n) + end + + def self.bar(n) + end +end + +## assert +class Object < BasicObject + def foo: (Integer) -> Integer + def self.bar: (Integer) -> Integer +end +class C + def foo: (untyped) -> nil + def self.bar: (untyped) -> nil +end