steep 0.38.0 → 0.39.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1662ab3cd8c9b1630d38939e491bd9db3b46701a5ab6f09061e4470c95fbbae8
4
- data.tar.gz: 9fea79ba28f595b1a51812708c0b3a98170110f0367a0baa287623232fe64156
3
+ metadata.gz: 33c89b6005654ebdc947af336b1c7fa47e02c45c480d27b9f4ef0ab6d3403dd1
4
+ data.tar.gz: be7b7812e1ba321b91680884fccc55fd57dd5836c89bf7817624b72706490d6e
5
5
  SHA512:
6
- metadata.gz: 2f42e7e12ff24d1d4acbebc7693b1bb7f1417f4d44f0cc2b2590990a50a1c20ee690d23a316414113e9a65601971cd3bf19b13babc9e09a64cfcebae1fe8c4ec
7
- data.tar.gz: 6aa3693092fa2811fe0663c4266ed3cf9ccd2b79d7e0e8e6c3c79e3c3a29b1d19954ac0127ed0c62a1619dac2555c67ae987f3a4386001cbdf6a73a76e405829
6
+ metadata.gz: 36945eb5fe4a04061c87bc76488c65ef2b009fcdb8279fd542a1249a10a223cd9571371f333e4ec29870a66dd120c4d9e65d572a9d3c90d56dba5c2c1dd95761
7
+ data.tar.gz: d9c2e56878f06d71edeb9a10b275c19afd7ba42b1af16ef01ef890ca3791ad4f92f903f7679fcf77b310638b0d0f5fced596e094ec225ff2f567e0f063bfc527
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.39.0 (2020-12-25)
6
+
7
+ * Update RBS to 1.0.0 ([#282](https://github.com/soutaro/steep/pull/282))
8
+ * Better `&&` and `||` typing ([#276](https://github.com/soutaro/steep/pull/276))
9
+ * Type case based on literals ([#277](https://github.com/soutaro/steep/pull/277))
10
+ * Type case improvements ([#279](https://github.com/soutaro/steep/pull/279), [#283](https://github.com/soutaro/steep/pull/283))
11
+ * Improvements on untyped classes/modules, unsupported syntax error handling, and argument types in untyped methods ([#280](https://github.com/soutaro/steep/pull/280))
12
+ * Fix `bot` and `top` type format ([#278](https://github.com/soutaro/steep/pull/278))
13
+ * Colorfull error messages ([#273](https://github.com/soutaro/steep/pull/273))
14
+
5
15
  ## 0.38.0 (2020-12-10)
6
16
 
7
17
  * Improve `break`/`next` typing ([#271](https://github.com/soutaro/steep/pull/271))
@@ -23,7 +23,7 @@ module Steep
23
23
  end
24
24
 
25
25
  def to_s
26
- ""
26
+ "bot"
27
27
  end
28
28
 
29
29
  include Helper::NoFreeVariables
@@ -368,6 +368,8 @@ module Steep
368
368
  ]
369
369
  when AST::Types::Name::Alias
370
370
  unwrap_optional(expand_alias(type))
371
+ when AST::Types::Boolean
372
+ [AST::Builtin.true_type, AST::Builtin.false_type]
371
373
  else
372
374
  [type, nil]
373
375
  end
@@ -421,6 +423,14 @@ module Steep
421
423
  return_type: AST::Types::Logic::ArgIsReceiver.new(location: method_type.type.return_type.location)
422
424
  )
423
425
  )
426
+ when RBS::BuiltinNames::Object.name, RBS::BuiltinNames::String.name, RBS::BuiltinNames::Integer.name, RBS::BuiltinNames::Symbol.name,
427
+ RBS::BuiltinNames::TrueClass.name, RBS::BuiltinNames::FalseClass.name, TypeName("::NilClass")
428
+ # Value based type-case works on literal types which is available for String, Integer, Symbol, TrueClass, FalseClass, and NilClass
429
+ return method_type.with(
430
+ type: method_type.type.with(
431
+ return_type: AST::Types::Logic::ArgEqualsReceiver.new(location: method_type.type.return_type.location)
432
+ )
433
+ )
424
434
  end
425
435
  end
426
436
  end
@@ -58,16 +58,23 @@ module Steep
58
58
  end
59
59
  end
60
60
 
61
+ class ArgEqualsReceiver < Base
62
+ def initialize(location: nil)
63
+ @location = location
64
+ end
65
+ end
66
+
61
67
  class Env < Base
62
- attr_reader :truthy, :falsy
68
+ attr_reader :truthy, :falsy, :type
63
69
 
64
- def initialize(truthy:, falsy:, location: nil)
70
+ def initialize(truthy:, falsy:, type:, location: nil)
65
71
  @truthy = truthy
66
72
  @falsy = falsy
73
+ @type = type
67
74
  end
68
75
 
69
76
  def ==(other)
70
- other.is_a?(Env) && other.truthy == truthy && other.falsy == falsy
77
+ other.is_a?(Env) && other.truthy == truthy && other.falsy == falsy && other.type == type
71
78
  end
72
79
 
73
80
  alias eql? ==
@@ -75,6 +82,12 @@ module Steep
75
82
  def hash
76
83
  self.class.hash ^ truthy.hash ^ falsy.hash
77
84
  end
85
+
86
+ def inspect
87
+ "#<Steep::AST::Types::Env @type=#{type}, @truthy=..., @falsy=...>"
88
+ end
89
+
90
+ alias to_s inspect
78
91
  end
79
92
  end
80
93
  end
@@ -23,7 +23,7 @@ module Steep
23
23
  end
24
24
 
25
25
  def to_s
26
- ""
26
+ "top"
27
27
  end
28
28
 
29
29
  include Helper::NoFreeVariables
@@ -8,7 +8,18 @@ module Steep
8
8
  end
9
9
 
10
10
  def location_to_str
11
- Rainbow("#{node.loc.expression.source_buffer.name}:#{node.loc.first_line}:#{node.loc.column}").red
11
+ file = Rainbow(node.loc.expression.source_buffer.name).cyan
12
+ line = Rainbow(node.loc.first_line).bright
13
+ column = Rainbow(node.loc.column).bright
14
+ "#{file}:#{line}:#{column}"
15
+ end
16
+
17
+ def format_message(message, class_name: self.class.name.split("::").last)
18
+ if message.empty?
19
+ "#{location_to_str}: #{Rainbow(class_name).red}"
20
+ else
21
+ "#{location_to_str}: #{Rainbow(class_name).red}: #{message}"
22
+ end
12
23
  end
13
24
 
14
25
  def print_to(io)
@@ -45,7 +56,7 @@ module Steep
45
56
  end
46
57
 
47
58
  def to_s
48
- "#{location_to_str}: IncompatibleAssignment: lhs_type=#{lhs_type}, rhs_type=#{rhs_type}"
59
+ format_message "lhs_type=#{lhs_type}, rhs_type=#{rhs_type}"
49
60
  end
50
61
  end
51
62
 
@@ -61,7 +72,7 @@ module Steep
61
72
  end
62
73
 
63
74
  def to_s
64
- "#{location_to_str}: IncompatibleArguments: receiver=#{receiver_type}, method_type=#{method_type}"
75
+ format_message "receiver=#{receiver_type}, method_type=#{method_type}"
65
76
  end
66
77
  end
67
78
 
@@ -79,7 +90,7 @@ module Steep
79
90
  end
80
91
 
81
92
  def to_s
82
- "#{location_to_str}: UnresolvedOverloading: receiver=#{receiver_type}, method_name=#{method_name}, method_types=#{method_types.join(" | ")}"
93
+ format_message "receiver=#{receiver_type}, method_name=#{method_name}, method_types=#{method_types.join(" | ")}"
83
94
  end
84
95
  end
85
96
 
@@ -97,7 +108,7 @@ module Steep
97
108
  end
98
109
 
99
110
  def to_s
100
- "#{location_to_str}: ArgumentTypeMismatch: receiver=#{receiver_type}, expected=#{expected}, actual=#{actual}"
111
+ format_message "receiver=#{receiver_type}, expected=#{expected}, actual=#{actual}"
101
112
  end
102
113
  end
103
114
 
@@ -112,7 +123,7 @@ module Steep
112
123
  end
113
124
 
114
125
  def to_s
115
- "#{location_to_str}: BlockParameterTypeMismatch: expected=#{expected}, actual=#{actual}"
126
+ format_message "expected=#{expected}, actual=#{actual}"
116
127
  end
117
128
  end
118
129
 
@@ -127,7 +138,7 @@ module Steep
127
138
  end
128
139
 
129
140
  def to_s
130
- "#{location_to_str}: NoMethodError: type=#{type}, method=#{method}"
141
+ format_message "type=#{type}, method=#{method}", class_name: "NoMethodError"
131
142
  end
132
143
  end
133
144
 
@@ -146,7 +157,7 @@ module Steep
146
157
  end
147
158
 
148
159
  def to_s
149
- "#{location_to_str}: ReturnTypeMismatch: expected=#{expected}, actual=#{actual}"
160
+ format_message "expected=#{expected}, actual=#{actual}"
150
161
  end
151
162
  end
152
163
 
@@ -159,7 +170,7 @@ module Steep
159
170
  end
160
171
 
161
172
  def to_s
162
- "#{location_to_str}: UnexpectedBlockGiven: method_type=#{method_type}"
173
+ format_message "method_type=#{method_type}"
163
174
  end
164
175
  end
165
176
 
@@ -172,7 +183,7 @@ module Steep
172
183
  end
173
184
 
174
185
  def to_s
175
- "#{location_to_str}: RequiredBlockMissing: method_type=#{method_type.to_s}"
186
+ format_message "method_type=#{method_type}"
176
187
  end
177
188
  end
178
189
 
@@ -191,7 +202,7 @@ module Steep
191
202
  end
192
203
 
193
204
  def to_s
194
- "#{location_to_str}: BlockTypeMismatch: expected=#{expected}, actual=#{actual}"
205
+ format_message "expected=#{expected}, actual=#{actual}"
195
206
  end
196
207
  end
197
208
 
@@ -210,7 +221,7 @@ module Steep
210
221
  end
211
222
 
212
223
  def to_s
213
- "#{location_to_str}: BlockBodyTypeMismatch: expected=#{expected}, actual=#{actual}"
224
+ format_message "expected=#{expected}, actual=#{actual}"
214
225
  end
215
226
  end
216
227
 
@@ -229,25 +240,25 @@ module Steep
229
240
  end
230
241
 
231
242
  def to_s
232
- "#{location_to_str}: BreakTypeMismatch: expected=#{expected}, actual=#{actual}"
243
+ format_message "expected=#{expected}, actual=#{actual}"
233
244
  end
234
245
  end
235
246
 
236
247
  class UnexpectedJump < Base
237
248
  def to_s
238
- "#{location_to_str}: UnexpectedJump"
249
+ format_message ""
239
250
  end
240
251
  end
241
252
 
242
253
  class UnexpectedJumpValue < Base
243
254
  def to_s
244
- "#{location_to_str}: UnexpectedJumpValue"
255
+ format_message ""
245
256
  end
246
257
  end
247
258
 
248
259
  class MethodArityMismatch < Base
249
260
  def to_s
250
- "#{location_to_str}: MethodArityMismatch: method=#{node.children[0]}"
261
+ format_message "method=#{node.children[0]}"
251
262
  end
252
263
  end
253
264
 
@@ -266,7 +277,7 @@ module Steep
266
277
  end
267
278
 
268
279
  def to_s
269
- "#{location_to_str}: IncompatibleMethodTypeAnnotation: interface_method=#{interface_method.type_name}.#{interface_method.name}, annotation_method=#{annotation_method.name}"
280
+ format_message "interface_method=#{interface_method.type_name}.#{interface_method.name}, annotation_method=#{annotation_method.name}"
270
281
  end
271
282
  end
272
283
 
@@ -279,7 +290,7 @@ module Steep
279
290
  end
280
291
 
281
292
  def to_s
282
- "#{location_to_str}: MethodDefinitionWithOverloading: method=#{method.name}, types=#{method.types.join(" | ")}"
293
+ format_message "method=#{method.name}, types=#{method.types.join(" | ")}"
283
294
  end
284
295
  end
285
296
 
@@ -298,7 +309,7 @@ module Steep
298
309
  end
299
310
 
300
311
  def to_s
301
- "#{location_to_str}: MethodReturnTypeAnnotationMismatch: method_type=#{method_type.return_type}, annotation_type=#{annotation_type}"
312
+ format_message "method_type=#{method_type.return_type}, annotation_type=#{annotation_type}"
302
313
  end
303
314
  end
304
315
 
@@ -324,13 +335,13 @@ module Steep
324
335
  prefix = node.children[0].type == :self ? "self" : "*"
325
336
  "#{prefix}.#{node.children[1]}"
326
337
  end
327
- "#{location_to_str}: MethodBodyTypeMismatch: method=#{method}, expected=#{expected}, actual=#{actual}"
338
+ format_message "method=#{method}, expected=#{expected}, actual=#{actual}"
328
339
  end
329
340
  end
330
341
 
331
342
  class UnexpectedYield < Base
332
343
  def to_s
333
- "#{location_to_str}: UnexpectedYield"
344
+ format_message ""
334
345
  end
335
346
  end
336
347
 
@@ -343,7 +354,7 @@ module Steep
343
354
  end
344
355
 
345
356
  def to_s
346
- "#{location_to_str}: UnexpectedSuper: method=#{method}"
357
+ format_message "method=#{method}"
347
358
  end
348
359
  end
349
360
 
@@ -356,7 +367,7 @@ module Steep
356
367
  end
357
368
 
358
369
  def to_s
359
- "#{location_to_str}: IncompatibleZuper: method=#{method}"
370
+ format_message "method=#{method}"
360
371
  end
361
372
  end
362
373
 
@@ -379,7 +390,7 @@ module Steep
379
390
  when :module
380
391
  "self.#{missing_method}"
381
392
  end
382
- "#{location_to_str}: MethodDefinitionMissing: module=#{module_name}, method=#{method}"
393
+ format_message "module=#{module_name}, method=#{method}"
383
394
  end
384
395
  end
385
396
 
@@ -394,7 +405,7 @@ module Steep
394
405
  end
395
406
 
396
407
  def to_s
397
- "#{location_to_str}: UnexpectedDynamicMethod: module=#{module_name}, method=#{method_name}"
408
+ format_message "module=#{module_name}, method=#{method_name}"
398
409
  end
399
410
  end
400
411
 
@@ -407,7 +418,7 @@ module Steep
407
418
  end
408
419
 
409
420
  def to_s
410
- "#{location_to_str}: UnknownConstantAssigned: type=#{type}"
421
+ format_message "type=#{type}"
411
422
  end
412
423
  end
413
424
 
@@ -417,7 +428,7 @@ module Steep
417
428
  end
418
429
 
419
430
  def to_s
420
- "#{location_to_str}: FallbackAny"
431
+ format_message ""
421
432
  end
422
433
  end
423
434
 
@@ -440,7 +451,7 @@ module Steep
440
451
  include ResultPrinter
441
452
 
442
453
  def to_s
443
- "#{location_to_str}: UnsatisfiableConstraint: method_type=#{method_type}, constraint=#{sub_type} <: '#{var} <: #{super_type}"
454
+ format_message "method_type=#{method_type}, constraint=#{sub_type} <: '#{var} <: #{super_type}"
444
455
  end
445
456
  end
446
457
 
@@ -459,7 +470,7 @@ module Steep
459
470
  include ResultPrinter
460
471
 
461
472
  def to_s
462
- "#{location_to_str}: IncompatibleAnnotation: var_name=#{var_name}, #{relation}"
473
+ format_message "var_name=#{var_name}, #{relation}"
463
474
  end
464
475
  end
465
476
 
@@ -478,7 +489,7 @@ module Steep
478
489
  include ResultPrinter
479
490
 
480
491
  def to_s
481
- "#{location_to_str}: IncompatibleTypeCase: var_name=#{var_name}, #{relation}"
492
+ format_message "var_name=#{var_name}, #{relation}"
482
493
  end
483
494
  end
484
495
 
@@ -491,7 +502,7 @@ module Steep
491
502
  end
492
503
 
493
504
  def to_s
494
- "#{location_to_str}: ElseOnExhaustiveCase: type=#{type}"
505
+ format_message "type=#{type}"
495
506
  end
496
507
  end
497
508
 
@@ -504,7 +515,7 @@ module Steep
504
515
  end
505
516
 
506
517
  def to_s
507
- "#{location_to_str}: UnexpectedSplat: type=#{type}"
518
+ format_message "type=#{type}"
508
519
  end
509
520
  end
510
521
 
@@ -519,7 +530,7 @@ module Steep
519
530
  end
520
531
 
521
532
  def to_s
522
- "#{location_to_str}: IncompatibleTuple: expected_tuple=#{expected_tuple}"
533
+ format_message "expected_tuple=#{expected_tuple}"
523
534
  end
524
535
  end
525
536
 
@@ -532,7 +543,7 @@ module Steep
532
543
  end
533
544
 
534
545
  def to_s
535
- "#{location_to_str}: UnexpectedKeyword: #{unexpected_keywords.to_a.join(", ")}"
546
+ format_message unexpected_keywords.to_a.join(", ")
536
547
  end
537
548
  end
538
549
 
@@ -545,7 +556,7 @@ module Steep
545
556
  end
546
557
 
547
558
  def to_s
548
- "#{location_to_str}: MissingKeyword: #{missing_keywords.to_a.join(", ")}"
559
+ format_message missing_keywords.to_a.join(", ")
549
560
  end
550
561
  end
551
562
 
@@ -558,8 +569,7 @@ module Steep
558
569
  end
559
570
 
560
571
  def to_s
561
- msg = message || "#{node.type} is not supported"
562
- "#{location_to_str}: UnsupportedSyntax: #{msg}"
572
+ format_message(message || "#{node.type} is not supported")
563
573
  end
564
574
  end
565
575
 
@@ -574,8 +584,8 @@ module Steep
574
584
  end
575
585
 
576
586
  def to_s
577
- <<-MESSAGE
578
- #{location_to_str}: UnexpectedError: #{error.class}
587
+ format_message <<-MESSAGE
588
+ #{error.class}
579
589
  >> #{message}
580
590
  MESSAGE
581
591
  end
@@ -192,8 +192,8 @@ module Steep
192
192
  rescue RBS::DuplicatedDeclarationError => exn
193
193
  @status = SignatureValidationErrorStatus.new(
194
194
  errors: [
195
- Signature::Errors::DuplicatedDefinitionError.new(
196
- name: exn.name,
195
+ Signature::Errors::DuplicatedDeclarationError.new(
196
+ type_name: exn.name,
197
197
  location: exn.decls[0].location
198
198
  )
199
199
  ],
@@ -19,16 +19,16 @@ module Steep
19
19
  end
20
20
  end
21
21
 
22
- class DuplicatedDefinitionError < Base
23
- attr_reader :name
22
+ class DuplicatedDeclarationError < Base
23
+ attr_reader :type_name
24
24
 
25
- def initialize(name:, location:)
26
- @name = name
25
+ def initialize(type_name:, location:)
26
+ @type_name = type_name
27
27
  @location = location
28
28
  end
29
29
 
30
30
  def puts(io)
31
- io.puts "#{loc_to_s}\sDuplicatedDefinitionError: name=#{name}"
31
+ io.puts "#{loc_to_s}\sDuplicatedDeclarationError: name=#{type_name}"
32
32
  end
33
33
  end
34
34
 
@@ -76,6 +76,52 @@ module Steep
76
76
  io.puts "#{loc_to_s}\tInvalidMethodOverloadError: class_name=#{class_name}, method_name=#{method_name}"
77
77
  end
78
78
  end
79
+
80
+ class UnknownMethodAliasError < Base
81
+ attr_reader :class_name
82
+ attr_reader :method_name
83
+
84
+ def initialize(class_name:, method_name:, location:)
85
+ @class_name = class_name
86
+ @method_name = method_name
87
+ @location = location
88
+ end
89
+
90
+ def puts(io)
91
+ io.puts "#{loc_to_s}\tUnknownMethodAliasError: class_name=#{class_name}, method_name=#{method_name}"
92
+ end
93
+ end
94
+
95
+ class DuplicatedMethodDefinitionError < Base
96
+ attr_reader :class_name
97
+ attr_reader :method_name
98
+
99
+ def initialize(class_name:, method_name:, location:)
100
+ @class_name = class_name
101
+ @method_name = method_name
102
+ @location = location
103
+ end
104
+
105
+ def puts(io)
106
+ io.puts "#{loc_to_s}\tDuplicatedMethodDefinitionError: class_name=#{class_name}, method_name=#{method_name}"
107
+ end
108
+ end
109
+
110
+ class RecursiveAliasError < Base
111
+ attr_reader :class_name
112
+ attr_reader :names
113
+ attr_reader :location
114
+
115
+ def initialize(class_name:, names:, location:)
116
+ @class_name = class_name
117
+ @names = names
118
+ @location = location
119
+ end
120
+
121
+ def puts(io)
122
+ io.puts "#{loc_to_s}\tRecursiveAliasError: class_name=#{class_name}, names=#{names.join(", ")}"
123
+ end
124
+ end
79
125
  end
80
126
  end
81
127
  end
@@ -62,7 +62,7 @@ module Steep
62
62
  end
63
63
 
64
64
  def validate_one_class(name)
65
- rescue_validation_errors do
65
+ rescue_validation_errors(name) do
66
66
  Steep.logger.debug "Validating class definition `#{name}`..."
67
67
  Steep.logger.tagged "#{name}" do
68
68
  builder.build_instance(name).each_type do |type|
@@ -76,7 +76,7 @@ module Steep
76
76
  end
77
77
 
78
78
  def validate_one_interface(name)
79
- rescue_validation_errors do
79
+ rescue_validation_errors(name) do
80
80
  Steep.logger.debug "Validating interface `#{name}`..."
81
81
  Steep.logger.tagged "#{name}" do
82
82
  builder.build_interface(name).each_type do |type|
@@ -117,7 +117,7 @@ module Steep
117
117
 
118
118
  def validate_alias
119
119
  env.alias_decls.each do |name, entry|
120
- rescue_validation_errors do
120
+ rescue_validation_errors(name) do
121
121
  Steep.logger.debug "Validating alias `#{name}`..."
122
122
  builder.expand_alias(name).tap do |type|
123
123
  validate_type(type)
@@ -126,7 +126,7 @@ module Steep
126
126
  end
127
127
  end
128
128
 
129
- def rescue_validation_errors
129
+ def rescue_validation_errors(type_name = nil)
130
130
  yield
131
131
  rescue RBS::InvalidTypeApplicationError => exn
132
132
  @errors << Errors::InvalidTypeApplicationError.new(
@@ -146,6 +146,30 @@ module Steep
146
146
  method_name: exn.method_name,
147
147
  location: exn.members[0].location
148
148
  )
149
+ rescue RBS::DuplicatedMethodDefinitionError => exn
150
+ @errors << Errors::DuplicatedMethodDefinitionError.new(
151
+ class_name: type_name,
152
+ method_name: exn.method_name,
153
+ location: exn.location
154
+ )
155
+ rescue RBS::DuplicatedInterfaceMethodDefinitionError => exn
156
+ @errors << Errors::DuplicatedMethodDefinitionError.new(
157
+ class_name: type_name,
158
+ method_name: exn.method_name,
159
+ location: exn.member.location
160
+ )
161
+ rescue RBS::UnknownMethodAliasError => exn
162
+ @errors << Errors::UnknownMethodAliasError.new(
163
+ class_name: type_name,
164
+ method_name: exn.aliased_name,
165
+ location: exn.location
166
+ )
167
+ rescue RBS::RecursiveAliasDefinitionError => exn
168
+ @errors << Errors::RecursiveAliasError.new(
169
+ class_name: exn.type.name,
170
+ names: exn.defs.map(&:name),
171
+ location: exn.defs[0].original.location
172
+ )
149
173
  end
150
174
  end
151
175
  end
@@ -10,7 +10,7 @@ module Steep
10
10
  end
11
11
 
12
12
  def instance_super_types(type_name, args:)
13
- ancestors = factory.definition_builder.one_instance_ancestors(type_name)
13
+ ancestors = factory.definition_builder.ancestor_builder.one_instance_ancestors(type_name)
14
14
 
15
15
  subst = unless args.empty?
16
16
  args_ = args.map {|type| factory.type_1(type) }
@@ -50,7 +50,7 @@ module Steep
50
50
  end
51
51
 
52
52
  def singleton_super_types(type_name)
53
- ancestors = factory.definition_builder.one_singleton_ancestors(type_name)
53
+ ancestors = factory.definition_builder.ancestor_builder.one_singleton_ancestors(type_name)
54
54
 
55
55
  ancestors.each_ancestor.map do |ancestor|
56
56
  name = ancestor.name
@@ -399,6 +399,9 @@ module Steep
399
399
 
400
400
  instance_type = AST::Types::Name::Instance.new(name: class_name, args: class_args)
401
401
  module_type = AST::Types::Name::Singleton.new(name: class_name)
402
+ else
403
+ instance_type = AST::Builtin::Object.instance_type
404
+ module_type = AST::Builtin::Object.module_type
402
405
  end
403
406
 
404
407
  if annots.instance_type
@@ -642,7 +645,7 @@ module Steep
642
645
  Pair.new(type: call.return_type, constr: self)
643
646
  end
644
647
 
645
- def synthesize(node, hint: nil)
648
+ def synthesize(node, hint: nil, condition: false)
646
649
  Steep.logger.tagged "synthesize:(#{node.location.expression.to_s.split(/:/, 2).last})" do
647
650
  Steep.logger.debug node.type
648
651
  case node.type
@@ -879,9 +882,7 @@ module Steep
879
882
  new.typing.add_context_for_node(node, context: new.context)
880
883
  new.typing.add_context_for_body(node, context: new.context)
881
884
 
882
- each_child_node(args_node) do |arg|
883
- _, new = new.synthesize(arg)
884
- end
885
+ new = new.synthesize_children(args_node)
885
886
 
886
887
  body_pair = if body_node
887
888
  return_type = expand_alias(new.method_context&.return_type)
@@ -936,14 +937,17 @@ module Steep
936
937
  checker.factory.definition_builder.build_singleton(name)
937
938
  end
938
939
 
940
+ args_node = node.children[2]
939
941
  new = for_new_method(node.children[1],
940
942
  node,
941
- args: node.children[2].children,
943
+ args: args_node.children,
942
944
  self_type: self_type,
943
945
  definition: definition)
944
946
  new.typing.add_context_for_node(node, context: new.context)
945
947
  new.typing.add_context_for_body(node, context: new.context)
946
948
 
949
+ new = new.synthesize_children(args_node)
950
+
947
951
  each_child_node(node.children[2]) do |arg|
948
952
  new.synthesize(arg)
949
953
  end
@@ -1091,10 +1095,6 @@ module Steep
1091
1095
  add_typing(node, type: type)
1092
1096
  else
1093
1097
  type = AST::Builtin.any_type
1094
- if context&.method_context&.method_type
1095
- Steep.logger.error { "Unknown arg type: #{node}" }
1096
- end
1097
-
1098
1098
  lvasgn(node, type)
1099
1099
  end
1100
1100
  end
@@ -1514,18 +1514,22 @@ module Steep
1514
1514
  yield_self do
1515
1515
  left, right = node.children
1516
1516
 
1517
- left_type, constr = synthesize(left)
1517
+ left_type, constr = synthesize(left, hint: hint, condition: true)
1518
1518
 
1519
1519
  interpreter = TypeInference::LogicTypeInterpreter.new(subtyping: checker, typing: typing)
1520
1520
  truthy_env, falsey_env = interpreter.eval(env: constr.context.lvar_env, type: left_type, node: left)
1521
1521
 
1522
+ if left_type.is_a?(AST::Types::Logic::Env)
1523
+ left_type = left_type.type
1524
+ end
1525
+
1522
1526
  right_type, constr = constr
1523
1527
  .update_lvar_env { truthy_env }
1524
1528
  .tap {|constr| typing.add_context_for_node(right, context: constr.context) }
1525
1529
  .for_branch(right)
1526
- .synthesize(right)
1530
+ .synthesize(right, hint: hint, condition: true)
1527
1531
 
1528
- truthy_env, _ = interpreter.eval(env: truthy_env, type: right_type, node: right)
1532
+ truthy_env, _ = interpreter.eval(env: constr.context.lvar_env, type: right_type, node: right)
1529
1533
 
1530
1534
  env = if right_type.is_a?(AST::Types::Bot)
1531
1535
  falsey_env
@@ -1534,14 +1538,14 @@ module Steep
1534
1538
  end
1535
1539
 
1536
1540
  type = case
1537
- when left_type.is_a?(AST::Types::Logic::Base) && right_type.is_a?(AST::Types::Logic::Base)
1538
- AST::Types::Logic::Env.new(truthy: truthy_env, falsy: env)
1539
1541
  when check_relation(sub_type: left_type, super_type: AST::Types::Boolean.new).success?
1540
1542
  union_type(left_type, right_type)
1541
1543
  else
1542
1544
  union_type(right_type, AST::Builtin.nil_type)
1543
1545
  end
1544
1546
 
1547
+ type = AST::Types::Logic::Env.new(truthy: truthy_env, falsy: env, type: type) if condition
1548
+
1545
1549
  add_typing(node,
1546
1550
  type: type,
1547
1551
  constr: constr.update_lvar_env { env })
@@ -1551,17 +1555,21 @@ module Steep
1551
1555
  yield_self do
1552
1556
  left, right = node.children
1553
1557
 
1554
- left_type, constr = synthesize(left, hint: hint)
1558
+ left_type, constr = synthesize(left, hint: hint, condition: true)
1555
1559
 
1556
1560
  interpreter = TypeInference::LogicTypeInterpreter.new(subtyping: checker, typing: typing)
1557
1561
  truthy_env, falsey_env = interpreter.eval(env: constr.context.lvar_env, type: left_type, node: left)
1558
1562
 
1563
+ if left_type.is_a?(AST::Types::Logic::Env)
1564
+ left_type = left_type.type
1565
+ end
1559
1566
  left_type, _ = checker.factory.unwrap_optional(left_type)
1567
+
1560
1568
  right_type, constr = constr
1561
1569
  .update_lvar_env { falsey_env }
1562
1570
  .tap {|constr| typing.add_context_for_node(right, context: constr.context) }
1563
1571
  .for_branch(right)
1564
- .synthesize(right, hint: left_type)
1572
+ .synthesize(right, hint: left_type, condition: true)
1565
1573
 
1566
1574
  _, falsey_env = interpreter.eval(env: falsey_env, type: right_type, node: right)
1567
1575
 
@@ -1572,12 +1580,14 @@ module Steep
1572
1580
  end
1573
1581
 
1574
1582
  type = case
1575
- when left_type.is_a?(AST::Types::Logic::Base) && right_type.is_a?(AST::Types::Logic::Base)
1576
- AST::Types::Logic::Env.new(truthy: env, falsy: falsey_env)
1583
+ when check_relation(sub_type: left_type, super_type: AST::Builtin.bool_type).success?
1584
+ AST::Builtin.bool_type
1577
1585
  else
1578
1586
  union_type(left_type, right_type)
1579
1587
  end
1580
1588
 
1589
+ type = AST::Types::Logic::Env.new(truthy: env, falsy: falsey_env, type: type) if condition
1590
+
1581
1591
  add_typing(node,
1582
1592
  type: type,
1583
1593
  constr: constr.update_lvar_env { env })
@@ -1586,7 +1596,7 @@ module Steep
1586
1596
  when :if
1587
1597
  cond, true_clause, false_clause = node.children
1588
1598
 
1589
- cond_type, constr = synthesize(cond)
1599
+ cond_type, constr = synthesize(cond, condition: true)
1590
1600
  interpreter = TypeInference::LogicTypeInterpreter.new(subtyping: checker, typing: constr.typing)
1591
1601
  truthy_env, falsey_env = interpreter.eval(env: constr.context.lvar_env, type: cond_type, node: cond)
1592
1602
 
@@ -1667,7 +1677,7 @@ module Steep
1667
1677
 
1668
1678
  tests.each do |test|
1669
1679
  test_node = test.updated(:send, [test, :===, var_node])
1670
- test_type, test_constr = test_constr.synthesize(test_node)
1680
+ test_type, test_constr = test_constr.synthesize(test_node, condition: true)
1671
1681
  truthy_env, falsy_env = interpreter.eval(type: test_type, node: test_node, env: test_constr.context.lvar_env)
1672
1682
  truthy_env = cond_vars.inject(truthy_env) do |env, var|
1673
1683
  env.assign!(var, node: test_node, type: env[first_var])
@@ -1675,6 +1685,7 @@ module Steep
1675
1685
  falsy_env = cond_vars.inject(falsy_env) do |env, var|
1676
1686
  env.assign!(var, node: test_node, type: env[first_var])
1677
1687
  end
1688
+
1678
1689
  test_envs << truthy_env
1679
1690
  test_constr = test_constr.update_lvar_env { falsy_env }
1680
1691
  end
@@ -1719,21 +1730,20 @@ module Steep
1719
1730
  branch_pairs = []
1720
1731
 
1721
1732
  when_constr = constr
1733
+ clause_constr = constr
1722
1734
 
1723
1735
  whens.each do |clause|
1724
1736
  *tests, body = clause.children
1725
1737
 
1726
1738
  test_constr = when_constr
1727
- test_envs = []
1728
1739
 
1729
1740
  tests.each do |test|
1730
- test_type, test_constr = test_constr.synthesize(test)
1741
+ test_type, test_constr = test_constr.synthesize(test, condition: true)
1731
1742
  truthy_env, falsy_env = interpreter.eval(env: test_constr.context.lvar_env, type: test_type, node: test)
1732
- test_envs << truthy_env
1743
+ clause_constr = clause_constr.update_lvar_env { truthy_env }
1733
1744
  test_constr = test_constr.update_lvar_env { falsy_env }
1734
1745
  end
1735
1746
 
1736
- clause_constr = when_constr.update_lvar_env {|env| env.join(*test_envs) }
1737
1747
  when_constr = test_constr
1738
1748
 
1739
1749
  if body
@@ -1907,7 +1917,7 @@ module Steep
1907
1917
  when :while, :until
1908
1918
  yield_self do
1909
1919
  cond, body = node.children
1910
- cond_type, constr = synthesize(cond)
1920
+ cond_type, constr = synthesize(cond, condition: true)
1911
1921
 
1912
1922
  interpreter = TypeInference::LogicTypeInterpreter.new(subtyping: checker, typing: typing)
1913
1923
  truthy_env, falsy_env = interpreter.eval(env: constr.context.lvar_env, node: cond, type: cond_type)
@@ -2154,7 +2164,12 @@ module Steep
2154
2164
 
2155
2165
  when :splat
2156
2166
  yield_self do
2157
- Steep.logger.warn { "Unsupported node #{node.type} (#{node.location.expression.source_buffer.name}:#{node.location.expression.line})" }
2167
+ typing.add_error(
2168
+ Errors::UnsupportedSyntax.new(
2169
+ node: node,
2170
+ message: "Unsupported splat node occurrence"
2171
+ )
2172
+ )
2158
2173
 
2159
2174
  each_child_node node do |child|
2160
2175
  synthesize(child)
@@ -2173,7 +2188,7 @@ module Steep
2173
2188
  add_typing node, type: AST::Builtin.any_type, constr: constr
2174
2189
 
2175
2190
  else
2176
- raise "Unexpected node: #{node.inspect}, #{node.location.expression}"
2191
+ typing.add_error(Errors::UnsupportedSyntax.new(node: node))
2177
2192
 
2178
2193
  end.tap do |pair|
2179
2194
  unless pair.is_a?(Pair) && !pair.type.is_a?(Pair)
@@ -2542,7 +2557,25 @@ module Steep
2542
2557
 
2543
2558
  constr.add_call(call)
2544
2559
  else
2545
- add_call(
2560
+ skips = []
2561
+ skips << receiver if receiver
2562
+ skips << node.children[0] if node.type == :block
2563
+ skips << block_params if block_params
2564
+ skips << block_body if block_body
2565
+
2566
+ constr = synthesize_children(node, skips: skips)
2567
+ if block_params
2568
+ block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
2569
+
2570
+ constr.type_block_without_hint(
2571
+ node: node,
2572
+ block_params: TypeInference::BlockParams.from_node(block_params, annotations: block_annotations),
2573
+ block_annotations: block_annotations,
2574
+ block_body: block_body
2575
+ )
2576
+ end
2577
+
2578
+ constr.add_call(
2546
2579
  TypeInference::MethodCall::NoMethodError.new(
2547
2580
  node: node,
2548
2581
  context: context.method_context,
@@ -3129,9 +3162,9 @@ module Steep
3129
3162
  block_constr = for_block(
3130
3163
  block_params: block_params,
3131
3164
  block_param_hint: nil,
3132
- block_type_hint: nil,
3165
+ block_type_hint: AST::Builtin.any_type,
3133
3166
  block_annotations: block_annotations,
3134
- node_type_hint: nil
3167
+ node_type_hint: AST::Builtin.any_type
3135
3168
  )
3136
3169
 
3137
3170
  block_constr.typing.add_context_for_body(node, context: block_constr.context)
@@ -41,8 +41,11 @@ module Steep
41
41
 
42
42
  if type.is_a?(AST::Types::Logic::Base)
43
43
  vars.each do |var_name|
44
- truthy_env = truthy_env.assign!(var_name, node: node, type: AST::Builtin.true_type)
45
- falsy_env = truthy_env.assign!(var_name, node: node, type: AST::Builtin.false_type)
44
+ var_type = truthy_env[var_name]
45
+ truthy_type, falsy_type = factory.unwrap_optional(var_type)
46
+ falsy_type ||= AST::Builtin.nil_type
47
+ truthy_env = truthy_env.assign!(var_name, node: node, type: truthy_type) {|_, type, _| type }
48
+ falsy_env = truthy_env.assign!(var_name, node: node, type: falsy_type) {|_, type, _| type }
46
49
  end
47
50
 
48
51
  case type
@@ -77,11 +80,16 @@ module Steep
77
80
 
78
81
  if arg_type.is_a?(AST::Types::Name::Singleton)
79
82
  receiver_vars.each do |var_name|
80
- var_type = env[var_name]
81
- truthy_type, falsy_type = type_case_select(var_type, arg_type.name)
82
-
83
- truthy_env = truthy_env.assign!(var_name, node: node, type: truthy_type)
84
- falsy_env = falsy_env.assign!(var_name, node: node, type: falsy_type)
83
+ case var_name
84
+ when :_, :__any__, :__skip__
85
+ # skip
86
+ else
87
+ var_type = env[var_name]
88
+ truthy_type, falsy_type = type_case_select(var_type, arg_type.name)
89
+
90
+ truthy_env = truthy_env.assign!(var_name, node: node, type: truthy_type)
91
+ falsy_env = falsy_env.assign!(var_name, node: node, type: falsy_type)
92
+ end
85
93
  end
86
94
  end
87
95
  end
@@ -93,7 +101,7 @@ module Steep
93
101
 
94
102
  if receiver
95
103
  _, arg_vars = decompose_value(arg)
96
- receiver_type = typing.type_of(node: receiver)
104
+ receiver_type = factory.deep_expand_alias(typing.type_of(node: receiver))
97
105
 
98
106
  if receiver_type.is_a?(AST::Types::Name::Singleton)
99
107
  arg_vars.each do |var_name|
@@ -106,6 +114,23 @@ module Steep
106
114
  end
107
115
  end
108
116
  end
117
+ when AST::Types::Logic::ArgEqualsReceiver
118
+ case value_node.type
119
+ when :send
120
+ receiver, _, arg = value_node.children
121
+
122
+ if receiver
123
+ _, arg_vars = decompose_value(arg)
124
+
125
+ arg_vars.each do |var_name|
126
+ var_type = factory.deep_expand_alias(env[var_name])
127
+ truthy_types, falsy_types = literal_var_type_case_select(receiver, var_type)
128
+
129
+ truthy_env = truthy_env.assign!(var_name, node: node, type: AST::Types::Union.build(types: truthy_types, location: nil))
130
+ falsy_env = falsy_env.assign!(var_name, node: node, type: AST::Types::Union.build(types: falsy_types, location: nil))
131
+ end
132
+ end
133
+ end
109
134
  when AST::Types::Logic::Not
110
135
  receiver, * = value_node.children
111
136
  receiver_type = typing.type_of(node: receiver)
@@ -156,6 +181,60 @@ module Steep
156
181
  end
157
182
  end
158
183
 
184
+ def literal_var_type_case_select(value_node, arg_type)
185
+ case arg_type
186
+ when AST::Types::Union
187
+ truthy_types = []
188
+ falsy_types = []
189
+
190
+ arg_type.types.each do |type|
191
+ ts, fs = literal_var_type_case_select(value_node, type)
192
+ truthy_types.push(*ts)
193
+ falsy_types.push(*fs)
194
+ end
195
+
196
+ [truthy_types, falsy_types]
197
+ else
198
+ value_type = typing.type_of(node: value_node)
199
+ types = [arg_type]
200
+
201
+ case value_node.type
202
+ when :nil
203
+ types.partition do |type|
204
+ type.is_a?(AST::Types::Nil) || AST::Builtin::NilClass.instance_type?(type)
205
+ end
206
+ when :true
207
+ types.partition do |type|
208
+ AST::Builtin::TrueClass.instance_type?(type) ||
209
+ (type.is_a?(AST::Types::Literal) && type.value == true)
210
+ end
211
+ when :false
212
+ types.partition do |type|
213
+ AST::Builtin::FalseClass.instance_type?(type) ||
214
+ (type.is_a?(AST::Types::Literal) && type.value == false)
215
+ end
216
+ when :int, :str, :sym
217
+ types.each.with_object([[], []]) do |type, pair|
218
+ true_types, false_types = pair
219
+
220
+ case
221
+ when type.is_a?(AST::Types::Literal)
222
+ if type.value == value_node.children[0]
223
+ true_types << type
224
+ else
225
+ false_types << type
226
+ end
227
+ else
228
+ true_types << AST::Types::Literal.new(value: value_node.children[0])
229
+ false_types << type
230
+ end
231
+ end
232
+ else
233
+ [[arg_type], [arg_type]]
234
+ end
235
+ end
236
+ end
237
+
159
238
  def type_case_select(type, klass)
160
239
  truth_types, false_types = type_case_select0(type, klass)
161
240
 
@@ -186,20 +265,6 @@ module Steep
186
265
 
187
266
  [truthy_types, falsy_types]
188
267
 
189
- when AST::Types::Name::Instance
190
- relation = Subtyping::Relation.new(sub_type: type, super_type: instance_type)
191
- if subtyping.check(relation, constraints: Subtyping::Constraints.empty, self_type: AST::Types::Self.new).success?
192
- [
193
- [type],
194
- []
195
- ]
196
- else
197
- [
198
- [],
199
- [type]
200
- ]
201
- end
202
-
203
268
  when AST::Types::Name::Alias
204
269
  ty = factory.expand_alias(type)
205
270
  type_case_select0(ty, klass)
@@ -217,10 +282,18 @@ module Steep
217
282
  ]
218
283
 
219
284
  else
220
- [
221
- [],
222
- [type]
223
- ]
285
+ relation = Subtyping::Relation.new(sub_type: type, super_type: instance_type)
286
+ if subtyping.check(relation, constraints: Subtyping::Constraints.empty, self_type: AST::Types::Self.new).success?
287
+ [
288
+ [type],
289
+ []
290
+ ]
291
+ else
292
+ [
293
+ [],
294
+ [type]
295
+ ]
296
+ end
224
297
  end
225
298
  end
226
299
  end
@@ -1,3 +1,3 @@
1
1
  module Steep
2
- VERSION = "0.38.0"
2
+ VERSION = "0.39.0"
3
3
  end
@@ -16,7 +16,7 @@ end
16
16
 
17
17
  case x
18
18
  when 1
19
- # !expects NoMethodError: type=(::Integer | ::String | ::Symbol), method=foobar
19
+ # !expects NoMethodError: type=1, method=foobar
20
20
  x.foobar
21
21
  end
22
22
 
@@ -34,5 +34,5 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency "rainbow", ">= 2.2.2", "< 4.0"
35
35
  spec.add_runtime_dependency "listen", "~> 3.0"
36
36
  spec.add_runtime_dependency "language_server-protocol", "~> 3.15.0.1"
37
- spec.add_runtime_dependency "rbs", ">= 0.20.0"
37
+ spec.add_runtime_dependency "rbs", "~> 1.0.0"
38
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: steep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.38.0
4
+ version: 0.39.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-10 00:00:00.000000000 Z
11
+ date: 2020-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -104,16 +104,16 @@ dependencies:
104
104
  name: rbs
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - ">="
107
+ - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: 0.20.0
109
+ version: 1.0.0
110
110
  type: :runtime
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - ">="
114
+ - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: 0.20.0
116
+ version: 1.0.0
117
117
  description: Gradual Typing for Ruby
118
118
  email:
119
119
  - matsumoto@soutaro.com
@@ -389,7 +389,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
389
389
  - !ruby/object:Gem::Version
390
390
  version: '0'
391
391
  requirements: []
392
- rubygems_version: 3.1.2
392
+ rubygems_version: 3.1.4
393
393
  signing_key:
394
394
  specification_version: 4
395
395
  summary: Gradual Typing for Ruby