steep 0.47.1 → 0.48.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f249f7e074584c271aace34633e7eebaf638c53faa821adc8ba20575c44781ac
4
- data.tar.gz: 19630a5254b0b1d1a0f10dd2d2300111c47773ac5f615ccfe7d33f815edf38c2
3
+ metadata.gz: 72c3b61eccfe6a3f2cf2da22293bd7b50a001c25e82197b3efea52753857ff78
4
+ data.tar.gz: '08786e3140b0bbf10f79c5395a7026062abef6a690a9fefdf6ca464fbf13e92d'
5
5
  SHA512:
6
- metadata.gz: d29cf28bca4f9235a7036e966edb7747872ebcd0a49bec3d6d21dcad73dc2f21cec05819b05b4df52b150bd24f998d533fd63b827f439462f3ce4b7173041ecd
7
- data.tar.gz: 49f76f139a14b94449a19f1c26847b320fc104ce292eb6f9824bac58b99b0f7b1997c0daf405cb37e58a5ec42d011daa221431d0f7056a326dba5922a72f096e
6
+ metadata.gz: d3abc0d6f64deffebf187428be69cec72dc5c887e0ecb2fbc407c20e2dde66bae8ce3bdf5f7f8a43ccaa90c562fa9c178bb9cc93a3d3d5b7fa99d5e7344fbfdd
7
+ data.tar.gz: df16f83cf33224f0442124546d3406313dff27bd472fc60978864c40cdffcbb9aa8013bb049c940021ccb6e76c7a1338d9d30fc0fb07f71e306e7dae21885ad7
data/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.48.0 (2022-03-07)
6
+
7
+ Steep supports all of the new features of RBS 2. 🎉
8
+ It now requires RBS >= 2.2 and support all of the features.
9
+
10
+ * Update RBS ([\#495](https://github.com/soutaro/steep/pull/495))
11
+ * Support generic type aliases ([\#496](https://github.com/soutaro/steep/pull/496))
12
+ * Support bounded generics ([\#499](https://github.com/soutaro/steep/pull/499))
13
+
5
14
  ## 0.47.1 (2022-02-17)
6
15
 
7
16
  This update lets Steep run with Active Support 7.
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- steep (0.47.1)
4
+ steep (0.48.0)
5
5
  activesupport (>= 5.1)
6
6
  language_server-protocol (>= 3.15, < 4.0)
7
7
  listen (~> 3.0)
8
8
  parallel (>= 1.0.0)
9
9
  parser (>= 3.0)
10
10
  rainbow (>= 2.2.2, < 4.0)
11
- rbs (~> 1.7.0)
11
+ rbs (>= 2.2.0)
12
12
  terminal-table (>= 2, < 4)
13
13
 
14
14
  PATH
@@ -42,15 +42,15 @@ GEM
42
42
  minitest-hooks (1.5.0)
43
43
  minitest (> 5.3)
44
44
  parallel (1.21.0)
45
- parser (3.1.0.0)
45
+ parser (3.1.1.0)
46
46
  ast (~> 2.4.1)
47
47
  rainbow (3.1.1)
48
48
  rake (13.0.6)
49
49
  rb-fsevent (0.11.1)
50
50
  rb-inotify (0.10.1)
51
51
  ffi (~> 1.0)
52
- rbs (1.7.1)
53
- stackprof (0.2.17)
52
+ rbs (2.2.2)
53
+ stackprof (0.2.19)
54
54
  terminal-table (3.0.2)
55
55
  unicode-display_width (>= 1.1.1, < 3)
56
56
  tzinfo (2.0.4)
@@ -70,4 +70,4 @@ DEPENDENCIES
70
70
  without_steep_types!
71
71
 
72
72
  BUNDLED WITH
73
- 2.2.27
73
+ 2.3.8
@@ -21,143 +21,154 @@ module Steep
21
21
  @type_name_resolver ||= RBS::TypeNameResolver.from_env(definition_builder.env)
22
22
  end
23
23
 
24
+ def type_opt(type)
25
+ if type
26
+ type(type)
27
+ end
28
+ end
29
+
24
30
  def type(type)
25
31
  ty = type_cache[type] and return ty
26
32
 
27
- type_cache[type] = case type
28
- when RBS::Types::Bases::Any
29
- Any.new(location: nil)
30
- when RBS::Types::Bases::Class
31
- Class.new(location: nil)
32
- when RBS::Types::Bases::Instance
33
- Instance.new(location: nil)
34
- when RBS::Types::Bases::Self
35
- Self.new(location: nil)
36
- when RBS::Types::Bases::Top
37
- Top.new(location: nil)
38
- when RBS::Types::Bases::Bottom
39
- Bot.new(location: nil)
40
- when RBS::Types::Bases::Bool
41
- Boolean.new(location: nil)
42
- when RBS::Types::Bases::Void
43
- Void.new(location: nil)
44
- when RBS::Types::Bases::Nil
45
- Nil.new(location: nil)
46
- when RBS::Types::Variable
47
- Var.new(name: type.name, location: nil)
48
- when RBS::Types::ClassSingleton
49
- type_name = type.name
50
- Name::Singleton.new(name: type_name, location: nil)
51
- when RBS::Types::ClassInstance
52
- type_name = type.name
53
- args = type.args.map {|arg| type(arg) }
54
- Name::Instance.new(name: type_name, args: args, location: nil)
55
- when RBS::Types::Interface
56
- type_name = type.name
57
- args = type.args.map {|arg| type(arg) }
58
- Name::Interface.new(name: type_name, args: args, location: nil)
59
- when RBS::Types::Alias
60
- type_name = type.name
61
- Name::Alias.new(name: type_name, args: [], location: nil)
62
- when RBS::Types::Union
63
- Union.build(types: type.types.map {|ty| type(ty) }, location: nil)
64
- when RBS::Types::Intersection
65
- Intersection.build(types: type.types.map {|ty| type(ty) }, location: nil)
66
- when RBS::Types::Optional
67
- Union.build(types: [type(type.type), Nil.new(location: nil)], location: nil)
68
- when RBS::Types::Literal
69
- Literal.new(value: type.literal, location: nil)
70
- when RBS::Types::Tuple
71
- Tuple.new(types: type.types.map {|ty| type(ty) }, location: nil)
72
- when RBS::Types::Record
73
- elements = type.fields.each.with_object({}) do |(key, value), hash|
74
- hash[key] = type(value)
75
- end
76
- Record.new(elements: elements, location: nil)
77
- when RBS::Types::Proc
78
- func = Interface::Function.new(
79
- params: params(type.type),
80
- return_type: type(type.type.return_type),
81
- location: type.location
82
- )
83
- block = if type.block
84
- Interface::Block.new(
85
- type: Interface::Function.new(
86
- params: params(type.block.type),
87
- return_type: type(type.block.type.return_type),
88
- location: type.location
89
- ),
90
- optional: !type.block.required
91
- )
92
- end
33
+ type_cache[type] =
34
+ case type
35
+ when RBS::Types::Bases::Any
36
+ Any.new(location: type.location)
37
+ when RBS::Types::Bases::Class
38
+ Class.new(location: type.location)
39
+ when RBS::Types::Bases::Instance
40
+ Instance.new(location: type.location)
41
+ when RBS::Types::Bases::Self
42
+ Self.new(location: type.location)
43
+ when RBS::Types::Bases::Top
44
+ Top.new(location: type.location)
45
+ when RBS::Types::Bases::Bottom
46
+ Bot.new(location: type.location)
47
+ when RBS::Types::Bases::Bool
48
+ Boolean.new(location: type.location)
49
+ when RBS::Types::Bases::Void
50
+ Void.new(location: type.location)
51
+ when RBS::Types::Bases::Nil
52
+ Nil.new(location: type.location)
53
+ when RBS::Types::Variable
54
+ Var.new(name: type.name, location: type.location)
55
+ when RBS::Types::ClassSingleton
56
+ type_name = type.name
57
+ Name::Singleton.new(name: type_name, location: type.location)
58
+ when RBS::Types::ClassInstance
59
+ type_name = type.name
60
+ args = type.args.map {|arg| type(arg) }
61
+ Name::Instance.new(name: type_name, args: args, location: type.location)
62
+ when RBS::Types::Interface
63
+ type_name = type.name
64
+ args = type.args.map {|arg| type(arg) }
65
+ Name::Interface.new(name: type_name, args: args, location: type.location)
66
+ when RBS::Types::Alias
67
+ type_name = type.name
68
+ args = type.args.map {|arg| type(arg) }
69
+ Name::Alias.new(name: type_name, args: args, location: type.location)
70
+ when RBS::Types::Union
71
+ Union.build(types: type.types.map {|ty| type(ty) }, location: type.location)
72
+ when RBS::Types::Intersection
73
+ Intersection.build(types: type.types.map {|ty| type(ty) }, location: type.location)
74
+ when RBS::Types::Optional
75
+ Union.build(types: [type(type.type), Nil.new(location: nil)], location: type.location)
76
+ when RBS::Types::Literal
77
+ Literal.new(value: type.literal, location: type.location)
78
+ when RBS::Types::Tuple
79
+ Tuple.new(types: type.types.map {|ty| type(ty) }, location: type.location)
80
+ when RBS::Types::Record
81
+ elements = type.fields.each.with_object({}) do |(key, value), hash|
82
+ hash[key] = type(value)
83
+ end
84
+ Record.new(elements: elements, location: type.location)
85
+ when RBS::Types::Proc
86
+ func = Interface::Function.new(
87
+ params: params(type.type),
88
+ return_type: type(type.type.return_type),
89
+ location: type.location
90
+ )
91
+ block = if type.block
92
+ Interface::Block.new(
93
+ type: Interface::Function.new(
94
+ params: params(type.block.type),
95
+ return_type: type(type.block.type.return_type),
96
+ location: type.location
97
+ ),
98
+ optional: !type.block.required
99
+ )
100
+ end
93
101
 
94
- Proc.new(type: func, block: block)
95
- else
96
- raise "Unexpected type given: #{type}"
97
- end
102
+ Proc.new(type: func, block: block)
103
+ else
104
+ raise "Unexpected type given: #{type}"
105
+ end
98
106
  end
99
107
 
100
108
  def type_1(type)
101
109
  case type
102
110
  when Any
103
- RBS::Types::Bases::Any.new(location: nil)
111
+ RBS::Types::Bases::Any.new(location: type.location)
104
112
  when Class
105
- RBS::Types::Bases::Class.new(location: nil)
113
+ RBS::Types::Bases::Class.new(location: type.location)
106
114
  when Instance
107
- RBS::Types::Bases::Instance.new(location: nil)
115
+ RBS::Types::Bases::Instance.new(location: type.location)
108
116
  when Self
109
- RBS::Types::Bases::Self.new(location: nil)
117
+ RBS::Types::Bases::Self.new(location: type.location)
110
118
  when Top
111
- RBS::Types::Bases::Top.new(location: nil)
119
+ RBS::Types::Bases::Top.new(location: type.location)
112
120
  when Bot
113
- RBS::Types::Bases::Bottom.new(location: nil)
121
+ RBS::Types::Bases::Bottom.new(location: type.location)
114
122
  when Boolean
115
- RBS::Types::Bases::Bool.new(location: nil)
123
+ RBS::Types::Bases::Bool.new(location: type.location)
116
124
  when Void
117
- RBS::Types::Bases::Void.new(location: nil)
125
+ RBS::Types::Bases::Void.new(location: type.location)
118
126
  when Nil
119
- RBS::Types::Bases::Nil.new(location: nil)
127
+ RBS::Types::Bases::Nil.new(location: type.location)
120
128
  when Var
121
- RBS::Types::Variable.new(name: type.name, location: nil)
129
+ RBS::Types::Variable.new(name: type.name, location: type.location)
122
130
  when Name::Singleton
123
- RBS::Types::ClassSingleton.new(name: type.name, location: nil)
131
+ RBS::Types::ClassSingleton.new(name: type.name, location: type.location)
124
132
  when Name::Instance
125
133
  RBS::Types::ClassInstance.new(
126
134
  name: type.name,
127
135
  args: type.args.map {|arg| type_1(arg) },
128
- location: nil
136
+ location: type.location
129
137
  )
130
138
  when Name::Interface
131
139
  RBS::Types::Interface.new(
132
140
  name: type.name,
133
141
  args: type.args.map {|arg| type_1(arg) },
134
- location: nil
142
+ location: type.location
135
143
  )
136
144
  when Name::Alias
137
- type.args.empty? or raise "alias type with args is not supported"
138
- RBS::Types::Alias.new(name: type.name, location: nil)
145
+ RBS::Types::Alias.new(
146
+ name: type.name,
147
+ args: type.args.map {|arg| type_1(arg) },
148
+ location: type.location
149
+ )
139
150
  when Union
140
151
  RBS::Types::Union.new(
141
152
  types: type.types.map {|ty| type_1(ty) },
142
- location: nil
153
+ location: type.location
143
154
  )
144
155
  when Intersection
145
156
  RBS::Types::Intersection.new(
146
157
  types: type.types.map {|ty| type_1(ty) },
147
- location: nil
158
+ location: type.location
148
159
  )
149
160
  when Literal
150
- RBS::Types::Literal.new(literal: type.value, location: nil)
161
+ RBS::Types::Literal.new(literal: type.value, location: type.location)
151
162
  when Tuple
152
163
  RBS::Types::Tuple.new(
153
164
  types: type.types.map {|ty| type_1(ty) },
154
- location: nil
165
+ location: type.location
155
166
  )
156
167
  when Record
157
168
  fields = type.elements.each.with_object({}) do |(key, value), hash|
158
169
  hash[key] = type_1(value)
159
170
  end
160
- RBS::Types::Record.new(fields: fields, location: nil)
171
+ RBS::Types::Record.new(fields: fields, location: type.location)
161
172
  when Proc
162
173
  block = if type.block
163
174
  RBS::Types::Block.new(
@@ -168,10 +179,10 @@ module Steep
168
179
  RBS::Types::Proc.new(
169
180
  type: function_1(type.type),
170
181
  block: block,
171
- location: nil
182
+ location: type.location
172
183
  )
173
184
  when Logic::Base
174
- RBS::Types::Bases::Bool.new(location: nil)
185
+ RBS::Types::Bases::Bool.new(location: type.location)
175
186
  else
176
187
  raise "Unexpected type given: #{type} (#{type.class})"
177
188
  end
@@ -204,45 +215,61 @@ module Steep
204
215
  )
205
216
  end
206
217
 
218
+ def type_param(type_param)
219
+ Interface::TypeParam.new(
220
+ name: type_param.name,
221
+ upper_bound: type_param.upper_bound&.yield_self {|u| type(u) },
222
+ variance: type_param.variance,
223
+ unchecked: type_param.unchecked?
224
+ )
225
+ end
226
+
227
+ def type_param_1(type_param)
228
+ RBS::AST::TypeParam.new(
229
+ name: type_param.name,
230
+ variance: type_param.variance,
231
+ upper_bound: type_param.upper_bound&.yield_self {|u| type_1(u) },
232
+ location: type_param.location
233
+ ).unchecked!(type_param.unchecked)
234
+ end
235
+
207
236
  def method_type(method_type, self_type:, subst2: nil, method_decls:)
208
237
  fvs = self_type.free_variables()
209
238
 
210
239
  type_params = []
211
- alpha_vars = []
212
- alpha_types = []
240
+ conflicting_names = []
213
241
 
214
- method_type.type_params.map do |name|
215
- if fvs.include?(name)
216
- type = Types::Var.fresh(name)
217
- alpha_vars << name
218
- alpha_types << type
219
- type_params << type.name
220
- else
221
- type_params << name
242
+ type_params = method_type.type_params.map do |type_param|
243
+ if fvs.include?(type_param.name)
244
+ conflicting_names << type_param.name
222
245
  end
246
+
247
+ type_param(type_param)
223
248
  end
224
- subst = Interface::Substitution.build(alpha_vars, alpha_types)
249
+
250
+ type_params, subst = Interface::TypeParam.rename(type_params, conflicting_names)
225
251
  subst.merge!(subst2, overwrite: true) if subst2
226
252
 
227
- type = Interface::MethodType.new(
228
- type_params: type_params,
229
- type: Interface::Function.new(
230
- params: params(method_type.type).subst(subst),
231
- return_type: type(method_type.type.return_type).subst(subst),
232
- location: method_type.location
233
- ),
234
- block: method_type.block&.yield_self do |block|
235
- Interface::Block.new(
236
- optional: !block.required,
237
- type: Interface::Function.new(
238
- params: params(block.type).subst(subst),
239
- return_type: type(block.type.return_type).subst(subst),
240
- location: nil
253
+ type =
254
+ Interface::MethodType.new(
255
+ type_params: type_params,
256
+ type: Interface::Function.new(
257
+ params: params(method_type.type).subst(subst),
258
+ return_type: type(method_type.type.return_type).subst(subst),
259
+ location: method_type.location
260
+ ),
261
+ block: method_type.block&.yield_self do |block|
262
+ Interface::Block.new(
263
+ optional: !block.required,
264
+ type: Interface::Function.new(
265
+ params: params(block.type).subst(subst),
266
+ return_type: type(block.type.return_type).subst(subst),
267
+ location: nil
268
+ )
241
269
  )
242
- )
243
- end,
244
- method_decls: method_decls
245
- )
270
+ end,
271
+ method_decls: method_decls
272
+ )
246
273
 
247
274
  if block_given?
248
275
  yield type
@@ -258,20 +285,14 @@ module Steep
258
285
  alpha_vars = []
259
286
  alpha_types = []
260
287
 
261
- method_type.type_params.map do |name|
262
- if fvs.include?(name)
263
- type = RBS::Types::Variable.new(name: name, location: nil),
264
- alpha_vars << name
265
- alpha_types << type
266
- type_params << type.name
267
- else
268
- type_params << name
269
- end
288
+ conflicting_names = method_type.type_params.each.with_object([]) do |param, names|
289
+ names << params.name if fvs.include?(param.name)
270
290
  end
271
- subst = Interface::Substitution.build(alpha_vars, alpha_types)
291
+
292
+ type_params, subst = Interface::TypeParam.rename(method_type.type_params, conflicting_names)
272
293
 
273
294
  type = RBS::MethodType.new(
274
- type_params: type_params,
295
+ type_params: type_params.map {|param| type_param_1(param) },
275
296
  type: function_1(method_type.type.subst(subst)),
276
297
  block: method_type.block&.yield_self do |block|
277
298
  block_type = block.type.subst(subst)
@@ -300,16 +321,19 @@ module Steep
300
321
  end
301
322
  end
302
323
 
303
- def unfold(type_name)
304
- type_name.yield_self do |type_name|
305
- type(definition_builder.expand_alias(type_name))
306
- end
324
+ def unfold(type_name, args)
325
+ type(
326
+ definition_builder.expand_alias2(
327
+ type_name,
328
+ args.empty? ? args : args.map {|t| type_1(t) }
329
+ )
330
+ )
307
331
  end
308
332
 
309
333
  def expand_alias(type)
310
334
  unfolded = case type
311
335
  when AST::Types::Name::Alias
312
- unfold(type.name)
336
+ unfold(type.name, type.args)
313
337
  else
314
338
  type
315
339
  end
@@ -21,17 +21,21 @@ module Steep
21
21
 
22
22
  alias eql? ==
23
23
 
24
- def self.fresh(name)
24
+ def self.fresh_name(name)
25
25
  @mutex ||= Mutex.new
26
26
 
27
27
  @mutex.synchronize do
28
28
  @max ||= 0
29
29
  @max += 1
30
30
 
31
- new(name: :"#{name}(#{@max})")
31
+ :"#{name}(#{@max})"
32
32
  end
33
33
  end
34
34
 
35
+ def self.fresh(name, location: nil)
36
+ new(name: fresh_name(name), location: location)
37
+ end
38
+
35
39
  def to_s
36
40
  name.to_s
37
41
  end
@@ -52,8 +56,15 @@ module Steep
52
56
  [0]
53
57
  end
54
58
 
59
+ def update(name: self.name, location: self.location)
60
+ self.class.new(
61
+ name: name,
62
+ location: location
63
+ )
64
+ end
65
+
55
66
  def with_location(new_location)
56
- self.class.new(name: name, location: new_location)
67
+ update(location: new_location)
57
68
  end
58
69
  end
59
70
  end
@@ -26,20 +26,32 @@ module Steep
26
26
  end
27
27
 
28
28
  module ResultPrinter
29
- def print_result_to(io, level: 1)
30
- printer = Drivers::TracePrinter.new(io)
31
- printer.print result.trace, level: level
32
- end
33
-
34
- def trace_lines
35
- StringIO.new.tap do |io|
36
- print_result_to(io)
37
- end.string.chomp
29
+ def relation_message(relation)
30
+ case
31
+ when relation.type?
32
+ relation.to_s
33
+ when relation.method?
34
+ if relation.super_type.is_a?(Interface::MethodType) && relation.sub_type.is_a?(Interface::MethodType)
35
+ relation.to_s
36
+ end
37
+ when relation.interface?
38
+ nil
39
+ when relation.block?
40
+ nil
41
+ when relation.function?
42
+ nil
43
+ when relation.params?
44
+ nil
45
+ end
38
46
  end
39
47
 
40
48
  def detail_lines
41
49
  StringIO.new.tap do |io|
42
- print_result_to(io)
50
+ result.failure_path&.reverse_each.map do |result|
51
+ relation_message(result.relation)
52
+ end.compact.each.with_index(1) do |message, index|
53
+ io.puts "#{" " * (index)}#{message}"
54
+ end
43
55
  end.string.chomp
44
56
  end
45
57
  end
@@ -440,7 +452,7 @@ module Steep
440
452
  super(node: node)
441
453
  @interface_method = interface_method
442
454
  @annotation_method = annotation_method
443
- @result = result
455
+ @result = relation
444
456
  end
445
457
  end
446
458
 
@@ -101,6 +101,23 @@ module Steep
101
101
  end
102
102
  end
103
103
 
104
+ class UnsatisfiableTypeApplication < Base
105
+ attr_reader :type_name
106
+ attr_reader :type_arg
107
+ attr_reader :type_param
108
+
109
+ def initialize(type_name:, type_arg:, type_param:, location:)
110
+ super(location: location)
111
+ @type_name = type_name
112
+ @type_arg = type_arg
113
+ @type_param = type_param
114
+ end
115
+
116
+ def header_line
117
+ "Type application of `#{type_name}` doesn't satisfy the constraints: #{type_arg} <: #{type_param.upper_bound}"
118
+ end
119
+ end
120
+
104
121
  class InvalidMethodOverload < Base
105
122
  attr_reader :class_name
106
123
  attr_reader :method_name
@@ -307,6 +324,34 @@ module Steep
307
324
  end
308
325
  end
309
326
 
327
+ class RecursiveTypeAlias < Base
328
+ attr_reader :alias_names
329
+
330
+ def initialize(alias_names:, location:)
331
+ @alias_names = alias_names
332
+ super(location: location)
333
+ end
334
+
335
+ def header_line
336
+ "Type aliases cannot be *directly recursive*: #{alias_names.join(", ")}"
337
+ end
338
+ end
339
+
340
+ class NonregularTypeAlias < Base
341
+ attr_reader :type_name
342
+ attr_reader :nonregular_type
343
+
344
+ def initialize(type_name:, nonregular_type:, location:)
345
+ @type_name = type_name
346
+ @nonregular_type = nonregular_type
347
+ @location = location
348
+ end
349
+
350
+ def header_line
351
+ "Type alias #{type_name} is defined *non-regular*: #{nonregular_type}"
352
+ end
353
+ end
354
+
310
355
  def self.from_rbs_error(error, factory:)
311
356
  case error
312
357
  when RBS::ParsingError
@@ -388,6 +433,17 @@ module Steep
388
433
  type_name: error.type_name,
389
434
  member: error.member,
390
435
  )
436
+ when RBS::RecursiveTypeAliasError
437
+ Diagnostic::Signature::RecursiveTypeAlias.new(
438
+ alias_names: error.alias_names,
439
+ location: error.location
440
+ )
441
+ when RBS::NonregularTypeAliasError
442
+ Diagnostic::Signature::NonregularTypeAlias.new(
443
+ type_name: error.diagnostic.type_name,
444
+ nonregular_type: factory.type(error.diagnostic.nonregular_type),
445
+ location: error.location
446
+ )
391
447
  else
392
448
  raise error
393
449
  end