steep 1.8.0.dev.1 → 1.8.0.pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/README.md +3 -2
- data/bin/mem_graph.rb +67 -0
- data/bin/mem_prof.rb +102 -0
- data/bin/stackprof_test.rb +19 -0
- data/bin/steep-check.rb +251 -0
- data/guides/src/gem-rbs-collection/gem-rbs-collection.md +1 -1
- data/lib/steep/annotation_parser.rb +1 -1
- data/lib/steep/ast/builtin.rb +5 -5
- data/lib/steep/ast/node/type_application.rb +7 -6
- data/lib/steep/ast/types/any.rb +1 -9
- data/lib/steep/ast/types/boolean.rb +8 -16
- data/lib/steep/ast/types/bot.rb +2 -10
- data/lib/steep/ast/types/class.rb +1 -13
- data/lib/steep/ast/types/factory.rb +101 -85
- data/lib/steep/ast/types/instance.rb +1 -13
- data/lib/steep/ast/types/intersection.rb +8 -15
- data/lib/steep/ast/types/literal.rb +2 -8
- data/lib/steep/ast/types/logic.rb +3 -24
- data/lib/steep/ast/types/name.rb +5 -16
- data/lib/steep/ast/types/nil.rb +3 -12
- data/lib/steep/ast/types/proc.rb +4 -13
- data/lib/steep/ast/types/record.rb +21 -12
- data/lib/steep/ast/types/self.rb +1 -13
- data/lib/steep/ast/types/shared_instance.rb +11 -0
- data/lib/steep/ast/types/top.rb +1 -9
- data/lib/steep/ast/types/tuple.rb +4 -10
- data/lib/steep/ast/types/union.rb +10 -15
- data/lib/steep/ast/types/var.rb +4 -13
- data/lib/steep/ast/types/void.rb +2 -10
- data/lib/steep/diagnostic/ruby.rb +10 -10
- data/lib/steep/drivers/check.rb +11 -14
- data/lib/steep/drivers/checkfile.rb +8 -10
- data/lib/steep/drivers/stats.rb +17 -13
- data/lib/steep/drivers/utils/driver_helper.rb +24 -3
- data/lib/steep/drivers/watch.rb +3 -3
- data/lib/steep/interface/builder.rb +162 -138
- data/lib/steep/interface/method_type.rb +12 -20
- data/lib/steep/interface/shape.rb +66 -10
- data/lib/steep/interface/substitution.rb +2 -0
- data/lib/steep/interface/type_param.rb +20 -7
- data/lib/steep/located_value.rb +20 -0
- data/lib/steep/server/change_buffer.rb +5 -7
- data/lib/steep/server/custom_methods.rb +61 -0
- data/lib/steep/server/delay_queue.rb +8 -1
- data/lib/steep/server/interaction_worker.rb +13 -6
- data/lib/steep/server/lsp_formatter.rb +8 -6
- data/lib/steep/server/master.rb +195 -142
- data/lib/steep/server/type_check_worker.rb +25 -22
- data/lib/steep/server/work_done_progress.rb +64 -0
- data/lib/steep/server/worker_process.rb +1 -1
- data/lib/steep/services/completion_provider.rb +32 -24
- data/lib/steep/services/goto_service.rb +3 -2
- data/lib/steep/services/hover_provider/ruby.rb +30 -17
- data/lib/steep/services/signature_help_provider.rb +9 -7
- data/lib/steep/services/signature_service.rb +1 -1
- data/lib/steep/services/type_check_service.rb +19 -9
- data/lib/steep/signature/validator.rb +17 -20
- data/lib/steep/source.rb +47 -1
- data/lib/steep/subtyping/check.rb +105 -55
- data/lib/steep/subtyping/constraints.rb +13 -17
- data/lib/steep/type_construction.rb +106 -100
- data/lib/steep/type_inference/block_params.rb +8 -5
- data/lib/steep/type_inference/logic_type_interpreter.rb +11 -7
- data/lib/steep/type_inference/method_call.rb +3 -3
- data/lib/steep/type_inference/method_params.rb +1 -1
- data/lib/steep/type_inference/send_args.rb +1 -1
- data/lib/steep/typing.rb +164 -106
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +29 -4
- data/steep.gemspec +2 -2
- metadata +16 -9
- data/lib/steep/type_inference/context_array.rb +0 -112
| @@ -79,8 +79,8 @@ module Steep | |
| 79 79 | 
             
                      type_params.zip(type_args).each do |param, arg|
         | 
| 80 80 | 
             
                        arg or raise
         | 
| 81 81 |  | 
| 82 | 
            -
                        if param. | 
| 83 | 
            -
                          upper_bound_type = factory.type(param. | 
| 82 | 
            +
                        if param.upper_bound_type
         | 
| 83 | 
            +
                          upper_bound_type = factory.type(param.upper_bound_type).subst(subst)
         | 
| 84 84 | 
             
                          arg_type = factory.type(arg)
         | 
| 85 85 |  | 
| 86 86 | 
             
                          constraints = Subtyping::Constraints.empty
         | 
| @@ -101,7 +101,8 @@ module Steep | |
| 101 101 | 
             
                                name: param.name,
         | 
| 102 102 | 
             
                                upper_bound: upper_bound_type,
         | 
| 103 103 | 
             
                                variance: param.variance,
         | 
| 104 | 
            -
                                unchecked: param.unchecked | 
| 104 | 
            +
                                unchecked: param.unchecked?,
         | 
| 105 | 
            +
                                default_type: factory.type_opt(param.default_type)
         | 
| 105 106 | 
             
                              ),
         | 
| 106 107 | 
             
                              location: location
         | 
| 107 108 | 
             
                            )
         | 
| @@ -162,9 +163,9 @@ module Steep | |
| 162 163 |  | 
| 163 164 | 
             
                      case
         | 
| 164 165 | 
             
                      when ancestor.name.interface?
         | 
| 165 | 
            -
                        AST::Types::Name::Interface.new(name: ancestor.name, args: args | 
| 166 | 
            +
                        AST::Types::Name::Interface.new(name: ancestor.name, args: args)
         | 
| 166 167 | 
             
                      when ancestor.name.class?
         | 
| 167 | 
            -
                        AST::Types::Name::Instance.new(name: ancestor.name, args: args | 
| 168 | 
            +
                        AST::Types::Name::Instance.new(name: ancestor.name, args: args)
         | 
| 168 169 | 
             
                      else
         | 
| 169 170 | 
             
                        raise "#{ancestor.name}"
         | 
| 170 171 | 
             
                      end
         | 
| @@ -181,7 +182,7 @@ module Steep | |
| 181 182 | 
             
                    if immediate_self_types && !immediate_self_types.empty?
         | 
| 182 183 | 
             
                      # @type var sts: Array[AST::Types::t]
         | 
| 183 184 | 
             
                      sts = immediate_self_types.map {|st| ancestor_to_type(st) }
         | 
| 184 | 
            -
                      self_type = AST::Types::Intersection.build(types: sts.push(self_type) | 
| 185 | 
            +
                      self_type = AST::Types::Intersection.build(types: sts.push(self_type))
         | 
| 185 186 | 
             
                    end
         | 
| 186 187 |  | 
| 187 188 | 
             
                    mixin_ancestors.each do |ancestor|
         | 
| @@ -236,7 +237,7 @@ module Steep | |
| 236 237 | 
             
                  def validate_definition_type(definition)
         | 
| 237 238 | 
             
                    each_method_type(definition) do |method_type|
         | 
| 238 239 | 
             
                      upper_bounds = method_type.type_params.each.with_object({}) do |param, hash|
         | 
| 239 | 
            -
                        hash[param.name] = factory.type_opt(param. | 
| 240 | 
            +
                        hash[param.name] = factory.type_opt(param.upper_bound_type)
         | 
| 240 241 | 
             
                      end
         | 
| 241 242 |  | 
| 242 243 | 
             
                      checker.push_variable_bounds(upper_bounds) do
         | 
| @@ -255,23 +256,21 @@ module Steep | |
| 255 256 | 
             
                    rescue_validation_errors(name) do
         | 
| 256 257 | 
             
                      Steep.logger.debug { "Validating class definition `#{name}`..." }
         | 
| 257 258 |  | 
| 258 | 
            -
                      class_type = AST::Types::Name::Singleton.new(name: name | 
| 259 | 
            +
                      class_type = AST::Types::Name::Singleton.new(name: name)
         | 
| 259 260 | 
             
                      instance_type = AST::Types::Name::Instance.new(
         | 
| 260 261 | 
             
                        name: name,
         | 
| 261 | 
            -
                        args: entry.type_params.map { AST::Types::Any. | 
| 262 | 
            -
                        location: nil
         | 
| 262 | 
            +
                        args: entry.type_params.map { AST::Types::Any.instance() }
         | 
| 263 263 | 
             
                      )
         | 
| 264 264 |  | 
| 265 265 | 
             
                      Steep.logger.tagged "#{name}" do
         | 
| 266 266 | 
             
                        builder.build_instance(name).tap do |definition|
         | 
| 267 267 | 
             
                          upper_bounds = definition.type_params_decl.each.with_object({}) do |param, bounds|
         | 
| 268 | 
            -
                            bounds[param.name] = factory.type_opt(param. | 
| 268 | 
            +
                            bounds[param.name] = factory.type_opt(param.upper_bound_type)
         | 
| 269 269 | 
             
                          end
         | 
| 270 270 |  | 
| 271 271 | 
             
                          self_type = AST::Types::Name::Instance.new(
         | 
| 272 272 | 
             
                            name: name,
         | 
| 273 | 
            -
                            args: entry.type_params.map { AST::Types::Var.new(name: _1.name) } | 
| 274 | 
            -
                            location: nil
         | 
| 273 | 
            +
                            args: entry.type_params.map { AST::Types::Var.new(name: _1.name) }
         | 
| 275 274 | 
             
                          )
         | 
| 276 275 |  | 
| 277 276 | 
             
                          push_context(self_type: self_type, class_type: class_type, instance_type: instance_type) do
         | 
| @@ -482,13 +481,12 @@ module Steep | |
| 482 481 | 
             
                        definition = builder.build_interface(name)
         | 
| 483 482 |  | 
| 484 483 | 
             
                        upper_bounds = definition.type_params_decl.each.with_object({}) do |param, bounds|
         | 
| 485 | 
            -
                          bounds[param.name] = factory.type_opt(param. | 
| 484 | 
            +
                          bounds[param.name] = factory.type_opt(param.upper_bound_type)
         | 
| 486 485 | 
             
                        end
         | 
| 487 486 |  | 
| 488 487 | 
             
                        self_type = AST::Types::Name::Interface.new(
         | 
| 489 488 | 
             
                          name: name,
         | 
| 490 | 
            -
                          args: definition.type_params.map { AST::Types::Var.new(name: _1) } | 
| 491 | 
            -
                          location: nil
         | 
| 489 | 
            +
                          args: definition.type_params.map { AST::Types::Var.new(name: _1) }
         | 
| 492 490 | 
             
                        )
         | 
| 493 491 |  | 
| 494 492 | 
             
                        push_context(self_type: self_type, class_type: nil, instance_type: nil) do
         | 
| @@ -561,11 +559,10 @@ module Steep | |
| 561 559 | 
             
                  def validate_one_alias(name, entry = env.type_alias_decls[name])
         | 
| 562 560 | 
             
                    *, inner_most_outer_module = entry.outer
         | 
| 563 561 | 
             
                    if inner_most_outer_module
         | 
| 564 | 
            -
                      class_type = AST::Types::Name::Singleton.new(name: inner_most_outer_module.name | 
| 562 | 
            +
                      class_type = AST::Types::Name::Singleton.new(name: inner_most_outer_module.name)
         | 
| 565 563 | 
             
                      instance_type = AST::Types::Name::Instance.new(
         | 
| 566 564 | 
             
                        name: inner_most_outer_module.name,
         | 
| 567 | 
            -
                        args: inner_most_outer_module.type_params.map { AST::Types::Any. | 
| 568 | 
            -
                        location: nil
         | 
| 565 | 
            +
                        args: inner_most_outer_module.type_params.map { AST::Types::Any.instance() },
         | 
| 569 566 | 
             
                      )
         | 
| 570 567 | 
             
                    end
         | 
| 571 568 |  | 
| @@ -579,7 +576,7 @@ module Steep | |
| 579 576 | 
             
                        end
         | 
| 580 577 |  | 
| 581 578 | 
             
                        upper_bounds = entry.decl.type_params.each.with_object({}) do |param, bounds|
         | 
| 582 | 
            -
                          bounds[param.name] = factory.type_opt(param. | 
| 579 | 
            +
                          bounds[param.name] = factory.type_opt(param.upper_bound_type)
         | 
| 583 580 | 
             
                        end
         | 
| 584 581 |  | 
| 585 582 | 
             
                        validator.validate_type_alias(entry: entry) do |type|
         | 
    
        data/lib/steep/source.rb
    CHANGED
    
    | @@ -8,6 +8,7 @@ module Steep | |
| 8 8 | 
             
                attr_reader :ignores
         | 
| 9 9 |  | 
| 10 10 | 
             
                extend NodeHelper
         | 
| 11 | 
            +
                extend ModuleHelper
         | 
| 11 12 |  | 
| 12 13 | 
             
                def initialize(buffer:, path:, node:, mapping:, comments:, ignores:)
         | 
| 13 14 | 
             
                  @buffer = buffer
         | 
| @@ -295,8 +296,14 @@ module Steep | |
| 295 296 | 
             
                end
         | 
| 296 297 |  | 
| 297 298 | 
             
                def annotations(block:, factory:, context:)
         | 
| 299 | 
            +
                  annotations =
         | 
| 300 | 
            +
                    if block
         | 
| 301 | 
            +
                      mapping.fetch(block, [])
         | 
| 302 | 
            +
                    else
         | 
| 303 | 
            +
                      []
         | 
| 304 | 
            +
                    end #: Array[AST::Annotation::t]
         | 
| 298 305 | 
             
                  AST::Annotation::Collection.new(
         | 
| 299 | 
            -
                    annotations:  | 
| 306 | 
            +
                    annotations: annotations,
         | 
| 300 307 | 
             
                    factory: factory,
         | 
| 301 308 | 
             
                    context: context
         | 
| 302 309 | 
             
                  )
         | 
| @@ -444,6 +451,32 @@ module Steep | |
| 444 451 | 
             
                  end
         | 
| 445 452 | 
             
                end
         | 
| 446 453 |  | 
| 454 | 
            +
                def self.skip_arg_assertions(node)
         | 
| 455 | 
            +
                  send_node, _ = deconstruct_sendish_and_block_nodes(node)
         | 
| 456 | 
            +
                  return false unless send_node
         | 
| 457 | 
            +
             | 
| 458 | 
            +
                  if send_node.type == :send
         | 
| 459 | 
            +
                    receiver, method, args = deconstruct_send_node!(send_node)
         | 
| 460 | 
            +
             | 
| 461 | 
            +
                    return false unless receiver
         | 
| 462 | 
            +
             | 
| 463 | 
            +
                    if receiver.type == :const
         | 
| 464 | 
            +
                      if type_name = module_name_from_node(receiver.children[0], receiver.children[1])
         | 
| 465 | 
            +
                        if type_name.namespace.empty?
         | 
| 466 | 
            +
                          if type_name.name == :Data && method == :define
         | 
| 467 | 
            +
                            return true
         | 
| 468 | 
            +
                          end
         | 
| 469 | 
            +
                          if type_name.name == :Struct && method == :new
         | 
| 470 | 
            +
                            return true
         | 
| 471 | 
            +
                          end
         | 
| 472 | 
            +
                        end
         | 
| 473 | 
            +
                      end
         | 
| 474 | 
            +
                    end
         | 
| 475 | 
            +
                  end
         | 
| 476 | 
            +
             | 
| 477 | 
            +
                  false
         | 
| 478 | 
            +
                end
         | 
| 479 | 
            +
             | 
| 447 480 | 
             
                def self.insert_type_node(node, comments)
         | 
| 448 481 | 
             
                  if node.location.expression
         | 
| 449 482 | 
             
                    first_line = node.location.expression.first_line
         | 
| @@ -567,6 +600,19 @@ module Steep | |
| 567 600 | 
             
                    body = insert_type_node(body, comments) if body
         | 
| 568 601 | 
             
                    return adjust_location(node.updated(nil, [object, name, args, body]))
         | 
| 569 602 | 
             
                  else
         | 
| 603 | 
            +
                    if skip_arg_assertions(node)
         | 
| 604 | 
            +
                      # Data.define, Struct.new, ...??
         | 
| 605 | 
            +
                      if node.location.expression
         | 
| 606 | 
            +
                        first_line = node.location.expression.first_line
         | 
| 607 | 
            +
                        last_line = node.location.expression.last_line
         | 
| 608 | 
            +
             | 
| 609 | 
            +
                        child_assertions = comments.delete_if {|line, _ | first_line < line && line < last_line }
         | 
| 610 | 
            +
                        node = map_child_node(node) {|child| insert_type_node(child, child_assertions) }
         | 
| 611 | 
            +
             | 
| 612 | 
            +
                        return adjust_location(node)
         | 
| 613 | 
            +
                      end
         | 
| 614 | 
            +
                    end
         | 
| 615 | 
            +
             | 
| 570 616 | 
             
                    adjust_location(
         | 
| 571 617 | 
             
                      map_child_node(node, nil) {|child| insert_type_node(child, comments) }
         | 
| 572 618 | 
             
                    )
         | 
| @@ -59,7 +59,7 @@ module Steep | |
| 59 59 | 
             
                  def variable_upper_bound(name)
         | 
| 60 60 | 
             
                    @bounds.reverse_each do |hash|
         | 
| 61 61 | 
             
                      if hash.key?(name)
         | 
| 62 | 
            -
                        return hash | 
| 62 | 
            +
                        return hash.fetch(name)
         | 
| 63 63 | 
             
                      end
         | 
| 64 64 | 
             
                    end
         | 
| 65 65 |  | 
| @@ -129,20 +129,17 @@ module Steep | |
| 129 129 | 
             
                        if ancestor.name.class?
         | 
| 130 130 | 
             
                          AST::Types::Name::Instance.new(
         | 
| 131 131 | 
             
                            name: name,
         | 
| 132 | 
            -
                            args: args | 
| 133 | 
            -
                            location: nil
         | 
| 132 | 
            +
                            args: args
         | 
| 134 133 | 
             
                          )
         | 
| 135 134 | 
             
                        else
         | 
| 136 135 | 
             
                          AST::Types::Name::Interface.new(
         | 
| 137 136 | 
             
                            name: name,
         | 
| 138 | 
            -
                            args: args | 
| 139 | 
            -
                            location: nil
         | 
| 137 | 
            +
                            args: args
         | 
| 140 138 | 
             
                          )
         | 
| 141 139 | 
             
                        end
         | 
| 142 140 | 
             
                      when RBS::Definition::Ancestor::Singleton
         | 
| 143 141 | 
             
                        AST::Types::Name::Singleton.new(
         | 
| 144 | 
            -
                          name: name | 
| 145 | 
            -
                          location: nil
         | 
| 142 | 
            +
                          name: name
         | 
| 146 143 | 
             
                        )
         | 
| 147 144 | 
             
                      end
         | 
| 148 145 | 
             
                    end
         | 
| @@ -163,20 +160,17 @@ module Steep | |
| 163 160 | 
             
                        if ancestor.name.class?
         | 
| 164 161 | 
             
                          AST::Types::Name::Instance.new(
         | 
| 165 162 | 
             
                            name: name,
         | 
| 166 | 
            -
                            args: args | 
| 167 | 
            -
                            location: nil
         | 
| 163 | 
            +
                            args: args
         | 
| 168 164 | 
             
                          )
         | 
| 169 165 | 
             
                        else
         | 
| 170 166 | 
             
                          AST::Types::Name::Interface.new(
         | 
| 171 167 | 
             
                            name: name,
         | 
| 172 | 
            -
                            args: args | 
| 173 | 
            -
                            location: nil
         | 
| 168 | 
            +
                            args: args
         | 
| 174 169 | 
             
                          )
         | 
| 175 170 | 
             
                        end
         | 
| 176 171 | 
             
                      when RBS::Definition::Ancestor::Singleton
         | 
| 177 172 | 
             
                        AST::Types::Name::Singleton.new(
         | 
| 178 | 
            -
                          name: name | 
| 179 | 
            -
                          location: nil
         | 
| 173 | 
            +
                          name: name
         | 
| 180 174 | 
             
                        )
         | 
| 181 175 | 
             
                      end
         | 
| 182 176 | 
             
                    end
         | 
| @@ -271,9 +265,6 @@ module Steep | |
| 271 265 | 
             
                    when relation.sub_type.is_a?(AST::Types::Bot)
         | 
| 272 266 | 
             
                      success(relation)
         | 
| 273 267 |  | 
| 274 | 
            -
                    when relation.sub_type.is_a?(AST::Types::Logic::Base) && (true_type?(relation.super_type) || false_type?(relation.super_type))
         | 
| 275 | 
            -
                      success(relation)
         | 
| 276 | 
            -
             | 
| 277 268 | 
             
                    when relation.super_type.is_a?(AST::Types::Boolean)
         | 
| 278 269 | 
             
                      Expand(relation) do
         | 
| 279 270 | 
             
                        check_type(
         | 
| @@ -284,7 +275,7 @@ module Steep | |
| 284 275 | 
             
                        )
         | 
| 285 276 | 
             
                      end
         | 
| 286 277 |  | 
| 287 | 
            -
                    when relation.sub_type.is_a?(AST::Types::Boolean)
         | 
| 278 | 
            +
                    when relation.sub_type.is_a?(AST::Types::Boolean) || relation.sub_type.is_a?(AST::Types::Logic::Base)
         | 
| 288 279 | 
             
                      Expand(relation) do
         | 
| 289 280 | 
             
                        check_type(
         | 
| 290 281 | 
             
                          Relation.new(
         | 
| @@ -357,20 +348,51 @@ module Steep | |
| 357 348 | 
             
                      constraints.add(relation.sub_type.name, super_type: relation.super_type)
         | 
| 358 349 | 
             
                      Success(relation)
         | 
| 359 350 |  | 
| 360 | 
            -
                    when relation.sub_type.is_a?(AST::Types:: | 
| 351 | 
            +
                    when relation.sub_type.is_a?(AST::Types::Var) && ub = variable_upper_bound(relation.sub_type.name)
         | 
| 352 | 
            +
                      Expand(relation) do
         | 
| 353 | 
            +
                        check_type(Relation.new(sub_type: ub, super_type: relation.super_type))
         | 
| 354 | 
            +
                      end
         | 
| 355 | 
            +
             | 
| 356 | 
            +
                    when relation.sub_type.is_a?(AST::Types::Intersection) && relation.super_type.is_a?(AST::Types::Union)
         | 
| 357 | 
            +
                      Any(relation) do |base_result|
         | 
| 358 | 
            +
                        # Expand the super_type first
         | 
| 359 | 
            +
                        base_result.add(relation) do
         | 
| 360 | 
            +
                          Any(relation) do |result|
         | 
| 361 | 
            +
                            relation.super_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : -Float::INFINITY }.each do |super_type|
         | 
| 362 | 
            +
                              rel = Relation.new(sub_type: relation.sub_type, super_type: super_type)
         | 
| 363 | 
            +
                              result.add(rel) do
         | 
| 364 | 
            +
                                check_type(rel)
         | 
| 365 | 
            +
                              end
         | 
| 366 | 
            +
                            end
         | 
| 367 | 
            +
                          end
         | 
| 368 | 
            +
                        end
         | 
| 369 | 
            +
             | 
| 370 | 
            +
                        # Expand the sub_type if it fails
         | 
| 371 | 
            +
                        base_result.add(relation) do
         | 
| 372 | 
            +
                          Any(relation) do |result|
         | 
| 373 | 
            +
                            relation.sub_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : -Float::INFINITY }.each do |sub_type|
         | 
| 374 | 
            +
                              rel = Relation.new(sub_type: sub_type, super_type: relation.super_type)
         | 
| 375 | 
            +
                              result.add(rel) do
         | 
| 376 | 
            +
                                check_type(rel)
         | 
| 377 | 
            +
                              end
         | 
| 378 | 
            +
                            end
         | 
| 379 | 
            +
                          end
         | 
| 380 | 
            +
                        end
         | 
| 381 | 
            +
                      end
         | 
| 382 | 
            +
             | 
| 383 | 
            +
                    when relation.super_type.is_a?(AST::Types::Intersection)
         | 
| 361 384 | 
             
                      All(relation) do |result|
         | 
| 362 | 
            -
                        relation. | 
| 363 | 
            -
                           | 
| 364 | 
            -
                          result.add(rel) do
         | 
| 385 | 
            +
                        relation.super_type.types.each do |super_type|
         | 
| 386 | 
            +
                          result.add(Relation.new(sub_type: relation.sub_type, super_type: super_type)) do |rel|
         | 
| 365 387 | 
             
                            check_type(rel)
         | 
| 366 388 | 
             
                          end
         | 
| 367 389 | 
             
                        end
         | 
| 368 390 | 
             
                      end
         | 
| 369 391 |  | 
| 370 | 
            -
                    when relation. | 
| 371 | 
            -
                       | 
| 372 | 
            -
                        relation. | 
| 373 | 
            -
                          rel = Relation.new(sub_type:  | 
| 392 | 
            +
                    when relation.sub_type.is_a?(AST::Types::Union)
         | 
| 393 | 
            +
                      All(relation) do |result|
         | 
| 394 | 
            +
                        relation.sub_type.types.each do |sub_type|
         | 
| 395 | 
            +
                          rel = Relation.new(sub_type: sub_type, super_type: relation.super_type)
         | 
| 374 396 | 
             
                          result.add(rel) do
         | 
| 375 397 | 
             
                            check_type(rel)
         | 
| 376 398 | 
             
                          end
         | 
| @@ -387,23 +409,16 @@ module Steep | |
| 387 409 | 
             
                        end
         | 
| 388 410 | 
             
                      end
         | 
| 389 411 |  | 
| 390 | 
            -
                    when relation.super_type.is_a?(AST::Types:: | 
| 391 | 
            -
                       | 
| 392 | 
            -
                        relation.super_type.types.each do |super_type|
         | 
| 393 | 
            -
                           | 
| 412 | 
            +
                    when relation.super_type.is_a?(AST::Types::Union)
         | 
| 413 | 
            +
                      Any(relation) do |result|
         | 
| 414 | 
            +
                        relation.super_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : -Float::INFINITY }.each do |super_type|
         | 
| 415 | 
            +
                          rel = Relation.new(sub_type: relation.sub_type, super_type: super_type)
         | 
| 416 | 
            +
                          result.add(rel) do
         | 
| 394 417 | 
             
                            check_type(rel)
         | 
| 395 418 | 
             
                          end
         | 
| 396 419 | 
             
                        end
         | 
| 397 420 | 
             
                      end
         | 
| 398 421 |  | 
| 399 | 
            -
                    when relation.sub_type.is_a?(AST::Types::Var) && ub = variable_upper_bound(relation.sub_type.name)
         | 
| 400 | 
            -
                      Expand(relation) do
         | 
| 401 | 
            -
                        check_type(Relation.new(sub_type: ub, super_type: relation.super_type))
         | 
| 402 | 
            -
                      end
         | 
| 403 | 
            -
             | 
| 404 | 
            -
                    when relation.super_type.is_a?(AST::Types::Var) || relation.sub_type.is_a?(AST::Types::Var)
         | 
| 405 | 
            -
                      Failure(relation, Result::Failure::UnknownPairError.new(relation: relation))
         | 
| 406 | 
            -
             | 
| 407 422 | 
             
                    when relation.super_type.is_a?(AST::Types::Name::Interface)
         | 
| 408 423 | 
             
                      Expand(relation) do
         | 
| 409 424 | 
             
                        check_interface(
         | 
| @@ -497,37 +512,72 @@ module Steep | |
| 497 512 | 
             
                      Expand(relation) do
         | 
| 498 513 | 
             
                        tuple_element_type =
         | 
| 499 514 | 
             
                          AST::Types::Union.build(
         | 
| 500 | 
            -
                            types: relation.sub_type.types | 
| 501 | 
            -
                            location: relation.sub_type.location
         | 
| 515 | 
            +
                            types: relation.sub_type.types
         | 
| 502 516 | 
             
                          )
         | 
| 503 517 |  | 
| 504 518 | 
             
                        check_type(Relation.new(sub_type: tuple_element_type, super_type: super_type.args[0]))
         | 
| 505 519 | 
             
                      end
         | 
| 506 520 |  | 
| 521 | 
            +
                    when relation.sub_type.is_a?(AST::Types::Tuple)
         | 
| 522 | 
            +
                      Any(relation) do |result|
         | 
| 523 | 
            +
                        # Check by converting the tuple to array
         | 
| 524 | 
            +
                        tuple_element_type = AST::Types::Union.build(types: relation.sub_type.types)
         | 
| 525 | 
            +
                        array_type = AST::Builtin::Array.instance_type(tuple_element_type)
         | 
| 526 | 
            +
                        result.add(Relation.new(sub_type: array_type, super_type: relation.super_type)) do
         | 
| 527 | 
            +
                          check_type(_1)
         | 
| 528 | 
            +
                        end
         | 
| 529 | 
            +
             | 
| 530 | 
            +
                        # Check by shapes
         | 
| 531 | 
            +
                        shape_relation = relation.map {|type|
         | 
| 532 | 
            +
                          # @type break: nil
         | 
| 533 | 
            +
                          builder.shape(
         | 
| 534 | 
            +
                            type, Interface::Builder::Config.new(self_type: type, variable_bounds: variable_upper_bounds)
         | 
| 535 | 
            +
                          )&.public_shape or break
         | 
| 536 | 
            +
                        }
         | 
| 537 | 
            +
                        if shape_relation
         | 
| 538 | 
            +
                          result.add(shape_relation) { check_interface(_1) }
         | 
| 539 | 
            +
                        end
         | 
| 540 | 
            +
                      end
         | 
| 541 | 
            +
             | 
| 507 542 | 
             
                    when relation.sub_type.is_a?(AST::Types::Record) && relation.super_type.is_a?(AST::Types::Record)
         | 
| 508 543 | 
             
                      All(relation) do |result|
         | 
| 509 544 | 
             
                        relation.super_type.elements.each_key do |key|
         | 
| 510 | 
            -
                           | 
| 511 | 
            -
                            sub_type: relation.sub_type.elements[key] || AST::Builtin.nil_type,
         | 
| 512 | 
            -
                            super_type: relation.super_type.elements[key]
         | 
| 513 | 
            -
                          )
         | 
| 545 | 
            +
                          super_element_type = relation.super_type.elements[key]
         | 
| 514 546 |  | 
| 515 | 
            -
                           | 
| 516 | 
            -
                             | 
| 547 | 
            +
                          if relation.sub_type.elements.key?(key)
         | 
| 548 | 
            +
                            sub_element_type = relation.sub_type.elements[key]
         | 
| 549 | 
            +
                          else
         | 
| 550 | 
            +
                            if relation.super_type.required?(key)
         | 
| 551 | 
            +
                              sub_element_type = AST::Builtin.nil_type
         | 
| 552 | 
            +
                            end
         | 
| 553 | 
            +
                          end
         | 
| 554 | 
            +
             | 
| 555 | 
            +
                          if sub_element_type
         | 
| 556 | 
            +
                            rel = Relation.new(sub_type: sub_element_type, super_type: super_element_type)
         | 
| 557 | 
            +
                            result.add(rel) { check_type(rel) }
         | 
| 517 558 | 
             
                          end
         | 
| 518 559 | 
             
                        end
         | 
| 519 560 | 
             
                      end
         | 
| 520 561 |  | 
| 521 | 
            -
                    when relation.sub_type.is_a?(AST::Types::Record) | 
| 522 | 
            -
                       | 
| 523 | 
            -
                         | 
| 524 | 
            -
             | 
| 525 | 
            -
             | 
| 526 | 
            -
             | 
| 527 | 
            -
             | 
| 528 | 
            -
             | 
| 529 | 
            -
             | 
| 530 | 
            -
                         | 
| 562 | 
            +
                    when relation.sub_type.is_a?(AST::Types::Record)
         | 
| 563 | 
            +
                      Any(relation) do |result|
         | 
| 564 | 
            +
                        # Check by converting the record to hash
         | 
| 565 | 
            +
                        key_type = AST::Types::Union.build(types: relation.sub_type.elements.each_key.map {|key| AST::Types::Literal.new(value: key) })
         | 
| 566 | 
            +
                        value_type = AST::Types::Union.build(types: relation.sub_type.elements.each_value.map {|key| key })
         | 
| 567 | 
            +
                        hash_type = AST::Builtin::Hash.instance_type(key_type, value_type)
         | 
| 568 | 
            +
                        result.add(Relation.new(sub_type: hash_type, super_type: relation.super_type)) { check_type(_1) }
         | 
| 569 | 
            +
             | 
| 570 | 
            +
                        # Check by the shapes
         | 
| 571 | 
            +
                        shape_relation = relation.map do |type|
         | 
| 572 | 
            +
                          # @type break: nil
         | 
| 573 | 
            +
                          builder.shape(
         | 
| 574 | 
            +
                            type,
         | 
| 575 | 
            +
                            Interface::Builder::Config.new(self_type: type, variable_bounds: variable_upper_bounds)
         | 
| 576 | 
            +
                          )&.public_shape or break
         | 
| 577 | 
            +
                        end
         | 
| 578 | 
            +
                        if shape_relation
         | 
| 579 | 
            +
                          result.add(shape_relation) { check_interface(_1) }
         | 
| 580 | 
            +
                        end
         | 
| 531 581 | 
             
                      end
         | 
| 532 582 |  | 
| 533 583 | 
             
                    when relation.sub_type.is_a?(AST::Types::Proc) && AST::Builtin::Proc.instance_type?(relation.super_type)
         | 
| @@ -28,7 +28,7 @@ module Steep | |
| 28 28 | 
             
                      attr_reader :lower_bound
         | 
| 29 29 | 
             
                      attr_reader :upper_bound
         | 
| 30 30 |  | 
| 31 | 
            -
                      def initialize(var | 
| 31 | 
            +
                      def initialize(var:, lower_bound:, upper_bound:)
         | 
| 32 32 | 
             
                        @var = var
         | 
| 33 33 | 
             
                        @lower_bound = lower_bound
         | 
| 34 34 | 
             
                        @upper_bound = upper_bound
         | 
| @@ -96,7 +96,7 @@ module Steep | |
| 96 96 | 
             
                    unless Set.new(vars).disjoint?(unknowns)
         | 
| 97 97 | 
             
                      raise UnsatisfiedInvariantError.new(
         | 
| 98 98 | 
             
                        reason: UnsatisfiedInvariantError::VariablesUnknownsNotDisjoint.new(vars: vars),
         | 
| 99 | 
            -
                        constraints:  | 
| 99 | 
            +
                        constraints: self
         | 
| 100 100 | 
             
                      )
         | 
| 101 101 | 
             
                    end
         | 
| 102 102 | 
             
                  end
         | 
| @@ -113,13 +113,13 @@ module Steep | |
| 113 113 | 
             
                    end
         | 
| 114 114 |  | 
| 115 115 | 
             
                    if super_type && !super_type.is_a?(AST::Types::Top)
         | 
| 116 | 
            -
                      type = eliminate_variable(super_type, to: AST::Types::Top. | 
| 116 | 
            +
                      type = eliminate_variable(super_type, to: AST::Types::Top.instance)
         | 
| 117 117 | 
             
                      supers << type
         | 
| 118 118 | 
             
                      skips << type if skip
         | 
| 119 119 | 
             
                    end
         | 
| 120 120 |  | 
| 121 121 | 
             
                    if sub_type && !sub_type.is_a?(AST::Types::Bot)
         | 
| 122 | 
            -
                      type = eliminate_variable(sub_type, to: AST::Types::Bot. | 
| 122 | 
            +
                      type = eliminate_variable(sub_type, to: AST::Types::Bot.instance)
         | 
| 123 123 | 
             
                      subs << type
         | 
| 124 124 | 
             
                      skips << type if skip
         | 
| 125 125 | 
             
                    end
         | 
| @@ -147,19 +147,19 @@ module Steep | |
| 147 147 | 
             
                    case type
         | 
| 148 148 | 
             
                    when AST::Types::Name::Instance, AST::Types::Name::Alias, AST::Types::Name::Interface
         | 
| 149 149 | 
             
                      type.args.map do |ty|
         | 
| 150 | 
            -
                        eliminate_variable(ty, to: AST::Types::Any. | 
| 150 | 
            +
                        eliminate_variable(ty, to: AST::Types::Any.instance)
         | 
| 151 151 | 
             
                      end.yield_self do |args|
         | 
| 152 | 
            -
                        type.class.new(name: type.name, args: args | 
| 152 | 
            +
                        type.class.new(name: type.name, args: args)
         | 
| 153 153 | 
             
                      end
         | 
| 154 154 | 
             
                    when AST::Types::Union
         | 
| 155 155 | 
             
                      type.types.map do |ty|
         | 
| 156 | 
            -
                        eliminate_variable(ty, to: AST::Types::Any. | 
| 156 | 
            +
                        eliminate_variable(ty, to: AST::Types::Any.instance)
         | 
| 157 157 | 
             
                      end.yield_self do |types|
         | 
| 158 158 | 
             
                        AST::Types::Union.build(types: types)
         | 
| 159 159 | 
             
                      end
         | 
| 160 160 | 
             
                    when AST::Types::Intersection
         | 
| 161 161 | 
             
                      type.types.map do |ty|
         | 
| 162 | 
            -
                        eliminate_variable(ty, to: AST::Types::Any. | 
| 162 | 
            +
                        eliminate_variable(ty, to: AST::Types::Any.instance)
         | 
| 163 163 | 
             
                      end.yield_self do |types|
         | 
| 164 164 | 
             
                        AST::Types::Intersection.build(types: types)
         | 
| 165 165 | 
             
                      end
         | 
| @@ -171,14 +171,10 @@ module Steep | |
| 171 171 | 
             
                      end
         | 
| 172 172 | 
             
                    when AST::Types::Tuple
         | 
| 173 173 | 
             
                      AST::Types::Tuple.new(
         | 
| 174 | 
            -
                        types: type.types.map {|ty| eliminate_variable(ty, to: AST::Builtin.any_type) } | 
| 175 | 
            -
                        location: type.location
         | 
| 174 | 
            +
                        types: type.types.map {|ty| eliminate_variable(ty, to: AST::Builtin.any_type) }
         | 
| 176 175 | 
             
                      )
         | 
| 177 176 | 
             
                    when AST::Types::Record
         | 
| 178 | 
            -
                      AST:: | 
| 179 | 
            -
                        elements: type.elements.transform_values {|ty| eliminate_variable(ty, to: AST::Builtin.any_type) },
         | 
| 180 | 
            -
                        location: type.location
         | 
| 181 | 
            -
                      )
         | 
| 177 | 
            +
                      type.map_type { eliminate_variable(_1, to: AST::Builtin.any_type) }
         | 
| 182 178 | 
             
                    when AST::Types::Proc
         | 
| 183 179 | 
             
                      type.map_type {|ty| eliminate_variable(ty, to: AST::Builtin.any_type) }
         | 
| 184 180 | 
             
                    else
         | 
| @@ -213,7 +209,7 @@ module Steep | |
| 213 209 |  | 
| 214 210 | 
             
                    case upper_bound.size
         | 
| 215 211 | 
             
                    when 0
         | 
| 216 | 
            -
                      AST::Types::Top. | 
| 212 | 
            +
                      AST::Types::Top.instance
         | 
| 217 213 | 
             
                    when 1
         | 
| 218 214 | 
             
                      upper_bound.first || raise
         | 
| 219 215 | 
             
                    else
         | 
| @@ -226,7 +222,7 @@ module Steep | |
| 226 222 |  | 
| 227 223 | 
             
                    case lower_bound.size
         | 
| 228 224 | 
             
                    when 0
         | 
| 229 | 
            -
                      AST::Types::Bot. | 
| 225 | 
            +
                      AST::Types::Bot.instance
         | 
| 230 226 | 
             
                    when 1
         | 
| 231 227 | 
             
                      lower_bound.first || raise
         | 
| 232 228 | 
             
                    else
         | 
| @@ -293,7 +289,7 @@ module Steep | |
| 293 289 | 
             
                          end
         | 
| 294 290 | 
             
                        else
         | 
| 295 291 | 
             
                          vars << var
         | 
| 296 | 
            -
                          types << AST::Types::Any. | 
| 292 | 
            +
                          types << AST::Types::Any.instance
         | 
| 297 293 | 
             
                        end
         | 
| 298 294 | 
             
                      end
         | 
| 299 295 | 
             
                    end
         |