mirah 0.0.5-java → 0.0.6-java
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.
- data/History.txt +33 -0
- data/README.txt +2 -3
- data/Rakefile +5 -0
- data/bin/duby +0 -0
- data/bin/dubyc +0 -0
- data/bin/dubyp +0 -0
- data/bin/jrubyp +0 -0
- data/bin/mirah +0 -0
- data/bin/mirah.cmd +14 -14
- data/bin/mirahc +0 -0
- data/bin/mirahc.cmd +14 -14
- data/bin/mirahp +0 -0
- data/bin/mirahp.cmd +14 -14
- data/examples/Dynamic.class +0 -0
- data/examples/SizeThing.class +0 -0
- data/examples/plugins/appengine/Rakefile +3 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +385 -0
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +58 -15
- data/examples/wiki/war/public/javascripts/prettify.js +0 -0
- data/examples/wiki/war/public/stylesheets/prettify.css +0 -0
- data/javalib/dynalink-0.1.jar +0 -0
- data/javalib/jsr292-mock.jar +0 -0
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/lib/mirah.rb +45 -25
- data/lib/mirah/ast.rb +81 -27
- data/lib/mirah/ast/call.rb +62 -71
- data/lib/mirah/ast/class.rb +23 -26
- data/lib/mirah/ast/flow.rb +38 -62
- data/lib/mirah/ast/intrinsics.rb +59 -37
- data/lib/mirah/ast/literal.rb +16 -14
- data/lib/mirah/ast/local.rb +8 -8
- data/lib/mirah/ast/method.rb +33 -19
- data/lib/mirah/ast/structure.rb +54 -13
- data/lib/mirah/ast/type.rb +8 -11
- data/lib/mirah/compiler.rb +86 -0
- data/lib/mirah/errors.rb +60 -0
- data/lib/mirah/jvm/base.rb +5 -11
- data/lib/mirah/jvm/compiler.rb +12 -1
- data/lib/mirah/jvm/source_compiler.rb +10 -2
- data/lib/mirah/jvm/source_generator/builder.rb +3 -1
- data/lib/mirah/jvm/source_generator/precompile.rb +6 -0
- data/lib/mirah/jvm/typer.rb +6 -1
- data/lib/mirah/jvm/types.rb +8 -0
- data/lib/mirah/jvm/types/factory.rb +34 -10
- data/lib/mirah/jvm/types/intrinsics.rb +12 -5
- data/lib/mirah/jvm/types/methods.rb +5 -9
- data/lib/mirah/plugin/gwt.rb +3 -2
- data/lib/mirah/transform.rb +68 -10
- data/lib/mirah/transform2.rb +10 -1
- data/lib/mirah/typer.rb +5 -10
- data/lib/mirah/version.rb +1 -1
- data/test/test_compilation.rb +1 -1
- data/test/test_java_typer.rb +10 -0
- data/test/test_javac_compiler.rb +4 -2
- data/test/test_jvm_compiler.rb +132 -9
- data/test/test_macros.rb +51 -0
- data/test/test_typer.rb +29 -25
- metadata +13 -21
- data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +0 -390
- data/javalib/JRubyParser.jar +0 -0
- data/javalib/dynalang-invoke-0.1.jar +0 -0
- data/lib/mirah/nbcompiler.rb +0 -44
data/lib/mirah/ast/intrinsics.rb
CHANGED
@@ -20,22 +20,14 @@ module Mirah::AST
|
|
20
20
|
class Unquote < Node
|
21
21
|
child :value
|
22
22
|
|
23
|
-
def infer(typer)
|
24
|
-
raise "Unquote used outside of macro"
|
23
|
+
def infer(typer, expression)
|
24
|
+
raise Mirah::SyntaxError.new("Unquote used outside of macro", self)
|
25
25
|
end
|
26
26
|
|
27
27
|
def _dump(depth)
|
28
28
|
vals = Unquote.__extracted
|
29
29
|
index = vals.size
|
30
|
-
|
31
|
-
if Scoped === value
|
32
|
-
value.scope
|
33
|
-
scoped_value = value
|
34
|
-
else
|
35
|
-
scoped_value = ScopedBody.new(value.parent, value.position) {[value]}
|
36
|
-
scoped_value.static_scope = scoped_value.scope.static_scope
|
37
|
-
end
|
38
|
-
vals << self.value
|
30
|
+
vals << value
|
39
31
|
Marshal.dump([position, index])
|
40
32
|
end
|
41
33
|
|
@@ -70,21 +62,22 @@ module Mirah::AST
|
|
70
62
|
end
|
71
63
|
|
72
64
|
def self.extract_values
|
73
|
-
values =
|
65
|
+
values = []
|
66
|
+
saved, self.__extracted = self.__extracted, values
|
74
67
|
begin
|
75
68
|
yield
|
76
69
|
return values
|
77
70
|
ensure
|
78
|
-
self.__extracted =
|
71
|
+
self.__extracted = saved
|
79
72
|
end
|
80
73
|
end
|
81
74
|
|
82
75
|
def self.inject_values(values)
|
83
|
-
self.__injected = values
|
76
|
+
saved, self.__injected = self.__injected, values
|
84
77
|
begin
|
85
78
|
yield
|
86
79
|
ensure
|
87
|
-
self.__injected =
|
80
|
+
self.__injected = saved
|
88
81
|
end
|
89
82
|
end
|
90
83
|
end
|
@@ -101,6 +94,8 @@ module Mirah::AST
|
|
101
94
|
value
|
102
95
|
when Named
|
103
96
|
value.name
|
97
|
+
when Node
|
98
|
+
value.string_value
|
104
99
|
else
|
105
100
|
raise "Bad unquote value #{value}"
|
106
101
|
end
|
@@ -128,8 +123,8 @@ module Mirah::AST
|
|
128
123
|
case value
|
129
124
|
when Arguments, Argument
|
130
125
|
value
|
131
|
-
when
|
132
|
-
RequiredArgument.new(nil, position, value.
|
126
|
+
when Node
|
127
|
+
RequiredArgument.new(nil, position, value.string_value)
|
133
128
|
when ::String
|
134
129
|
RequiredArgument.new(nil, position, value)
|
135
130
|
else
|
@@ -142,8 +137,8 @@ module Mirah::AST
|
|
142
137
|
child :name
|
143
138
|
child :value
|
144
139
|
|
145
|
-
def infer(typer)
|
146
|
-
raise "UnquoteAssign used outside of macro"
|
140
|
+
def infer(typer, expression)
|
141
|
+
raise Mirah::SyntaxError.new("UnquoteAssign used outside of macro")
|
147
142
|
end
|
148
143
|
|
149
144
|
def _dump(depth)
|
@@ -172,6 +167,12 @@ module Mirah::AST
|
|
172
167
|
end
|
173
168
|
|
174
169
|
def node
|
170
|
+
if ScopedBody === self.name_node
|
171
|
+
scope = name_node
|
172
|
+
name_node = scope.children[0]
|
173
|
+
else
|
174
|
+
name_node = self.name_node
|
175
|
+
end
|
175
176
|
klass = LocalAssignment
|
176
177
|
if Field === name_node
|
177
178
|
name = name_node.name
|
@@ -182,7 +183,7 @@ module Mirah::AST
|
|
182
183
|
elsif String === name_node
|
183
184
|
name = name_node.literal
|
184
185
|
elsif ::String === name_node
|
185
|
-
name =
|
186
|
+
name = name_node
|
186
187
|
else
|
187
188
|
raise "Bad unquote value"
|
188
189
|
end
|
@@ -193,7 +194,12 @@ module Mirah::AST
|
|
193
194
|
n = klass.new(nil, position, name)
|
194
195
|
n << value
|
195
196
|
n.validate_children
|
196
|
-
|
197
|
+
if scope
|
198
|
+
scope.children.clear
|
199
|
+
scope << n
|
200
|
+
else
|
201
|
+
return n
|
202
|
+
end
|
197
203
|
end
|
198
204
|
|
199
205
|
def f_arg
|
@@ -217,10 +223,10 @@ module Mirah::AST
|
|
217
223
|
|
218
224
|
def initialize(parent, line_number, name, &block)
|
219
225
|
super(parent, line_number, &block)
|
220
|
-
|
226
|
+
self.name = name
|
221
227
|
end
|
222
228
|
|
223
|
-
def infer(typer)
|
229
|
+
def infer(typer, expression)
|
224
230
|
resolve_if(typer) do
|
225
231
|
self_type = scope.static_scope.self_type
|
226
232
|
extension_name = "%s$%s" % [self_type.name,
|
@@ -239,7 +245,7 @@ module Mirah::AST
|
|
239
245
|
self_type.add_method(name, arg_types, macro)
|
240
246
|
end
|
241
247
|
proxy.__inline__(Noop.new(parent, position))
|
242
|
-
proxy.infer(typer)
|
248
|
+
proxy.infer(typer, expression)
|
243
249
|
end
|
244
250
|
end
|
245
251
|
|
@@ -270,12 +276,13 @@ module Mirah::AST
|
|
270
276
|
new_factory = orig_factory.dup
|
271
277
|
Mirah::AST.type_factory = new_factory
|
272
278
|
ast = build_ast(name, parent, transformer)
|
273
|
-
puts ast.inspect if state.verbose
|
274
279
|
classes = compile_ast(name, ast, transformer)
|
275
280
|
loader = MirahClassLoader.new(
|
276
281
|
JRuby.runtime.jruby_class_loader, classes)
|
277
282
|
klass = loader.loadClass(name, true)
|
278
|
-
|
283
|
+
if state.save_extensions
|
284
|
+
annotate(parent, name)
|
285
|
+
end
|
279
286
|
Mirah::AST.type_factory = orig_factory
|
280
287
|
klass
|
281
288
|
end
|
@@ -304,20 +311,29 @@ module Mirah::AST
|
|
304
311
|
end
|
305
312
|
|
306
313
|
def compile_ast(name, ast, transformer)
|
307
|
-
|
308
|
-
|
309
|
-
|
314
|
+
begin
|
315
|
+
typer = Mirah::Typer::JVM.new(transformer)
|
316
|
+
typer.infer(ast, false)
|
317
|
+
typer.resolve(true)
|
318
|
+
typer.errors.each do |e|
|
319
|
+
raise e
|
320
|
+
end
|
321
|
+
ensure
|
322
|
+
puts ast.inspect if transformer.state.verbose
|
323
|
+
end
|
310
324
|
compiler = Mirah::Compiler::JVM.new
|
311
325
|
ast.compile(compiler, false)
|
312
326
|
class_map = {}
|
313
327
|
compiler.generate do |outfile, builder|
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
328
|
+
bytes = builder.generate
|
329
|
+
name = builder.class_name.gsub(/\//, '.')
|
330
|
+
class_map[name] = bytes
|
331
|
+
if transformer.state.save_extensions
|
332
|
+
outfile = "#{transformer.destination}#{outfile}"
|
333
|
+
FileUtils.mkdir_p(File.dirname(outfile))
|
334
|
+
File.open(outfile, 'wb') do |f|
|
335
|
+
f.write(bytes)
|
336
|
+
end
|
321
337
|
end
|
322
338
|
end
|
323
339
|
class_map
|
@@ -325,7 +341,7 @@ module Mirah::AST
|
|
325
341
|
|
326
342
|
def build_ast(name, parent, transformer)
|
327
343
|
# TODO should use a new type factory too.
|
328
|
-
|
344
|
+
|
329
345
|
ast = Mirah::AST.parse_ruby("begin;end")
|
330
346
|
ast = transformer.transform(ast, nil)
|
331
347
|
|
@@ -372,6 +388,12 @@ module Mirah::AST
|
|
372
388
|
[arg.name, type, arg.position]
|
373
389
|
end
|
374
390
|
m = extension.define_method(position, '_expand', node_type, *actual_args)
|
391
|
+
scope.static_scope.imports.each do |short, long|
|
392
|
+
m.static_scope.import(long, short)
|
393
|
+
end
|
394
|
+
scope.static_scope.search_packages.each do |package|
|
395
|
+
m.static_scope.import(package, '*')
|
396
|
+
end
|
375
397
|
m.body = self.body
|
376
398
|
ast.body = extension
|
377
399
|
ast
|
data/lib/mirah/ast/literal.rb
CHANGED
@@ -19,11 +19,13 @@ module Mirah::AST
|
|
19
19
|
super(parent, line_number, &block)
|
20
20
|
end
|
21
21
|
|
22
|
-
def infer(typer)
|
23
|
-
|
24
|
-
kid
|
22
|
+
def infer(typer, expression)
|
23
|
+
resolve_if(typer) do
|
24
|
+
children.each do |kid|
|
25
|
+
kid.infer(typer, true)
|
26
|
+
end
|
27
|
+
@inferred_type = typer.array_type
|
25
28
|
end
|
26
|
-
@inferred_type = typer.array_type
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
@@ -35,7 +37,7 @@ module Mirah::AST
|
|
35
37
|
@literal = literal
|
36
38
|
end
|
37
39
|
|
38
|
-
def infer(typer)
|
40
|
+
def infer(typer, expression)
|
39
41
|
resolve_if(typer) {@inferred_type = typer.fixnum_type(@literal)}
|
40
42
|
end
|
41
43
|
|
@@ -56,7 +58,7 @@ module Mirah::AST
|
|
56
58
|
@literal = literal
|
57
59
|
end
|
58
60
|
|
59
|
-
def infer(typer)
|
61
|
+
def infer(typer, expression)
|
60
62
|
resolve_if(typer) {@inferred_type = typer.float_type(@literal)}
|
61
63
|
end
|
62
64
|
end
|
@@ -71,7 +73,7 @@ module Mirah::AST
|
|
71
73
|
@literal = literal
|
72
74
|
end
|
73
75
|
|
74
|
-
def infer(typer)
|
76
|
+
def infer(typer, expression)
|
75
77
|
return @inferred_type if resolved?
|
76
78
|
resolved!
|
77
79
|
@inferred_type ||= typer.regexp_type
|
@@ -88,7 +90,7 @@ module Mirah::AST
|
|
88
90
|
@literal = literal
|
89
91
|
end
|
90
92
|
|
91
|
-
def infer(typer)
|
93
|
+
def infer(typer, expression)
|
92
94
|
return @inferred_type if resolved?
|
93
95
|
resolved!
|
94
96
|
@inferred_type ||= typer.string_type
|
@@ -108,10 +110,10 @@ module Mirah::AST
|
|
108
110
|
super(parent, position, &block)
|
109
111
|
end
|
110
112
|
|
111
|
-
def infer(typer)
|
113
|
+
def infer(typer, expression)
|
112
114
|
unless resolved?
|
113
115
|
resolved = true
|
114
|
-
children.each {|node| node.infer(typer); resolved &&= node.resolved?}
|
116
|
+
children.each {|node| node.infer(typer, true); resolved &&= node.resolved?}
|
115
117
|
resolved! if resolved
|
116
118
|
@inferred_type ||= typer.string_type
|
117
119
|
end
|
@@ -126,9 +128,9 @@ module Mirah::AST
|
|
126
128
|
super(parent, position)
|
127
129
|
end
|
128
130
|
|
129
|
-
def infer(typer)
|
131
|
+
def infer(typer, expression)
|
130
132
|
unless resolved?
|
131
|
-
body.infer(typer)
|
133
|
+
body.infer(typer, true)
|
132
134
|
resolved! if body.resolved?
|
133
135
|
@inferred_type ||= typer.string_type
|
134
136
|
end
|
@@ -146,7 +148,7 @@ module Mirah::AST
|
|
146
148
|
@literal = literal
|
147
149
|
end
|
148
150
|
|
149
|
-
def infer(typer)
|
151
|
+
def infer(typer, expression)
|
150
152
|
return @inferred_type if resolved?
|
151
153
|
resolved!
|
152
154
|
@inferred_type ||= typer.boolean_type
|
@@ -160,7 +162,7 @@ module Mirah::AST
|
|
160
162
|
super(parent, line_number)
|
161
163
|
end
|
162
164
|
|
163
|
-
def infer(typer)
|
165
|
+
def infer(typer, expression)
|
164
166
|
return @inferred_type if resolved?
|
165
167
|
resolved!
|
166
168
|
@inferred_type ||= typer.null_type
|
data/lib/mirah/ast/local.rb
CHANGED
@@ -24,14 +24,14 @@ module Mirah::AST
|
|
24
24
|
|
25
25
|
def initialize(parent, line_number, name, &block)
|
26
26
|
super(parent, line_number, &block)
|
27
|
-
|
27
|
+
self.name = name
|
28
28
|
end
|
29
29
|
|
30
30
|
def captured?
|
31
31
|
scope.static_scope.captured?(name)
|
32
32
|
end
|
33
33
|
|
34
|
-
def infer(typer)
|
34
|
+
def infer(typer, expression)
|
35
35
|
resolve_if(typer) do
|
36
36
|
scope.static_scope << name
|
37
37
|
@type = type_node.type_reference(typer)
|
@@ -53,7 +53,7 @@ module Mirah::AST
|
|
53
53
|
|
54
54
|
def initialize(parent, line_number, name, &block)
|
55
55
|
super(parent, line_number, &block)
|
56
|
-
|
56
|
+
self.name = name
|
57
57
|
end
|
58
58
|
|
59
59
|
def captured?
|
@@ -64,10 +64,10 @@ module Mirah::AST
|
|
64
64
|
"LocalAssignment(name = #{name}, scope = #{scope}, captured = #{captured? == true})"
|
65
65
|
end
|
66
66
|
|
67
|
-
def infer(typer)
|
67
|
+
def infer(typer, expression)
|
68
68
|
resolve_if(typer) do
|
69
69
|
scope.static_scope << name
|
70
|
-
typer.infer(value)
|
70
|
+
typer.infer(value, true)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -83,18 +83,18 @@ module Mirah::AST
|
|
83
83
|
|
84
84
|
def initialize(parent, line_number, name)
|
85
85
|
super(parent, line_number, [])
|
86
|
-
|
86
|
+
self.name = name
|
87
87
|
end
|
88
88
|
|
89
89
|
def captured?
|
90
|
-
scope.static_scope.captured?(name)
|
90
|
+
scope && scope.static_scope.captured?(name)
|
91
91
|
end
|
92
92
|
|
93
93
|
def to_s
|
94
94
|
"Local(name = #{name}, scope = #{scope}, captured = #{captured? == true})"
|
95
95
|
end
|
96
96
|
|
97
|
-
def infer(typer)
|
97
|
+
def infer(typer, expression)
|
98
98
|
resolve_if(typer) do
|
99
99
|
scope.static_scope << name
|
100
100
|
typer.local_type(containing_scope, name)
|
data/lib/mirah/ast/method.rb
CHANGED
@@ -25,9 +25,9 @@ module Mirah::AST
|
|
25
25
|
super(parent, line_number, &block)
|
26
26
|
end
|
27
27
|
|
28
|
-
def infer(typer)
|
28
|
+
def infer(typer, expression)
|
29
29
|
unless resolved?
|
30
|
-
@inferred_type = args ? args.map {|arg| typer.infer(arg)} : []
|
30
|
+
@inferred_type = args ? args.map {|arg| typer.infer(arg, true)} : []
|
31
31
|
if @inferred_type.all?
|
32
32
|
resolved!
|
33
33
|
else
|
@@ -115,10 +115,10 @@ module Mirah::AST
|
|
115
115
|
def initialize(parent, line_number, name, type=nil)
|
116
116
|
super(parent, line_number, [type])
|
117
117
|
|
118
|
-
|
118
|
+
self.name = name
|
119
119
|
end
|
120
120
|
|
121
|
-
def infer(typer)
|
121
|
+
def infer(typer, expression)
|
122
122
|
resolve_if(typer) do
|
123
123
|
scope.static_scope << name
|
124
124
|
# if not already typed, check parent of parent (MethodDefinition)
|
@@ -144,17 +144,17 @@ module Mirah::AST
|
|
144
144
|
|
145
145
|
def initialize(parent, line_number, name, &block)
|
146
146
|
super(parent, line_number, &block)
|
147
|
-
|
147
|
+
self.name = name
|
148
148
|
end
|
149
149
|
|
150
|
-
def infer(typer)
|
150
|
+
def infer(typer, expression)
|
151
151
|
resolve_if(typer) do
|
152
152
|
scope.static_scope << name
|
153
153
|
# if not already typed, check parent of parent (MethodDefinition)
|
154
154
|
# for signature info
|
155
155
|
method_def = parent.parent
|
156
156
|
signature = method_def.signature
|
157
|
-
value_type = value.infer(typer)
|
157
|
+
value_type = value.infer(typer, true)
|
158
158
|
declared_type = type_node.type_reference(typer) if type_node
|
159
159
|
signature[name.intern] = declared_type || value_type
|
160
160
|
end
|
@@ -168,10 +168,10 @@ module Mirah::AST
|
|
168
168
|
def initialize(parent, line_number, name)
|
169
169
|
super(parent, line_number)
|
170
170
|
|
171
|
-
|
171
|
+
self.name = name
|
172
172
|
end
|
173
173
|
|
174
|
-
def infer(typer)
|
174
|
+
def infer(typer, expression)
|
175
175
|
scope.static_scope << name
|
176
176
|
super
|
177
177
|
end
|
@@ -186,10 +186,10 @@ module Mirah::AST
|
|
186
186
|
def initialize(parent, line_number, name)
|
187
187
|
super(parent, line_number)
|
188
188
|
|
189
|
-
|
189
|
+
self.name = name
|
190
190
|
end
|
191
191
|
|
192
|
-
def infer(typer)
|
192
|
+
def infer(typer, expression)
|
193
193
|
scope.static_scope << name
|
194
194
|
super
|
195
195
|
end
|
@@ -202,6 +202,7 @@ module Mirah::AST
|
|
202
202
|
include Scoped
|
203
203
|
include ClassScoped
|
204
204
|
include Binding
|
205
|
+
include Java::DubyLangCompiler.MethodDefinition
|
205
206
|
|
206
207
|
child :signature
|
207
208
|
child :arguments
|
@@ -216,7 +217,7 @@ module Mirah::AST
|
|
216
217
|
def initialize(parent, line_number, name, annotations=[], &block)
|
217
218
|
@annotations = annotations
|
218
219
|
super(parent, line_number, &block)
|
219
|
-
|
220
|
+
self.name = name
|
220
221
|
@visibility = (class_scope && class_scope.current_access_level) || :public
|
221
222
|
end
|
222
223
|
|
@@ -224,24 +225,30 @@ module Mirah::AST
|
|
224
225
|
super
|
225
226
|
end
|
226
227
|
|
227
|
-
def infer(typer)
|
228
|
+
def infer(typer, expression)
|
228
229
|
resolve_if(typer) do
|
229
230
|
@defining_class ||= begin
|
231
|
+
static_scope.self_node = :self
|
230
232
|
static_scope.self_type = if static?
|
231
233
|
scope.static_scope.self_type.meta
|
232
234
|
else
|
233
235
|
scope.static_scope.self_type
|
234
236
|
end
|
235
237
|
end
|
236
|
-
@annotations.each {|a| a.infer(typer)} if @annotations
|
237
|
-
typer.infer(arguments)
|
238
|
+
@annotations.each {|a| a.infer(typer, true)} if @annotations
|
239
|
+
typer.infer(arguments, true)
|
240
|
+
if @return_type.kind_of?(UnquotedValue)
|
241
|
+
@return_type = @return_type.node
|
242
|
+
@return_type.parent = self
|
243
|
+
end
|
238
244
|
signature[:return] = @return_type.type_reference(typer) if @return_type
|
239
245
|
if @exceptions
|
240
246
|
signature[:throws] = @exceptions.map {|e| e.type_reference(typer)}
|
241
247
|
end
|
242
248
|
typer.infer_signature(self)
|
243
249
|
forced_type = signature[:return]
|
244
|
-
|
250
|
+
body_is_expression = (forced_type != typer.no_type)
|
251
|
+
inferred_type = body ? typer.infer(body, body_is_expression) : typer.no_type
|
245
252
|
|
246
253
|
if inferred_type && arguments.inferred_type.all?
|
247
254
|
actual_type = if forced_type.nil?
|
@@ -283,7 +290,7 @@ module Mirah::AST
|
|
283
290
|
arguments.args.each do |arg|
|
284
291
|
if OptionalArgument === arg
|
285
292
|
arg_types_for_opt = args_for_opt.map do |arg_for_opt|
|
286
|
-
arg_for_opt.infer(typer)
|
293
|
+
arg_for_opt.infer(typer, true)
|
287
294
|
end
|
288
295
|
typer.learn_method_type(defining_class, name, arg_types_for_opt, type, signature[:throws])
|
289
296
|
end
|
@@ -318,6 +325,13 @@ module Mirah::AST
|
|
318
325
|
extract_delegate_constructor
|
319
326
|
end
|
320
327
|
|
328
|
+
def validate_children
|
329
|
+
super
|
330
|
+
if @delegate_args
|
331
|
+
@delegate_args.each {|arg| arg.parent = self}
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
321
335
|
def first_node
|
322
336
|
if body.kind_of? Body
|
323
337
|
body.children[0]
|
@@ -354,9 +368,9 @@ module Mirah::AST
|
|
354
368
|
self.first_node = Noop.new(self, position) if @delegate_args
|
355
369
|
end
|
356
370
|
|
357
|
-
def infer(typer)
|
371
|
+
def infer(typer, expression)
|
358
372
|
unless @inferred_type
|
359
|
-
delegate_args.each {|a| typer.infer(a)} if delegate_args
|
373
|
+
delegate_args.each {|a| typer.infer(a, true)} if delegate_args
|
360
374
|
end
|
361
375
|
super
|
362
376
|
end
|