diff --git a/lib/rbs/definition_builder.rb b/lib/rbs/definition_builder.rb index 42ba0447d..a32d89b68 100644 --- a/lib/rbs/definition_builder.rb +++ b/lib/rbs/definition_builder.rb @@ -788,5 +788,24 @@ def expand_alias(type_name) ensure_namespace!(type_name.namespace, location: entry.decl.location) entry.decl.type end + + def update(env:, except:, ancestor_builder:) + method_builder = self.method_builder.update(env: env, except: except) + + DefinitionBuilder.new(env: env, ancestor_builder: ancestor_builder, method_builder: method_builder).tap do |builder| + builder.instance_cache.merge!(instance_cache) + builder.singleton_cache.merge!(singleton_cache) + builder.singleton0_cache.merge!(singleton0_cache) + builder.interface_cache.merge!(interface_cache) + + except.each do |name| + builder.instance_cache.delete([name, true]) + builder.instance_cache.delete([name, false]) + builder.singleton_cache.delete(name) + builder.singleton0_cache.delete(name) + builder.interface_cache.delete(name) + end + end + end end end diff --git a/lib/rbs/definition_builder/method_builder.rb b/lib/rbs/definition_builder/method_builder.rb index 803310ddb..76312a285 100644 --- a/lib/rbs/definition_builder/method_builder.rb +++ b/lib/rbs/definition_builder/method_builder.rb @@ -219,6 +219,20 @@ def each_member_with_accessibility(members, accessibility: :public) end end end + + def update(env:, except:) + MethodBuilder.new(env: env).tap do |copy| + copy.instance_methods.merge!(instance_methods) + copy.singleton_methods.merge!(singleton_methods) + copy.interface_methods.merge!(interface_methods) + + except.each do |type_name| + copy.instance_methods.delete(type_name) + copy.singleton_methods.delete(type_name) + copy.interface_methods.delete(type_name) + end + end + end end end end diff --git a/sig/definition_builder.rbs b/sig/definition_builder.rbs index a35d6292c..e4e38cbd3 100644 --- a/sig/definition_builder.rbs +++ b/sig/definition_builder.rbs @@ -44,5 +44,7 @@ module RBS def define_methods: (Definition, interface_methods: Hash[Symbol, Definition::Method], methods: MethodBuilder::Methods, super_interface_method: bool) -> void def expand_alias: (TypeName) -> Types::t + + def update: (env: Environment, ancestor_builder: AncestorBuilder, except: _Each[TypeName]) -> DefinitionBuilder end end diff --git a/sig/method_builder.rbs b/sig/method_builder.rbs index 62b30edb8..85cbd02dc 100644 --- a/sig/method_builder.rbs +++ b/sig/method_builder.rbs @@ -66,6 +66,8 @@ module RBS def build_method: (Methods, Methods::instance_type, member: AST::Members::MethodDefinition, accessibility: Methods::Definition::accessibility) -> void def each_member_with_accessibility: (Array[AST::Members::t | AST::Declarations::t], ?accessibility: Definition::accessibility) { (AST::Members::t | AST::Declarations::t, Definition::accessibility) -> void } -> void + + def update: (env: Environment, except: _Each[TypeName]) -> MethodBuilder end end end