lib/rbs/definition_builder.rb in rbs-1.0.0 vs lib/rbs/definition_builder.rb in rbs-1.0.1

- old
+ new

@@ -129,12 +129,12 @@ end end end end - def build_instance(type_name) - try_cache(type_name, cache: instance_cache) do + def build_instance(type_name, no_self_types: false) + try_cache(type_name, cache: instance_cache, key: [type_name, no_self_types]) do entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}" ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location) case entry when Environment::ClassEntry, Environment::ModuleEntry @@ -162,27 +162,29 @@ raise end end if self_types = one_ancestors.self_types - self_types.each do |ans| - defn = if ans.name.interface? - build_interface(ans.name) - else - build_instance(ans.name) - end + unless no_self_types + self_types.each do |ans| + defn = if ans.name.interface? + build_interface(ans.name) + else + build_instance(ans.name) + end - # Successor interface method overwrites. - merge_definition(src: defn, - dest: definition, - subst: Substitution.build(defn.type_params, ans.args), - keep_super: true) + # Successor interface method overwrites. + merge_definition(src: defn, + dest: definition, + subst: Substitution.build(defn.type_params, ans.args), + keep_super: true) + end end end one_ancestors.each_included_module do |mod| - defn = build_instance(mod.name) + defn = build_instance(mod.name, no_self_types: true) merge_definition(src: defn, dest: definition, subst: Substitution.build(defn.type_params, mod.args)) end @@ -279,11 +281,11 @@ merge_definition(src: defn, dest: definition, subst: Substitution.new, keep_super: true) end end one_ancestors.each_extended_module do |mod| - mod_defn = build_instance(mod.name) + mod_defn = build_instance(mod.name, no_self_types: true) merge_definition(src: mod_defn, dest: definition, subst: Substitution.build(mod_defn.type_params, mod.args)) end @@ -749,23 +751,25 @@ defs: defs, alias_of: method.alias_of ) end - def try_cache(type_name, cache:) - cached = _ = cache[type_name] + def try_cache(type_name, cache:, key: type_name) + # @type var cc: Hash[untyped, Definition | false | nil] + cc = _ = cache + cached = cc[key] case cached when Definition cached when false raise when nil - cache[type_name] = false + cc[key] = false begin - cache[type_name] = yield + cc[key] = yield rescue => ex - cache.delete(type_name) + cc.delete(key) raise ex end else raise end