steep 1.8.0.dev.2 → 1.8.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -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 +22 -13
  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 +101 -101
  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 +15 -8
  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|