def call(minuend = @minuend, context: nil)
minuend.map do |decl|
case decl
when AST::Declarations::Constant
name = absolute_typename(decl.name, context: context)
decl unless @subtrahend.constant_name?(name)
when AST::Declarations::Interface
name = absolute_typename(decl.name, context: context)
decl unless @subtrahend.interface_name?(name)
when AST::Declarations::Class, AST::Declarations::Module
name = absolute_typename(decl.name, context: context)
case
when @subtrahend.class_decl?(name) && decl.is_a?(AST::Declarations::Class)
filter_members(decl, context: context)
when @subtrahend.module_decl?(name) && decl.is_a?(AST::Declarations::Module)
filter_members(decl, context: context)
when @subtrahend.constant_name?(name)
nil
else
decl
end
when AST::Declarations::Global
decl unless @subtrahend.global_decls[decl.name]
when AST::Declarations::TypeAlias
name = absolute_typename(decl.name, context: context)
decl unless @subtrahend.type_alias_decls[name]
when AST::Declarations::ClassAlias
name = absolute_typename(decl.new_name, context: context)
decl unless @subtrahend.class_alias?(name) || @subtrahend.class_decl?(name)
when AST::Declarations::ModuleAlias
name = absolute_typename(decl.new_name, context: context)
decl unless @subtrahend.module_alias?(name) || @subtrahend.module_decl?(name)
else
raise "unknown decl: #{(_ = decl).class}"
end
end.compact
end