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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/bin/mem_graph.rb +67 -0
  4. data/bin/mem_prof.rb +102 -0
  5. data/bin/stackprof_test.rb +19 -0
  6. data/bin/steep-check.rb +251 -0
  7. data/lib/steep/annotation_parser.rb +1 -1
  8. data/lib/steep/ast/builtin.rb +5 -5
  9. data/lib/steep/ast/node/type_application.rb +7 -6
  10. data/lib/steep/ast/types/any.rb +1 -9
  11. data/lib/steep/ast/types/boolean.rb +8 -16
  12. data/lib/steep/ast/types/bot.rb +2 -10
  13. data/lib/steep/ast/types/class.rb +1 -13
  14. data/lib/steep/ast/types/factory.rb +101 -85
  15. data/lib/steep/ast/types/instance.rb +1 -13
  16. data/lib/steep/ast/types/intersection.rb +8 -15
  17. data/lib/steep/ast/types/literal.rb +2 -8
  18. data/lib/steep/ast/types/logic.rb +3 -24
  19. data/lib/steep/ast/types/name.rb +5 -16
  20. data/lib/steep/ast/types/nil.rb +3 -12
  21. data/lib/steep/ast/types/proc.rb +4 -13
  22. data/lib/steep/ast/types/record.rb +21 -12
  23. data/lib/steep/ast/types/self.rb +1 -13
  24. data/lib/steep/ast/types/shared_instance.rb +11 -0
  25. data/lib/steep/ast/types/top.rb +1 -9
  26. data/lib/steep/ast/types/tuple.rb +4 -10
  27. data/lib/steep/ast/types/union.rb +10 -15
  28. data/lib/steep/ast/types/var.rb +4 -13
  29. data/lib/steep/ast/types/void.rb +2 -10
  30. data/lib/steep/diagnostic/ruby.rb +4 -4
  31. data/lib/steep/drivers/check.rb +11 -14
  32. data/lib/steep/drivers/checkfile.rb +8 -10
  33. data/lib/steep/drivers/stats.rb +17 -13
  34. data/lib/steep/drivers/utils/driver_helper.rb +24 -3
  35. data/lib/steep/drivers/watch.rb +3 -3
  36. data/lib/steep/interface/builder.rb +162 -138
  37. data/lib/steep/interface/method_type.rb +12 -20
  38. data/lib/steep/interface/shape.rb +66 -10
  39. data/lib/steep/interface/substitution.rb +2 -0
  40. data/lib/steep/interface/type_param.rb +20 -7
  41. data/lib/steep/located_value.rb +20 -0
  42. data/lib/steep/server/change_buffer.rb +5 -7
  43. data/lib/steep/server/custom_methods.rb +61 -0
  44. data/lib/steep/server/delay_queue.rb +8 -1
  45. data/lib/steep/server/interaction_worker.rb +10 -5
  46. data/lib/steep/server/lsp_formatter.rb +8 -6
  47. data/lib/steep/server/master.rb +193 -140
  48. data/lib/steep/server/type_check_worker.rb +18 -19
  49. data/lib/steep/server/work_done_progress.rb +64 -0
  50. data/lib/steep/services/completion_provider.rb +24 -22
  51. data/lib/steep/services/goto_service.rb +3 -2
  52. data/lib/steep/services/hover_provider/ruby.rb +7 -6
  53. data/lib/steep/services/signature_help_provider.rb +7 -6
  54. data/lib/steep/services/signature_service.rb +1 -1
  55. data/lib/steep/services/type_check_service.rb +3 -3
  56. data/lib/steep/signature/validator.rb +17 -20
  57. data/lib/steep/subtyping/check.rb +105 -55
  58. data/lib/steep/subtyping/constraints.rb +11 -15
  59. data/lib/steep/type_construction.rb +100 -100
  60. data/lib/steep/type_inference/block_params.rb +6 -6
  61. data/lib/steep/type_inference/logic_type_interpreter.rb +11 -7
  62. data/lib/steep/type_inference/method_call.rb +3 -3
  63. data/lib/steep/type_inference/method_params.rb +1 -1
  64. data/lib/steep/type_inference/send_args.rb +1 -1
  65. data/lib/steep/typing.rb +158 -102
  66. data/lib/steep/version.rb +1 -1
  67. data/lib/steep.rb +28 -3
  68. data/steep.gemspec +2 -2
  69. metadata +16 -9
  70. 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 = _ = Struct.new(:id, :kind, :params, keyword_init: true) do
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 "$/file/reset"
78
- uri = request[:params][:uri]
79
- text = request[:params][:content]
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 "workspace/executeCommand"
86
- case request[:params][:command]
87
- when "steep/stats"
88
- queue << StatsJob.new(id: request[:id])
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.context_at(line: position.line, column: position.column)
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.context_at(line: position.line, column: position.column)
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.context_at(line: position.line, column: position.column)
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.context_at(line: position.line, column: position.column)
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.context_at(line: position.line, column: position.column)
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.context_at(line: position.line, column: position.column)
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.context_at(line: position.line, column: position.column)
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.context_at(line: position.line, column: position.column)
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.method_types.flat_map {|method_type| method_type.method_decls.to_a }).sort_by {|decl| decl.method_name.to_s }
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
- method_types = method_entry.method_types.select {|method_type| method_type.method_decls.any? {|decl| decl.method_def.member == member }}
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: method_types.map {|type| subtyping.factory.method_type_1(type) },
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
- generated_method_types, defined_method_types = method_entry.method_types.partition {|method_type| method_type.method_decls.empty? }
653
+ generated_overloads, defined_overloads =
654
+ method_entry.overloads.partition {|overload| overload.method_defs.empty? }
653
655
 
654
- unless defined_method_types.empty?
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: defined_method_types.map {|type| subtyping.factory.method_type_1(type) },
660
- method_decls: defined_method_types.flat_map {|type| type.method_decls.to_a }.sort_by {|decl| decl.method_name.to_s }
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 generated_method_types.empty?
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: generated_method_types.map {|type| subtyping.factory.method_type_1(type) }
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.context_at(line: position.line, column: position.column)
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.method_types.each.with_index do |method_type, i|
743
- defn = method_type.method_decls.to_a[0]&.method_def
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, location: type.location)
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.context_at(line: line, column: column).method_context
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
- Services::TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver)
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.context_at(line: line, column: column)
122
- var_type = context.type_env[var_name] || AST::Types::Any.new(location: nil)
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.context_at(line: line, column: column)
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.context_at(line: line, column: column)
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.context_at(line: line, column: column)
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
- TypeCheckService.type_check(source: source, subtyping: subtyping, constant_resolver: resolver)
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.context_at(line: node.loc.expression.line, column: node.loc.expression.column)
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.method_types.each.with_index do |method_type, i|
117
- defn = method_type.method_decls.to_a[0]&.method_def
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 method_type.method_decls.intersect?(call.method_decls)
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.upper_bound
83
- upper_bound_type = factory.type(param.upper_bound).subst(subst)
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, location: nil)
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, location: nil)
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), location: nil)
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.upper_bound)
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, location: nil)
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.new(location: nil) },
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.upper_bound)
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.upper_bound)
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, location: nil)
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.new(location: nil) },
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.upper_bound)
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|