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.
Files changed (77) hide show
  1. data/History.txt +8 -0
  2. data/README.txt +39 -0
  3. data/Rakefile +13 -0
  4. data/bin/duby +9 -0
  5. data/bin/dubyc +9 -0
  6. data/bin/dubyp +9 -0
  7. data/examples/README +16 -0
  8. data/examples/appengine/Rakefile +72 -0
  9. data/examples/appengine/Readme +27 -0
  10. data/examples/appengine/config.ru +7 -0
  11. data/examples/appengine/lib/duby/plugin/datastore.rb +171 -0
  12. data/examples/appengine/src/com/google/appengine/ext/duby/db/Model.duby +132 -0
  13. data/examples/appengine/src/com/ribrdb/DubyApp.duby +28 -0
  14. data/examples/appengine/src/com/ribrdb/list.dhtml +15 -0
  15. data/examples/construction.duby +8 -0
  16. data/examples/edb.duby +3 -0
  17. data/examples/fib.duby +24 -0
  18. data/examples/fields.duby +22 -0
  19. data/examples/fractal.duby +57 -0
  20. data/examples/java_thing.duby +13 -0
  21. data/examples/simple_class.duby +12 -0
  22. data/examples/swing.duby +20 -0
  23. data/examples/tak.duby +15 -0
  24. data/examples/test.edb +9 -0
  25. data/javalib/JRubyParser.jar +0 -0
  26. data/lib/duby.rb +168 -0
  27. data/lib/duby/ast.rb +386 -0
  28. data/lib/duby/ast/call.rb +145 -0
  29. data/lib/duby/ast/class.rb +154 -0
  30. data/lib/duby/ast/flow.rb +332 -0
  31. data/lib/duby/ast/intrinsics.rb +56 -0
  32. data/lib/duby/ast/literal.rb +97 -0
  33. data/lib/duby/ast/local.rb +92 -0
  34. data/lib/duby/ast/method.rb +244 -0
  35. data/lib/duby/ast/structure.rb +62 -0
  36. data/lib/duby/ast/type.rb +93 -0
  37. data/lib/duby/c/compiler.rb +134 -0
  38. data/lib/duby/compiler.rb +282 -0
  39. data/lib/duby/jvm/compiler.rb +766 -0
  40. data/lib/duby/jvm/method_lookup.rb +193 -0
  41. data/lib/duby/jvm/source_compiler.rb +605 -0
  42. data/lib/duby/jvm/source_generator/builder.rb +387 -0
  43. data/lib/duby/jvm/source_generator/loops.rb +110 -0
  44. data/lib/duby/jvm/source_generator/precompile.rb +170 -0
  45. data/lib/duby/jvm/source_generator/typer.rb +11 -0
  46. data/lib/duby/jvm/typer.rb +131 -0
  47. data/lib/duby/jvm/types.rb +331 -0
  48. data/lib/duby/jvm/types/basic_types.rb +19 -0
  49. data/lib/duby/jvm/types/boolean.rb +11 -0
  50. data/lib/duby/jvm/types/enumerable.rb +63 -0
  51. data/lib/duby/jvm/types/factory.rb +155 -0
  52. data/lib/duby/jvm/types/floats.rb +70 -0
  53. data/lib/duby/jvm/types/integers.rb +110 -0
  54. data/lib/duby/jvm/types/intrinsics.rb +230 -0
  55. data/lib/duby/jvm/types/literals.rb +82 -0
  56. data/lib/duby/jvm/types/methods.rb +381 -0
  57. data/lib/duby/jvm/types/number.rb +92 -0
  58. data/lib/duby/nbcompiler.rb +29 -0
  59. data/lib/duby/old/compiler_old.rb +845 -0
  60. data/lib/duby/old/declaration.rb +72 -0
  61. data/lib/duby/old/mapper.rb +72 -0
  62. data/lib/duby/old/signature.rb +52 -0
  63. data/lib/duby/old/typer_old.rb +163 -0
  64. data/lib/duby/plugin/edb.rb +25 -0
  65. data/lib/duby/plugin/java.rb +42 -0
  66. data/lib/duby/plugin/math.rb +84 -0
  67. data/lib/duby/transform.rb +1028 -0
  68. data/lib/duby/typer.rb +369 -0
  69. data/test/TestUser.class +0 -0
  70. data/test/test_ast.rb +391 -0
  71. data/test/test_compilation.rb +98 -0
  72. data/test/test_java_typer.rb +199 -0
  73. data/test/test_javac_compiler.rb +58 -0
  74. data/test/test_jvm_compiler.rb +1770 -0
  75. data/test/test_math_plugin.rb +87 -0
  76. data/test/test_typer.rb +246 -0
  77. 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