From 9bea2142349509b2d5837743961da90e6adf9211 Mon Sep 17 00:00:00 2001 From: Soutaro Matsumoto Date: Mon, 9 Sep 2024 22:11:19 +0900 Subject: [PATCH] Union/intersection subtyping order --- lib/steep/subtyping/check.rb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/steep/subtyping/check.rb b/lib/steep/subtyping/check.rb index e77d3209..a99a255b 100644 --- a/lib/steep/subtyping/check.rb +++ b/lib/steep/subtyping/check.rb @@ -354,20 +354,19 @@ def check_type0(relation) when relation.super_type.is_a?(AST::Types::Var) || relation.sub_type.is_a?(AST::Types::Var) Failure(relation, Result::Failure::UnknownPairError.new(relation: relation)) - when relation.sub_type.is_a?(AST::Types::Union) + when relation.super_type.is_a?(AST::Types::Intersection) All(relation) do |result| - relation.sub_type.types.each do |sub_type| - rel = Relation.new(sub_type: sub_type, super_type: relation.super_type) - result.add(rel) do + relation.super_type.types.each do |super_type| + result.add(Relation.new(sub_type: relation.sub_type, super_type: super_type)) do |rel| check_type(rel) end end end - when relation.super_type.is_a?(AST::Types::Union) - Any(relation) do |result| - relation.super_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : -Float::INFINITY }.each do |super_type| - rel = Relation.new(sub_type: relation.sub_type, super_type: super_type) + when relation.sub_type.is_a?(AST::Types::Union) + All(relation) do |result| + relation.sub_type.types.each do |sub_type| + rel = Relation.new(sub_type: sub_type, super_type: relation.super_type) result.add(rel) do check_type(rel) end @@ -384,10 +383,11 @@ def check_type0(relation) end end - when relation.super_type.is_a?(AST::Types::Intersection) - All(relation) do |result| - relation.super_type.types.each do |super_type| - result.add(Relation.new(sub_type: relation.sub_type, super_type: super_type)) do |rel| + when relation.super_type.is_a?(AST::Types::Union) + Any(relation) do |result| + relation.super_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : -Float::INFINITY }.each do |super_type| + rel = Relation.new(sub_type: relation.sub_type, super_type: super_type) + result.add(rel) do check_type(rel) end end