duby 0.0.2-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 +8 -0
- data/README.txt +39 -0
- data/Rakefile +13 -0
- data/bin/duby +9 -0
- data/bin/dubyc +9 -0
- data/bin/dubyp +9 -0
- data/examples/README +16 -0
- data/examples/appengine/Rakefile +72 -0
- data/examples/appengine/Readme +27 -0
- data/examples/appengine/config.ru +7 -0
- data/examples/appengine/lib/duby/plugin/datastore.rb +171 -0
- data/examples/appengine/src/com/google/appengine/ext/duby/db/Model.duby +132 -0
- data/examples/appengine/src/com/ribrdb/DubyApp.duby +28 -0
- data/examples/appengine/src/com/ribrdb/list.dhtml +15 -0
- data/examples/construction.duby +8 -0
- data/examples/edb.duby +3 -0
- data/examples/fib.duby +24 -0
- data/examples/fields.duby +22 -0
- data/examples/fractal.duby +57 -0
- data/examples/java_thing.duby +13 -0
- data/examples/simple_class.duby +12 -0
- data/examples/swing.duby +20 -0
- data/examples/tak.duby +15 -0
- data/examples/test.edb +9 -0
- data/javalib/JRubyParser.jar +0 -0
- data/lib/duby.rb +168 -0
- data/lib/duby/ast.rb +386 -0
- data/lib/duby/ast/call.rb +145 -0
- data/lib/duby/ast/class.rb +154 -0
- data/lib/duby/ast/flow.rb +332 -0
- data/lib/duby/ast/intrinsics.rb +56 -0
- data/lib/duby/ast/literal.rb +97 -0
- data/lib/duby/ast/local.rb +92 -0
- data/lib/duby/ast/method.rb +244 -0
- data/lib/duby/ast/structure.rb +62 -0
- data/lib/duby/ast/type.rb +93 -0
- data/lib/duby/c/compiler.rb +134 -0
- data/lib/duby/compiler.rb +282 -0
- data/lib/duby/jvm/compiler.rb +766 -0
- data/lib/duby/jvm/method_lookup.rb +193 -0
- data/lib/duby/jvm/source_compiler.rb +605 -0
- data/lib/duby/jvm/source_generator/builder.rb +387 -0
- data/lib/duby/jvm/source_generator/loops.rb +110 -0
- data/lib/duby/jvm/source_generator/precompile.rb +170 -0
- data/lib/duby/jvm/source_generator/typer.rb +11 -0
- data/lib/duby/jvm/typer.rb +131 -0
- data/lib/duby/jvm/types.rb +331 -0
- data/lib/duby/jvm/types/basic_types.rb +19 -0
- data/lib/duby/jvm/types/boolean.rb +11 -0
- data/lib/duby/jvm/types/enumerable.rb +63 -0
- data/lib/duby/jvm/types/factory.rb +155 -0
- data/lib/duby/jvm/types/floats.rb +70 -0
- data/lib/duby/jvm/types/integers.rb +110 -0
- data/lib/duby/jvm/types/intrinsics.rb +230 -0
- data/lib/duby/jvm/types/literals.rb +82 -0
- data/lib/duby/jvm/types/methods.rb +381 -0
- data/lib/duby/jvm/types/number.rb +92 -0
- data/lib/duby/nbcompiler.rb +29 -0
- data/lib/duby/old/compiler_old.rb +845 -0
- data/lib/duby/old/declaration.rb +72 -0
- data/lib/duby/old/mapper.rb +72 -0
- data/lib/duby/old/signature.rb +52 -0
- data/lib/duby/old/typer_old.rb +163 -0
- data/lib/duby/plugin/edb.rb +25 -0
- data/lib/duby/plugin/java.rb +42 -0
- data/lib/duby/plugin/math.rb +84 -0
- data/lib/duby/transform.rb +1028 -0
- data/lib/duby/typer.rb +369 -0
- data/test/TestUser.class +0 -0
- data/test/test_ast.rb +391 -0
- data/test/test_compilation.rb +98 -0
- data/test/test_java_typer.rb +199 -0
- data/test/test_javac_compiler.rb +58 -0
- data/test/test_jvm_compiler.rb +1770 -0
- data/test/test_math_plugin.rb +87 -0
- data/test/test_typer.rb +246 -0
- metadata +156 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
module Duby::AST
|
2
|
+
class Print < Node
|
3
|
+
attr_accessor :parameters
|
4
|
+
attr_accessor :println
|
5
|
+
|
6
|
+
def initialize(parent, line_number, println, &block)
|
7
|
+
super(parent, line_number, &block)
|
8
|
+
@parameters = children
|
9
|
+
@println = println
|
10
|
+
end
|
11
|
+
|
12
|
+
def infer(typer)
|
13
|
+
if parameters.size > 0
|
14
|
+
resolved = parameters.select {|param| typer.infer(param); param.resolved?}
|
15
|
+
resolved! if resolved.size == parameters.size
|
16
|
+
else
|
17
|
+
resolved!
|
18
|
+
end
|
19
|
+
typer.no_type
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
defmacro('puts') do |transformer, fcall, parent|
|
24
|
+
Print.new(parent, fcall.position, true) do |print|
|
25
|
+
if fcall.respond_to?(:args_node) && fcall.args_node
|
26
|
+
fcall.args_node.child_nodes.map do |arg|
|
27
|
+
transformer.transform(arg, print)
|
28
|
+
end
|
29
|
+
else
|
30
|
+
[]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
defmacro('print') do |transformer, fcall, parent|
|
36
|
+
Print.new(parent, fcall.position, false) do |print|
|
37
|
+
if fcall.respond_to?(:args_node) && fcall.args_node
|
38
|
+
fcall.args_node.child_nodes.map do |arg|
|
39
|
+
transformer.transform(arg, print)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
[]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class InlineCode
|
48
|
+
def initialize(&block)
|
49
|
+
@block = block
|
50
|
+
end
|
51
|
+
|
52
|
+
def inline(transformer, call)
|
53
|
+
@block.call(transformer, call)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Duby::AST
|
2
|
+
class Array < Node
|
3
|
+
def initialize(parent, line_number, &block)
|
4
|
+
super(parent, line_number, &block)
|
5
|
+
end
|
6
|
+
|
7
|
+
def infer(typer)
|
8
|
+
@inferred_type = typer.array_type
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Fixnum < Node
|
13
|
+
include Literal
|
14
|
+
|
15
|
+
def initialize(parent, line_number, literal)
|
16
|
+
super(parent, line_number)
|
17
|
+
@literal = literal
|
18
|
+
end
|
19
|
+
|
20
|
+
def infer(typer)
|
21
|
+
return @inferred_type if resolved?
|
22
|
+
resolved!
|
23
|
+
@inferred_type = typer.fixnum_type
|
24
|
+
end
|
25
|
+
|
26
|
+
def ==(other)
|
27
|
+
@literal == other.literal
|
28
|
+
end
|
29
|
+
|
30
|
+
def eql?(other)
|
31
|
+
self.class == other.class && @literal.eql?(other.literal)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Float < Node
|
36
|
+
include Literal
|
37
|
+
|
38
|
+
def initialize(parent, line_number, literal)
|
39
|
+
super(parent, line_number)
|
40
|
+
@literal = literal
|
41
|
+
end
|
42
|
+
|
43
|
+
def infer(typer)
|
44
|
+
return @inferred_type if resolved?
|
45
|
+
resolved!
|
46
|
+
@inferred_type = typer.float_type
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Hash < Node; end
|
51
|
+
|
52
|
+
class String < Node
|
53
|
+
include Literal
|
54
|
+
|
55
|
+
def initialize(parent, line_number, literal)
|
56
|
+
super(parent, line_number)
|
57
|
+
@literal = literal
|
58
|
+
end
|
59
|
+
|
60
|
+
def infer(typer)
|
61
|
+
return @inferred_type if resolved?
|
62
|
+
resolved!
|
63
|
+
@inferred_type ||= typer.string_type
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class Symbol < Node; end
|
68
|
+
|
69
|
+
class Boolean < Node
|
70
|
+
include Literal
|
71
|
+
|
72
|
+
def initialize(parent, line_number, literal)
|
73
|
+
super(parent, line_number)
|
74
|
+
@literal = literal
|
75
|
+
end
|
76
|
+
|
77
|
+
def infer(typer)
|
78
|
+
return @inferred_type if resolved?
|
79
|
+
resolved!
|
80
|
+
@inferred_type ||= typer.boolean_type
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class Null < Node
|
85
|
+
include Literal
|
86
|
+
|
87
|
+
def initialize(parent, line_number)
|
88
|
+
super(parent, line_number)
|
89
|
+
end
|
90
|
+
|
91
|
+
def infer(typer)
|
92
|
+
return @inferred_type if resolved?
|
93
|
+
resolved!
|
94
|
+
@inferred_type ||= typer.null_type
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Duby::AST
|
2
|
+
class LocalDeclaration < Node
|
3
|
+
include Named
|
4
|
+
include Typed
|
5
|
+
include Scoped
|
6
|
+
|
7
|
+
def initialize(parent, line_number, name, captured=false, &block)
|
8
|
+
super(parent, line_number, &block)
|
9
|
+
@name = name
|
10
|
+
@captured = captured
|
11
|
+
@type = children[0]
|
12
|
+
end
|
13
|
+
|
14
|
+
def captured?
|
15
|
+
@captured
|
16
|
+
end
|
17
|
+
|
18
|
+
def infer(typer)
|
19
|
+
unless resolved?
|
20
|
+
resolved!
|
21
|
+
@inferred_type = typer.known_types[type] || type
|
22
|
+
if @inferred_type
|
23
|
+
resolved!
|
24
|
+
typer.learn_local_type(scope, name, @inferred_type)
|
25
|
+
else
|
26
|
+
typer.defer(self)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
@inferred_type
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class LocalAssignment < Node
|
34
|
+
include Named
|
35
|
+
include Valued
|
36
|
+
include Scoped
|
37
|
+
|
38
|
+
def initialize(parent, line_number, name, captured=false, &block)
|
39
|
+
super(parent, line_number, children, &block)
|
40
|
+
@captured = captured
|
41
|
+
@value = children[0]
|
42
|
+
@name = name
|
43
|
+
end
|
44
|
+
|
45
|
+
def captured?
|
46
|
+
@captured
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
"LocalAssignment(name = #{name}, scope = #{scope}, captured = #{captured?})"
|
51
|
+
end
|
52
|
+
|
53
|
+
def infer(typer)
|
54
|
+
unless @inferred_type
|
55
|
+
@inferred_type = typer.learn_local_type(scope, name, typer.infer(value))
|
56
|
+
|
57
|
+
@inferred_type ? resolved! : typer.defer(self)
|
58
|
+
end
|
59
|
+
|
60
|
+
@inferred_type
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class Local < Node
|
65
|
+
include Named
|
66
|
+
include Scoped
|
67
|
+
|
68
|
+
def initialize(parent, line_number, name, captured=false)
|
69
|
+
super(parent, line_number, [])
|
70
|
+
@name = name
|
71
|
+
@captured = captured
|
72
|
+
end
|
73
|
+
|
74
|
+
def captured?
|
75
|
+
@captured
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_s
|
79
|
+
"Local(name = #{name}, scope = #{scope}, captured = #{captured?})"
|
80
|
+
end
|
81
|
+
|
82
|
+
def infer(typer)
|
83
|
+
unless @inferred_type
|
84
|
+
@inferred_type = typer.local_type(scope, name)
|
85
|
+
|
86
|
+
@inferred_type ? resolved! : typer.defer(self)
|
87
|
+
end
|
88
|
+
|
89
|
+
@inferred_type
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,244 @@
|
|
1
|
+
module Duby::AST
|
2
|
+
class Arguments < Node
|
3
|
+
attr_accessor :args, :opt_args, :rest_arg, :block_arg
|
4
|
+
|
5
|
+
def initialize(parent, line_number, &block)
|
6
|
+
super(parent, line_number, &block)
|
7
|
+
@args, @opt_args, @rest_arg, @block_arg = children
|
8
|
+
end
|
9
|
+
|
10
|
+
def infer(typer)
|
11
|
+
unless @inferred_type
|
12
|
+
@inferred_type = args ? args.map {|arg| typer.infer(arg)} : []
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Argument < Node
|
18
|
+
include Typed
|
19
|
+
end
|
20
|
+
|
21
|
+
class RequiredArgument < Argument
|
22
|
+
include Named
|
23
|
+
include Scoped
|
24
|
+
|
25
|
+
def initialize(parent, line_number, name)
|
26
|
+
super(parent, line_number)
|
27
|
+
|
28
|
+
@name = name
|
29
|
+
end
|
30
|
+
|
31
|
+
def infer(typer)
|
32
|
+
unless @inferred_type
|
33
|
+
# if not already typed, check parent of parent (MethodDefinition) for signature info
|
34
|
+
method_def = parent.parent
|
35
|
+
signature = method_def.signature
|
36
|
+
|
37
|
+
# if signature, search for this argument
|
38
|
+
if signature[name.intern]
|
39
|
+
@inferred_type = typer.learn_local_type(scope, name, signature[name.intern])
|
40
|
+
else
|
41
|
+
@inferred_type = typer.local_type(scope, name)
|
42
|
+
end
|
43
|
+
|
44
|
+
unless @inferred_type
|
45
|
+
typer.defer(self)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
@inferred_type
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class OptionalArgument < Argument
|
54
|
+
include Named
|
55
|
+
include Scoped
|
56
|
+
attr_accessor :child
|
57
|
+
|
58
|
+
def initialize(parent, line_number, name, &block)
|
59
|
+
super(parent, line_number, &block)
|
60
|
+
@child = children[0]
|
61
|
+
@name = name
|
62
|
+
end
|
63
|
+
|
64
|
+
def infer(typer)
|
65
|
+
unless @inferred_type
|
66
|
+
# if not already typed, check parent of parent (MethodDefinition) for signature info
|
67
|
+
method_def = parent.parent
|
68
|
+
signature = method_def.signature
|
69
|
+
|
70
|
+
# if signature, search for this argument
|
71
|
+
@inferred_type = child.infer(typer)
|
72
|
+
if @inferred_type
|
73
|
+
typer.learn_local_type(scope, name, @inferred_type)
|
74
|
+
signature[name.intern] = @inferred_type
|
75
|
+
else
|
76
|
+
typer.defer(self)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
@inferred_type
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class RestArgument < Argument
|
85
|
+
include Named
|
86
|
+
include Scoped
|
87
|
+
|
88
|
+
def initialize(parent, line_number, name)
|
89
|
+
super(parent, line_number)
|
90
|
+
|
91
|
+
@name = name
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class BlockArgument < Argument
|
96
|
+
include Named
|
97
|
+
|
98
|
+
def initialize(parent, line_number, name)
|
99
|
+
super(parent, line_number)
|
100
|
+
|
101
|
+
@name = name
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class MethodDefinition < Node
|
106
|
+
include Annotated
|
107
|
+
include Named
|
108
|
+
include Scope
|
109
|
+
attr_accessor :signature, :arguments, :body, :defining_class
|
110
|
+
|
111
|
+
def initialize(parent, line_number, name, annotations=[], &block)
|
112
|
+
@annotations = annotations
|
113
|
+
super(parent, line_number, &block)
|
114
|
+
@signature, @arguments, @body = children
|
115
|
+
@name = name
|
116
|
+
end
|
117
|
+
|
118
|
+
def name
|
119
|
+
super
|
120
|
+
end
|
121
|
+
|
122
|
+
def infer(typer)
|
123
|
+
@defining_class ||= typer.self_type
|
124
|
+
typer.infer(arguments)
|
125
|
+
typer.infer_signature(self)
|
126
|
+
forced_type = signature[:return]
|
127
|
+
inferred_type = body ? typer.infer(body) : typer.no_type
|
128
|
+
|
129
|
+
if !inferred_type
|
130
|
+
typer.defer(self)
|
131
|
+
else
|
132
|
+
actual_type = if forced_type.nil?
|
133
|
+
inferred_type
|
134
|
+
else
|
135
|
+
forced_type
|
136
|
+
end
|
137
|
+
if actual_type.unreachable?
|
138
|
+
actual_type = typer.no_type
|
139
|
+
end
|
140
|
+
|
141
|
+
if !abstract? &&
|
142
|
+
forced_type != typer.no_type &&
|
143
|
+
!actual_type.is_parent(inferred_type)
|
144
|
+
raise Duby::Typer::InferenceError.new(
|
145
|
+
"Inferred return type %s is incompatible with declared %s" %
|
146
|
+
[inferred_type, actual_type], self)
|
147
|
+
end
|
148
|
+
|
149
|
+
@inferred_type = typer.learn_method_type(defining_class, name, arguments.inferred_type, actual_type, signature[:throws])
|
150
|
+
|
151
|
+
# learn the other overloads as well
|
152
|
+
args_for_opt = []
|
153
|
+
if arguments.args
|
154
|
+
arguments.args.each do |arg|
|
155
|
+
if OptionalArgument === arg
|
156
|
+
arg_types_for_opt = args_for_opt.map do |arg_for_opt|
|
157
|
+
arg_for_opt.infer(typer)
|
158
|
+
end
|
159
|
+
typer.learn_method_type(defining_class, name, arg_types_for_opt, actual_type, signature[:throws])
|
160
|
+
end
|
161
|
+
args_for_opt << arg
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
signature[:return] = @inferred_type
|
166
|
+
end
|
167
|
+
|
168
|
+
@inferred_type
|
169
|
+
end
|
170
|
+
|
171
|
+
def abstract?
|
172
|
+
node = parent
|
173
|
+
while node && !node.kind_of?(Scope)
|
174
|
+
node = node.parent
|
175
|
+
end
|
176
|
+
InterfaceDeclaration === node
|
177
|
+
end
|
178
|
+
|
179
|
+
def static?
|
180
|
+
false
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
class StaticMethodDefinition < MethodDefinition
|
185
|
+
def defining_class
|
186
|
+
@defining_class.meta
|
187
|
+
end
|
188
|
+
|
189
|
+
def static?
|
190
|
+
true
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
class ConstructorDefinition < MethodDefinition
|
195
|
+
attr_accessor :delegate_args, :calls_super
|
196
|
+
|
197
|
+
def initialize(*args)
|
198
|
+
super
|
199
|
+
extract_delegate_constructor
|
200
|
+
end
|
201
|
+
|
202
|
+
def first_node
|
203
|
+
if @body.kind_of? Body
|
204
|
+
@body.children[0]
|
205
|
+
else
|
206
|
+
@body
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def first_node=(new_node)
|
211
|
+
if @body.kind_of? Body
|
212
|
+
@body.children[0] = new_node
|
213
|
+
else
|
214
|
+
@body = children[2] = new_node
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def extract_delegate_constructor
|
219
|
+
# TODO verify that this constructor exists during type inference.
|
220
|
+
possible_delegate = first_node
|
221
|
+
if FunctionalCall === possible_delegate &&
|
222
|
+
possible_delegate.name == 'initialize'
|
223
|
+
@delegate_args = possible_delegate.parameters
|
224
|
+
elsif Super === possible_delegate
|
225
|
+
@calls_super = true
|
226
|
+
@delegate_args = possible_delegate.parameters
|
227
|
+
unless @delegate_args
|
228
|
+
args = arguments.children.map {|x| x || []}
|
229
|
+
@delegate_args = args.flatten.map do |arg|
|
230
|
+
Local.new(self, possible_delegate.position, arg.name)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
self.first_node = Noop.new(self, position) if @delegate_args
|
235
|
+
end
|
236
|
+
|
237
|
+
def infer(typer)
|
238
|
+
unless @inferred_type
|
239
|
+
delegate_args.each {|a| typer.infer(a)} if delegate_args
|
240
|
+
end
|
241
|
+
super
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|