duby 0.0.2-java → 0.0.3-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 +7 -0
- data/README.txt +18 -7
- data/Rakefile +72 -0
- data/examples/ant/example-build.xml +7 -0
- data/examples/appengine/Rakefile +8 -67
- data/examples/appengine/Readme +4 -3
- data/examples/appengine/lib/duby/appengine_tasks.rb +173 -0
- data/examples/appengine/lib/duby/plugin/datastore.rb +92 -31
- data/examples/appengine/lib/duby_task.rb +61 -0
- data/examples/appengine/src/com/ribrdb/DubyApp.duby +32 -6
- data/examples/appengine/src/com/ribrdb/list.dhtml +2 -2
- data/examples/appengine/{config.ru → src/config.ru} +0 -0
- data/examples/bintrees.duby +66 -0
- data/examples/dynamic.duby +17 -0
- data/examples/fib.duby +3 -11
- data/examples/fields.duby +3 -3
- data/examples/fractal.duby +1 -3
- data/examples/sort_closure.duby +7 -0
- data/examples/swing.duby +11 -11
- data/javalib/duby-bootstrap.jar +0 -0
- data/javalib/dynalang-invoke-0.1.jar +0 -0
- data/lib/duby.rb +168 -35
- data/lib/duby/ast.rb +224 -27
- data/lib/duby/ast/call.rb +85 -25
- data/lib/duby/ast/class.rb +112 -28
- data/lib/duby/ast/flow.rb +65 -44
- data/lib/duby/ast/intrinsics.rb +223 -21
- data/lib/duby/ast/literal.rb +67 -16
- data/lib/duby/ast/local.rb +36 -40
- data/lib/duby/ast/method.rb +83 -67
- data/lib/duby/ast/structure.rb +105 -23
- data/lib/duby/compiler.rb +83 -28
- data/lib/duby/env.rb +33 -0
- data/lib/duby/jvm/base.rb +210 -0
- data/lib/duby/jvm/compiler.rb +293 -219
- data/lib/duby/jvm/method_lookup.rb +77 -67
- data/lib/duby/jvm/source_compiler.rb +250 -157
- data/lib/duby/jvm/source_generator/builder.rb +53 -49
- data/lib/duby/jvm/source_generator/loops.rb +9 -9
- data/lib/duby/jvm/source_generator/precompile.rb +35 -25
- data/lib/duby/jvm/typer.rb +19 -10
- data/lib/duby/jvm/types.rb +127 -68
- data/lib/duby/jvm/types/basic_types.rb +26 -13
- data/lib/duby/jvm/types/enumerable.rb +6 -4
- data/lib/duby/jvm/types/factory.rb +49 -13
- data/lib/duby/jvm/types/floats.rb +16 -0
- data/lib/duby/jvm/types/integers.rb +63 -2
- data/lib/duby/jvm/types/intrinsics.rb +43 -21
- data/lib/duby/jvm/types/methods.rb +326 -86
- data/lib/duby/jvm/types/number.rb +3 -0
- data/lib/duby/nbcompiler.rb +1 -1
- data/lib/duby/plugin/edb.rb +1 -1
- data/lib/duby/plugin/java.rb +10 -1
- data/lib/duby/transform.rb +134 -46
- data/lib/duby/typer.rb +75 -50
- data/test/test_ast.rb +106 -106
- data/test/test_compilation.rb +46 -32
- data/test/test_env.rb +42 -0
- data/test/test_java_typer.rb +35 -51
- data/test/test_javac_compiler.rb +4 -1
- data/test/test_jvm_compiler.rb +564 -133
- data/test/test_typer.rb +68 -92
- metadata +37 -21
- data/examples/README +0 -16
- data/lib/duby/c/compiler.rb +0 -134
- data/lib/duby/old/compiler_old.rb +0 -845
- data/lib/duby/old/declaration.rb +0 -72
- data/lib/duby/old/mapper.rb +0 -72
- data/lib/duby/old/signature.rb +0 -52
- data/lib/duby/old/typer_old.rb +0 -163
- data/lib/duby/plugin/math.rb +0 -84
- data/test/test_math_plugin.rb +0 -87
data/lib/duby/ast.rb
CHANGED
@@ -5,18 +5,40 @@ module Duby
|
|
5
5
|
class << self
|
6
6
|
attr_accessor :verbose
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
# The top of the AST class hierarchy, this represents an abstract AST node.
|
10
10
|
# It provides accessors for _children_, an array of all child nodes,
|
11
11
|
# _parent_, a reference to this node's parent (nil if none), and _newline_,
|
12
12
|
# whether this node represents a new line.
|
13
13
|
class Node
|
14
|
+
include Java::DubyLangCompiler.Node
|
15
|
+
include Enumerable
|
16
|
+
|
14
17
|
attr_accessor :children
|
15
18
|
attr_accessor :parent
|
16
19
|
attr_accessor :position
|
17
20
|
attr_accessor :newline
|
18
21
|
attr_accessor :inferred_type
|
19
22
|
|
23
|
+
def self.child(name)
|
24
|
+
@children ||= []
|
25
|
+
index = @children.size
|
26
|
+
class_eval <<-EOF
|
27
|
+
def #{name}
|
28
|
+
@children[#{index}]
|
29
|
+
end
|
30
|
+
|
31
|
+
def #{name}=(node)
|
32
|
+
@children[#{index}] = _set_parent(node)
|
33
|
+
end
|
34
|
+
EOF
|
35
|
+
@children << name
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.child_name(i)
|
39
|
+
@children[i] if @children
|
40
|
+
end
|
41
|
+
|
20
42
|
def initialize(parent, position, children = [])
|
21
43
|
@parent = parent
|
22
44
|
@newline = false
|
@@ -45,16 +67,28 @@ module Duby
|
|
45
67
|
def inspect(indent = 0)
|
46
68
|
indent_str = ' ' * indent
|
47
69
|
str = indent_str + to_s
|
48
|
-
children.
|
70
|
+
children.each_with_index do |child, i|
|
71
|
+
extra_indent = 0
|
49
72
|
if child
|
73
|
+
name = self.class.child_name(i)
|
74
|
+
if Duby::AST.verbose && name
|
75
|
+
str << "\n#{indent_str} #{name}:"
|
76
|
+
extra_indent = 1
|
77
|
+
end
|
50
78
|
if ::Array === child
|
51
79
|
child.each {|ary_child|
|
52
|
-
|
80
|
+
if Duby::AST.verbose && Node === ary_child && ary_child.parent != self
|
81
|
+
str << "\n#{indent_str} (wrong parent)"
|
82
|
+
end
|
83
|
+
str << "\n#{ary_child.inspect(indent + extra_indent + 1)}"
|
53
84
|
}
|
54
85
|
elsif ::Hash === child
|
55
86
|
str << "\n#{indent_str} #{child.inspect}"
|
56
87
|
else
|
57
|
-
|
88
|
+
if Duby::AST.verbose && Node === child && child.parent != self
|
89
|
+
str << "\n#{indent_str} (wrong parent)"
|
90
|
+
end
|
91
|
+
str << "\n#{child.inspect(indent + extra_indent + 1)}"
|
58
92
|
end
|
59
93
|
end
|
60
94
|
end
|
@@ -71,7 +105,21 @@ module Duby
|
|
71
105
|
|
72
106
|
def each(&b) children.each(&b) end
|
73
107
|
|
74
|
-
def
|
108
|
+
def <<(node)
|
109
|
+
@children << _set_parent(node)
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
def insert(index, node)
|
114
|
+
node.parent = self
|
115
|
+
@children.insert(index, node)
|
116
|
+
end
|
117
|
+
|
118
|
+
def empty?
|
119
|
+
@children.empty?
|
120
|
+
end
|
121
|
+
|
122
|
+
def resolved!(typer=nil)
|
75
123
|
log "#{to_s} resolved!"
|
76
124
|
@resolved = true
|
77
125
|
end
|
@@ -81,7 +129,7 @@ module Duby
|
|
81
129
|
def resolve_if(typer)
|
82
130
|
unless resolved?
|
83
131
|
@inferred_type = yield
|
84
|
-
@inferred_type ? resolved! : typer.defer(self)
|
132
|
+
@inferred_type ? resolved!(typer) : typer.defer(self)
|
85
133
|
end
|
86
134
|
@inferred_type
|
87
135
|
end
|
@@ -89,8 +137,33 @@ module Duby
|
|
89
137
|
def self.===(other)
|
90
138
|
super || (other.kind_of?(NodeProxy) && (self === other.__getobj__))
|
91
139
|
end
|
140
|
+
|
141
|
+
def _set_parent(node)
|
142
|
+
case node
|
143
|
+
when Node
|
144
|
+
node.parent = self
|
145
|
+
when ::Array
|
146
|
+
node.each {|x| x.parent = self if x}
|
147
|
+
end
|
148
|
+
node
|
149
|
+
end
|
150
|
+
|
151
|
+
def initialize_copy(other)
|
152
|
+
@parent = nil
|
153
|
+
@children = []
|
154
|
+
other.children.each do |child|
|
155
|
+
case child
|
156
|
+
when ::Array
|
157
|
+
self << child.map {|x| x.dup}
|
158
|
+
when nil
|
159
|
+
self << nil
|
160
|
+
else
|
161
|
+
self << child.dup
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
92
165
|
end
|
93
|
-
|
166
|
+
|
94
167
|
class ErrorNode < Node
|
95
168
|
def initialize(parent, error)
|
96
169
|
super(parent, error.position)
|
@@ -98,7 +171,7 @@ module Duby
|
|
98
171
|
@inferred_type = TypeReference::ErrorType
|
99
172
|
@resolved = true
|
100
173
|
end
|
101
|
-
|
174
|
+
|
102
175
|
def infer(typer)
|
103
176
|
end
|
104
177
|
end
|
@@ -134,10 +207,20 @@ module Duby
|
|
134
207
|
@scope ||= begin
|
135
208
|
scope = parent
|
136
209
|
raise "No parent for #{self.class.name} at #{line_number}" if scope.nil?
|
137
|
-
|
210
|
+
until scope.class.include?(Scope)
|
211
|
+
scope = scope.parent
|
212
|
+
end
|
138
213
|
scope
|
139
214
|
end
|
140
215
|
end
|
216
|
+
|
217
|
+
def containing_scope
|
218
|
+
scope = self.scope.static_scope
|
219
|
+
while scope.parent && scope.parent.include?(name)
|
220
|
+
scope = scope.parent
|
221
|
+
end
|
222
|
+
scope
|
223
|
+
end
|
141
224
|
end
|
142
225
|
|
143
226
|
module ClassScoped
|
@@ -159,7 +242,109 @@ module Duby
|
|
159
242
|
end
|
160
243
|
end
|
161
244
|
|
162
|
-
|
245
|
+
class StaticScope
|
246
|
+
attr_reader :parent
|
247
|
+
attr_writer :self_type
|
248
|
+
|
249
|
+
def initialize(parent=nil)
|
250
|
+
@vars = {}
|
251
|
+
@parent = parent
|
252
|
+
@children = {}
|
253
|
+
end
|
254
|
+
|
255
|
+
def <<(name)
|
256
|
+
@vars[name] = true
|
257
|
+
end
|
258
|
+
|
259
|
+
def include?(name, include_parent=true)
|
260
|
+
@vars.include?(name) ||
|
261
|
+
(include_parent && parent && parent.include?(name))
|
262
|
+
end
|
263
|
+
|
264
|
+
def captured?(name)
|
265
|
+
if !include?(name, false)
|
266
|
+
return false
|
267
|
+
elsif parent && parent.include?(name)
|
268
|
+
return true
|
269
|
+
else
|
270
|
+
return children.any? {|child| child.include?(name, false)}
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def children
|
275
|
+
@children.keys
|
276
|
+
end
|
277
|
+
|
278
|
+
def add_child(scope)
|
279
|
+
@children[scope] = true
|
280
|
+
end
|
281
|
+
|
282
|
+
def remove_child(scope)
|
283
|
+
@children.delete(scope)
|
284
|
+
end
|
285
|
+
|
286
|
+
def parent=(parent)
|
287
|
+
@parent.remove_child(self) if @parent
|
288
|
+
parent.add_child(self)
|
289
|
+
@parent = parent
|
290
|
+
end
|
291
|
+
|
292
|
+
def self_type
|
293
|
+
if @self_type.nil? && parent
|
294
|
+
@self_type = parent.self_type
|
295
|
+
end
|
296
|
+
@self_type
|
297
|
+
end
|
298
|
+
|
299
|
+
def binding_type(defining_class=nil, duby=nil)
|
300
|
+
@binding_type ||= begin
|
301
|
+
if parent
|
302
|
+
parent.binding_type(defining_class, duby)
|
303
|
+
else
|
304
|
+
name = "#{defining_class.name}$#{duby.tmp}"
|
305
|
+
factory = Duby::AST.type_factory
|
306
|
+
if factory
|
307
|
+
factory.declare_type(name)
|
308
|
+
else
|
309
|
+
Duby::AST::TypeReference.new(name, false, false)
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
def binding_type=(type)
|
316
|
+
if parent
|
317
|
+
parent.binding_type = type
|
318
|
+
else
|
319
|
+
@binding_type = type
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
def has_binding?
|
324
|
+
@binding_type != nil || (parent && parent.has_binding?)
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
module Scope
|
329
|
+
attr_writer :static_scope
|
330
|
+
def static_scope
|
331
|
+
@static_scope ||= StaticScope.new
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
module Binding
|
336
|
+
def binding_type(duby=nil)
|
337
|
+
static_scope.binding_type(defining_class, duby)
|
338
|
+
end
|
339
|
+
|
340
|
+
def binding_type=(type)
|
341
|
+
static_scope.binding_type = type
|
342
|
+
end
|
343
|
+
|
344
|
+
def has_binding?
|
345
|
+
static_scope.has_binding?
|
346
|
+
end
|
347
|
+
end
|
163
348
|
|
164
349
|
class Colon2 < Node; end
|
165
350
|
|
@@ -186,10 +371,14 @@ module Duby
|
|
186
371
|
class VoidType < Node; end
|
187
372
|
|
188
373
|
class Annotation < Node
|
374
|
+
attr_reader :values
|
375
|
+
attr_accessor :runtime
|
376
|
+
alias runtime? runtime
|
377
|
+
|
189
378
|
def initialize(parent, position, klass)
|
190
379
|
super(parent, position)
|
191
380
|
@class = klass
|
192
|
-
@values =
|
381
|
+
@values = {}
|
193
382
|
end
|
194
383
|
|
195
384
|
def name
|
@@ -201,7 +390,11 @@ module Duby
|
|
201
390
|
end
|
202
391
|
|
203
392
|
def []=(name, value)
|
204
|
-
|
393
|
+
@values[name] = value
|
394
|
+
end
|
395
|
+
|
396
|
+
def [](name)
|
397
|
+
@values[name]
|
205
398
|
end
|
206
399
|
end
|
207
400
|
|
@@ -211,7 +404,7 @@ module Duby
|
|
211
404
|
alias array? array
|
212
405
|
attr_accessor :meta
|
213
406
|
alias meta? meta
|
214
|
-
|
407
|
+
|
215
408
|
def initialize(name, array = false, meta = false, position=nil)
|
216
409
|
super(nil, position)
|
217
410
|
@name = name
|
@@ -239,7 +432,7 @@ module Duby
|
|
239
432
|
# default behavior now is to disallow any polymorphic types
|
240
433
|
self == other
|
241
434
|
end
|
242
|
-
|
435
|
+
|
243
436
|
def compatible?(other)
|
244
437
|
# default behavior is only exact match right now
|
245
438
|
self == other ||
|
@@ -250,7 +443,7 @@ module Duby
|
|
250
443
|
def iterable?
|
251
444
|
array?
|
252
445
|
end
|
253
|
-
|
446
|
+
|
254
447
|
def component_type
|
255
448
|
AST.type(name) if array?
|
256
449
|
end
|
@@ -276,14 +469,18 @@ module Duby
|
|
276
469
|
name == :error
|
277
470
|
end
|
278
471
|
|
472
|
+
def null?
|
473
|
+
name == :null
|
474
|
+
end
|
475
|
+
|
279
476
|
def unreachable?
|
280
477
|
name == :unreachable
|
281
478
|
end
|
282
|
-
|
479
|
+
|
283
480
|
def block?
|
284
481
|
name == :block
|
285
482
|
end
|
286
|
-
|
483
|
+
|
287
484
|
def primitive?
|
288
485
|
true
|
289
486
|
end
|
@@ -305,15 +502,15 @@ module Duby
|
|
305
502
|
@interfaces = interfaces
|
306
503
|
end
|
307
504
|
end
|
308
|
-
|
505
|
+
|
309
506
|
def self.type_factory
|
310
507
|
Thread.current[:ast_type_factory]
|
311
508
|
end
|
312
|
-
|
509
|
+
|
313
510
|
def self.type_factory=(factory)
|
314
511
|
Thread.current[:ast_type_factory] = factory
|
315
512
|
end
|
316
|
-
|
513
|
+
|
317
514
|
# Shortcut method to construct type references
|
318
515
|
def self.type(typesym, array = false, meta = false)
|
319
516
|
factory = type_factory
|
@@ -323,7 +520,7 @@ module Duby
|
|
323
520
|
TypeReference.new(typesym, array, meta)
|
324
521
|
end
|
325
522
|
end
|
326
|
-
|
523
|
+
|
327
524
|
def self.no_type
|
328
525
|
factory = type_factory
|
329
526
|
if factory
|
@@ -332,7 +529,7 @@ module Duby
|
|
332
529
|
TypeReference::NoType
|
333
530
|
end
|
334
531
|
end
|
335
|
-
|
532
|
+
|
336
533
|
def self.error_type
|
337
534
|
TypeReference::ErrorType
|
338
535
|
end
|
@@ -340,7 +537,7 @@ module Duby
|
|
340
537
|
def self.unreachable_type
|
341
538
|
TypeReference::UnreachableType
|
342
539
|
end
|
343
|
-
|
540
|
+
|
344
541
|
def self.block_type
|
345
542
|
TypeReference::BlockType
|
346
543
|
end
|
@@ -351,7 +548,7 @@ module Duby
|
|
351
548
|
factory.fixnum(parent, position, literal)
|
352
549
|
else
|
353
550
|
Fixnum.new(parent, position, literal)
|
354
|
-
end
|
551
|
+
end
|
355
552
|
end
|
356
553
|
|
357
554
|
def self.float(parent, position, literal)
|
@@ -360,15 +557,15 @@ module Duby
|
|
360
557
|
factory.float(parent, position, literal)
|
361
558
|
else
|
362
559
|
Float.new(parent, position, literal)
|
363
|
-
end
|
560
|
+
end
|
364
561
|
end
|
365
|
-
|
562
|
+
|
366
563
|
def self.defmacro(name, &block)
|
367
564
|
@macros ||= {}
|
368
565
|
raise "Conflicting macros for #{name}" if @macros[name]
|
369
566
|
@macros[name] = block
|
370
567
|
end
|
371
|
-
|
568
|
+
|
372
569
|
def self.macro(name)
|
373
570
|
@macros[name]
|
374
571
|
end
|
data/lib/duby/ast/call.rb
CHANGED
@@ -6,13 +6,25 @@ module Duby::AST
|
|
6
6
|
node.parent = parent
|
7
7
|
__setobj__(node)
|
8
8
|
end
|
9
|
+
|
10
|
+
def dup
|
11
|
+
new = super
|
12
|
+
new.__setobj__(__getobj__.dup)
|
13
|
+
new.proxy = new
|
14
|
+
new
|
15
|
+
end
|
9
16
|
end
|
10
17
|
|
11
18
|
class FunctionalCall < Node
|
19
|
+
include Java::DubyLangCompiler.Call
|
12
20
|
include Named
|
13
|
-
|
21
|
+
include Scoped
|
22
|
+
attr_accessor :cast, :inlined, :proxy
|
14
23
|
alias cast? cast
|
15
24
|
|
25
|
+
child :parameters
|
26
|
+
child :block
|
27
|
+
|
16
28
|
def self.new(*args, &block)
|
17
29
|
real_node = super
|
18
30
|
real_node.proxy = NodeProxy.new(real_node)
|
@@ -20,30 +32,47 @@ module Duby::AST
|
|
20
32
|
|
21
33
|
def initialize(parent, line_number, name, &kids)
|
22
34
|
super(parent, line_number, &kids)
|
23
|
-
@parameters, @block = children
|
24
35
|
@name = name
|
25
36
|
@cast = false
|
26
37
|
end
|
27
|
-
|
38
|
+
|
39
|
+
def arguments
|
40
|
+
@arguments ||= begin
|
41
|
+
args = java.util.ArrayList.new(parameters.size)
|
42
|
+
parameters.each do |param|
|
43
|
+
args.add(param)
|
44
|
+
end
|
45
|
+
args
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def target
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
28
53
|
def infer(typer)
|
29
|
-
@self_type ||=
|
54
|
+
@self_type ||= scope.defining_class
|
30
55
|
|
31
56
|
unless @inferred_type
|
32
57
|
receiver_type = @self_type
|
33
58
|
should_defer = false
|
34
|
-
|
59
|
+
|
35
60
|
parameter_types = parameters.map do |param|
|
36
61
|
typer.infer(param) || should_defer = true
|
37
62
|
end
|
38
|
-
|
39
|
-
parameter_types << Duby::AST.block_type if
|
40
|
-
|
63
|
+
|
64
|
+
parameter_types << Duby::AST.block_type if block
|
65
|
+
|
41
66
|
unless should_defer
|
42
|
-
if parameters.size == 1 && typer.
|
67
|
+
if parameters.size == 1 && typer.known_type(name)
|
43
68
|
# cast operation
|
44
69
|
resolved!
|
45
70
|
self.cast = true
|
46
|
-
@inferred_type = typer.
|
71
|
+
@inferred_type = typer.known_type(name)
|
72
|
+
elsif parameters.size == 0 && scope.static_scope.include?(name)
|
73
|
+
@inlined = Local.new(parent, position, name)
|
74
|
+
proxy.__inline__(@inlined)
|
75
|
+
return proxy.infer(typer)
|
47
76
|
else
|
48
77
|
@inferred_type = typer.method_type(receiver_type, name,
|
49
78
|
parameter_types)
|
@@ -54,17 +83,30 @@ module Duby::AST
|
|
54
83
|
end
|
55
84
|
end
|
56
85
|
end
|
57
|
-
|
58
|
-
@inferred_type
|
86
|
+
|
87
|
+
if @inferred_type
|
88
|
+
if block
|
89
|
+
method = receiver_type.get_method(name, parameter_types)
|
90
|
+
block.prepare(typer, method)
|
91
|
+
end
|
92
|
+
resolved!
|
93
|
+
else
|
94
|
+
typer.defer(proxy)
|
95
|
+
end
|
59
96
|
end
|
60
|
-
|
97
|
+
|
61
98
|
@inferred_type
|
62
99
|
end
|
63
100
|
end
|
64
|
-
|
101
|
+
|
65
102
|
class Call < Node
|
103
|
+
include Java::DubyLangCompiler.Call
|
66
104
|
include Named
|
67
|
-
attr_accessor :
|
105
|
+
attr_accessor :inlined, :proxy
|
106
|
+
|
107
|
+
child :target
|
108
|
+
child :parameters
|
109
|
+
child :block
|
68
110
|
|
69
111
|
def self.new(*args, &block)
|
70
112
|
real_node = super
|
@@ -72,11 +114,20 @@ module Duby::AST
|
|
72
114
|
end
|
73
115
|
|
74
116
|
def initialize(parent, line_number, name, &kids)
|
75
|
-
super(parent, line_number,
|
76
|
-
@target, @parameters, @block = children
|
117
|
+
super(parent, line_number, &kids)
|
77
118
|
@name = name
|
78
119
|
end
|
79
120
|
|
121
|
+
def arguments
|
122
|
+
@arguments ||= begin
|
123
|
+
args = java.util.ArrayList.new(parameters.size)
|
124
|
+
parameters.each do |param|
|
125
|
+
args.add(param)
|
126
|
+
end
|
127
|
+
args
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
80
131
|
def infer(typer)
|
81
132
|
unless @inferred_type
|
82
133
|
receiver_type = typer.infer(target)
|
@@ -85,7 +136,7 @@ module Duby::AST
|
|
85
136
|
typer.infer(param) || should_defer = true
|
86
137
|
end
|
87
138
|
|
88
|
-
parameter_types << Duby::AST.block_type if
|
139
|
+
parameter_types << Duby::AST.block_type if block
|
89
140
|
|
90
141
|
unless should_defer
|
91
142
|
@inferred_type = typer.method_type(receiver_type, name,
|
@@ -96,22 +147,31 @@ module Duby::AST
|
|
96
147
|
return proxy.infer(typer)
|
97
148
|
end
|
98
149
|
end
|
99
|
-
|
100
|
-
@inferred_type
|
150
|
+
|
151
|
+
if @inferred_type
|
152
|
+
if block && !receiver_type.error?
|
153
|
+
method = receiver_type.get_method(name, parameter_types)
|
154
|
+
block.prepare(typer, method)
|
155
|
+
end
|
156
|
+
resolved!
|
157
|
+
else
|
158
|
+
typer.defer(proxy)
|
159
|
+
end
|
101
160
|
end
|
102
|
-
|
161
|
+
|
103
162
|
@inferred_type
|
104
163
|
end
|
105
164
|
end
|
106
165
|
|
107
166
|
class Super < Node
|
108
167
|
include Named
|
109
|
-
attr_accessor :
|
168
|
+
attr_accessor :method, :cast
|
110
169
|
alias :cast? :cast
|
111
170
|
|
171
|
+
child :parameters
|
172
|
+
|
112
173
|
def initialize(parent, line_number)
|
113
174
|
super(parent, line_number)
|
114
|
-
@parameters = children[0]
|
115
175
|
@call_parent = parent
|
116
176
|
@call_parent = (@call_parent = @call_parent.parent) until MethodDefinition === @call_parent
|
117
177
|
@cast = false
|
@@ -123,9 +183,9 @@ module Duby::AST
|
|
123
183
|
|
124
184
|
def infer(typer)
|
125
185
|
@self_type ||= typer.self_type.superclass
|
126
|
-
|
186
|
+
|
127
187
|
unless @inferred_type
|
128
|
-
receiver_type = @call_parent.defining_class
|
188
|
+
receiver_type = @call_parent.defining_class.superclass
|
129
189
|
should_defer = receiver_type.nil?
|
130
190
|
parameter_types = parameters.map do |param|
|
131
191
|
typer.infer(param) || should_defer = true
|