steep 0.47.1 → 0.49.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/Gemfile.lock +7 -7
  4. data/lib/steep/ast/types/any.rb +2 -0
  5. data/lib/steep/ast/types/boolean.rb +2 -0
  6. data/lib/steep/ast/types/bot.rb +2 -0
  7. data/lib/steep/ast/types/class.rb +2 -0
  8. data/lib/steep/ast/types/factory.rb +162 -138
  9. data/lib/steep/ast/types/helper.rb +8 -0
  10. data/lib/steep/ast/types/instance.rb +2 -0
  11. data/lib/steep/ast/types/intersection.rb +4 -0
  12. data/lib/steep/ast/types/literal.rb +2 -0
  13. data/lib/steep/ast/types/logic.rb +2 -0
  14. data/lib/steep/ast/types/name.rb +6 -0
  15. data/lib/steep/ast/types/nil.rb +2 -0
  16. data/lib/steep/ast/types/proc.rb +9 -0
  17. data/lib/steep/ast/types/record.rb +4 -0
  18. data/lib/steep/ast/types/self.rb +2 -0
  19. data/lib/steep/ast/types/top.rb +2 -0
  20. data/lib/steep/ast/types/tuple.rb +4 -0
  21. data/lib/steep/ast/types/union.rb +4 -0
  22. data/lib/steep/ast/types/var.rb +16 -3
  23. data/lib/steep/ast/types/void.rb +2 -0
  24. data/lib/steep/diagnostic/ruby.rb +36 -11
  25. data/lib/steep/diagnostic/signature.rb +56 -0
  26. data/lib/steep/drivers/check.rb +2 -2
  27. data/lib/steep/interface/function.rb +4 -0
  28. data/lib/steep/interface/method_type.rb +14 -26
  29. data/lib/steep/interface/type_param.rb +103 -0
  30. data/lib/steep/server/base_worker.rb +1 -0
  31. data/lib/steep/server/interaction_worker.rb +1 -1
  32. data/lib/steep/server/type_check_worker.rb +2 -2
  33. data/lib/steep/services/signature_service.rb +2 -2
  34. data/lib/steep/services/type_check_service.rb +4 -1
  35. data/lib/steep/signature/validator.rb +228 -49
  36. data/lib/steep/subtyping/cache.rb +30 -0
  37. data/lib/steep/subtyping/check.rb +600 -705
  38. data/lib/steep/subtyping/constraints.rb +66 -30
  39. data/lib/steep/subtyping/relation.rb +60 -0
  40. data/lib/steep/subtyping/result.rb +190 -16
  41. data/lib/steep/type_construction.rb +576 -395
  42. data/lib/steep/type_inference/block_params.rb +31 -3
  43. data/lib/steep/type_inference/context.rb +37 -3
  44. data/lib/steep/version.rb +1 -1
  45. data/lib/steep.rb +3 -3
  46. data/sample/lib/length.rb +35 -0
  47. data/sample/sig/length.rbs +34 -0
  48. data/smoke/diagnostics/proc_type_expected.rb +3 -0
  49. data/smoke/diagnostics/test_expectations.yml +12 -0
  50. data/smoke/diagnostics-rbs/nonregular-type-alias.rbs +3 -0
  51. data/smoke/diagnostics-rbs/recursive-type-alias.rbs +3 -0
  52. data/smoke/diagnostics-rbs/test_expectations.yml +57 -12
  53. data/smoke/tsort/a.rb +1 -1
  54. data/smoke/tsort/test_expectations.yml +1 -63
  55. data/steep.gemspec +1 -1
  56. metadata +14 -10
  57. data/lib/steep/drivers/trace_printer.rb +0 -29
  58. data/lib/steep/interface/method.rb +0 -78
  59. data/lib/steep/subtyping/trace.rb +0 -71
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f249f7e074584c271aace34633e7eebaf638c53faa821adc8ba20575c44781ac
4
- data.tar.gz: 19630a5254b0b1d1a0f10dd2d2300111c47773ac5f615ccfe7d33f815edf38c2
3
+ metadata.gz: 44df04a21f7dc9d7514ad6acb34549f40fe0b4d962840c29ced4ceca926fd000
4
+ data.tar.gz: 15ac298575e8af8d29c1b1ab5e2894f3e62677dedd58b166d147d3d1649026d3
5
5
  SHA512:
6
- metadata.gz: d29cf28bca4f9235a7036e966edb7747872ebcd0a49bec3d6d21dcad73dc2f21cec05819b05b4df52b150bd24f998d533fd63b827f439462f3ce4b7173041ecd
7
- data.tar.gz: 49f76f139a14b94449a19f1c26847b320fc104ce292eb6f9824bac58b99b0f7b1997c0daf405cb37e58a5ec42d011daa221431d0f7056a326dba5922a72f096e
6
+ metadata.gz: cdc1e1dea1ef2aa9cebd6d40a850894340e2d0ed26f8a982c81c80d384522712c442a499ef12419b0b224cd1bb659944198b8dc897eea692e4d6c06284c86381
7
+ data.tar.gz: 22a8d55bd324e3527ffd2a8886bbf7fe28e766ab2dab1e175c43a08b37d256c647f39a05e7890ed5b2726934428bb303c1fe98c45ad07166df2fb2698cc835af
data/CHANGELOG.md CHANGED
@@ -2,6 +2,30 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.49.1 (2022-03-11)
6
+
7
+ * Fix lambda typing ([\#506](https://github.com/soutaro/steep/pull/506))
8
+ * Validate type descendants ([\#507](https://github.com/soutaro/steep/pull/507))
9
+ * Fix print error with absolute path ([\#508](https://github.com/soutaro/steep/pull/508))
10
+ * Skip non-target ruby code on `steep stats` ([\#509](https://github.com/soutaro/steep/pull/509))
11
+
12
+ ## 0.49.0 (2022-03-08)
13
+
14
+ * Better typing for `#flat_map` ([\#504](https://github.com/soutaro/steep/pull/504))
15
+ * Support lambdas (`->`) with block ([\#503](https://github.com/soutaro/steep/pull/503))
16
+ * Let proc type be `::Proc` class instance ([\#502](https://github.com/soutaro/steep/pull/502))
17
+ * Disable contextual typing on `bool` type ([\#501](https://github.com/soutaro/steep/pull/501))
18
+ * Type check `return` without value ([\#500](https://github.com/soutaro/steep/pull/500))
19
+
20
+ ## 0.48.0 (2022-03-07)
21
+
22
+ Steep supports all of the new features of RBS 2. 🎉
23
+ It now requires RBS >= 2.2 and support all of the features.
24
+
25
+ * Update RBS ([\#495](https://github.com/soutaro/steep/pull/495))
26
+ * Support generic type aliases ([\#496](https://github.com/soutaro/steep/pull/496))
27
+ * Support bounded generics ([\#499](https://github.com/soutaro/steep/pull/499))
28
+
5
29
  ## 0.47.1 (2022-02-17)
6
30
 
7
31
  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.49.1)
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
@@ -24,7 +24,7 @@ PATH
24
24
  GEM
25
25
  remote: https://rubygems.org/
26
26
  specs:
27
- activesupport (7.0.2.2)
27
+ activesupport (7.0.2.3)
28
28
  concurrent-ruby (~> 1.0, >= 1.0.2)
29
29
  i18n (>= 1.6, < 2)
30
30
  minitest (>= 5.1)
@@ -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
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [1]
33
35
  end
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [0]
33
35
  end
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [2]
33
35
  end
@@ -30,6 +30,8 @@ module Steep
30
30
  @fvs = Set.new([self])
31
31
  end
32
32
 
33
+ include Helper::NoChild
34
+
33
35
  def level
34
36
  [0]
35
37
  end
@@ -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
@@ -369,7 +393,7 @@ module Steep
369
393
  when AST::Types::Name::Alias
370
394
  unwrap_optional(expand_alias(type))
371
395
  when AST::Types::Boolean
372
- [AST::Builtin.true_type, AST::Builtin.false_type]
396
+ [type, type]
373
397
  else
374
398
  [type, nil]
375
399
  end
@@ -21,6 +21,14 @@ module Steep
21
21
  @fvs ||= Set.new
22
22
  end
23
23
  end
24
+
25
+ module NoChild
26
+ def each_child(&block)
27
+ unless block
28
+ enum_for :each_child
29
+ end
30
+ end
31
+ end
24
32
  end
25
33
  end
26
34
  end
@@ -26,6 +26,8 @@ module Steep
26
26
  @fvs = Set.new([self])
27
27
  end
28
28
 
29
+ include Helper::NoChild
30
+
29
31
  def to_s
30
32
  "instance"
31
33
  end
@@ -72,6 +72,10 @@ module Steep
72
72
 
73
73
  include Helper::ChildrenLevel
74
74
 
75
+ def each_child(&block)
76
+ types.each(&block)
77
+ end
78
+
75
79
  def level
76
80
  [0] + level_of_children(types)
77
81
  end
@@ -31,6 +31,8 @@ module Steep
31
31
 
32
32
  include Helper::NoFreeVariables
33
33
 
34
+ include Helper::NoChild
35
+
34
36
  def level
35
37
  [0]
36
38
  end
@@ -13,6 +13,8 @@ module Steep
13
13
  @fvs ||= Set[]
14
14
  end
15
15
 
16
+ include Helper::NoChild
17
+
16
18
  def hash
17
19
  self.class.hash
18
20
  end
@@ -72,6 +72,10 @@ module Steep
72
72
  end
73
73
  end
74
74
 
75
+ def each_child(&block)
76
+ args.each(&block)
77
+ end
78
+
75
79
  include Helper::ChildrenLevel
76
80
 
77
81
  def level
@@ -98,6 +102,8 @@ module Steep
98
102
  def with_location(new_location)
99
103
  self.class.new(name: name, location: new_location)
100
104
  end
105
+
106
+ include Helper::NoChild
101
107
  end
102
108
 
103
109
  class Instance < Applying
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [0]
33
35
  end
@@ -90,6 +90,15 @@ module Steep
90
90
  def block_required?
91
91
  block && !block.optional?
92
92
  end
93
+
94
+ def each_child(&block)
95
+ if block_given?
96
+ type.each_child(&block)
97
+ self.block&.type&.each_child(&block)
98
+ else
99
+ enum_for :each_child
100
+ end
101
+ end
93
102
  end
94
103
  end
95
104
  end
@@ -42,6 +42,10 @@ module Steep
42
42
 
43
43
  include Helper::ChildrenLevel
44
44
 
45
+ def each_child(&block)
46
+ elements.each_value(&block)
47
+ end
48
+
45
49
  def level
46
50
  [0] + level_of_children(elements.values)
47
51
  end