steep 0.36.0 → 0.37.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: 5203340eb3b3534da5f1071cc497bbe7a481553e909088277c83dbfe5e5c0bbc
4
- data.tar.gz: 11863c0ea9b692de6fba552ec01645525240c025c598235f9b3bf88e35571ed5
3
+ metadata.gz: f3d9186b6988081611f8bf060700ad97eb408ab605ab11ab32b717b9a0e9b8b9
4
+ data.tar.gz: 6f308f7bd551472237d5857614b765468782290733514793b2dfe35a3ac232cf
5
5
  SHA512:
6
- metadata.gz: 9897fecb7ca5b60da9eeb236e5f06af1a9b2fa2a2df2bd87d07f7a496f0f05b988b30db2e294797304c6d7f0e8fe478cdc1d41049cbaf2e56c45108444b2c721
7
- data.tar.gz: fa2dca2cd37d74e39878ab3da7a5453a714f50e921fcd1c0e75054bf083a11003cb5799f4f92531a10bce6074dce3cce88c90daeb214b9fb45d7f5612e294fb3
6
+ metadata.gz: 1fee308a7783a6e54c974c71c78189492c0f557528bccb0da530927cfdb4e4a16f4ff6cd2ec9f8c3292dd9839bb1637f68fd3aff9da0fef6783e3f4b5d838984
7
+ data.tar.gz: 7cd72caf879d339e5fec0bed219957befd40d5dc2466b345435f4b523c8028a9264404b1d9c695c11ca638b8e6bbeb1d1ad8f600367cd87bf9b3c4fade99eeaa
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.37.0 (2020-12-06)
6
+
7
+ * Update to RBS 0.20.0 with _singleton attribute_ syntax and _proc types with blocks_. ([#264](https://github.com/soutaro/steep/pull/264))
8
+
5
9
  ## 0.36.0 (2020-11-16)
6
10
 
7
11
  * Flow-sensitive typing improvements with `||` and `&&` ([#260](https://github.com/soutaro/steep/pull/260))
@@ -42,6 +42,8 @@ require "steep/ast/annotation/collection"
42
42
  require "steep/ast/builtin"
43
43
  require "steep/ast/types/factory"
44
44
 
45
+ require "steep/interface/function"
46
+ require "steep/interface/block"
45
47
  require "steep/interface/method_type"
46
48
  require "steep/interface/substitution"
47
49
  require "steep/interface/interface"
@@ -75,9 +75,23 @@ module Steep
75
75
  end
76
76
  Record.new(elements: elements, location: nil)
77
77
  when RBS::Types::Proc
78
- params = params(type.type)
79
- return_type = type(type.type.return_type)
80
- Proc.new(params: params, return_type: return_type, location: nil)
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
93
+
94
+ Proc.new(type: func, block: block)
81
95
  else
82
96
  raise "Unexpected type given: #{type}"
83
97
  end
@@ -145,8 +159,15 @@ module Steep
145
159
  end
146
160
  RBS::Types::Record.new(fields: fields, location: nil)
147
161
  when Proc
162
+ block = if type.block
163
+ RBS::Types::Block.new(
164
+ type: function_1(type.block.type),
165
+ required: !type.block.optional?
166
+ )
167
+ end
148
168
  RBS::Types::Proc.new(
149
- type: function_1(type.params, type.return_type),
169
+ type: function_1(type.type),
170
+ block: block,
150
171
  location: nil
151
172
  )
152
173
  when Logic::Base
@@ -156,7 +177,10 @@ module Steep
156
177
  end
157
178
  end
158
179
 
159
- def function_1(params, return_type)
180
+ def function_1(func)
181
+ params = func.params
182
+ return_type = func.return_type
183
+
160
184
  RBS::Types::Function.new(
161
185
  required_positionals: params.required.map {|type| RBS::Types::Function::Param.new(name: nil, type: type_1(type)) },
162
186
  optional_positionals: params.optional.map {|type| RBS::Types::Function::Param.new(name: nil, type: type_1(type)) },
@@ -170,7 +194,7 @@ module Steep
170
194
  end
171
195
 
172
196
  def params(type)
173
- Interface::Params.new(
197
+ Interface::Function::Params.new(
174
198
  required: type.required_positionals.map {|param| type(param.type) },
175
199
  optional: type.optional_positionals.map {|param| type(param.type) },
176
200
  rest: type.rest_positionals&.yield_self {|param| type(param.type) },
@@ -202,13 +226,19 @@ module Steep
202
226
 
203
227
  type = Interface::MethodType.new(
204
228
  type_params: type_params,
205
- return_type: type(method_type.type.return_type).subst(subst),
206
- params: params(method_type.type).subst(subst),
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
+ ),
207
234
  block: method_type.block&.yield_self do |block|
208
235
  Interface::Block.new(
209
236
  optional: !block.required,
210
- type: Proc.new(params: params(block.type).subst(subst),
211
- return_type: type(block.type.return_type).subst(subst), location: nil)
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
241
+ )
212
242
  )
213
243
  end,
214
244
  method_decls: method_decls
@@ -242,12 +272,12 @@ module Steep
242
272
 
243
273
  type = RBS::MethodType.new(
244
274
  type_params: type_params,
245
- type: function_1(method_type.params.subst(subst), method_type.return_type.subst(subst)),
275
+ type: function_1(method_type.type.subst(subst)),
246
276
  block: method_type.block&.yield_self do |block|
247
277
  block_type = block.type.subst(subst)
248
278
 
249
- RBS::MethodType::Block.new(
250
- type: function_1(block_type.params, block_type.return_type),
279
+ RBS::Types::Block.new(
280
+ type: function_1(block_type),
251
281
  required: !block.optional
252
282
  )
253
283
  end,
@@ -354,7 +384,9 @@ module Steep
354
384
  when :is_a?, :kind_of?, :instance_of?
355
385
  if defined_in == RBS::BuiltinNames::Object.name && member.instance?
356
386
  return method_type.with(
357
- return_type: AST::Types::Logic::ReceiverIsArg.new(location: method_type.return_type.location)
387
+ type: method_type.type.with(
388
+ return_type: AST::Types::Logic::ReceiverIsArg.new(location: method_type.type.return_type.location)
389
+ )
358
390
  )
359
391
  end
360
392
 
@@ -363,7 +395,9 @@ module Steep
363
395
  when RBS::BuiltinNames::Object.name,
364
396
  NilClassName
365
397
  return method_type.with(
366
- return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.return_type.location)
398
+ type: method_type.type.with(
399
+ return_type: AST::Types::Logic::ReceiverIsNil.new(location: method_type.type.return_type.location)
400
+ )
367
401
  )
368
402
  end
369
403
 
@@ -373,7 +407,9 @@ module Steep
373
407
  RBS::BuiltinNames::TrueClass.name,
374
408
  RBS::BuiltinNames::FalseClass.name
375
409
  return method_type.with(
376
- return_type: AST::Types::Logic::Not.new(location: method_type.return_type.location)
410
+ type: method_type.type.with(
411
+ return_type: AST::Types::Logic::Not.new(location: method_type.type.return_type.location)
412
+ )
377
413
  )
378
414
  end
379
415
 
@@ -381,7 +417,9 @@ module Steep
381
417
  case defined_in
382
418
  when RBS::BuiltinNames::Module.name
383
419
  return method_type.with(
384
- return_type: AST::Types::Logic::ArgIsReceiver.new(location: method_type.return_type.location)
420
+ type: method_type.type.with(
421
+ return_type: AST::Types::Logic::ArgIsReceiver.new(location: method_type.type.return_type.location)
422
+ )
385
423
  )
386
424
  end
387
425
  end
@@ -572,14 +610,17 @@ module Steep
572
610
  method_types: type.types.map.with_index {|elem_type, index|
573
611
  Interface::MethodType.new(
574
612
  type_params: [],
575
- params: Interface::Params.new(required: [AST::Types::Literal.new(value: index)],
576
- optional: [],
577
- rest: nil,
578
- required_keywords: {},
579
- optional_keywords: {},
580
- rest_keywords: nil),
613
+ type: Interface::Function.new(
614
+ params: Interface::Function::Params.new(required: [AST::Types::Literal.new(value: index)],
615
+ optional: [],
616
+ rest: nil,
617
+ required_keywords: {},
618
+ optional_keywords: {},
619
+ rest_keywords: nil),
620
+ return_type: elem_type,
621
+ location: nil
622
+ ),
581
623
  block: nil,
582
- return_type: elem_type,
583
624
  method_decls: Set[]
584
625
  )
585
626
  } + aref.method_types
@@ -591,14 +632,17 @@ module Steep
591
632
  method_types: type.types.map.with_index {|elem_type, index|
592
633
  Interface::MethodType.new(
593
634
  type_params: [],
594
- params: Interface::Params.new(required: [AST::Types::Literal.new(value: index), elem_type],
595
- optional: [],
596
- rest: nil,
597
- required_keywords: {},
598
- optional_keywords: {},
599
- rest_keywords: nil),
635
+ type: Interface::Function.new(
636
+ params: Interface::Function::Params.new(required: [AST::Types::Literal.new(value: index), elem_type],
637
+ optional: [],
638
+ rest: nil,
639
+ required_keywords: {},
640
+ optional_keywords: {},
641
+ rest_keywords: nil),
642
+ return_type: elem_type,
643
+ location: nil
644
+ ),
600
645
  block: nil,
601
- return_type: elem_type,
602
646
  method_decls: Set[]
603
647
  )
604
648
  } + update.method_types
@@ -610,9 +654,12 @@ module Steep
610
654
  method_types: [
611
655
  Interface::MethodType.new(
612
656
  type_params: [],
613
- params: Interface::Params.empty,
657
+ type: Interface::Function.new(
658
+ params: Interface::Function::Params.empty,
659
+ return_type: type.types[0] || AST::Builtin.nil_type,
660
+ location: nil
661
+ ),
614
662
  block: nil,
615
- return_type: type.types[0] || AST::Builtin.nil_type,
616
663
  method_decls: Set[]
617
664
  )
618
665
  ]
@@ -624,9 +671,12 @@ module Steep
624
671
  method_types: [
625
672
  Interface::MethodType.new(
626
673
  type_params: [],
627
- params: Interface::Params.empty,
674
+ type: Interface::Function.new(
675
+ params: Interface::Function::Params.empty,
676
+ return_type: type.types.last || AST::Builtin.nil_type,
677
+ location: nil
678
+ ),
628
679
  block: nil,
629
- return_type: type.types.last || AST::Builtin.nil_type,
630
680
  method_decls: Set[]
631
681
  )
632
682
  ]
@@ -651,14 +701,17 @@ module Steep
651
701
 
652
702
  Interface::MethodType.new(
653
703
  type_params: [],
654
- params: Interface::Params.new(required: [key_type],
655
- optional: [],
656
- rest: nil,
657
- required_keywords: {},
658
- optional_keywords: {},
659
- rest_keywords: nil),
704
+ type: Interface::Function.new(
705
+ params: Interface::Function::Params.new(required: [key_type],
706
+ optional: [],
707
+ rest: nil,
708
+ required_keywords: {},
709
+ optional_keywords: {},
710
+ rest_keywords: nil),
711
+ return_type: value_type,
712
+ location: nil
713
+ ),
660
714
  block: nil,
661
- return_type: value_type,
662
715
  method_decls: Set[]
663
716
  )
664
717
  } + ref.method_types
@@ -671,14 +724,16 @@ module Steep
671
724
  key_type = Literal.new(value: key_value, location: nil)
672
725
  Interface::MethodType.new(
673
726
  type_params: [],
674
- params: Interface::Params.new(required: [key_type, value_type],
675
- optional: [],
676
- rest: nil,
677
- required_keywords: {},
678
- optional_keywords: {},
679
- rest_keywords: nil),
727
+ type: Interface::Function.new(
728
+ params: Interface::Function::Params.new(required: [key_type, value_type],
729
+ optional: [],
730
+ rest: nil,
731
+ required_keywords: {},
732
+ optional_keywords: {},
733
+ rest_keywords: nil),
734
+ return_type: value_type,
735
+ location: nil),
680
736
  block: nil,
681
- return_type: value_type,
682
737
  method_decls: Set[]
683
738
  )
684
739
  } + update.method_types
@@ -691,14 +746,18 @@ module Steep
691
746
  interface(Builtin::Proc.instance_type, private: private, self_type: self_type).tap do |interface|
692
747
  method_type = Interface::MethodType.new(
693
748
  type_params: [],
694
- params: type.params,
695
- return_type: type.return_type,
696
- block: nil,
749
+ type: type.type,
750
+ block: type.block,
697
751
  method_decls: Set[]
698
752
  )
699
753
 
700
- interface.methods[:[]] = Interface::Interface::Entry.new(method_types: [method_type])
701
754
  interface.methods[:call] = Interface::Interface::Entry.new(method_types: [method_type])
755
+
756
+ if type.block_required?
757
+ interface.methods.delete(:[])
758
+ else
759
+ interface.methods[:[]] = Interface::Interface::Entry.new(method_types: [method_type.with(block: nil)])
760
+ end
702
761
  end
703
762
 
704
763
  when Logic::Base
@@ -3,68 +3,76 @@ module Steep
3
3
  module Types
4
4
  class Proc
5
5
  attr_reader :location
6
- attr_reader :params
7
- attr_reader :return_type
6
+ attr_reader :type
7
+ attr_reader :block
8
8
 
9
- def initialize(params:, return_type:, location: nil)
9
+ def initialize(type:, block:, location: type.location)
10
+ @type = type
11
+ @block = block
10
12
  @location = location
11
- @params = params
12
- @return_type = return_type
13
13
  end
14
14
 
15
15
  def ==(other)
16
- other.is_a?(self.class) &&
17
- other.params == params &&
18
- other.return_type == return_type
16
+ other.is_a?(self.class) && other.type == type && other.block == block
19
17
  end
20
18
 
21
19
  def hash
22
- self.class.hash && params.hash && return_type.hash
20
+ self.class.hash ^ type.hash ^ block.hash
23
21
  end
24
22
 
25
23
  alias eql? ==
26
24
 
27
25
  def subst(s)
28
26
  self.class.new(
29
- params: params.subst(s),
30
- return_type: return_type.subst(s),
27
+ type: type.subst(s),
28
+ block: block&.subst(s),
31
29
  location: location
32
30
  )
33
31
  end
34
32
 
35
33
  def to_s
36
- "^#{params} -> #{return_type}"
34
+ if block
35
+ "^#{type.params} #{block} -> #{type.return_type}"
36
+ else
37
+ "^#{type.params} -> #{type.return_type}"
38
+ end
37
39
  end
38
40
 
39
41
  def free_variables()
40
- @fvs ||= Set.new.tap do |set|
41
- set.merge(params.free_variables)
42
- set.merge(return_type.free_variables)
42
+ @fvs ||= Set[].tap do |fvs|
43
+ fvs.merge(type.free_variables)
44
+ fvs.merge(block.free_variables) if block
43
45
  end
44
46
  end
45
47
 
46
48
  def level
47
- children = params.each_type.to_a + [return_type]
49
+ children = type.params.each_type.to_a + [type.return_type]
50
+ if block
51
+ children.push(*block.type.params.each_type.to_a)
52
+ children.push(block.type.return_type)
53
+ end
48
54
  [0] + level_of_children(children)
49
55
  end
50
56
 
51
57
  def closed?
52
- params.closed? && return_type.closed?
58
+ type.closed? && (block.nil? || block.closed?)
53
59
  end
54
60
 
55
61
  def with_location(new_location)
56
- self.class.new(location: new_location, params: params, return_type: return_type)
62
+ self.class.new(location: new_location, block: block, type: type)
57
63
  end
58
64
 
59
65
  def map_type(&block)
60
66
  self.class.new(
61
- params: params.map_type(&block),
62
- return_type: yield(return_type),
67
+ type: type.map_type(&block),
68
+ block: self.block&.map_type(&block),
63
69
  location: location
64
70
  )
65
71
  end
66
72
 
67
73
  def one_arg?
74
+ params = type.params
75
+
68
76
  params.required.size == 1 &&
69
77
  params.optional.empty? &&
70
78
  !params.rest &&
@@ -78,6 +86,10 @@ module Steep
78
86
  args: [],
79
87
  location: location)
80
88
  end
89
+
90
+ def block_required?
91
+ block && !block.optional?
92
+ end
81
93
  end
82
94
  end
83
95
  end
@@ -0,0 +1,79 @@
1
+ module Steep
2
+ module Interface
3
+ class Block
4
+ attr_reader :type
5
+ attr_reader :optional
6
+
7
+ def initialize(type:, optional:)
8
+ @type = type
9
+ @optional = optional
10
+ end
11
+
12
+ def optional?
13
+ @optional
14
+ end
15
+
16
+ def to_optional
17
+ self.class.new(
18
+ type: type,
19
+ optional: true
20
+ )
21
+ end
22
+
23
+ def ==(other)
24
+ other.is_a?(self.class) && other.type == type && other.optional == optional
25
+ end
26
+
27
+ alias eql? ==
28
+
29
+ def hash
30
+ type.hash ^ optional.hash
31
+ end
32
+
33
+ def closed?
34
+ type.closed?
35
+ end
36
+
37
+ def subst(s)
38
+ ty = type.subst(s)
39
+ if ty == type
40
+ self
41
+ else
42
+ self.class.new(
43
+ type: ty,
44
+ optional: optional
45
+ )
46
+ end
47
+ end
48
+
49
+ def free_variables()
50
+ @fvs ||= type.free_variables
51
+ end
52
+
53
+ def to_s
54
+ "#{optional? ? "?" : ""}{ #{type.params} -> #{type.return_type} }"
55
+ end
56
+
57
+ def map_type(&block)
58
+ self.class.new(
59
+ type: type.map_type(&block),
60
+ optional: optional
61
+ )
62
+ end
63
+
64
+ def +(other)
65
+ optional = self.optional? || other.optional?
66
+ type = Function.new(
67
+ params: self.type.params + other.type.params,
68
+ return_type: AST::Types::Union.build(types: [self.type.return_type, other.type.return_type]),
69
+ location: nil
70
+ )
71
+
72
+ self.class.new(
73
+ type: type,
74
+ optional: optional
75
+ )
76
+ end
77
+ end
78
+ end
79
+ end