mirah 0.0.5-java → 0.0.6-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/History.txt +33 -0
  2. data/README.txt +2 -3
  3. data/Rakefile +5 -0
  4. data/bin/duby +0 -0
  5. data/bin/dubyc +0 -0
  6. data/bin/dubyp +0 -0
  7. data/bin/jrubyp +0 -0
  8. data/bin/mirah +0 -0
  9. data/bin/mirah.cmd +14 -14
  10. data/bin/mirahc +0 -0
  11. data/bin/mirahc.cmd +14 -14
  12. data/bin/mirahp +0 -0
  13. data/bin/mirahp.cmd +14 -14
  14. data/examples/Dynamic.class +0 -0
  15. data/examples/SizeThing.class +0 -0
  16. data/examples/plugins/appengine/Rakefile +3 -1
  17. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +385 -0
  18. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +58 -15
  19. data/examples/wiki/war/public/javascripts/prettify.js +0 -0
  20. data/examples/wiki/war/public/stylesheets/prettify.css +0 -0
  21. data/javalib/dynalink-0.1.jar +0 -0
  22. data/javalib/jsr292-mock.jar +0 -0
  23. data/javalib/mirah-bootstrap.jar +0 -0
  24. data/javalib/mirah-parser.jar +0 -0
  25. data/lib/mirah.rb +45 -25
  26. data/lib/mirah/ast.rb +81 -27
  27. data/lib/mirah/ast/call.rb +62 -71
  28. data/lib/mirah/ast/class.rb +23 -26
  29. data/lib/mirah/ast/flow.rb +38 -62
  30. data/lib/mirah/ast/intrinsics.rb +59 -37
  31. data/lib/mirah/ast/literal.rb +16 -14
  32. data/lib/mirah/ast/local.rb +8 -8
  33. data/lib/mirah/ast/method.rb +33 -19
  34. data/lib/mirah/ast/structure.rb +54 -13
  35. data/lib/mirah/ast/type.rb +8 -11
  36. data/lib/mirah/compiler.rb +86 -0
  37. data/lib/mirah/errors.rb +60 -0
  38. data/lib/mirah/jvm/base.rb +5 -11
  39. data/lib/mirah/jvm/compiler.rb +12 -1
  40. data/lib/mirah/jvm/source_compiler.rb +10 -2
  41. data/lib/mirah/jvm/source_generator/builder.rb +3 -1
  42. data/lib/mirah/jvm/source_generator/precompile.rb +6 -0
  43. data/lib/mirah/jvm/typer.rb +6 -1
  44. data/lib/mirah/jvm/types.rb +8 -0
  45. data/lib/mirah/jvm/types/factory.rb +34 -10
  46. data/lib/mirah/jvm/types/intrinsics.rb +12 -5
  47. data/lib/mirah/jvm/types/methods.rb +5 -9
  48. data/lib/mirah/plugin/gwt.rb +3 -2
  49. data/lib/mirah/transform.rb +68 -10
  50. data/lib/mirah/transform2.rb +10 -1
  51. data/lib/mirah/typer.rb +5 -10
  52. data/lib/mirah/version.rb +1 -1
  53. data/test/test_compilation.rb +1 -1
  54. data/test/test_java_typer.rb +10 -0
  55. data/test/test_javac_compiler.rb +4 -2
  56. data/test/test_jvm_compiler.rb +132 -9
  57. data/test/test_macros.rb +51 -0
  58. data/test/test_typer.rb +29 -25
  59. metadata +13 -21
  60. data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +0 -390
  61. data/javalib/JRubyParser.jar +0 -0
  62. data/javalib/dynalang-invoke-0.1.jar +0 -0
  63. data/lib/mirah/nbcompiler.rb +0 -44
@@ -13,43 +13,7 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- require 'delegate'
17
-
18
16
  module Mirah::AST
19
- class NodeProxy < DelegateClass(Node)
20
- include Java::DubyLangCompiler::Node
21
- def __inline__(node)
22
- node.parent = parent
23
- __setobj__(node)
24
- end
25
-
26
- def dup
27
- value = __getobj__.dup
28
- if value.respond_to?(:proxy=)
29
- new = super
30
- new.__setobj__(value)
31
- new.proxy = new
32
- new
33
- else
34
- value
35
- end
36
- end
37
-
38
- def _dump(depth)
39
- Marshal.dump(__getobj__)
40
- end
41
-
42
- def self._load(str)
43
- value = Marshal.load(str)
44
- if value.respond_to?(:proxy=)
45
- proxy = NodeProxy.new(value)
46
- proxy.proxy = proxy
47
- else
48
- value
49
- end
50
- end
51
- end
52
-
53
17
  class FunctionalCall < Node
54
18
  include Java::DubyLangCompiler.Call
55
19
  include Named
@@ -67,18 +31,16 @@ module Mirah::AST
67
31
 
68
32
  def initialize(parent, line_number, name, &kids)
69
33
  super(parent, line_number, &kids)
70
- @name = name
34
+ self.name = name
71
35
  @cast = false
72
36
  end
73
37
 
74
38
  def arguments
75
- @arguments ||= begin
76
- args = java.util.ArrayList.new(parameters.size)
77
- parameters.each do |param|
78
- args.add(param)
79
- end
80
- args
39
+ args = java.util.ArrayList.new(parameters.size)
40
+ parameters.each do |param|
41
+ args.add(param)
81
42
  end
43
+ args
82
44
  end
83
45
 
84
46
  def target
@@ -88,20 +50,21 @@ module Mirah::AST
88
50
  def validate_parameters
89
51
  parameters.each_with_index do |child, i|
90
52
  if UnquotedValue === child
53
+ child = child.node
91
54
  child.parent = self
92
- parameters[i] = child.node
55
+ parameters[i] = child
93
56
  end
94
57
  end
95
58
  end
96
59
 
97
- def infer(typer)
60
+ def infer(typer, expression)
98
61
  unless @inferred_type
99
62
  @self_type ||= scope.static_scope.self_type
100
63
  receiver_type = @self_type
101
64
  should_defer = false
102
65
 
103
66
  parameter_types = parameters.map do |param|
104
- typer.infer(param) || should_defer = true
67
+ typer.infer(param, true) || should_defer = true
105
68
  end
106
69
 
107
70
  parameter_types << Mirah::AST.block_type if block
@@ -115,14 +78,14 @@ module Mirah::AST
115
78
  elsif parameters.size == 0 && scope.static_scope.include?(name)
116
79
  @inlined = Local.new(parent, position, name)
117
80
  proxy.__inline__(@inlined)
118
- return proxy.infer(typer)
81
+ return proxy.infer(typer, expression)
119
82
  else
120
83
  @inferred_type = typer.method_type(receiver_type, name,
121
84
  parameter_types)
122
85
  if @inferred_type.kind_of? InlineCode
123
86
  @inlined = @inferred_type.inline(typer.transformer, self)
124
87
  proxy.__inline__(@inlined)
125
- return proxy.infer(typer)
88
+ return proxy.infer(typer, expression)
126
89
  end
127
90
  end
128
91
  end
@@ -174,34 +137,33 @@ module Mirah::AST
174
137
 
175
138
  def initialize(parent, line_number, name, &kids)
176
139
  super(parent, line_number, &kids)
177
- @name = name
140
+ self.name = name
178
141
  end
179
142
 
180
143
  def validate_parameters
181
144
  parameters.each_with_index do |child, i|
182
145
  if UnquotedValue === child
146
+ child = child.node
183
147
  child.parent = self
184
- parameters[i] = child.node
148
+ parameters[i] = child
185
149
  end
186
150
  end
187
151
  end
188
152
 
189
153
  def arguments
190
- @arguments ||= begin
191
- args = java.util.ArrayList.new(parameters.size)
192
- parameters.each do |param|
193
- args.add(param)
194
- end
195
- args
154
+ args = java.util.ArrayList.new(parameters.size)
155
+ parameters.each do |param|
156
+ args.add(param)
196
157
  end
158
+ args
197
159
  end
198
160
 
199
- def infer(typer)
161
+ def infer(typer, expression)
200
162
  unless @inferred_type
201
- receiver_type = typer.infer(target)
163
+ receiver_type = typer.infer(target, true)
202
164
  should_defer = receiver_type.nil?
203
165
  parameter_types = parameters.map do |param|
204
- typer.infer(param) || should_defer = true
166
+ typer.infer(param, true) || should_defer = true
205
167
  end
206
168
 
207
169
  parameter_types << Mirah::AST.block_type if block
@@ -212,7 +174,7 @@ module Mirah::AST
212
174
  if @inferred_type.kind_of? InlineCode
213
175
  @inlined = @inferred_type.inline(typer.transformer, self)
214
176
  proxy.__inline__(@inlined)
215
- return proxy.infer(typer)
177
+ return proxy.infer(typer, expression)
216
178
  end
217
179
  end
218
180
 
@@ -266,11 +228,15 @@ module Mirah::AST
266
228
 
267
229
  # join and load
268
230
  class_name = elements.join(".")
269
- begin
270
- typer.type_reference(scope, class_name, array)
271
- rescue NameError => ex
272
- typer.known_types[class_name] = Mirah::AST.error_type
273
- raise ex
231
+ typer.type_reference(scope, class_name, array)
232
+ end
233
+ end
234
+
235
+
236
+ class Colon2 < Call
237
+ def infer(typer, expression)
238
+ resolve_if(typer) do
239
+ type_reference(typer).meta
274
240
  end
275
241
  end
276
242
  end
@@ -285,23 +251,29 @@ module Mirah::AST
285
251
 
286
252
  def initialize(parent, line_number)
287
253
  super(parent, line_number)
288
- @call_parent = parent
289
- @call_parent = (@call_parent = @call_parent.parent) until MethodDefinition === @call_parent
290
254
  @cast = false
291
255
  end
292
256
 
257
+ def call_parent
258
+ @call_parent ||= begin
259
+ node = parent
260
+ node = (node && node.parent) until MethodDefinition === node
261
+ node
262
+ end
263
+ end
264
+
293
265
  def name
294
- @call_parent.name
266
+ call_parent.name
295
267
  end
296
268
 
297
- def infer(typer)
269
+ def infer(typer, expression)
298
270
  @self_type ||= scope.static_scope.self_type.superclass
299
271
 
300
272
  unless @inferred_type
301
- receiver_type = @call_parent.defining_class.superclass
273
+ receiver_type = call_parent.defining_class.superclass
302
274
  should_defer = receiver_type.nil?
303
275
  parameter_types = parameters.map do |param|
304
- typer.infer(param) || should_defer = true
276
+ typer.infer(param, true) || should_defer = true
305
277
  end
306
278
 
307
279
  unless should_defer
@@ -314,6 +286,25 @@ module Mirah::AST
314
286
 
315
287
  @inferred_type
316
288
  end
289
+
290
+ alias originial_parameters parameters
291
+
292
+ def parameters
293
+ if originial_parameters.nil?
294
+ self.parameters = default_parameters
295
+ end
296
+ originial_parameters
297
+ end
298
+
299
+ def default_parameters
300
+ node = self
301
+ node = node.parent until MethodDefinition === node || node.nil?
302
+ return [] if node.nil?
303
+ args = node.arguments.children.map {|x| x || []}
304
+ args.flatten.map do |arg|
305
+ Local.new(self, position, arg.name)
306
+ end
307
+ end
317
308
  end
318
309
 
319
310
  class BlockPass < Node
@@ -18,6 +18,8 @@ module Mirah::AST
18
18
  include Annotated
19
19
  include Named
20
20
  include Scope
21
+ include Java::DubyLangCompiler.ClassDefinition
22
+
21
23
  attr_accessor :interfaces
22
24
  attr_accessor :current_access_level
23
25
  attr_accessor :abstract
@@ -32,7 +34,7 @@ module Mirah::AST
32
34
  @annotations = annotations
33
35
  @interfaces = []
34
36
  @interface_nodes = []
35
- @name = name
37
+ self.name = name
36
38
  self.parent = parent
37
39
  if Mirah::AST.type_factory.respond_to? :define_type
38
40
  Mirah::AST.type_factory.define_type(self)
@@ -52,11 +54,6 @@ module Mirah::AST
52
54
  node
53
55
  end
54
56
 
55
- def define_inner_class(position, name, &block)
56
- name = "#{self.name}$#{name}"
57
- append_node ClassDefinition.new(nil, position, name, &block)
58
- end
59
-
60
57
  def define_method(position, name, type, *args)
61
58
  append_node(_define_method(MethodDefinition, position, name, type, args))
62
59
  end
@@ -103,14 +100,14 @@ module Mirah::AST
103
100
  append_node(field)
104
101
  end
105
102
 
106
- def infer(typer)
103
+ def infer(typer, expression)
107
104
  resolve_if(typer) do
108
105
  @superclass = superclass_node.type_reference(typer) if superclass_node
109
- @annotations.each {|a| a.infer(typer)} if @annotations
106
+ @annotations.each {|a| a.infer(typer, true)} if @annotations
110
107
  @interfaces.concat(@interface_nodes.map{|n| n.type_reference(typer)})
111
108
  typer.define_type(self, name, superclass, @interfaces) do
112
109
  static_scope.self_type = typer.self_type
113
- typer.infer(body) if body
110
+ typer.infer(body, false) if body
114
111
  end
115
112
  end
116
113
  end
@@ -147,12 +144,12 @@ module Mirah::AST
147
144
  def initialize(parent, position, name, annotations)
148
145
  super(parent, position, name, annotations) {|p| }
149
146
  @abstract = true
150
- @name = name
147
+ self.name = name
151
148
  @children = [[], nil]
152
149
  @children = yield(self)
153
150
  end
154
151
 
155
- def infer(typer)
152
+ def infer(typer, expression)
156
153
  resolve_if(typer) do
157
154
  @interfaces = interface_nodes.map {|i| i.type_reference(typer)}
158
155
  super
@@ -175,7 +172,7 @@ module Mirah::AST
175
172
  end
176
173
 
177
174
  defmacro('interface') do |transformer, fcall, parent|
178
- raise "Interface name required" unless fcall.parameters.size > 0
175
+ raise Mirah::SyntaxError.new("Interface name required", fcall) unless fcall.parameters.size > 0
179
176
  interfaces = fcall.parameters
180
177
  interface_name = interfaces.shift
181
178
  if (Call === interface_name &&
@@ -210,13 +207,13 @@ module Mirah::AST
210
207
  def initialize(parent, position, name, annotations=[], static = false, &block)
211
208
  @annotations = annotations
212
209
  super(parent, position, &block)
213
- @name = name
210
+ self.name = name
214
211
  @static = static
215
212
  end
216
213
 
217
- def infer(typer)
214
+ def infer(typer, expression)
218
215
  resolve_if(typer) do
219
- @annotations.each {|a| a.infer(typer)} if @annotations
216
+ @annotations.each {|a| a.infer(typer, true)} if @annotations
220
217
  @type = type_node.type_reference(typer)
221
218
  end
222
219
  end
@@ -243,17 +240,17 @@ module Mirah::AST
243
240
  def initialize(parent, position, name, annotations=[], static = false, &block)
244
241
  @annotations = annotations
245
242
  super(parent, position, &block)
246
- @name = name
243
+ self.name = name
247
244
  @static = static
248
245
  end
249
246
 
250
- def infer(typer)
247
+ def infer(typer, expression)
251
248
  resolve_if(typer) do
252
- @annotations.each {|a| a.infer(typer)} if @annotations
249
+ @annotations.each {|a| a.infer(typer, true)} if @annotations
253
250
  if static
254
- typer.learn_static_field_type(class_scope, name, typer.infer(value))
251
+ typer.learn_static_field_type(class_scope, name, typer.infer(value, true))
255
252
  else
256
- typer.learn_field_type(class_scope, name, typer.infer(value))
253
+ typer.learn_field_type(class_scope, name, typer.infer(value, true))
257
254
  end
258
255
  end
259
256
  end
@@ -269,13 +266,13 @@ module Mirah::AST
269
266
  def initialize(parent, position, name, annotations=[], static = false, &block)
270
267
  @annotations = annotations
271
268
  super(parent, position, &block)
272
- @name = name
269
+ self.name = name
273
270
  @static = static
274
271
  end
275
272
 
276
- def infer(typer)
273
+ def infer(typer, expression)
277
274
  resolve_if(typer) do
278
- @annotations.each {|a| a.infer(typer)} if @annotations
275
+ @annotations.each {|a| a.infer(typer, true)} if @annotations
279
276
  if static
280
277
  typer.static_field_type(class_scope, name)
281
278
  else
@@ -291,11 +288,11 @@ module Mirah::AST
291
288
 
292
289
  def initialize(parent, line_number, name)
293
290
  super(parent, line_number)
294
- @name = name
291
+ self.name = name
295
292
  class_scope.current_access_level = name.to_sym
296
293
  end
297
294
 
298
- def infer(typer)
295
+ def infer(typer, expression)
299
296
  typer.no_type
300
297
  end
301
298
  end
@@ -303,7 +300,7 @@ module Mirah::AST
303
300
  class Include < Node
304
301
  include Scoped
305
302
 
306
- def infer(typer)
303
+ def infer(typer, expression)
307
304
  children.each do |type|
308
305
  typeref = type.type_reference(typer)
309
306
  the_scope = scope.static_scope
@@ -22,16 +22,16 @@ module Mirah
22
22
  super(parent, line_number, &block)
23
23
  end
24
24
 
25
- def infer(typer)
25
+ def infer(typer, expression)
26
26
  unless resolved?
27
- @inferred_type = typer.infer(predicate)
27
+ @inferred_type = typer.infer(predicate, true)
28
28
  if @inferred_type && !@inferred_type.primitive?
29
29
  call = Call.new(parent, position, '!=') do |call|
30
30
  predicate.parent = call
31
31
  [predicate, [Null.new(call, position)]]
32
32
  end
33
33
  self.predicate = call
34
- @inferred_type = typer.infer(predicate)
34
+ @inferred_type = typer.infer(predicate, true)
35
35
  end
36
36
 
37
37
  @inferred_type ? resolved! : typer.defer(self)
@@ -50,60 +50,40 @@ module Mirah
50
50
  super(parent, line_number, &block)
51
51
  end
52
52
 
53
- def infer(typer)
53
+ def infer(typer, expression)
54
54
  unless resolved?
55
- condition_type = typer.infer(condition)
55
+ condition_type = typer.infer(condition, true)
56
56
  unless condition_type
57
57
  typer.defer(condition)
58
58
  end
59
59
 
60
60
  # condition type is unrelated to body types, so we proceed with bodies
61
- then_type = typer.infer(body) if body
62
-
63
- if !then_type
64
- # attempt to determine else branch
65
- if self.else
66
- else_type = typer.infer(self.else)
67
-
68
- if !else_type
69
- # we have neither type, defer until later
70
- typer.defer(self)
71
- else
72
- # we have else but not then, defer only then and use else type for now
73
- @inferred_type = else_type
74
- if body
75
- typer.defer(self)
76
- else
77
- resolved! if condition_type
78
- end
79
- end
80
- else
81
- # no then type could be inferred and no else body, defer for now
82
- typer.defer(self)
83
- end
84
- else
85
- if self.else
86
- else_type = typer.infer(self.else)
87
-
88
- if !else_type
89
- # we determined a then type, so we use that and defer the else body
90
- @inferred_type = then_type
91
- typer.defer(self)
92
- else
61
+ then_type = typer.infer(body, expression) if body
62
+ else_type = typer.infer(self.else, expression) if self.else
63
+
64
+ if expression
65
+ have_body_type = body.nil? || then_type
66
+ have_else_type = self.else.nil? || else_type
67
+ if have_body_type && have_else_type
68
+ if then_type && else_type
93
69
  # both then and else inferred, ensure they're compatible
94
70
  if then_type.compatible?(else_type)
95
71
  # types are compatible...if condition is resolved, we're done
96
72
  @inferred_type = then_type.narrow(else_type)
97
73
  resolved! if condition_type
98
74
  else
99
- raise Typer::InferenceError.new("if statement with incompatible result types #{then_type} and #{else_type}")
75
+ raise Mirah::Typer::InferenceError.new("if statement with incompatible result types #{then_type} and #{else_type}")
100
76
  end
77
+ else
78
+ @inferred_type = then_type || else_type
79
+ resolved!
101
80
  end
102
81
  else
103
- # only then and type inferred, we're 100% resolved
104
- @inferred_type = then_type
105
- resolved! if condition_type
82
+ typer.defer(self)
106
83
  end
84
+ else
85
+ @inferred_type = typer.no_type
86
+ resolved!
107
87
  end
108
88
  end
109
89
 
@@ -136,13 +116,13 @@ module Mirah
136
116
  end
137
117
  end
138
118
 
139
- def infer(typer)
119
+ def infer(typer, expression)
140
120
  unless resolved?
141
121
  child_types = children.map do |c|
142
122
  if c.nil? || (Body === c && c.empty?)
143
123
  typer.no_type
144
124
  else
145
- typer.infer(c)
125
+ typer.infer(c, true)
146
126
  end
147
127
  end
148
128
  if child_types.any? {|t| t.nil?}
@@ -211,10 +191,10 @@ module Mirah
211
191
  super(parent, line_number, &block)
212
192
  end
213
193
 
214
- def infer(typer)
194
+ def infer(typer, expression)
215
195
  resolve_if(typer) do
216
196
  if value
217
- typer.infer(value)
197
+ typer.infer(value, true)
218
198
  else
219
199
  typer.no_type
220
200
  end
@@ -223,7 +203,7 @@ module Mirah
223
203
  end
224
204
 
225
205
  class Break < Node;
226
- def infer(typer)
206
+ def infer(typer, expression)
227
207
  unless resolved?
228
208
  resolved!
229
209
  @inferred_type = typer.null_type
@@ -245,12 +225,12 @@ module Mirah
245
225
  super(parent, line_number, &block)
246
226
  end
247
227
 
248
- def infer(typer)
228
+ def infer(typer, expression)
249
229
  unless resolved?
250
230
  @inferred_type = AST.unreachable_type
251
231
  throwable = AST.type(nil, 'java.lang.Throwable')
252
232
  if children.size == 1
253
- arg_type = typer.infer(self.exception)
233
+ arg_type = typer.infer(self.exception, true)
254
234
  unless arg_type
255
235
  typer.defer(self)
256
236
  return
@@ -261,7 +241,7 @@ module Mirah
261
241
  end
262
242
  end
263
243
 
264
- arg_types = children.map {|c| typer.infer(c)}
244
+ arg_types = children.map {|c| typer.infer(c, true)}
265
245
  if arg_types.any? {|c| c.nil?}
266
246
  typer.defer(self)
267
247
  else
@@ -275,7 +255,7 @@ module Mirah
275
255
  end
276
256
  resolved!
277
257
  @children = [exception]
278
- typer.infer(exception)
258
+ typer.infer(exception, true)
279
259
  end
280
260
  end
281
261
  @inferred_type
@@ -302,7 +282,7 @@ module Mirah
302
282
  end
303
283
  end
304
284
 
305
- def infer(typer)
285
+ def infer(typer, expression)
306
286
  unless resolved?
307
287
  @types ||= type_nodes.map {|n| n.type_reference(typer)}
308
288
  if name
@@ -311,11 +291,7 @@ module Mirah
311
291
  @type = types.size == 1 ? types[0] : AST.type(nil, 'java.lang.Throwable')
312
292
  typer.learn_local_type(static_scope, name, @type)
313
293
  end
314
- @inferred_type = typer.infer(body)
315
-
316
- if (@inferred_type && !body.resolved?)
317
- puts "#{body} not resolved"
318
- end
294
+ @inferred_type = typer.infer(body, true)
319
295
 
320
296
  (@inferred_type && body.resolved?) ? resolved! : typer.defer(self)
321
297
  end
@@ -344,9 +320,9 @@ module Mirah
344
320
  @body, @clauses = children
345
321
  end
346
322
 
347
- def infer(typer)
323
+ def infer(typer, expression)
348
324
  unless resolved?
349
- types = [typer.infer(body)] + clauses.map {|c| typer.infer(c)}
325
+ types = [typer.infer(body, true )] + clauses.map {|c| typer.infer(c, true)}
350
326
  if types.any? {|t| t.nil?}
351
327
  typer.defer(self)
352
328
  else
@@ -362,16 +338,16 @@ module Mirah
362
338
  class Ensure < Node
363
339
  child :body
364
340
  child :clause
365
- attr_accessor :state # Used by the some compilers.
341
+ attr_accessor :state # Used by some compilers.
366
342
 
367
343
  def initialize(parent, position, &block)
368
344
  super(parent, position, &block)
369
345
  end
370
346
 
371
- def infer(typer)
347
+ def infer(typer, expression)
372
348
  resolve_if(typer) do
373
- typer.infer(clause)
374
- typer.infer(body)
349
+ typer.infer(clause, false)
350
+ typer.infer(body, true)
375
351
  end
376
352
  end
377
353
  end