steep 1.8.0.dev.2 → 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/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/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 +4 -4
- 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 +10 -5
- data/lib/steep/server/lsp_formatter.rb +8 -6
- data/lib/steep/server/master.rb +193 -140
- data/lib/steep/server/type_check_worker.rb +18 -19
- data/lib/steep/server/work_done_progress.rb +64 -0
- data/lib/steep/services/completion_provider.rb +24 -22
- data/lib/steep/services/goto_service.rb +3 -2
- data/lib/steep/services/hover_provider/ruby.rb +7 -6
- data/lib/steep/services/signature_help_provider.rb +7 -6
- data/lib/steep/services/signature_service.rb +1 -1
- data/lib/steep/services/type_check_service.rb +3 -3
- data/lib/steep/signature/validator.rb +17 -20
- data/lib/steep/subtyping/check.rb +105 -55
- data/lib/steep/subtyping/constraints.rb +11 -15
- data/lib/steep/type_construction.rb +100 -100
- data/lib/steep/type_inference/block_params.rb +6 -6
- 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 +158 -102
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +28 -3
- data/steep.gemspec +2 -2
- metadata +16 -9
- data/lib/steep/type_inference/context_array.rb +0 -112
| @@ -11,9 +11,7 @@ module Steep | |
| 11 11 | 
             
                  TypeCheckCodeJob = _ = Struct.new(:guid, :path, keyword_init: true)
         | 
| 12 12 | 
             
                  ValidateAppSignatureJob = _ = Struct.new(:guid, :path, keyword_init: true)
         | 
| 13 13 | 
             
                  ValidateLibrarySignatureJob = _ = Struct.new(:guid, :path, keyword_init: true)
         | 
| 14 | 
            -
                  GotoJob  | 
| 15 | 
            -
                    # @implements GotoJob
         | 
| 16 | 
            -
             | 
| 14 | 
            +
                  class GotoJob < Struct.new(:id, :kind, :params, keyword_init: true)
         | 
| 17 15 | 
             
                    def self.implementation(id:, params:)
         | 
| 18 16 | 
             
                      new(
         | 
| 19 17 | 
             
                        kind: :implementation,
         | 
| @@ -57,7 +55,6 @@ module Steep | |
| 57 55 | 
             
                    super(project: project, reader: reader, writer: writer)
         | 
| 58 56 |  | 
| 59 57 | 
             
                    @assignment = assignment
         | 
| 60 | 
            -
                    @service = Services::TypeCheckService.new(project: project)
         | 
| 61 58 | 
             
                    @buffered_changes = {}
         | 
| 62 59 | 
             
                    @mutex = Mutex.new()
         | 
| 63 60 | 
             
                    @queue = Queue.new
         | 
| @@ -65,30 +62,35 @@ module Steep | |
| 65 62 | 
             
                    @current_type_check_guid = nil
         | 
| 66 63 | 
             
                  end
         | 
| 67 64 |  | 
| 65 | 
            +
                  def service
         | 
| 66 | 
            +
                    @service ||= Services::TypeCheckService.new(project: project)
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 68 69 | 
             
                  def handle_request(request)
         | 
| 69 70 | 
             
                    case request[:method]
         | 
| 70 71 | 
             
                    when "initialize"
         | 
| 71 | 
            -
                      load_files(project: project, commandline_args: commandline_args)
         | 
| 72 72 | 
             
                      writer.write({ id: request[:id], result: nil})
         | 
| 73 73 |  | 
| 74 74 | 
             
                    when "textDocument/didChange"
         | 
| 75 75 | 
             
                      collect_changes(request)
         | 
| 76 76 |  | 
| 77 | 
            -
                    when  | 
| 78 | 
            -
                       | 
| 79 | 
            -
                       | 
| 77 | 
            +
                    when CustomMethods::FileLoad::METHOD
         | 
| 78 | 
            +
                      input = request[:params][:content]
         | 
| 79 | 
            +
                      load_files(input)
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                    when CustomMethods::FileReset::METHOD
         | 
| 82 | 
            +
                      params = request[:params] #: CustomMethods::FileReset::params
         | 
| 83 | 
            +
                      uri = params[:uri]
         | 
| 84 | 
            +
                      text = params[:content]
         | 
| 80 85 | 
             
                      reset_change(uri: uri, text: text)
         | 
| 81 86 |  | 
| 82 87 | 
             
                    when "workspace/symbol"
         | 
| 83 88 | 
             
                      query = request[:params][:query]
         | 
| 84 89 | 
             
                      queue << WorkspaceSymbolJob.new(id: request[:id], query: query)
         | 
| 85 | 
            -
                    when  | 
| 86 | 
            -
                       | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
                      end
         | 
| 90 | 
            -
                    when "$/typecheck/start"
         | 
| 91 | 
            -
                      params = request[:params]
         | 
| 90 | 
            +
                    when CustomMethods::Stats::METHOD
         | 
| 91 | 
            +
                      queue << StatsJob.new(id: request[:id])
         | 
| 92 | 
            +
                    when CustomMethods::TypeCheck__Start::METHOD
         | 
| 93 | 
            +
                      params = request[:params] #: CustomMethods::TypeCheck__Start::params
         | 
| 92 94 | 
             
                      enqueue_typecheck_jobs(params)
         | 
| 93 95 | 
             
                    when "textDocument/definition"
         | 
| 94 96 | 
             
                      queue << GotoJob.definition(id: request[:id], params: request[:params])
         | 
| @@ -241,10 +243,7 @@ module Steep | |
| 241 243 | 
             
                  end
         | 
| 242 244 |  | 
| 243 245 | 
             
                  def typecheck_progress(guid:, path:)
         | 
| 244 | 
            -
                    writer.write(
         | 
| 245 | 
            -
                      method: "$/typecheck/progress",
         | 
| 246 | 
            -
                      params: { guid: guid, path: path }
         | 
| 247 | 
            -
                    )
         | 
| 246 | 
            +
                    writer.write(CustomMethods::TypeCheck__Progress.notification({ guid: guid, path: path.to_s }))
         | 
| 248 247 | 
             
                  end
         | 
| 249 248 |  | 
| 250 249 | 
             
                  def workspace_symbol_result(query)
         | 
| @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            module Steep
         | 
| 2 | 
            +
              module Server
         | 
| 3 | 
            +
                class WorkDoneProgress
         | 
| 4 | 
            +
                  attr_reader :sender, :guid, :percentage
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def initialize(guid, &block)
         | 
| 7 | 
            +
                    @sender = block
         | 
| 8 | 
            +
                    @guid = guid
         | 
| 9 | 
            +
                    @percentage = 0
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def begin(title, message = nil, request_id:)
         | 
| 13 | 
            +
                    sender.call(
         | 
| 14 | 
            +
                      {
         | 
| 15 | 
            +
                        id: request_id,
         | 
| 16 | 
            +
                        method: "window/workDoneProgress/create",
         | 
| 17 | 
            +
                        params: { token: guid }
         | 
| 18 | 
            +
                      }
         | 
| 19 | 
            +
                    )
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    value = { kind: "begin", cancellable: false, title: title, percentage: percentage }
         | 
| 22 | 
            +
                    value[:message] = message if message
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    sender.call(
         | 
| 25 | 
            +
                      {
         | 
| 26 | 
            +
                        method: "$/progress",
         | 
| 27 | 
            +
                        params: { token: guid, value: value }
         | 
| 28 | 
            +
                      }
         | 
| 29 | 
            +
                    )
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    self
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def report(percentage, message = nil)
         | 
| 35 | 
            +
                    @percentage = percentage
         | 
| 36 | 
            +
                    value = { kind: "report", percentage: percentage }
         | 
| 37 | 
            +
                    value[:message] = message if message
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    sender.call(
         | 
| 40 | 
            +
                      {
         | 
| 41 | 
            +
                        method: "$/progress",
         | 
| 42 | 
            +
                        params: { token: guid, value: value }
         | 
| 43 | 
            +
                      }
         | 
| 44 | 
            +
                    )
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    self
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  def end(message = nil)
         | 
| 50 | 
            +
                    value = { kind: "end" }
         | 
| 51 | 
            +
                    value[:message] = message if message
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    sender.call(
         | 
| 54 | 
            +
                      {
         | 
| 55 | 
            +
                        method: "$/progress",
         | 
| 56 | 
            +
                        params: { token: guid, value: value }
         | 
| 57 | 
            +
                      }
         | 
| 58 | 
            +
                    )
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    self
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
| @@ -183,8 +183,9 @@ module Steep | |
| 183 183 | 
             
                    end
         | 
| 184 184 |  | 
| 185 185 | 
             
                    Steep.measure "typechecking" do
         | 
| 186 | 
            +
                      location = source.buffer.loc_to_pos([line, column])
         | 
| 186 187 | 
             
                      resolver = RBS::Resolver::ConstantResolver.new(builder: subtyping.factory.definition_builder)
         | 
| 187 | 
            -
                      @typing = TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver)
         | 
| 188 | 
            +
                      @typing = TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver, cursor: location)
         | 
| 188 189 | 
             
                    end
         | 
| 189 190 | 
             
                  end
         | 
| 190 191 |  | 
| @@ -348,7 +349,7 @@ module Steep | |
| 348 349 |  | 
| 349 350 | 
             
                    items = [] #: Array[item]
         | 
| 350 351 |  | 
| 351 | 
            -
                    context = typing. | 
| 352 | 
            +
                    context = typing.cursor_context.context or raise
         | 
| 352 353 |  | 
| 353 354 | 
             
                    case
         | 
| 354 355 | 
             
                    when node.type == :send && node.children[0] == nil && at_end?(position, of: (_ = node.loc).selector)
         | 
| @@ -469,7 +470,7 @@ module Steep | |
| 469 470 |  | 
| 470 471 | 
             
                    if at_end?(shift_pos, of: node.loc)
         | 
| 471 472 | 
             
                      begin
         | 
| 472 | 
            -
                        context = typing. | 
| 473 | 
            +
                        context = typing.cursor_context.context or raise
         | 
| 473 474 | 
             
                        receiver_type =
         | 
| 474 475 | 
             
                          case (type = typing.type_of(node: node))
         | 
| 475 476 | 
             
                          when AST::Types::Self
         | 
| @@ -499,7 +500,7 @@ module Steep | |
| 499 500 |  | 
| 500 501 | 
             
                    if at_end?(shift_pos, of: node.loc)
         | 
| 501 502 | 
             
                      begin
         | 
| 502 | 
            -
                        context = typing. | 
| 503 | 
            +
                        context = typing.cursor_context.context or raise
         | 
| 503 504 | 
             
                        receiver_type =
         | 
| 504 505 | 
             
                          case (type = typing.type_of(node: node))
         | 
| 505 506 | 
             
                          when AST::Types::Self
         | 
| @@ -529,11 +530,11 @@ module Steep | |
| 529 530 | 
             
                    case node&.type
         | 
| 530 531 | 
             
                    when :const
         | 
| 531 532 | 
             
                      # Constant:: ←
         | 
| 532 | 
            -
                      context = typing. | 
| 533 | 
            +
                      context = typing.cursor_context.context or raise
         | 
| 533 534 | 
             
                      constant_items_for_context(context, parent: node, position: position, items: items, prefix: "")
         | 
| 534 535 | 
             
                    when nil
         | 
| 535 536 | 
             
                      # :: ←
         | 
| 536 | 
            -
                      context = typing. | 
| 537 | 
            +
                      context = typing.cursor_context.context or raise
         | 
| 537 538 | 
             
                      constant_items_for_context(context, parent: nil, position: position, items: items, prefix: "")
         | 
| 538 539 | 
             
                    end
         | 
| 539 540 |  | 
| @@ -552,7 +553,7 @@ module Steep | |
| 552 553 |  | 
| 553 554 | 
             
                    return [] unless node
         | 
| 554 555 |  | 
| 555 | 
            -
                    context = typing. | 
| 556 | 
            +
                    context = typing.cursor_context.context or raise
         | 
| 556 557 | 
             
                    items = [] #: Array[item]
         | 
| 557 558 | 
             
                    instance_variable_items_for_context(context, prefix: "@", position: position, items: items)
         | 
| 558 559 | 
             
                    items
         | 
| @@ -561,7 +562,7 @@ module Steep | |
| 561 562 | 
             
                  def items_for_rbs(position:, buffer:)
         | 
| 562 563 | 
             
                    items = [] #: Array[item]
         | 
| 563 564 |  | 
| 564 | 
            -
                    context = typing. | 
| 565 | 
            +
                    context = typing.cursor_context.context or raise
         | 
| 565 566 | 
             
                    completion = TypeNameCompletion.new(env: context.env, context: context.module_context.nesting, dirs: [])
         | 
| 566 567 | 
             
                    prefix = TypeNameCompletion::Prefix.parse(buffer, line: position.line, column: position.column)
         | 
| 567 568 |  | 
| @@ -609,7 +610,7 @@ module Steep | |
| 609 610 |  | 
| 610 611 | 
             
                  def method_items_for_receiver_type(type, include_private:, prefix:, position:, items:)
         | 
| 611 612 | 
             
                    range = range_for(position, prefix: prefix)
         | 
| 612 | 
            -
                    context = typing. | 
| 613 | 
            +
                    context = typing.cursor_context.context or raise
         | 
| 613 614 |  | 
| 614 615 | 
             
                    config =
         | 
| 615 616 | 
             
                      if (module_type = context.module_context&.module_type) && (instance_type = context.module_context&.instance_type)
         | 
| @@ -634,39 +635,40 @@ module Steep | |
| 634 635 | 
             
                            case type
         | 
| 635 636 | 
             
                            when AST::Types::Name::Instance, AST::Types::Name::Interface, AST::Types::Name::Singleton
         | 
| 636 637 | 
             
                              # Simple method type
         | 
| 637 | 
            -
                              all_decls = Set.new(method_entry. | 
| 638 | 
            +
                              all_decls = Set.new(method_entry.overloads.flat_map {|overload| overload.method_decls(name) }).sort_by {|decl| decl.method_name.to_s }
         | 
| 638 639 | 
             
                              all_members = Set.new(all_decls.flat_map {|decl| decl.method_def.member })
         | 
| 639 640 | 
             
                              all_members.each do |member|
         | 
| 640 641 | 
             
                                associated_decl = all_decls.find {|decl| decl.method_def.member == member } or next
         | 
| 641 | 
            -
                                 | 
| 642 | 
            +
                                overloads = method_entry.overloads.select {|overload| overload.method_defs.any? {|defn| defn.member == member }}
         | 
| 642 643 | 
             
                                items << SimpleMethodNameItem.new(
         | 
| 643 644 | 
             
                                  identifier: name,
         | 
| 644 645 | 
             
                                  range: range,
         | 
| 645 646 | 
             
                                  receiver_type: type,
         | 
| 646 647 | 
             
                                  method_name: associated_decl.method_name,
         | 
| 647 | 
            -
                                  method_types:  | 
| 648 | 
            +
                                  method_types: overloads.map {|overload| subtyping.factory.method_type_1(overload.method_type) },
         | 
| 648 649 | 
             
                                  method_member: member
         | 
| 649 650 | 
             
                                )
         | 
| 650 651 | 
             
                              end
         | 
| 651 652 | 
             
                            else
         | 
| 652 | 
            -
                               | 
| 653 | 
            +
                              generated_overloads, defined_overloads =
         | 
| 654 | 
            +
                                method_entry.overloads.partition {|overload| overload.method_defs.empty? }
         | 
| 653 655 |  | 
| 654 | 
            -
                              unless  | 
| 656 | 
            +
                              unless defined_overloads.empty?
         | 
| 655 657 | 
             
                                items << ComplexMethodNameItem.new(
         | 
| 656 658 | 
             
                                  identifier: name,
         | 
| 657 659 | 
             
                                  range: range,
         | 
| 658 660 | 
             
                                  receiver_type: type,
         | 
| 659 | 
            -
                                  method_types:  | 
| 660 | 
            -
                                  method_decls:  | 
| 661 | 
            +
                                  method_types: defined_overloads.map { subtyping.factory.method_type_1(_1.method_type) },
         | 
| 662 | 
            +
                                  method_decls: defined_overloads.flat_map { _1.method_decls(name).to_a }.sort_by {|decl| decl.method_name.to_s }
         | 
| 661 663 | 
             
                                )
         | 
| 662 664 | 
             
                              end
         | 
| 663 665 |  | 
| 664 | 
            -
                              unless  | 
| 666 | 
            +
                              unless generated_overloads.empty?
         | 
| 665 667 | 
             
                                items << GeneratedMethodNameItem.new(
         | 
| 666 668 | 
             
                                  identifier: name,
         | 
| 667 669 | 
             
                                  range: range,
         | 
| 668 670 | 
             
                                  receiver_type: type,
         | 
| 669 | 
            -
                                  method_types:  | 
| 671 | 
            +
                                  method_types: generated_overloads.map { subtyping.factory.method_type_1(_1.method_type) }
         | 
| 670 672 | 
             
                                )
         | 
| 671 673 | 
             
                              end
         | 
| 672 674 | 
             
                            end
         | 
| @@ -731,7 +733,7 @@ module Steep | |
| 731 733 |  | 
| 732 734 | 
             
                    case call
         | 
| 733 735 | 
             
                    when TypeInference::MethodCall::Typed, TypeInference::MethodCall::Error
         | 
| 734 | 
            -
                      context = typing. | 
| 736 | 
            +
                      context = typing.cursor_context.context or raise
         | 
| 735 737 | 
             
                      type = call.receiver_type
         | 
| 736 738 | 
             
                      type = type.subst(Interface::Substitution.build([], self_type: context.self_type, module_type: context.module_context&.module_type, instance_type: context.module_context&.instance_type))
         | 
| 737 739 |  | 
| @@ -739,8 +741,8 @@ module Steep | |
| 739 741 | 
             
                      if shape = subtyping.builder.shape(type, config)
         | 
| 740 742 | 
             
                        shape = shape.public_shape if private_send?(call_node)
         | 
| 741 743 | 
             
                        if method = shape.methods[call.method_name]
         | 
| 742 | 
            -
                          method. | 
| 743 | 
            -
                            defn =  | 
| 744 | 
            +
                          method.overloads.each.with_index do |overload, i|
         | 
| 745 | 
            +
                            defn = overload.method_decls(call.method_name).to_a[0]&.method_def
         | 
| 744 746 | 
             
                            if defn && defn.type.type
         | 
| 745 747 | 
             
                              range = range_for(position, prefix: prefix)
         | 
| 746 748 | 
             
                              kwargs = argument_nodes.find { |arg| arg.type == :kwargs }&.children || []
         | 
| @@ -790,7 +792,7 @@ module Steep | |
| 790 792 | 
             
                  def unwrap_optional(type)
         | 
| 791 793 | 
             
                    if type.is_a?(AST::Types::Union) && type.types.include?(AST::Builtin.nil_type)
         | 
| 792 794 | 
             
                      types = type.types.reject { |t| t == AST::Builtin.nil_type }
         | 
| 793 | 
            -
                      AST::Types::Union.new(types: types | 
| 795 | 
            +
                      AST::Types::Union.new(types: types)
         | 
| 794 796 | 
             
                    else
         | 
| 795 797 | 
             
                      type
         | 
| 796 798 | 
             
                    end
         | 
| @@ -176,7 +176,7 @@ module Steep | |
| 176 176 | 
             
                          when :def, :defs
         | 
| 177 177 | 
             
                            named_location = (_ = node.location) #: Parser::AST::_NamedLocation
         | 
| 178 178 | 
             
                            if test_ast_location(named_location.name, line: line, column: column)
         | 
| 179 | 
            -
                              if method_context = typing. | 
| 179 | 
            +
                              if method_context = typing.cursor_context.context&.method_context
         | 
| 180 180 | 
             
                                if method = method_context.method
         | 
| 181 181 | 
             
                                  method.defs.each do |defn|
         | 
| 182 182 | 
             
                                    singleton_method =
         | 
| @@ -285,8 +285,9 @@ module Steep | |
| 285 285 | 
             
                    source = Source.parse(content, path: path, factory: subtyping.factory)
         | 
| 286 286 | 
             
                    source = source.without_unrelated_defs(line: line, column: column)
         | 
| 287 287 | 
             
                    resolver = RBS::Resolver::ConstantResolver.new(builder: subtyping.factory.definition_builder)
         | 
| 288 | 
            +
                    loc = source.buffer.loc_to_pos([line, column])
         | 
| 288 289 | 
             
                    [
         | 
| 289 | 
            -
                      Services::TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver),
         | 
| 290 | 
            +
                      Services::TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver, cursor: loc),
         | 
| 290 291 | 
             
                      signature_service
         | 
| 291 292 | 
             
                    ]
         | 
| 292 293 | 
             
                  rescue
         | 
| @@ -84,7 +84,8 @@ module Steep | |
| 84 84 | 
             
                      source = Source.parse(content, path: path, factory: subtyping.factory)
         | 
| 85 85 | 
             
                      source = source.without_unrelated_defs(line: line, column: column)
         | 
| 86 86 | 
             
                      resolver = ::RBS::Resolver::ConstantResolver.new(builder: subtyping.factory.definition_builder)
         | 
| 87 | 
            -
                       | 
| 87 | 
            +
                      pos = source.buffer.loc_to_pos([line, column])
         | 
| 88 | 
            +
                      Services::TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver, cursor: pos)
         | 
| 88 89 | 
             
                    rescue
         | 
| 89 90 | 
             
                      nil
         | 
| 90 91 | 
             
                    end
         | 
| @@ -118,8 +119,8 @@ module Steep | |
| 118 119 | 
             
                        case node.type
         | 
| 119 120 | 
             
                        when :lvar
         | 
| 120 121 | 
             
                          var_name = node.children[0]
         | 
| 121 | 
            -
                          context = typing. | 
| 122 | 
            -
                          var_type = context.type_env[var_name] || AST::Types::Any. | 
| 122 | 
            +
                          context = typing.cursor_context.context or raise
         | 
| 123 | 
            +
                          var_type = context.type_env[var_name] || AST::Types::Any.instance()
         | 
| 123 124 |  | 
| 124 125 | 
             
                          return VariableContent.new(
         | 
| 125 126 | 
             
                            node: node,
         | 
| @@ -130,7 +131,7 @@ module Steep | |
| 130 131 |  | 
| 131 132 | 
             
                        when :lvasgn
         | 
| 132 133 | 
             
                          var_name, rhs = node.children
         | 
| 133 | 
            -
                          context = typing. | 
| 134 | 
            +
                          context = typing.cursor_context.context or raise
         | 
| 134 135 | 
             
                          type = context.type_env[var_name] || typing.type_of(node: node)
         | 
| 135 136 |  | 
| 136 137 | 
             
                          return VariableContent.new(
         | 
| @@ -165,7 +166,7 @@ module Steep | |
| 165 166 | 
             
                          end
         | 
| 166 167 |  | 
| 167 168 | 
             
                        when :def, :defs
         | 
| 168 | 
            -
                          context = typing. | 
| 169 | 
            +
                          context = typing.cursor_context.context or raise
         | 
| 169 170 | 
             
                          method_context = context.method_context
         | 
| 170 171 |  | 
| 171 172 | 
             
                          if method_context && method_context.method
         | 
| @@ -181,7 +182,7 @@ module Steep | |
| 181 182 | 
             
                          end
         | 
| 182 183 |  | 
| 183 184 | 
             
                        when :const, :casgn
         | 
| 184 | 
            -
                          context = typing. | 
| 185 | 
            +
                          context = typing.cursor_context.context or raise
         | 
| 185 186 |  | 
| 186 187 | 
             
                          type = typing.type_of(node: node)
         | 
| 187 188 | 
             
                          const_name = typing.source_index.reference(constant_node: node)
         | 
| @@ -76,7 +76,8 @@ module Steep | |
| 76 76 | 
             
                  def type_check!(line:, column:)
         | 
| 77 77 | 
             
                    source = self.source.without_unrelated_defs(line: line, column: column)
         | 
| 78 78 | 
             
                    resolver = RBS::Resolver::ConstantResolver.new(builder: subtyping.factory.definition_builder)
         | 
| 79 | 
            -
                     | 
| 79 | 
            +
                    pos = self.source.buffer.loc_to_pos([line, column])
         | 
| 80 | 
            +
                    TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver, cursor: pos)
         | 
| 80 81 | 
             
                  end
         | 
| 81 82 |  | 
| 82 83 | 
             
                  def last_argument_nodes_for(argument_nodes:, line:, column:)
         | 
| @@ -99,7 +100,7 @@ module Steep | |
| 99 100 |  | 
| 100 101 | 
             
                  def signature_help_for(node, argument, last_argument, typing)
         | 
| 101 102 | 
             
                    call = typing.call_of(node: node)
         | 
| 102 | 
            -
                    context = typing. | 
| 103 | 
            +
                    context = typing.cursor_context.context or raise
         | 
| 103 104 |  | 
| 104 105 | 
             
                    items = [] #: Array[Item]
         | 
| 105 106 | 
             
                    index = nil #: Integer?
         | 
| @@ -113,14 +114,14 @@ module Steep | |
| 113 114 | 
             
                        shape = shape.public_shape if private_send?(node)
         | 
| 114 115 |  | 
| 115 116 | 
             
                        if method = shape.methods[call.method_name]
         | 
| 116 | 
            -
                          method. | 
| 117 | 
            -
                            defn =  | 
| 117 | 
            +
                          method.overloads.each.with_index do |overload, i|
         | 
| 118 | 
            +
                            defn = overload.method_defs[0]
         | 
| 118 119 |  | 
| 119 120 | 
             
                            active_parameter = active_parameter_for(defn&.type, argument, last_argument, node)
         | 
| 120 | 
            -
                            items << Item.new(subtyping.factory.method_type_1(method_type), defn&.comment, active_parameter)
         | 
| 121 | 
            +
                            items << Item.new(subtyping.factory.method_type_1(overload.method_type), defn&.comment, active_parameter)
         | 
| 121 122 |  | 
| 122 123 | 
             
                            if call.is_a?(MethodCall::Typed)
         | 
| 123 | 
            -
                              if  | 
| 124 | 
            +
                              if call.method_decls.intersect?(overload.method_decls(call.method_name).to_set)
         | 
| 124 125 | 
             
                                index = i
         | 
| 125 126 | 
             
                              end
         | 
| 126 127 | 
             
                            end
         | 
| @@ -156,6 +156,7 @@ module Steep | |
| 156 156 | 
             
                            old_text = files[path]&.content
         | 
| 157 157 | 
             
                            content = cs.inject(old_text || "") {|text, change| change.apply_to(text) }
         | 
| 158 158 |  | 
| 159 | 
            +
                            content ||= "" # It was not clear why `content` can be `nil`, but it happens with `master_test`.
         | 
| 159 160 | 
             
                            buffer = RBS::Buffer.new(name: path, content: content)
         | 
| 160 161 |  | 
| 161 162 | 
             
                            update[path] =
         | 
| @@ -228,7 +229,6 @@ module Steep | |
| 228 229 | 
             
                  end
         | 
| 229 230 |  | 
| 230 231 | 
             
                  def update_env(updated_files, paths:)
         | 
| 231 | 
            -
             | 
| 232 232 | 
             
                    Steep.logger.tagged "#update_env" do
         | 
| 233 233 | 
             
                      errors = [] #: Array[RBS::BaseError]
         | 
| 234 234 | 
             
                      new_decls = Set[].compare_by_identity #: Set[RBS::AST::Declarations::t]
         | 
| @@ -363,7 +363,7 @@ module Steep | |
| 363 363 | 
             
                  def type_check_file(target:, subtyping:, path:, text:)
         | 
| 364 364 | 
             
                    Steep.logger.tagged "#type_check_file(#{path}@#{target.name})" do
         | 
| 365 365 | 
             
                      source = Source.parse(text, path: path, factory: subtyping.factory)
         | 
| 366 | 
            -
                      typing = TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: yield)
         | 
| 366 | 
            +
                      typing = TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: yield, cursor: nil)
         | 
| 367 367 | 
             
                      ignores = Source::IgnoreRanges.new(ignores: source.ignores)
         | 
| 368 368 | 
             
                      SourceFile.with_typing(path: path, content: text, node: source.node, typing: typing, ignores: ignores)
         | 
| 369 369 | 
             
                    end
         | 
| @@ -380,7 +380,7 @@ module Steep | |
| 380 380 | 
             
                    SourceFile.no_data(path: path, content: text)
         | 
| 381 381 | 
             
                  end
         | 
| 382 382 |  | 
| 383 | 
            -
                  def self.type_check(source:, subtyping:, constant_resolver:)
         | 
| 383 | 
            +
                  def self.type_check(source:, subtyping:, constant_resolver:, cursor:)
         | 
| 384 384 | 
             
                    annotations = source.annotations(block: source.node, factory: subtyping.factory, context: nil)
         | 
| 385 385 |  | 
| 386 386 | 
             
                    definition = subtyping.factory.definition_builder.build_instance(AST::Builtin::Object.module_name)
         | 
| @@ -418,7 +418,7 @@ module Steep | |
| 418 418 | 
             
                      variable_context: TypeInference::Context::TypeVariableContext.empty
         | 
| 419 419 | 
             
                    )
         | 
| 420 420 |  | 
| 421 | 
            -
                    typing = Typing.new(source: source, root_context: context)
         | 
| 421 | 
            +
                    typing = Typing.new(source: source, root_context: context, cursor: cursor)
         | 
| 422 422 |  | 
| 423 423 | 
             
                    construction = TypeConstruction.new(
         | 
| 424 424 | 
             
                      checker: subtyping,
         | 
| @@ -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|
         |