mirah 0.0.4-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 (141) hide show
  1. data/History.txt +15 -0
  2. data/README.txt +51 -0
  3. data/Rakefile +86 -0
  4. data/bin/duby +10 -0
  5. data/bin/dubyc +10 -0
  6. data/bin/dubyp +10 -0
  7. data/bin/jrubyp +36 -0
  8. data/bin/mirah +9 -0
  9. data/bin/mirah.cmd +1 -0
  10. data/bin/mirahc +9 -0
  11. data/bin/mirahc.cmd +1 -0
  12. data/bin/mirahp +9 -0
  13. data/bin/mirahp.cmd +1 -0
  14. data/examples/ant/example-build.xml +7 -0
  15. data/examples/appengine/Rakefile +19 -0
  16. data/examples/appengine/Readme +29 -0
  17. data/examples/appengine/src/org/mirah/MirahApp.mirah +57 -0
  18. data/examples/appengine/src/org/mirah/list.dhtml +15 -0
  19. data/examples/appengine/war/WEB-INF/lib/dubydatastore.jar +0 -0
  20. data/examples/bintrees.mirah +66 -0
  21. data/examples/construction.mirah +8 -0
  22. data/examples/dynamic.mirah +17 -0
  23. data/examples/edb.mirah +3 -0
  24. data/examples/fib.mirah +16 -0
  25. data/examples/fields.mirah +22 -0
  26. data/examples/fractal.mirah +55 -0
  27. data/examples/java_thing.mirah +13 -0
  28. data/examples/plugins/appengine/Rakefile +55 -0
  29. data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +375 -0
  30. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +336 -0
  31. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +113 -0
  32. data/examples/simple_class.mirah +12 -0
  33. data/examples/sort_closure.mirah +7 -0
  34. data/examples/swing.mirah +20 -0
  35. data/examples/tak.mirah +15 -0
  36. data/examples/test.edb +9 -0
  37. data/examples/wiki/Rakefile +18 -0
  38. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +324 -0
  39. data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +42 -0
  40. data/examples/wiki/src/org/mirah/wiki/error.eduby.html +2 -0
  41. data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +69 -0
  42. data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +7 -0
  43. data/examples/wiki/src/org/mirah/wiki/view.eduby.html +15 -0
  44. data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
  45. data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
  46. data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
  47. data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
  48. data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
  49. data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
  50. data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
  51. data/examples/wiki/war/app.yaml +21 -0
  52. data/examples/wiki/war/public/favicon.ico +0 -0
  53. data/examples/wiki/war/public/images/appengine_duby.png +0 -0
  54. data/examples/wiki/war/public/images/back.gif +0 -0
  55. data/examples/wiki/war/public/images/dir.gif +0 -0
  56. data/examples/wiki/war/public/images/file.gif +0 -0
  57. data/examples/wiki/war/public/javascripts/prettify.js +61 -0
  58. data/examples/wiki/war/public/robots.txt +0 -0
  59. data/examples/wiki/war/public/stylesheets/main.css +156 -0
  60. data/examples/wiki/war/public/stylesheets/prettify.css +1 -0
  61. data/examples/wiki/war/public/stylesheets/sh_style.css +66 -0
  62. data/examples/wiki/war/public/stylesheets/source.css +21 -0
  63. data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
  64. data/examples/wiki/war/public/wmd/images/bg.png +0 -0
  65. data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
  66. data/examples/wiki/war/public/wmd/images/bold.png +0 -0
  67. data/examples/wiki/war/public/wmd/images/code.png +0 -0
  68. data/examples/wiki/war/public/wmd/images/h1.png +0 -0
  69. data/examples/wiki/war/public/wmd/images/hr.png +0 -0
  70. data/examples/wiki/war/public/wmd/images/img.png +0 -0
  71. data/examples/wiki/war/public/wmd/images/italic.png +0 -0
  72. data/examples/wiki/war/public/wmd/images/link.png +0 -0
  73. data/examples/wiki/war/public/wmd/images/ol.png +0 -0
  74. data/examples/wiki/war/public/wmd/images/redo.png +0 -0
  75. data/examples/wiki/war/public/wmd/images/separator.png +0 -0
  76. data/examples/wiki/war/public/wmd/images/ul.png +0 -0
  77. data/examples/wiki/war/public/wmd/images/undo.png +0 -0
  78. data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
  79. data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
  80. data/examples/wiki/war/public/wmd/showdown.js +421 -0
  81. data/examples/wiki/war/public/wmd/wmd-base.js +1799 -0
  82. data/examples/wiki/war/public/wmd/wmd-plus.js +311 -0
  83. data/examples/wiki/war/public/wmd/wmd.js +73 -0
  84. data/javalib/JRubyParser.jar +0 -0
  85. data/javalib/dynalang-invoke-0.1.jar +0 -0
  86. data/javalib/mirah-bootstrap.jar +0 -0
  87. data/javalib/mirah-parser.jar +0 -0
  88. data/lib/duby.rb +2 -0
  89. data/lib/mirah.rb +338 -0
  90. data/lib/mirah/appengine_tasks.rb +146 -0
  91. data/lib/mirah/ast.rb +615 -0
  92. data/lib/mirah/ast/call.rb +307 -0
  93. data/lib/mirah/ast/class.rb +311 -0
  94. data/lib/mirah/ast/flow.rb +364 -0
  95. data/lib/mirah/ast/intrinsics.rb +470 -0
  96. data/lib/mirah/ast/literal.rb +154 -0
  97. data/lib/mirah/ast/local.rb +89 -0
  98. data/lib/mirah/ast/method.rb +360 -0
  99. data/lib/mirah/ast/scope.rb +208 -0
  100. data/lib/mirah/ast/structure.rb +226 -0
  101. data/lib/mirah/ast/type.rb +130 -0
  102. data/lib/mirah/compiler.rb +341 -0
  103. data/lib/mirah/env.rb +33 -0
  104. data/lib/mirah/jvm/base.rb +258 -0
  105. data/lib/mirah/jvm/compiler.rb +885 -0
  106. data/lib/mirah/jvm/method_lookup.rb +203 -0
  107. data/lib/mirah/jvm/source_compiler.rb +737 -0
  108. data/lib/mirah/jvm/source_generator/builder.rb +444 -0
  109. data/lib/mirah/jvm/source_generator/loops.rb +110 -0
  110. data/lib/mirah/jvm/source_generator/precompile.rb +188 -0
  111. data/lib/mirah/jvm/source_generator/typer.rb +11 -0
  112. data/lib/mirah/jvm/typer.rb +151 -0
  113. data/lib/mirah/jvm/types.rb +416 -0
  114. data/lib/mirah/jvm/types/basic_types.rb +33 -0
  115. data/lib/mirah/jvm/types/boolean.rb +17 -0
  116. data/lib/mirah/jvm/types/enumerable.rb +65 -0
  117. data/lib/mirah/jvm/types/extensions.rb +86 -0
  118. data/lib/mirah/jvm/types/factory.rb +186 -0
  119. data/lib/mirah/jvm/types/floats.rb +86 -0
  120. data/lib/mirah/jvm/types/integers.rb +171 -0
  121. data/lib/mirah/jvm/types/intrinsics.rb +376 -0
  122. data/lib/mirah/jvm/types/literals.rb +74 -0
  123. data/lib/mirah/jvm/types/methods.rb +614 -0
  124. data/lib/mirah/jvm/types/number.rb +143 -0
  125. data/lib/mirah/nbcompiler.rb +29 -0
  126. data/lib/mirah/plugin/edb.rb +29 -0
  127. data/lib/mirah/plugin/gwt.rb +173 -0
  128. data/lib/mirah/plugin/java.rb +55 -0
  129. data/lib/mirah/transform.rb +266 -0
  130. data/lib/mirah/transform2.rb +728 -0
  131. data/lib/mirah/typer.rb +407 -0
  132. data/lib/mirah_task.rb +107 -0
  133. data/test/test_ast.rb +359 -0
  134. data/test/test_compilation.rb +112 -0
  135. data/test/test_env.rb +42 -0
  136. data/test/test_gwt.rb +58 -0
  137. data/test/test_java_typer.rb +183 -0
  138. data/test/test_javac_compiler.rb +63 -0
  139. data/test/test_jvm_compiler.rb +2607 -0
  140. data/test/test_typer.rb +221 -0
  141. metadata +235 -0
@@ -0,0 +1,208 @@
1
+ module Duby
2
+ module AST
3
+ module Scoped
4
+ def scope
5
+ @scope ||= begin
6
+ scope = parent
7
+ until scope.nil? || scope.class.include?(Scope)
8
+ scope = scope.parent
9
+ end
10
+ scope
11
+ end
12
+ end
13
+
14
+ def containing_scope
15
+ scope = self.scope.static_scope
16
+ while !scope.shadowed?(name) && scope.parent && scope.parent.include?(name)
17
+ scope = scope.parent
18
+ end
19
+ scope
20
+ end
21
+ end
22
+
23
+ module Scope
24
+ include Scoped
25
+ attr_writer :static_scope, :type_scope
26
+ def static_scope
27
+ @static_scope ||= StaticScope.new(self)
28
+ end
29
+ end
30
+
31
+ module ClassScoped
32
+ def class_scope
33
+ @class_scope ||= begin
34
+ scope = parent
35
+ scope = scope.parent until scope.nil? || ClassDefinition === scope
36
+ scope
37
+ end
38
+ end
39
+ end
40
+
41
+ class StaticScope
42
+ java_import 'java.util.LinkedHashMap'
43
+ attr_reader :parent
44
+ attr_writer :self_type, :self_node, :package
45
+
46
+ def initialize(node, parent=nil)
47
+ @scope_node = node
48
+ @vars = {}
49
+ @var_types = {}
50
+ @parent = parent
51
+ @children = {}
52
+ @imports = {}
53
+ @search_packages = []
54
+ @shadowed = {}
55
+ end
56
+
57
+ def <<(name)
58
+ @vars[name] = true
59
+ end
60
+
61
+ def shadow(name)
62
+ @shadowed[name] = @vars[name] = true
63
+ end
64
+
65
+ def shadowed?(name)
66
+ @shadowed[name]
67
+ end
68
+
69
+ def locals
70
+ @vars.keys
71
+ end
72
+
73
+ def local_type(name)
74
+ @var_types[name]
75
+ end
76
+
77
+ def learn_local_type(name, type)
78
+ return unless type
79
+ existing_type = local_type(name)
80
+ if existing_type
81
+ unless existing_type.assignable_from?(type)
82
+ raise Duby::Typer::InferenceError.new(
83
+ "Can't assign #{type.full_name} to " \
84
+ "variable of type #{existing_type.full_name}")
85
+ end
86
+ existing_type
87
+ elsif type
88
+ @var_types[name] = type
89
+ end
90
+ end
91
+
92
+ def include?(name, include_parent=true)
93
+ @vars.include?(name) ||
94
+ (include_parent && parent && parent.include?(name))
95
+ end
96
+
97
+ def captured?(name)
98
+ if !include?(name, false)
99
+ return false
100
+ elsif parent && parent.include?(name)
101
+ return true
102
+ else
103
+ return children.any? {|child| child.include?(name, false)}
104
+ end
105
+ end
106
+
107
+ def children
108
+ @children.keys
109
+ end
110
+
111
+ def add_child(scope)
112
+ @children[scope] = true
113
+ end
114
+
115
+ def remove_child(scope)
116
+ @children.delete(scope)
117
+ end
118
+
119
+ def parent=(parent)
120
+ @parent.remove_child(self) if @parent
121
+ parent.add_child(self)
122
+ @parent = parent
123
+ end
124
+
125
+ def outer_scope
126
+ node = @scope_node.scope
127
+ node && node.static_scope
128
+ end
129
+
130
+ def self_type
131
+ if @self_type.nil? && parent
132
+ @self_type = parent.self_type
133
+ end
134
+ @self_type
135
+ end
136
+
137
+ def self_node
138
+ if @self_node.nil? && parent
139
+ @self_node = parent.self_node
140
+ end
141
+ @self_node
142
+ end
143
+
144
+ def binding_type(defining_class=nil, duby=nil)
145
+ @binding_type ||= begin
146
+ if parent
147
+ parent.binding_type(defining_class, duby)
148
+ else
149
+ name = "#{defining_class.name}$#{duby.tmp}"
150
+ factory = Duby::AST.type_factory
151
+ if factory
152
+ factory.declare_type(@scope_node, name)
153
+ else
154
+ Duby::AST::TypeReference.new(name, false, false)
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ def binding_type=(type)
161
+ if parent
162
+ parent.binding_type = type
163
+ else
164
+ @binding_type = type
165
+ end
166
+ end
167
+
168
+ def has_binding?
169
+ @binding_type != nil || (parent && parent.has_binding?)
170
+ end
171
+
172
+ def package
173
+ @package || outer_scope.package
174
+ end
175
+
176
+ def fetch_imports(map)
177
+ parent_scope = outer_scope
178
+ parent_scope.fetch_imports(map) if parent_scope
179
+
180
+ map.update(@imports)
181
+ end
182
+
183
+ def fetch_packages(list)
184
+ parent_scope = outer_scope
185
+ parent_scope.fetch_packages(list) if parent_scope
186
+
187
+ list.concat(@search_packages)
188
+ end
189
+
190
+ def imports
191
+ @cached_imports ||= fetch_imports({})
192
+ end
193
+
194
+ def search_packages
195
+ @cached_packages ||= fetch_packages([])
196
+ end
197
+
198
+ def import(full_name, short_name)
199
+ return if full_name == short_name
200
+ if short_name == '*'
201
+ @search_packages << full_name.sub(/\.\*$/, '')
202
+ else
203
+ @imports[short_name] = full_name
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,226 @@
1
+ module Duby::AST
2
+ class Body < Node
3
+ def initialize(parent, line_number, &block)
4
+ super(parent, line_number, &block)
5
+ end
6
+
7
+ # Type of a block is the type of its final element
8
+ def infer(typer)
9
+ unless @inferred_type
10
+ @typer ||= typer
11
+ @self_type ||= typer.self_type
12
+ if children.size == 0
13
+ @inferred_type = typer.no_type
14
+ else
15
+ children.each {|child| @inferred_type = typer.infer(child)}
16
+ end
17
+
18
+ if @inferred_type
19
+ resolved!
20
+ else
21
+ typer.defer(self)
22
+ end
23
+ end
24
+
25
+ @inferred_type
26
+ end
27
+
28
+ def <<(node)
29
+ super
30
+ if @typer
31
+ orig_self = @typer.self_type
32
+ @typer.known_types['self'] = @self_type
33
+ @typer.infer(node)
34
+ @typer.known_types['self'] = orig_self
35
+ end
36
+ self
37
+ end
38
+ end
39
+
40
+ # class << self
41
+ class ClassAppendSelf < Body
42
+ include Scope
43
+ include Scoped
44
+
45
+ def initialize(parent, line_number, &block)
46
+ super(parent, line_number, &block)
47
+ end
48
+
49
+ def infer(typer)
50
+ static_scope.self_type = scope.static_scope.self_type.meta
51
+ super
52
+ end
53
+ end
54
+
55
+ class ScopedBody < Body
56
+ include Scope
57
+ include Scoped
58
+
59
+ def infer(typer)
60
+ static_scope.self_type ||= typer.self_type
61
+ super
62
+ end
63
+
64
+ def inspect_children(indent=0)
65
+ indent_str = ' ' * indent
66
+ str = ''
67
+ if static_scope.self_node
68
+ str << "\n#{indent_str}self:\n" << static_scope.self_node.inspect(indent + 1)
69
+ end
70
+ str << "\n#{indent_str}body:" << super(indent + 1)
71
+ end
72
+ end
73
+
74
+ class Block < Node
75
+ include Scoped
76
+ include Scope
77
+ include Java::DubyLangCompiler::Block
78
+ child :args
79
+ child :body
80
+
81
+ def initialize(parent, position, &block)
82
+ super(parent, position) do
83
+ static_scope.parent = scope.static_scope
84
+ yield(self) if block_given?
85
+ end
86
+ end
87
+
88
+ def prepare(typer, method)
89
+ duby = typer.transformer
90
+ interface = method.argument_types[-1]
91
+ outer_class = scope.defining_class
92
+ binding = scope.binding_type(duby)
93
+ name = "#{outer_class.name}$#{duby.tmp}"
94
+ klass = duby.define_closure(position, name, outer_class)
95
+ klass.interfaces = [interface]
96
+ klass.define_constructor(position,
97
+ ['binding', binding]) do |c|
98
+ duby.eval("@binding = binding", '-', c, 'binding')
99
+ end
100
+
101
+ # TODO We need a special scope here that allows access to the
102
+ # outer class.
103
+ static_scope.self_type = typer.infer(klass)
104
+
105
+ add_methods(klass, binding, typer)
106
+
107
+ call = parent
108
+ instance = Call.new(call, position, 'new')
109
+ instance.target = Constant.new(call, position, name)
110
+ instance.parameters = [
111
+ BindingReference.new(instance, position, binding)
112
+ ]
113
+ call.parameters << instance
114
+ call.block = nil
115
+ typer.infer(instance)
116
+ end
117
+
118
+ def add_methods(klass, binding, typer)
119
+ found_def = false
120
+ body.each do |node|
121
+ if node.kind_of?(MethodDefinition)
122
+ found_def = true
123
+ node.static_scope = static_scope
124
+ node.binding_type = binding
125
+ klass.append_node(node)
126
+ end
127
+ end
128
+ build_method(klass, binding, typer) unless found_def
129
+ end
130
+
131
+ def build_method(klass, binding, typer)
132
+ # find all methods which would not otherwise be on java.lang.Object
133
+ impl_methods = find_methods(klass.interfaces).select do |m|
134
+ begin
135
+ obj_m = java.lang.Object.java_class.java_method m.name, *m.parameter_types
136
+ rescue NameError
137
+ # not found on Object
138
+ next true
139
+ end
140
+ # found on Object
141
+ next false
142
+ end
143
+
144
+ raise "Multiple abstract methods found; cannot use block" if impl_methods.size > 1
145
+ impl_methods.each do |method|
146
+ mdef = klass.define_method(position,
147
+ method.name,
148
+ method.return_type,
149
+ args.dup)
150
+ mdef.static_scope = static_scope
151
+ mdef.body = body.dup
152
+ mdef.binding_type = binding
153
+ typer.infer(mdef.body)
154
+ end
155
+ end
156
+
157
+ def find_methods(interfaces)
158
+ methods = []
159
+ interfaces = interfaces.dup
160
+ until interfaces.empty?
161
+ interface = interfaces.pop
162
+ methods += interface.declared_instance_methods.select {|m| m.abstract?}
163
+ interfaces.concat(interface.interfaces)
164
+ end
165
+ methods
166
+ end
167
+ end
168
+
169
+ class BindingReference < Node
170
+ def initialize(parent, position, type)
171
+ super(parent, position)
172
+ @inferred_type = type
173
+ end
174
+
175
+ def infer(typer)
176
+ resolved! unless resolved?
177
+ @inferred_type
178
+ end
179
+ end
180
+
181
+ class Noop < Node
182
+ def infer(typer)
183
+ resolved!
184
+ @inferred_type ||= typer.no_type
185
+ end
186
+ end
187
+
188
+ class Script < Node
189
+ include Scope
190
+ include Binding
191
+ child :body
192
+
193
+ attr_accessor :defining_class
194
+ attr_reader :filename
195
+
196
+ def initialize(parent, line_number, &block)
197
+ super(parent, line_number, &block)
198
+ @package = ""
199
+ end
200
+
201
+ def infer(typer)
202
+ resolve_if(typer) do
203
+ typer.set_filename(self, filename)
204
+ @defining_class ||= begin
205
+ static_scope.self_type = typer.self_type
206
+ end
207
+ typer.infer(body)
208
+ end
209
+ end
210
+
211
+ def filename=(filename)
212
+ @filename = filename
213
+ if Script.explicit_packages
214
+ static_scope.package = ''
215
+ else
216
+ package = File.dirname(@filename).tr('/', '.')
217
+ package.sub! /^\.+/, ''
218
+ static_scope.package = package
219
+ end
220
+ end
221
+
222
+ class << self
223
+ attr_accessor :explicit_packages
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,130 @@
1
+ module Duby::AST
2
+ class Import < Node
3
+ include Scoped
4
+ attr_accessor :short
5
+ attr_accessor :long
6
+ def initialize(parent, line_number, short, long)
7
+ @short = short
8
+ @long = long
9
+ super(parent, line_number, [])
10
+ scope.static_scope.import(long, short)
11
+ end
12
+
13
+ def to_s
14
+ "Import(#{short} = #{long})"
15
+ end
16
+
17
+ def infer(typer)
18
+ begin
19
+ typer.type_reference(scope, @long)
20
+ rescue NameError => ex
21
+ typer.known_types[short] = Duby::AST.error_type
22
+ raise ex
23
+ end
24
+ typer.no_type
25
+ end
26
+ end
27
+
28
+ defmacro('import') do |transformer, fcall, parent|
29
+ case fcall.parameters.size
30
+ when 1
31
+ node = fcall.parameters[0]
32
+ case node
33
+ when String
34
+ long = node.literal
35
+ short = long[(long.rindex('.') + 1)..-1]
36
+ when Call
37
+ case node.parameters.size
38
+ when 0
39
+ pieces = [node.name]
40
+ while Call === node
41
+ node = node.target
42
+ pieces << node.name
43
+ end
44
+ long = pieces.reverse.join '.'
45
+ short = pieces[0]
46
+ when 1
47
+ arg = node.parameters[0]
48
+ unless (FunctionalCall === arg &&
49
+ arg.name == 'as' && arg.parameters.size == 1)
50
+ raise Duby::TransformError.new("unknown import syntax", fcall)
51
+ end
52
+ short = arg.parameters[0].name
53
+ pieces = [node.name]
54
+ while Call === node
55
+ node = node.target
56
+ pieces << node.name
57
+ end
58
+ long = pieces.reverse.join '.'
59
+ else
60
+ raise Duby::TransformError.new("unknown import syntax", fcall)
61
+ end
62
+ else
63
+ raise Duby::TransformError.new("unknown import syntax", fcall)
64
+ end
65
+ when 2
66
+ short = fcall.parameters[0].literal
67
+ long = fcall.parameters[1].literal
68
+ else
69
+ raise Duby::TransformError.new("unknown import syntax", fcall)
70
+ end
71
+ Import.new(parent, fcall.position, short, long)
72
+ end
73
+
74
+ defmacro('package') do |transformer, fcall, parent|
75
+ node = fcall.parameters[0]
76
+ block = fcall.block
77
+ case node
78
+ when String
79
+ name = node.literal
80
+ when Call
81
+ pieces = [node.name]
82
+ block ||= node.block
83
+ while Call === node
84
+ node = node.target
85
+ pieces << node.name
86
+ block ||= node.block
87
+ end
88
+ name = pieces.reverse.join '.'
89
+ when FunctionalCall
90
+ name = node.name
91
+ block ||= node.block
92
+ else
93
+ raise Duby::TransformError.new("unknown package syntax", fcall)
94
+ end
95
+ if block
96
+ raise Duby::TransformError.new("unknown package syntax", block)
97
+ new_scope = ScopedBody.new(parent, fcall.position)
98
+ new_scope.static_scope.package = name
99
+ new_scope << block.body
100
+ else
101
+ fcall.scope.static_scope.package = name
102
+ Noop.new(parent, fcall.position)
103
+ end
104
+ end
105
+
106
+ class EmptyArray < Node
107
+ attr_accessor :size
108
+ attr_accessor :component_type
109
+ child :type_node
110
+ child :size
111
+
112
+ def initialize(*args)
113
+ super(*args)
114
+ end
115
+
116
+ def infer(typer)
117
+ resolve_if(typer) do
118
+ @component_type = type_node.type_reference(typer)
119
+ typer.infer(size)
120
+ typer.type_reference(nil, @component_type, true)
121
+ end
122
+ end
123
+ end
124
+
125
+ class Builtin < Node
126
+ def infer(typer)
127
+ resolve_if(typer) {Duby::AST.type(nil, 'mirah.impl.Builtin')}
128
+ end
129
+ end
130
+ end