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,28 @@
1
+ import javax.servlet.http.HttpServlet
2
+ import com.google.appengine.ext.duby.db.Model
3
+
4
+ class Post < Model
5
+ def initialize; end
6
+
7
+ property title, String
8
+ property body, Text
9
+ end
10
+
11
+ class DubyApp < HttpServlet
12
+ def_edb(list, 'com/ribrdb/list.dhtml')
13
+
14
+ def doGet(request, response)
15
+ returns :void
16
+ @posts = Post.all.run
17
+ response.getWriter.write(list)
18
+ end
19
+
20
+ def doPost(request, response)
21
+ post = Post.new
22
+ post.title = request.getParameter('title')
23
+ post.body = Text.new(request.getParameter('body'))
24
+ post.save
25
+ doGet(request, response)
26
+ end
27
+
28
+ end
@@ -0,0 +1,15 @@
1
+ <title>Posts</title>
2
+ <body>
3
+ <h1>All Posts:</h1>
4
+ <% for post in @posts %>
5
+ <h2><%= post.title %></h2>
6
+ <p><%= post.body.getValue %></p>
7
+ <% end %>
8
+ <hr>
9
+ <h1>New Post:</h1>
10
+ <form method=post>
11
+ Title: <input type=text name=title><br>
12
+ Body: <textarea name=body></textarea><br>
13
+ <input type=submit>
14
+ </form>
15
+ </body>
@@ -0,0 +1,8 @@
1
+ import "java.lang.StringBuffer"
2
+ import "java.util.ArrayList"
3
+
4
+ list = ArrayList.new
5
+ sb = StringBuffer.new("Hello")
6
+ sb.append(", world")
7
+ list.add(sb)
8
+ puts list
@@ -0,0 +1,3 @@
1
+ def_edb :render, 'test.edb'
2
+ @message = "Hello"
3
+ puts render
@@ -0,0 +1,24 @@
1
+ import "java.lang.System"
2
+
3
+ def fib(a:int)
4
+ if a < 2
5
+ a
6
+ else
7
+ fib(a - 1) + fib(a - 2)
8
+ end
9
+ end
10
+
11
+ def bench(times:int)
12
+ while times > 0
13
+ time_start = System.currentTimeMillis
14
+ puts "fib(45):"
15
+ puts fib(45)
16
+ time_total = System.currentTimeMillis - time_start
17
+ puts "Total time:"
18
+ puts time_total
19
+ times -= 1
20
+ end
21
+ nil
22
+ end
23
+
24
+ bench 10
@@ -0,0 +1,22 @@
1
+ import 'java.util.ArrayList'
2
+
3
+ class Bar
4
+ def initialize
5
+ @a = ArrayList
6
+ end
7
+
8
+ def list=(a:ArrayList)
9
+ @a = a
10
+ end
11
+
12
+ def foo
13
+ puts @a
14
+ end
15
+ end
16
+
17
+ b = Bar.new
18
+ list = ArrayList.new
19
+ list.add('hello')
20
+ list.add('world')
21
+ b.list = list
22
+ b.foo
@@ -0,0 +1,57 @@
1
+ import java.lang.System
2
+
3
+ def run
4
+ puts "Rendering"
5
+ y = -39.0
6
+ while y <= 39.0
7
+ puts
8
+ x = -39.0
9
+ while x <= 39.0
10
+ i = iterate(x/40.0,y/40.0)
11
+ if (i == 0)
12
+ print "*"
13
+ else
14
+ print " "
15
+ end
16
+ x += 1
17
+ end
18
+ y += 1
19
+ end
20
+ puts
21
+ end
22
+
23
+ def iterate(x:double,y:double)
24
+ cr = y-0.5
25
+ ci = x
26
+ zi = 0.0
27
+ zr = 0.0
28
+ i = 0
29
+
30
+ result = 0
31
+ while true
32
+ i += 1
33
+ temp = zr * zi
34
+ zr2 = zr * zr
35
+ zi2 = zi * zi
36
+ zr = zr2 - zi2 + cr
37
+ zi = temp + temp + ci
38
+ if (zi2 + zr2 > 16)
39
+ result = i
40
+ break
41
+ end
42
+ if (i > 1000)
43
+ result = 0
44
+ break
45
+ end
46
+ end
47
+
48
+ result
49
+ end
50
+
51
+ i = 0
52
+ while i < 10
53
+ start = System.currentTimeMillis
54
+ run
55
+ puts "Time: " + (System.currentTimeMillis - start) / 1000.0
56
+ i += 1
57
+ end
@@ -0,0 +1,13 @@
1
+ import "java.lang.System"
2
+
3
+ def foo
4
+ home = System.getProperty "java.home"
5
+ System.setProperty "hello.world", "something"
6
+ hello = System.getProperty "hello.world"
7
+
8
+ puts home
9
+ puts hello
10
+ end
11
+
12
+ puts "Hello world!"
13
+ foo
@@ -0,0 +1,12 @@
1
+ class Foo
2
+ def initialize
3
+ puts 'constructor'
4
+ @hello = 'Hello, '
5
+ end
6
+
7
+ def hello(a:string)
8
+ puts @hello; puts a
9
+ end
10
+ end
11
+
12
+ Foo.new.hello('Duby')
@@ -0,0 +1,20 @@
1
+ import javax.swing.JFrame
2
+ import javax.swing.JButton
3
+ import java.awt.event.ActionListener
4
+
5
+ frame = JFrame.new "Welcome to Duby"
6
+ frame.setSize 300, 300
7
+ frame.setVisible true
8
+
9
+ button = JButton.new "Press me"
10
+ frame.add button
11
+ frame.show
12
+
13
+ class AL; implements ActionListener
14
+ def initialize; end
15
+ def actionPerformed(event)
16
+ JButton(event.getSource).setText "Duby Rocks!"
17
+ end
18
+ end
19
+
20
+ button.addActionListener AL.new
@@ -0,0 +1,15 @@
1
+ def tak(x:fixnum, y:fixnum, z:fixnum)
2
+ unless y < x
3
+ z
4
+ else
5
+ tak( tak(x-1, y, z),
6
+ tak(y-1, z, x),
7
+ tak(z-1, x, y))
8
+ end
9
+ end
10
+
11
+ i = 0
12
+ while i<1000
13
+ tak(24, 16, 8)
14
+ i+=1
15
+ end
@@ -0,0 +1,9 @@
1
+ <html>
2
+ <head>
3
+ <title><%= @message %></title>
4
+ </head>
5
+ <body>
6
+ <h1><%= @message %></h1>
7
+ </body>
8
+ </html>
9
+
Binary file
@@ -0,0 +1,168 @@
1
+ require 'fileutils'
2
+ require 'duby/transform'
3
+ require 'duby/ast'
4
+ require 'duby/typer'
5
+ require 'duby/compiler'
6
+ begin
7
+ require 'bitescript'
8
+ rescue LoadError
9
+ $: << File.dirname(__FILE__) + '/../../bitescript/lib'
10
+ require 'bitescript'
11
+ end
12
+ require 'duby/jvm/compiler'
13
+ require 'duby/jvm/typer'
14
+ Dir[File.dirname(__FILE__) + "/duby/plugin/*"].each {|file| require "#{file}" if file =~ /\.rb$/}
15
+ require 'jruby'
16
+
17
+ module Duby
18
+ def self.run(*args)
19
+ DubyImpl.new.run(*args)
20
+ end
21
+
22
+ def self.compile(*args)
23
+ DubyImpl.new.compile(*args)
24
+ end
25
+
26
+ def self.parse(*args)
27
+ DubyImpl.new.parse(*args)
28
+ end
29
+ end
30
+
31
+ class DubyImpl
32
+ def run(*args)
33
+ ast = parse(*args)
34
+
35
+ main_cls = nil
36
+ compile_ast(ast) do |outfile, builder|
37
+ bytes = builder.generate
38
+ name = builder.class_name.gsub(/\//, '.')
39
+ cls = JRuby.runtime.jruby_class_loader.define_class(name, bytes.to_java_bytes)
40
+ proxy_cls = JavaUtilities.get_proxy_class(name)
41
+ # TODO: using first main; find correct one
42
+ if proxy_cls.respond_to? :main
43
+ main_cls ||= proxy_cls
44
+ end
45
+ end
46
+
47
+ if main_cls
48
+ main_cls.main(args.to_java(:string))
49
+ else
50
+ puts "No main found"
51
+ end
52
+ end
53
+
54
+ def compile(*args)
55
+ process_flags!(args)
56
+
57
+ expand_files(args).each do |duby_file|
58
+ if duby_file == '-e'
59
+ @filename = '-e'
60
+ next
61
+ elsif @filename == '-e'
62
+ ast = parse('-e', duby_file)
63
+ else
64
+ ast = parse(duby_file)
65
+ end
66
+ exit 1 if @error
67
+
68
+ compile_ast(ast) do |filename, builder|
69
+ filename = "#{@dest}#{filename}"
70
+ FileUtils.mkdir_p(File.dirname(filename))
71
+ bytes = builder.generate
72
+ File.open(filename, 'w') {|f| f.write(bytes)}
73
+ end
74
+ @filename = nil
75
+ end
76
+ end
77
+
78
+ def parse(*args)
79
+ process_flags!(args)
80
+ @filename = args.shift
81
+
82
+ if @filename == '-e'
83
+ @filename = 'dash_e'
84
+ src = args[0]
85
+ else
86
+ src = File.read(@filename)
87
+ end
88
+ Duby::AST.type_factory = Duby::JVM::Types::TypeFactory.new(@filename)
89
+ ast = Duby::AST.parse_ruby(src, @filename)
90
+ @transformer = Duby::Transform::Transformer.new
91
+ ast = @transformer.transform(ast, nil)
92
+ @transformer.errors.each do |ex|
93
+ raise ex.cause || ex if @verbose
94
+ puts "#@filename:#{ex.position.start_line+1}: #{ex.message}"
95
+ end
96
+ @error = @transformer.errors.size > 0
97
+ ast
98
+ end
99
+
100
+ def compile_ast(ast, &block)
101
+ typer = Duby::Typer::JVM.new(@filename, @transformer)
102
+ typer.infer(ast)
103
+ begin
104
+ typer.resolve(true)
105
+ ensure
106
+ typer.errors.each do |ex|
107
+ puts ex.message
108
+ puts ex.backtrace if @verbose
109
+ end
110
+ end
111
+
112
+ compiler = @compiler_class.new(@filename)
113
+ ast.compile(compiler, false)
114
+ compiler.generate(&block)
115
+ end
116
+
117
+ def process_flags!(args)
118
+ while args.length > 0
119
+ case args[0]
120
+ when '-V'
121
+ Duby::Typer.verbose = true
122
+ Duby::AST.verbose = true
123
+ Duby::Compiler::JVM.verbose = true
124
+ @verbose = true
125
+ args.shift
126
+ when '-java'
127
+ require 'duby/jvm/source_compiler'
128
+ @compiler_class = Duby::Compiler::JavaSource
129
+ args.shift
130
+ when '-d'
131
+ args.shift
132
+ @dest = File.join(args.shift, '')
133
+ when '-p'
134
+ args.shift
135
+ plugin = args.shift
136
+ require "duby/plugin/#{plugin}"
137
+ when '-I'
138
+ args.shift
139
+ $: << args.shift
140
+ else
141
+ break
142
+ end
143
+ end
144
+ @compiler_class ||= Duby::Compiler::JVM
145
+ end
146
+
147
+ def expand_files(files)
148
+ expanded = []
149
+ files.each do |filename|
150
+ if File.directory?(filename)
151
+ Dir[File.join(filename, '*')].each do |child|
152
+ if File.directory?(child)
153
+ files << child
154
+ elsif child =~ /\.duby$/
155
+ expanded << child
156
+ end
157
+ end
158
+ else
159
+ expanded << filename
160
+ end
161
+ end
162
+ expanded
163
+ end
164
+ end
165
+
166
+ if __FILE__ == $0
167
+ Duby.run(ARGV[0], *ARGV[1..-1])
168
+ end
@@ -0,0 +1,386 @@
1
+ require 'duby/transform'
2
+
3
+ module Duby
4
+ module AST
5
+ class << self
6
+ attr_accessor :verbose
7
+ end
8
+
9
+ # The top of the AST class hierarchy, this represents an abstract AST node.
10
+ # It provides accessors for _children_, an array of all child nodes,
11
+ # _parent_, a reference to this node's parent (nil if none), and _newline_,
12
+ # whether this node represents a new line.
13
+ class Node
14
+ attr_accessor :children
15
+ attr_accessor :parent
16
+ attr_accessor :position
17
+ attr_accessor :newline
18
+ attr_accessor :inferred_type
19
+
20
+ def initialize(parent, position, children = [])
21
+ @parent = parent
22
+ @newline = false
23
+ @inferred_type = nil
24
+ @resolved = false
25
+ @position = position
26
+ if block_given?
27
+ @children = yield(self) || []
28
+ else
29
+ @children = children
30
+ end
31
+ end
32
+
33
+ def line_number
34
+ if @position
35
+ @position.start_line + 1
36
+ else
37
+ 0
38
+ end
39
+ end
40
+
41
+ def log(message)
42
+ puts "* [AST] [#{simple_name}] " + message if AST.verbose
43
+ end
44
+
45
+ def inspect(indent = 0)
46
+ indent_str = ' ' * indent
47
+ str = indent_str + to_s
48
+ children.each do |child|
49
+ if child
50
+ if ::Array === child
51
+ child.each {|ary_child|
52
+ str << "\n#{ary_child.inspect(indent + 1)}"
53
+ }
54
+ elsif ::Hash === child
55
+ str << "\n#{indent_str} #{child.inspect}"
56
+ else
57
+ str << "\n#{child.inspect(indent + 1)}"
58
+ end
59
+ end
60
+ end
61
+ str
62
+ end
63
+
64
+ def simple_name
65
+ self.class.name.split("::")[-1]
66
+ end
67
+
68
+ def to_s; simple_name; end
69
+
70
+ def [](index) children[index] end
71
+
72
+ def each(&b) children.each(&b) end
73
+
74
+ def resolved!
75
+ log "#{to_s} resolved!"
76
+ @resolved = true
77
+ end
78
+
79
+ def resolved?; @resolved end
80
+
81
+ def resolve_if(typer)
82
+ unless resolved?
83
+ @inferred_type = yield
84
+ @inferred_type ? resolved! : typer.defer(self)
85
+ end
86
+ @inferred_type
87
+ end
88
+
89
+ def self.===(other)
90
+ super || (other.kind_of?(NodeProxy) && (self === other.__getobj__))
91
+ end
92
+ end
93
+
94
+ class ErrorNode < Node
95
+ def initialize(parent, error)
96
+ super(parent, error.position)
97
+ @error = error
98
+ @inferred_type = TypeReference::ErrorType
99
+ @resolved = true
100
+ end
101
+
102
+ def infer(typer)
103
+ end
104
+ end
105
+
106
+ module Named
107
+ attr_accessor :name
108
+
109
+ def to_s
110
+ "#{super}(#{name})"
111
+ end
112
+ end
113
+
114
+ module Typed
115
+ attr_accessor :type
116
+ end
117
+
118
+ module Valued
119
+ include Typed
120
+ attr_accessor :value
121
+ end
122
+
123
+ module Literal
124
+ include Typed
125
+ attr_accessor :literal
126
+
127
+ def to_s
128
+ "#{super}(#{literal.inspect})"
129
+ end
130
+ end
131
+
132
+ module Scoped
133
+ def scope
134
+ @scope ||= begin
135
+ scope = parent
136
+ raise "No parent for #{self.class.name} at #{line_number}" if scope.nil?
137
+ scope = scope.parent until scope.class.include?(Scope)
138
+ scope
139
+ end
140
+ end
141
+ end
142
+
143
+ module ClassScoped
144
+ def scope
145
+ @scope ||= begin
146
+ scope = parent
147
+ scope = scope.parent until scope.nil? || ClassDefinition === scope
148
+ scope
149
+ end
150
+ end
151
+ end
152
+
153
+ module Annotated
154
+ attr_accessor :annotations
155
+
156
+ def annotation(name)
157
+ name = name.to_s
158
+ annotations.find {|a| a.name == name}
159
+ end
160
+ end
161
+
162
+ module Scope; end
163
+
164
+ class Colon2 < Node; end
165
+
166
+ class Constant < Node
167
+ include Named
168
+ def initialize(parent, position, name)
169
+ @name = name
170
+ super(parent, position, [])
171
+ end
172
+
173
+ def infer(typer)
174
+ @inferred_type ||= begin
175
+ typer.type_reference(name, false, true)
176
+ end
177
+ end
178
+ end
179
+
180
+ class Self < Node
181
+ def infer(typer)
182
+ @inferred_type ||= typer.self_type
183
+ end
184
+ end
185
+
186
+ class VoidType < Node; end
187
+
188
+ class Annotation < Node
189
+ def initialize(parent, position, klass)
190
+ super(parent, position)
191
+ @class = klass
192
+ @values = []
193
+ end
194
+
195
+ def name
196
+ @class.name
197
+ end
198
+
199
+ def type
200
+ @class
201
+ end
202
+
203
+ def []=(name, value)
204
+ # TODO support annotation arguments
205
+ end
206
+ end
207
+
208
+ class TypeReference < Node
209
+ include Named
210
+ attr_accessor :array
211
+ alias array? array
212
+ attr_accessor :meta
213
+ alias meta? meta
214
+
215
+ def initialize(name, array = false, meta = false, position=nil)
216
+ super(nil, position)
217
+ @name = name
218
+ @array = array
219
+ @meta = meta
220
+ end
221
+
222
+ def to_s
223
+ "Type(#{name}#{array? ? ' array' : ''}#{meta? ? ' meta' : ''})"
224
+ end
225
+
226
+ def ==(other)
227
+ to_s == other.to_s
228
+ end
229
+
230
+ def eql?(other)
231
+ self == other
232
+ end
233
+
234
+ def hash
235
+ to_s.hash
236
+ end
237
+
238
+ def is_parent(other)
239
+ # default behavior now is to disallow any polymorphic types
240
+ self == other
241
+ end
242
+
243
+ def compatible?(other)
244
+ # default behavior is only exact match right now
245
+ self == other ||
246
+ error? || other.error? ||
247
+ unreachable? || other.unreachable?
248
+ end
249
+
250
+ def iterable?
251
+ array?
252
+ end
253
+
254
+ def component_type
255
+ AST.type(name) if array?
256
+ end
257
+
258
+ def narrow(other)
259
+ # only exact match allowed for now, so narrowing is a noop
260
+ if error? || unreachable?
261
+ other
262
+ else
263
+ self
264
+ end
265
+ end
266
+
267
+ def unmeta
268
+ TypeReference.new(name, array, false)
269
+ end
270
+
271
+ def meta
272
+ TypeReference.new(name, array, true)
273
+ end
274
+
275
+ def error?
276
+ name == :error
277
+ end
278
+
279
+ def unreachable?
280
+ name == :unreachable
281
+ end
282
+
283
+ def block?
284
+ name == :block
285
+ end
286
+
287
+ def primitive?
288
+ true
289
+ end
290
+
291
+ NoType = TypeReference.new(:notype)
292
+ NullType = TypeReference.new(:null)
293
+ ErrorType = TypeReference.new(:error)
294
+ UnreachableType = TypeReference.new(:unreachable)
295
+ BlockType = TypeReference.new(:block)
296
+ end
297
+
298
+ class TypeDefinition < TypeReference
299
+ attr_accessor :superclass, :interfaces
300
+
301
+ def initialize(name, superclass, interfaces)
302
+ super(name, false)
303
+
304
+ @superclass = superclass
305
+ @interfaces = interfaces
306
+ end
307
+ end
308
+
309
+ def self.type_factory
310
+ Thread.current[:ast_type_factory]
311
+ end
312
+
313
+ def self.type_factory=(factory)
314
+ Thread.current[:ast_type_factory] = factory
315
+ end
316
+
317
+ # Shortcut method to construct type references
318
+ def self.type(typesym, array = false, meta = false)
319
+ factory = type_factory
320
+ if factory
321
+ factory.type(typesym, array, meta)
322
+ else
323
+ TypeReference.new(typesym, array, meta)
324
+ end
325
+ end
326
+
327
+ def self.no_type
328
+ factory = type_factory
329
+ if factory
330
+ factory.no_type
331
+ else
332
+ TypeReference::NoType
333
+ end
334
+ end
335
+
336
+ def self.error_type
337
+ TypeReference::ErrorType
338
+ end
339
+
340
+ def self.unreachable_type
341
+ TypeReference::UnreachableType
342
+ end
343
+
344
+ def self.block_type
345
+ TypeReference::BlockType
346
+ end
347
+
348
+ def self.fixnum(parent, position, literal)
349
+ factory = type_factory
350
+ if factory
351
+ factory.fixnum(parent, position, literal)
352
+ else
353
+ Fixnum.new(parent, position, literal)
354
+ end
355
+ end
356
+
357
+ def self.float(parent, position, literal)
358
+ factory = type_factory
359
+ if factory
360
+ factory.float(parent, position, literal)
361
+ else
362
+ Float.new(parent, position, literal)
363
+ end
364
+ end
365
+
366
+ def self.defmacro(name, &block)
367
+ @macros ||= {}
368
+ raise "Conflicting macros for #{name}" if @macros[name]
369
+ @macros[name] = block
370
+ end
371
+
372
+ def self.macro(name)
373
+ @macros[name]
374
+ end
375
+ end
376
+ end
377
+
378
+ require 'duby/ast/local'
379
+ require 'duby/ast/call'
380
+ require 'duby/ast/flow'
381
+ require 'duby/ast/literal'
382
+ require 'duby/ast/method'
383
+ require 'duby/ast/class'
384
+ require 'duby/ast/structure'
385
+ require 'duby/ast/type'
386
+ require 'duby/ast/intrinsics'