yoda-language-server 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/client/vscode/package-lock.json +6 -6
  4. data/client/vscode/src/check-versions.ts +5 -11
  5. data/client/vscode/src/install-tools.ts +1 -1
  6. data/lib/yoda/cli/analyze_deps.rb +46 -25
  7. data/lib/yoda/id_mask.rb +84 -0
  8. data/lib/yoda/model/descriptions/require_path_description.rb +45 -0
  9. data/lib/yoda/model/descriptions.rb +1 -0
  10. data/lib/yoda/model/node_signatures/node.rb +9 -1
  11. data/lib/yoda/model/values/literal_value.rb +3 -0
  12. data/lib/yoda/parsing/location.rb +9 -0
  13. data/lib/yoda/services/loadable_path_resolver.rb +33 -0
  14. data/lib/yoda/services.rb +1 -0
  15. data/lib/yoda/store/actions/read_project_files.rb +9 -7
  16. data/lib/yoda/store/adapters/gdbm_adapter/namespace_accessor.rb +1 -1
  17. data/lib/yoda/store/adapters/memory_adapter.rb +1 -1
  18. data/lib/yoda/store/objects/libraries_status.rb +1 -1
  19. data/lib/yoda/store/objects/library/core.rb +8 -0
  20. data/lib/yoda/store/objects/library/gem.rb +14 -3
  21. data/lib/yoda/store/objects/library/path_resolvable.rb +29 -0
  22. data/lib/yoda/store/objects/library/std.rb +9 -0
  23. data/lib/yoda/store/objects/library.rb +1 -0
  24. data/lib/yoda/store/objects/patch.rb +1 -1
  25. data/lib/yoda/store/objects/patch_set.rb +2 -2
  26. data/lib/yoda/store/project/dependency.rb +22 -4
  27. data/lib/yoda/store/project/file_finder.rb +20 -0
  28. data/lib/yoda/store/project.rb +2 -0
  29. data/lib/yoda/store/registry/cache.rb +2 -2
  30. data/lib/yoda/store/registry/composer.rb +9 -7
  31. data/lib/yoda/store/registry/index.rb +14 -10
  32. data/lib/yoda/store/registry/library_registry.rb +1 -1
  33. data/lib/yoda/store/registry.rb +1 -1
  34. data/lib/yoda/typing/constant_resolver/code_query.rb +25 -0
  35. data/lib/yoda/typing/constant_resolver/query.rb +12 -1
  36. data/lib/yoda/typing/constant_resolver.rb +13 -8
  37. data/lib/yoda/typing/inferencer/load_resolver.rb +37 -0
  38. data/lib/yoda/typing/inferencer/tracer.rb +32 -0
  39. data/lib/yoda/typing/inferencer.rb +3 -2
  40. data/lib/yoda/typing/node_info.rb +5 -0
  41. data/lib/yoda/typing/tree/{defined.rb → ask_defined.rb} +3 -2
  42. data/lib/yoda/typing/tree/base.rb +65 -20
  43. data/lib/yoda/typing/tree/begin.rb +5 -5
  44. data/lib/yoda/typing/tree/block_call.rb +26 -0
  45. data/lib/yoda/typing/tree/case.rb +8 -19
  46. data/lib/yoda/typing/tree/class_tree.rb +10 -18
  47. data/lib/yoda/typing/tree/conditional_loop.rb +15 -0
  48. data/lib/yoda/typing/tree/constant.rb +19 -0
  49. data/lib/yoda/typing/tree/constant_assignment.rb +2 -2
  50. data/lib/yoda/typing/tree/ensure.rb +17 -0
  51. data/lib/yoda/typing/tree/for.rb +7 -0
  52. data/lib/yoda/typing/tree/hash_tree.rb +32 -0
  53. data/lib/yoda/typing/tree/if.rb +10 -5
  54. data/lib/yoda/typing/tree/interpolation_text.rb +21 -0
  55. data/lib/yoda/typing/tree/literal.rb +8 -36
  56. data/lib/yoda/typing/tree/literal_inferable.rb +48 -0
  57. data/lib/yoda/typing/tree/local_exit.rb +15 -0
  58. data/lib/yoda/typing/tree/logical_assignment.rb +5 -5
  59. data/lib/yoda/typing/tree/logical_operator.rb +6 -5
  60. data/lib/yoda/typing/tree/method_def.rb +41 -0
  61. data/lib/yoda/typing/tree/method_inferable.rb +51 -0
  62. data/lib/yoda/typing/tree/module_tree.rb +7 -20
  63. data/lib/yoda/typing/tree/multiple_assignment.rb +6 -10
  64. data/lib/yoda/typing/tree/namespace_inferable.rb +20 -0
  65. data/lib/yoda/typing/tree/rescue.rb +18 -0
  66. data/lib/yoda/typing/tree/rescue_clause.rb +42 -0
  67. data/lib/yoda/typing/tree/self.rb +2 -1
  68. data/lib/yoda/typing/tree/send.rb +8 -60
  69. data/lib/yoda/typing/tree/send_inferable.rb +89 -0
  70. data/lib/yoda/typing/tree/singleton_class_tree.rb +24 -0
  71. data/lib/yoda/typing/tree/singleton_method_def.rb +41 -0
  72. data/lib/yoda/typing/tree/super.rb +9 -2
  73. data/lib/yoda/typing/tree/variable.rb +5 -10
  74. data/lib/yoda/typing/tree/variable_assignment.rb +11 -8
  75. data/lib/yoda/typing/tree/yield.rb +9 -2
  76. data/lib/yoda/typing/tree.rb +55 -22
  77. data/lib/yoda/typing.rb +1 -0
  78. data/lib/yoda/version.rb +1 -1
  79. data/lib/yoda.rb +1 -0
  80. metadata +25 -13
  81. data/lib/yoda/typing/inferencer/ast_traverser.rb +0 -408
  82. data/lib/yoda/typing/tree/block.rb +0 -12
  83. data/lib/yoda/typing/tree/const.rb +0 -12
  84. data/lib/yoda/typing/tree/escape.rb +0 -12
  85. data/lib/yoda/typing/tree/hash_body.rb +0 -36
  86. data/lib/yoda/typing/tree/literal_with_interpolation.rb +0 -21
  87. data/lib/yoda/typing/tree/method.rb +0 -43
  88. data/lib/yoda/typing/tree/rescue_body.rb +0 -12
  89. data/lib/yoda/typing/tree/singleton_method.rb +0 -47
  90. data/lib/yoda/typing/tree/while.rb +0 -12
@@ -1,408 +0,0 @@
1
- require 'forwardable'
2
-
3
- module Yoda
4
- module Typing
5
- class Inferencer
6
- class AstTraverser
7
- extend Forwardable
8
-
9
- # @return [Tracer]
10
- attr_reader :tracer
11
-
12
- # @return [Contexts::BaseContext]
13
- attr_reader :context
14
-
15
- delegate [:bind_context, :bind_type, :bind_send] => :tracer
16
-
17
- # @return [Types::Generator]
18
- delegate [:generator] => :context
19
-
20
- # @param tracer [Tracer]
21
- # @param context [ContextsBaseContext]
22
- def initialize(tracer:, context:)
23
- @tracer = tracer
24
- @context = context
25
- end
26
-
27
- # @param node [AST::Vnode]
28
- # @return [RBS::Types::t]
29
- def traverse(node)
30
- bind_context(node: node, context: context)
31
- Logger.trace("Traversing #{node}")
32
- type = infer_node(node)
33
- Logger.trace("Traversed #{node} -> #{type.to_s}")
34
- bind_type(node: node, type: type, context: context)
35
-
36
- type
37
- end
38
-
39
- private
40
-
41
- # @param context [Contexts::BaseContext]
42
- # @return [self]
43
- def derive(context:)
44
- self.class.new(tracer: tracer, context: context)
45
- end
46
-
47
- # @param node [AST::Vnode]
48
- # @return [Types::Type]
49
- def infer_node(node)
50
- case node.type
51
- when :lvasgn, :ivasgn, :cvasgn, :gvasgn
52
- infer_assignment_node(node)
53
- when :casgn
54
- # TODO
55
- traverse(node.content)
56
- when :masgn
57
- # TODO
58
- traverse(node.content)
59
- when :op_asgn, :or_asgn, :and_asgn
60
- # TODO
61
- traverse(node.content)
62
- when :and, :or, :not
63
- # TODO
64
- generator.union_type(*node.children.map { |node| traverse(node) })
65
- when :if
66
- infer_branch_nodes(node.children.first, node.children.slice(1..2).compact)
67
- when :while, :until, :while_post, :until_post
68
- # TODO
69
- traverse(node.body)
70
- when :for
71
- # TODO
72
- traverse(node.body)
73
- when :case
74
- infer_case_node(node)
75
- when :super, :zsuper, :yield
76
- # TODO
77
- type_for_literal_sexp(node)
78
- when :return, :break, :next
79
- # TODO
80
- node.arguments[0] ? traverse(node.arguments[0]) : generator.nil_type
81
- when :ensure
82
- infer_ensure_node(node)
83
- when :rescue
84
- infer_rescue_node(node)
85
- when :resbody
86
- infer_resbody_node(node)
87
- when :csend, :send
88
- infer_send_node(node)
89
- when :block
90
- infer_block_call_node(node)
91
- when :const
92
- infer_const_node(node)
93
- when :lvar, :cvar, :ivar, :gvar
94
- context.type_binding.resolve(node.name) || generator.any_type
95
- when :begin, :kwbegin, :block
96
- node.children.map { |node| traverse(node) }.last
97
- when :dstr, :dsym, :xstr
98
- node.children.each { |node| traverse(node) }
99
- type_for_literal_sexp(node)
100
- when :def
101
- infer_method_node(node)
102
- when :defs
103
- infer_smethod_node(node)
104
- when :hash
105
- infer_hash_node(node)
106
- when :self
107
- context.receiver
108
- when :defined
109
- generator.boolean_type
110
- when :class
111
- infer_class_node(node)
112
- when :module
113
- infer_namespace_node(node)
114
- when :sclass
115
- infer_singleton_class_node(node)
116
- else
117
- type_for_literal_sexp(node)
118
- end
119
- end
120
-
121
- # @param node [AST::ArgumentNode]
122
- # @return [Store::Types::Base]
123
- def infer_assignment_node(node)
124
- body_type = traverse(node.content)
125
- context.type_binding.bind(node.assignee.name, body_type)
126
- body_type
127
- end
128
-
129
- # @param node [AST::ConstantBaseNode]h
130
- # @return [Types::Base]
131
- def infer_const_base_node(node)
132
- object = Store::Query::FindConstant.new(context.registry).find('::')
133
-
134
- case object
135
- when Store::Objects::NamespaceObject
136
- generator.singleton_type_at(object.path)
137
- when Store::Objects::ValueObject
138
- # TODO
139
- generator.any_type
140
- else
141
- generator.any_type
142
- end
143
- end
144
-
145
- # @param node [AST::ConstantNode]
146
- # @return [Types::Base]
147
- def infer_const_node(node)
148
- context.constant_resolver.resolve_node(node, tracer: tracer)
149
- end
150
-
151
- # @param node [AST::DefNode]
152
- # @return [Types::Base]
153
- def infer_method_node(node)
154
- traverse_method(node, receiver_type: context.method_receiver)
155
- end
156
-
157
- # @param node [AST::DefSingletonNode]
158
- # @return [Types::Base]
159
- def infer_smethod_node(node)
160
- traverse_method(node, receiver_type: traverse(node.receiver))
161
- end
162
-
163
- # @param node [AST::DefNode, AST::DefSingletonNode]
164
- # @param receiver_type [Types::Type]
165
- # @return [Types::Base]
166
- def traverse_method(node, receiver_type:)
167
- value_resolve_context = generator.value_resolve_context(self_type: receiver_type)
168
-
169
- method_candidates = receiver_type.value.select_method(node.name.to_s, visibility: %i(private protected public))
170
- method_types = method_candidates.map(&:rbs_type).map { |type| value_resolve_context.wrap(type) }
171
-
172
- # TODO: Support overloads
173
- method_bind = method_types.reduce({}) do |all_bind, method_type|
174
- bind = ParameterBinder.new(node.parameters.parameter).bind(type: method_type, generator: generator)
175
- all_bind.merge(bind.to_h) { |_key, v1, v2| generator.union_type(v1, v2) }
176
- end
177
-
178
- Logger.trace("method_candidates: [#{method_candidates.join(', ')}]")
179
- Logger.trace("bind arguments: #{method_bind.map { |key, value| [key, value.to_s] }.to_h }")
180
-
181
- tracer.bind_method_definition(node: node, method_candidates: method_candidates)
182
-
183
- method_context = context.derive_method_context(receiver_type: receiver_type, binds: method_bind)
184
- derive(context: method_context).traverse(node.body)
185
-
186
- generator.symbol_type(node.name.to_sym)
187
- end
188
-
189
- # @param node [AST::SingletonClassNode]
190
- # @return [Types::Base]
191
- def infer_singleton_class_node(node)
192
- receiver_type = traverse(node.receiver)
193
-
194
- new_context = context.derive_class_context(class_type: receiver_type.singleton_type)
195
- derive(context: new_context).traverse(node.body)
196
-
197
- generator.nil_type
198
- end
199
-
200
- # @param node [AST::ClassNode]
201
- # @return [Types::Base]
202
- def infer_class_node(node)
203
- if super_class_node = node.super_class
204
- traverse(super_class_node)
205
- end
206
-
207
- infer_namespace_node(node)
208
- end
209
-
210
- # @param node [AST::ModuleNode, AST::ClassNode]
211
- # @return [Types::Base]
212
- def infer_namespace_node(node)
213
- namespace_type = traverse(node.receiver)
214
-
215
- new_context = context.derive_class_context(class_type: namespace_type)
216
- derive(context: new_context).traverse(node.body)
217
-
218
- namespace_type
219
- end
220
-
221
- # @param node [AST::HashNode]
222
- # @return [Model::TypeExpressions::Base]
223
- def infer_hash_node(node)
224
- hash = node.contents.each_with_object({}) do |node, memo|
225
- case node.type
226
- when :pair
227
- case node.key.type
228
- when :sym
229
- memo[node.key.value.to_sym] = traverse(node.value)
230
- when :str
231
- memo[node.key.value.to_s] = traverse(node.value)
232
- else
233
- # TODO: Support other key types.
234
- end
235
- when :kwsplat
236
- traverse(node.content)
237
- # TODO: merge infered result
238
- end
239
- end
240
-
241
- generator.record_type(hash)
242
- end
243
-
244
- # @param node [AST::BlockCallNode]
245
- def infer_block_call_node(node)
246
- infer_send_node(node.send_clause, node.parameters, node.body)
247
- end
248
-
249
- # @param node [AST::SendNode]
250
- # @param block_param_node [AST::ParametersNode, nil]
251
- # @param block_node [AST::Vnode, nil]
252
- # @return [Types::Base]
253
- def infer_send_node(node, block_param_node = nil, block_node = nil)
254
- receiver_type = node.implicit_receiver? ? context.receiver : traverse(node.receiver)
255
- argument_types = infer_argument_nodes(node.arguments)
256
- value_resolve_context = generator.value_resolve_context(self_type: receiver_type)
257
-
258
- visibility = node.implicit_receiver? ? %i(private protected public) : %i(public)
259
- # TODO: Support overloads
260
- method_candidates = receiver_type.value.select_method(node.selector_name, visibility: visibility)
261
- method_types = method_candidates.map(&:rbs_type).map { |type| value_resolve_context.wrap(type) }
262
-
263
- if block_node
264
- # TODO: Resolve type variables by matching argument_types with arguments
265
- binds = ArgumentsBinder.new(generator: generator).bind(types: method_types, arguments: block_param_node.parameter)
266
- new_context = context.derive_block_context(binds: binds)
267
- derive(context: new_context).traverse(block_node)
268
- end
269
-
270
- Logger.trace("method_candidates: [#{method_candidates.join(', ')}]")
271
- Logger.trace("receiver_type: #{receiver_type}")
272
-
273
- bind_send(node: node, method_candidates: method_candidates, receiver_type: receiver_type)
274
- if method_types.empty?
275
- generator.unknown_type(reason: "method not found")
276
- else
277
- generator.union_type(*method_types.map { |method_type| value_resolve_context.wrap(method_type.type.return_type) })
278
- end
279
- end
280
-
281
- # @param nodes [Array<::AST::Node>]
282
- # @return [{Symbol => Types::Base}]
283
- def infer_argument_nodes(argument_nodes)
284
- argument_nodes.each_with_object({}) do |node, obj|
285
- case node.type
286
- when :splat
287
- # TODO
288
- traverse(node)
289
- when :block_pass
290
- obj[:block_argument] = traverse(node.children.first)
291
- else
292
- obj[:arguments] ||= []
293
- obj[:arguments].push(traverse(node))
294
- end
295
- end
296
- end
297
-
298
- # @param condition_node [::AST::Node]
299
- # @param branch_nodes [Array<::AST::Node>]
300
- # @return [Types::Base]
301
- def infer_branch_nodes(condition_node, branch_nodes)
302
- traverse(condition_node)
303
- generator.union_type(*branch_nodes.map { |node| traverse(node) })
304
- end
305
-
306
- # @param node [::AST::Node]
307
- # @return [[Store::Types::Base, Environment]]
308
- def infer_case_node(node)
309
- # TODO
310
- subject_node, *when_nodes, else_node = node.children
311
- when_body_nodes = when_nodes.map { |node| node.children.last }
312
- generator.union_type(*[*when_body_nodes, else_node].compact.map { |node| traverse(node) })
313
- end
314
-
315
- # @param node [AST::EnsureNode]
316
- # @return [Types::Base]
317
- def infer_ensure_node(node)
318
- type = traverse(node.body)
319
- traverse(node.ensure_body)
320
- type
321
- end
322
-
323
- # @param node [AST::RescueNode]
324
- # @return [Types::Base]
325
- def infer_rescue_node(node)
326
- type = traverse(node.body)
327
- node.rescue_clauses.each { |rescue_clause| traverse(rescue_clause) }
328
- traverse(node.else_clause)
329
- type
330
- end
331
-
332
- # @param node [AST::RescueClauseNode]
333
- # @return [Types::Base]
334
- def infer_resbody_node(node)
335
- binds = {}
336
-
337
- exception_type = begin
338
- if node.match_clause
339
- case node.match_clause.type
340
- when :array
341
- generator.union_type(*node.match_clause.contents.map { |content| traverse(content).instance_type })
342
- when :empty
343
- generator.standard_error_type
344
- else
345
- # Unexpected
346
- generator.standard_error_type
347
- end
348
- else
349
- generator.standard_error_type
350
- end
351
- end
352
-
353
-
354
- if node.assignee
355
- case node.assignee.type
356
- when :lvasgn
357
- binds[node.assignee.assignee.name] = exception_type
358
- end
359
- end
360
-
361
- new_context = context.derive_block_context(binds: binds)
362
- derive(context: new_context).traverse(node.body)
363
- end
364
-
365
- # @param [AST::LiteralNode]
366
- # @return [Types::Base]
367
- def type_for_literal_sexp(node)
368
- case node.type
369
- when :dstr, :xstr
370
- generator.string_type
371
- when :str, :string
372
- generator.string_type(node.value.to_s)
373
- when :dsym
374
- generator.symbol_type
375
- when :sym
376
- generator.symbol_type(node.value.to_sym)
377
- when :array, :splat
378
- generator.array_type
379
- when :hash
380
- generator.hash_type
381
- when :irange, :erange
382
- generator.range_type
383
- when :regexp
384
- generator.regexp_type
385
- when :true
386
- generator.true_type
387
- when :false
388
- generator.false_type
389
- when :nil
390
- generator.nil_type
391
- when :int
392
- generator.integer_type(node.value.to_i)
393
- when :float
394
- generator.float_type
395
- when :complex
396
- generator.numeric_type
397
- when :rational
398
- generator.numeric_type
399
- when :empty
400
- generator.nil_type
401
- else
402
- generator.any_type
403
- end
404
- end
405
- end
406
- end
407
- end
408
- end
@@ -1,12 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class Block < Base
5
- def type
6
- send_node, arg_node, block_node = node
7
- infer_send_node(send_node, arg_node, block_node)
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,12 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class Const < Base
5
- def type
6
- # TODO
7
- infer(node.children.last)
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,12 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class Escape < Base
5
- def type
6
- # TODO
7
- node.children[0] ? infer(node.children[0]) : generator.nil_type
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,36 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class HashBody < Base
5
- def type
6
- infer_hash_node(node)
7
- end
8
-
9
- # @param node [::AST::Node]
10
- # @return [Model::TypeExpressions::Base]
11
- def infer_hash_node(node)
12
- hash = node.children.each_with_object({}) do |node, memo|
13
- case node.type
14
- when :pair
15
- pair_key, pair_value = node.children
16
- case pair_key.type
17
- when :sym
18
- memo[pair_key.children.first.to_sym] = infer(pair_value)
19
- when :str
20
- memo[pair_key.children.first.to_s] = infer(pair_value)
21
- else
22
- # TODO: Support other key types.
23
- end
24
- when :kwsplat
25
- content_node = node.children.first
26
- content_type = infer(content_node)
27
- # TODO: merge infered result
28
- end
29
- end
30
-
31
- Types::AssociativeArray.new(contents: hash)
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,21 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class LiteralWithInterpolation < Base
5
- def children
6
- @children ||= node.children.map(&method(:build_child))
7
- end
8
-
9
- def type
10
- children.map(&:type)
11
- case node.type
12
- when :xstr, :dstr
13
- generator.string_type
14
- when :dsym
15
- generator.symbol_type
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,43 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class Method < Base
5
- def name
6
- node.children.first
7
- end
8
-
9
- def argument
10
- @argument ||= build_child(node.children[1])
11
- end
12
-
13
- def body
14
- @body ||= node.children[2] && build_child(node.children[2], context: method_context)
15
- end
16
-
17
- # @return [Types::Base]
18
- def type
19
- @type ||= generator.symbol_type
20
- end
21
-
22
- def receiver_type
23
- @receiver_type ||= generator.union(context.current_objects.map { |object| generator.object_type(object) })
24
- end
25
-
26
- def method_context
27
- @method_context ||= method_definition_provider.generate_method_context(context: context, args_node: args_node)
28
- end
29
-
30
- private
31
-
32
- def method_definition_provider
33
- @method_definition_provider ||= MethodDefinitionResolver.new(
34
- receiver_type: receiver_type,
35
- name: name,
36
- registry: context.registry,
37
- generator: generator,
38
- )
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,12 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class RescueBody < Base
5
- def type
6
- # TODO
7
- infer(node.children[2])
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,47 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class SingletonMethod < Base
5
- def receiver
6
- node.children[0]
7
- end
8
-
9
- def name
10
- node.children[1]
11
- end
12
-
13
- def argument
14
- @argument ||= build_child(node.children[2])
15
- end
16
-
17
- def body
18
- @body ||= node.children[3] && build_child(node.children[3], context: method_context)
19
- end
20
-
21
- # @return [Types::Base]
22
- def type
23
- @type ||= generator.symbol_type
24
- end
25
-
26
- def receiver_type
27
- @receiver_type ||= receiver.type
28
- end
29
-
30
- def method_context
31
- @method_context ||= method_definition_provider.generate_method_context(context: context, args_node: args_node)
32
- end
33
-
34
- private
35
-
36
- def method_definition_provider
37
- @method_definition_provider ||= MethodDefinitionResolver.new(
38
- receiver_type: receiver_type,
39
- name: name,
40
- registry: context.registry,
41
- generator: generator,
42
- )
43
- end
44
- end
45
- end
46
- end
47
- end
@@ -1,12 +0,0 @@
1
- module Yoda
2
- module Typing
3
- module Tree
4
- class While < Base
5
- def type
6
- # TODO
7
- infer(node.children[1])
8
- end
9
- end
10
- end
11
- end
12
- end