mirah 0.0.12-java → 0.1.0-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 (171) hide show
  1. data/History.txt +372 -0
  2. data/README.txt +4 -5
  3. data/Rakefile +178 -55
  4. data/examples/appengine/Readme +3 -3
  5. data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
  6. data/examples/appengine/src/org/mirah/list.dhtml +1 -1
  7. data/examples/bintrees.mirah +1 -1
  8. data/examples/edb.mirah +1 -1
  9. data/examples/fib.mirah +1 -1
  10. data/examples/interfaces.mirah +1 -1
  11. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
  12. data/examples/maven/README.txt +1 -1
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
  14. data/examples/plugins/appengine/Rakefile +1 -1
  15. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
  16. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
  17. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
  18. data/examples/rosettacode/100-doors.mirah +6 -6
  19. data/examples/rosettacode/README.txt +3 -3
  20. data/examples/rosettacode/boolean-values.mirah +1 -1
  21. data/examples/rosettacode/comments.mirah +1 -1
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
  23. data/examples/rosettacode/factorial.mirah +1 -1
  24. data/examples/rosettacode/fibonacci.mirah +1 -1
  25. data/examples/rosettacode/fizz-buzz.mirah +2 -2
  26. data/examples/rosettacode/flatten-a-list.mirah +4 -4
  27. data/examples/rosettacode/guess-the-number.mirah +2 -2
  28. data/examples/rosettacode/hamming-numbers.mirah +4 -4
  29. data/examples/rosettacode/is-string-numeric.mirah +22 -22
  30. data/examples/rosettacode/palindrome.mirah +2 -2
  31. data/examples/rosettacode/random-numbers.mirah +1 -1
  32. data/examples/rosettacode/repeat-a-string.mirah +1 -1
  33. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  34. data/examples/rosettacode/rot-13.mirah +5 -5
  35. data/examples/rosettacode/secure-temporary-file.mirah +2 -2
  36. data/examples/rosettacode/sleep.mirah +1 -1
  37. data/examples/rosettacode/string-length.mirah +5 -5
  38. data/examples/swing.mirah +1 -1
  39. data/examples/test.edb +1 -1
  40. data/javalib/mirah-bootstrap.jar +0 -0
  41. data/javalib/mirah-builtins.jar +0 -0
  42. data/javalib/mirah-parser.jar +0 -0
  43. data/javalib/mirah-util.jar +0 -0
  44. data/lib/duby.rb +1 -1
  45. data/lib/mirah.rb +50 -28
  46. data/lib/mirah/ast.rb +15 -605
  47. data/lib/mirah/ast/scope.rb +98 -69
  48. data/lib/mirah/commands.rb +1 -1
  49. data/lib/mirah/commands/base.rb +7 -7
  50. data/lib/mirah/commands/compile.rb +3 -3
  51. data/lib/mirah/commands/parse.rb +7 -5
  52. data/lib/mirah/commands/run.rb +12 -19
  53. data/lib/mirah/compiler.rb +15 -23
  54. data/lib/mirah/errors.rb +16 -1
  55. data/lib/mirah/generator.rb +79 -39
  56. data/lib/mirah/jvm/compiler.rb +1 -19
  57. data/lib/mirah/jvm/compiler/base.rb +233 -90
  58. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
  59. data/lib/mirah/jvm/method_lookup.rb +134 -65
  60. data/lib/mirah/jvm/typer.rb +10 -5
  61. data/lib/mirah/jvm/types.rb +10 -2
  62. data/lib/mirah/jvm/types/array_type.rb +10 -12
  63. data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
  64. data/lib/mirah/jvm/types/basic_types.rb +26 -33
  65. data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
  66. data/lib/mirah/jvm/types/block_type.rb +15 -0
  67. data/lib/mirah/jvm/types/boolean.rb +8 -4
  68. data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
  69. data/lib/mirah/jvm/types/enumerable.rb +7 -7
  70. data/lib/mirah/jvm/types/extensions.rb +11 -6
  71. data/lib/mirah/jvm/types/factory.rb +624 -94
  72. data/lib/mirah/jvm/types/floats.rb +21 -15
  73. data/lib/mirah/jvm/types/generic_type.rb +72 -0
  74. data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
  75. data/lib/mirah/jvm/types/integers.rb +26 -71
  76. data/lib/mirah/jvm/types/interface_definition.rb +3 -3
  77. data/lib/mirah/jvm/types/intrinsics.rb +203 -168
  78. data/lib/mirah/jvm/types/literals.rb +6 -6
  79. data/lib/mirah/jvm/types/meta_type.rb +13 -4
  80. data/lib/mirah/jvm/types/methods.rb +281 -93
  81. data/lib/mirah/jvm/types/null_type.rb +17 -5
  82. data/lib/mirah/jvm/types/number.rb +10 -7
  83. data/lib/mirah/jvm/types/primitive_type.rb +17 -6
  84. data/lib/mirah/jvm/types/source_mirror.rb +12 -7
  85. data/lib/mirah/jvm/types/type.rb +107 -23
  86. data/lib/mirah/jvm/types/type_definition.rb +25 -10
  87. data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
  88. data/lib/mirah/jvm/types/void_type.rb +3 -3
  89. data/lib/mirah/parser.rb +154 -16
  90. data/lib/mirah/plugin/edb.rb +1 -1
  91. data/lib/mirah/transform.rb +1 -2
  92. data/lib/mirah/transform/ast_ext.rb +24 -43
  93. data/lib/mirah/transform/transformer.rb +29 -224
  94. data/lib/mirah/typer.rb +2 -16
  95. data/lib/mirah/util/argument_processor.rb +25 -10
  96. data/lib/mirah/util/class_loader.rb +1 -1
  97. data/lib/mirah/util/compilation_state.rb +16 -17
  98. data/lib/mirah/util/delegate.rb +2 -2
  99. data/lib/mirah/util/logging.rb +110 -0
  100. data/lib/mirah/util/process_errors.rb +69 -11
  101. data/lib/mirah/version.rb +1 -1
  102. data/test/core/commands_test.rb +6 -24
  103. data/test/core/env_test.rb +5 -5
  104. data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
  105. data/test/core/typer_test.rb +196 -158
  106. data/test/core/util/argument_processor_test.rb +10 -10
  107. data/test/core/util/class_loader_test.rb +6 -5
  108. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  109. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  110. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  111. data/test/jvm/annotations_test.rb +5 -5
  112. data/test/jvm/blocks_test.rb +140 -88
  113. data/test/jvm/bytecode_test_helper.rb +112 -94
  114. data/test/jvm/cast_test.rb +162 -0
  115. data/test/jvm/constructors_test.rb +18 -8
  116. data/test/jvm/enumerable_test.rb +77 -44
  117. data/test/jvm/example_test.rb +53 -0
  118. data/test/jvm/factory_test.rb +7 -1
  119. data/test/jvm/generics_test.rb +57 -0
  120. data/test/jvm/hash_test.rb +106 -0
  121. data/test/jvm/import_test.rb +81 -0
  122. data/test/jvm/interface_test.rb +73 -0
  123. data/test/jvm/java_typer_test.rb +92 -66
  124. data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
  125. data/test/jvm/jvm_compiler_test.rb +170 -604
  126. data/test/jvm/list_extensions_test.rb +23 -0
  127. data/test/jvm/macros_test.rb +197 -32
  128. data/test/jvm/main_method_test.rb +4 -4
  129. data/test/jvm/numeric_extensions_test.rb +13 -0
  130. data/test/jvm/rescue_test.rb +73 -16
  131. data/test/jvm/varargs_test.rb +65 -0
  132. data/test/test_helper.rb +1 -2
  133. metadata +234 -251
  134. data/examples/SortClosure$__xform_tmp_1.class +0 -0
  135. data/examples/SortClosure$__xform_tmp_2.class +0 -0
  136. data/examples/SortClosure.class +0 -0
  137. data/examples/macros/StringEachChar$Extension1.class +0 -0
  138. data/lib/mirah/ast/call.rb +0 -345
  139. data/lib/mirah/ast/class.rb +0 -359
  140. data/lib/mirah/ast/flow.rb +0 -381
  141. data/lib/mirah/ast/intrinsics.rb +0 -563
  142. data/lib/mirah/ast/literal.rb +0 -178
  143. data/lib/mirah/ast/local.rb +0 -112
  144. data/lib/mirah/ast/method.rb +0 -408
  145. data/lib/mirah/ast/structure.rb +0 -387
  146. data/lib/mirah/ast/type.rb +0 -146
  147. data/lib/mirah/commands/base.rb~ +0 -57
  148. data/lib/mirah/compiler/call.rb +0 -45
  149. data/lib/mirah/compiler/class.rb +0 -81
  150. data/lib/mirah/compiler/flow.rb +0 -109
  151. data/lib/mirah/compiler/literal.rb +0 -130
  152. data/lib/mirah/compiler/local.rb +0 -59
  153. data/lib/mirah/compiler/method.rb +0 -44
  154. data/lib/mirah/compiler/structure.rb +0 -65
  155. data/lib/mirah/jvm/compiler/java_source.rb +0 -787
  156. data/lib/mirah/jvm/method_lookup.rb~ +0 -247
  157. data/lib/mirah/jvm/source_generator/builder.rb +0 -468
  158. data/lib/mirah/jvm/source_generator/loops.rb +0 -131
  159. data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
  160. data/lib/mirah/plugin/gwt.rb +0 -189
  161. data/lib/mirah/plugin/java.rb +0 -70
  162. data/lib/mirah/transform/error.rb +0 -13
  163. data/lib/mirah/transform/helper.rb +0 -765
  164. data/lib/mirah/typer/simple.rb +0 -384
  165. data/lib/mirah/version.rb~ +0 -18
  166. data/test/core/ast_test.rb +0 -382
  167. data/test/core/compilation_test.rb +0 -130
  168. data/test/core/macros_test.rb +0 -61
  169. data/test/jvm/javac_test_helper.rb +0 -89
  170. data/test/jvm/jvm_compiler_test.rb~ +0 -2181
  171. data/test/plugins/gwt_test.rb +0 -69
Binary file
@@ -1,345 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- module Mirah::AST
17
- class FunctionalCall < Node
18
- include Java::DubyLangCompiler.Call
19
- include Named
20
- include Scoped
21
- attr_accessor :cast, :inlined, :proxy
22
- alias cast? cast
23
-
24
- child :parameters
25
- child :block
26
-
27
- def self.new(*args, &block)
28
- real_node = super
29
- real_node.proxy = NodeProxy.new(real_node)
30
- end
31
-
32
- def initialize(parent, line_number, name, &kids)
33
- super(parent, line_number, &kids)
34
- self.name = name
35
- @cast = false
36
- end
37
-
38
- def arguments
39
- args = java.util.ArrayList.new(parameters.size)
40
- parameters.each do |param|
41
- args.add(param)
42
- end
43
- args
44
- end
45
-
46
- def target
47
- nil
48
- end
49
-
50
- def validate_parameters
51
- parameters.each_with_index do |child, i|
52
- if UnquotedValue === child
53
- children = child.nodes
54
- children.each {|c| c.parent = self}
55
- parameters[i] = children
56
- end
57
- end
58
- parameters.flatten!
59
- end
60
-
61
- def infer(typer, expression)
62
- unless @inferred_type
63
- @self_type ||= scope.static_scope.self_type
64
- receiver_type = @self_type
65
- should_defer = false
66
-
67
- parameter_types = parameters.map do |param|
68
- typer.infer(param, true) || should_defer = true
69
- end
70
-
71
- parameter_types << Mirah::AST.block_type if block
72
-
73
- unless should_defer
74
- if parameters.size == 1 && typer.known_type(scope, name)
75
- # cast operation
76
- resolved!
77
- self.cast = true
78
- @inferred_type = typer.known_type(scope, name)
79
- elsif parameters.size == 0 && scope.static_scope.include?(name)
80
- @inlined = Local.new(parent, position, name)
81
- proxy.__inline__(@inlined)
82
- return proxy.infer(typer, expression)
83
- else
84
- @inferred_type = typer.method_type(receiver_type, name,
85
- parameter_types)
86
- if @inferred_type.kind_of? InlineCode
87
- @inlined = @inferred_type.inline(typer.transformer, self)
88
- proxy.__inline__(@inlined)
89
- return proxy.infer(typer, expression)
90
- end
91
- end
92
- end
93
-
94
- if @inferred_type && !@inferred_type.error?
95
- if block
96
- method = receiver_type.get_method(name, parameter_types)
97
- block.prepare(typer, method)
98
- end
99
- @inferred_type = receiver_type if @inferred_type.void?
100
- resolved!
101
- else
102
- if should_defer || receiver_type.nil?
103
- message = nil
104
- else
105
- parameter_names = parameter_types.map {|t| t.full_name}.join(', ')
106
- receiver = receiver_type.full_name
107
- desc = "#{name}(#{parameter_names})"
108
- kind = receiver_type.meta? ? "static" : "instance"
109
- message = "Cannot find #{kind} method #{desc} on #{receiver}"
110
- end
111
- typer.defer(proxy, message)
112
- end
113
- end
114
-
115
- @inferred_type
116
- end
117
-
118
- def type_reference(typer)
119
- typer.type_reference(scope, name)
120
- end
121
- end
122
-
123
- class Call < Node
124
- include Java::DubyLangCompiler.Call
125
- include Named
126
- include Scoped
127
- attr_accessor :cast, :inlined, :proxy
128
- alias cast? cast
129
-
130
- child :target
131
- child :parameters
132
- child :block
133
-
134
- def self.new(*args, &block)
135
- real_node = super
136
- real_node.proxy = NodeProxy.new(real_node)
137
- end
138
-
139
- def initialize(parent, line_number, name, &kids)
140
- super(parent, line_number, &kids)
141
- self.name = name
142
- end
143
-
144
- def validate_parameters
145
- parameters.each_with_index do |child, i|
146
- if UnquotedValue === child
147
- child = child.node
148
- child.parent = self
149
- parameters[i] = child
150
- end
151
- end
152
- end
153
-
154
- def arguments
155
- args = java.util.ArrayList.new(parameters.size)
156
- parameters.each do |param|
157
- args.add(param)
158
- end
159
- args
160
- end
161
-
162
- def infer(typer, expression)
163
- unless @inferred_type
164
- receiver_type = typer.infer(target, true)
165
- should_defer = receiver_type.nil?
166
- parameter_types = parameters.map do |param|
167
- typer.infer(param, true) || should_defer = true
168
- end
169
-
170
- parameter_types << Mirah::AST.block_type if block
171
-
172
- unless should_defer
173
- class_name, array = self.type_name(true)
174
- if class_name && parameters.size == 1 && typer.known_type(scope, class_name)
175
- # Support casts to fully-qualified names and inner classes.
176
- begin
177
- type = inferred_type = typer.type_reference(scope, class_name, array)
178
- @inferred_type = type unless (type && type.error?)
179
- if @inferred_type
180
- # cast operation
181
- resolved!
182
- self.cast = true
183
- return @inferred_type
184
- end
185
- rescue
186
- end
187
- end
188
- @inferred_type = typer.method_type(receiver_type, name,
189
- parameter_types)
190
- if @inferred_type.kind_of? InlineCode
191
- @inlined = @inferred_type.inline(typer.transformer, self)
192
- proxy.__inline__(@inlined)
193
- return proxy.infer(typer, expression)
194
- end
195
- end
196
-
197
- if @inferred_type
198
- if block && !receiver_type.error?
199
- method = receiver_type.get_method(name, parameter_types)
200
- block.prepare(typer, method)
201
- end
202
- @inferred_type = receiver_type if @inferred_type.void?
203
- resolved!
204
- else
205
- if should_defer
206
- message = nil
207
- else
208
- parameter_names = parameter_types.map {|t| t.full_name}.join(', ')
209
- receiver = receiver_type.full_name
210
- desc = "#{name}(#{parameter_names})"
211
- kind = receiver_type.meta? ? "static" : "instance"
212
- message = "Cannot find #{kind} method #{desc} on #{receiver}"
213
- end
214
- typer.defer(proxy, message)
215
- end
216
- end
217
-
218
- @inferred_type
219
- end
220
-
221
- def type_reference(typer)
222
- class_name, array = type_name
223
- typer.type_reference(scope, class_name, array)
224
- end
225
-
226
- def type_name(force=false)
227
- if !force && parameters && !parameters.empty?
228
- return nil
229
- end
230
- if name == "[]"
231
- # array type, top should be a constant; find the rest
232
- array = true
233
- elements = []
234
- else
235
- array = false
236
- elements = [name]
237
- end
238
- old_receiver = nil
239
- receiver = self.target
240
- while !receiver.eql?(old_receiver)
241
- old_receiver = receiver
242
- case receiver
243
- when Constant, Local, Annotation
244
- elements.unshift(receiver.name)
245
- when FunctionalCall
246
- if receiver.parameters.nil? || receiver.parameters.empty?
247
- elements.unshift(receiver.name)
248
- else
249
- return nil, nil
250
- end
251
- when Call
252
- if receiver.parameters.nil? || receiver.parameters.empty?
253
- elements.unshift(receiver.name)
254
- receiver = receiver.target
255
- else
256
- return nil, nil
257
- end
258
- when String
259
- elements.unshift(receiver.literal)
260
- end
261
- end
262
-
263
- return elements.join("."), array
264
- end
265
- end
266
-
267
-
268
- class Colon2 < Call
269
- def infer(typer, expression)
270
- resolve_if(typer) do
271
- type_reference(typer).meta
272
- end
273
- end
274
- end
275
-
276
- class Super < Node
277
- include Named
278
- include Scoped
279
- attr_accessor :method, :cast
280
- alias :cast? :cast
281
-
282
- child :parameters
283
-
284
- def initialize(parent, line_number)
285
- super(parent, line_number)
286
- @cast = false
287
- end
288
-
289
- def call_parent
290
- @call_parent ||= begin
291
- node = parent
292
- node = (node && node.parent) until MethodDefinition === node
293
- node
294
- end
295
- end
296
-
297
- def name
298
- call_parent.name
299
- end
300
-
301
- def infer(typer, expression)
302
- @self_type ||= scope.static_scope.self_type.superclass
303
-
304
- unless @inferred_type
305
- receiver_type = call_parent.defining_class.superclass
306
- should_defer = receiver_type.nil?
307
- parameter_types = parameters.map do |param|
308
- typer.infer(param, true) || should_defer = true
309
- end
310
-
311
- unless should_defer
312
- @inferred_type = typer.method_type(receiver_type, name,
313
- parameter_types)
314
- end
315
-
316
- @inferred_type ? resolved! : typer.defer(self)
317
- end
318
-
319
- @inferred_type
320
- end
321
-
322
- alias originial_parameters parameters
323
-
324
- def parameters
325
- if originial_parameters.nil?
326
- self.parameters = default_parameters
327
- end
328
- originial_parameters
329
- end
330
-
331
- def default_parameters
332
- node = self
333
- node = node.parent until MethodDefinition === node || node.nil?
334
- return [] if node.nil?
335
- args = node.arguments.children.map {|x| x || []}
336
- args.flatten.map do |arg|
337
- Local.new(self, position, arg.name)
338
- end
339
- end
340
- end
341
-
342
- class BlockPass < Node
343
- child :value
344
- end
345
- end
@@ -1,359 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- module Mirah::AST
17
- class ClassDefinition < Node
18
- include Annotated
19
- include Named
20
- include Scope
21
- include Java::DubyLangCompiler.ClassDefinition
22
-
23
- attr_accessor :interfaces
24
- attr_accessor :current_access_level
25
- attr_accessor :abstract
26
-
27
- child :superclass_node
28
- child :body
29
-
30
- attr_accessor :superclass
31
-
32
- def initialize(parent, position, name, annotations=[], &block)
33
- @abstract = false
34
- @annotations = annotations
35
- @interfaces = []
36
- @interface_nodes = []
37
- self.name = name
38
- self.parent = parent
39
- if Mirah::AST.type_factory.respond_to? :define_type
40
- Mirah::AST.type_factory.define_type(self)
41
- end
42
- # We need somewhere to collect nodes that get appended during
43
- # the transform phase.
44
- @extra_body = Body.new(self, position)
45
- super(parent, position, &block)
46
- if body
47
- @extra_body.insert(0, body)
48
- end
49
- self.body = @extra_body
50
- end
51
-
52
- def append_node(node)
53
- @extra_body << node
54
- node
55
- end
56
-
57
- def define_method(position, name, type, *args, &block)
58
- append_node(_define_method(MethodDefinition, position, name, type, args, &block))
59
- end
60
-
61
- def define_static_method(position, name, type, *args, &block)
62
- append_node(
63
- _define_method(StaticMethodDefinition, position, name, type, args, &block))
64
- end
65
-
66
- def define_constructor(position, *args, &block)
67
- append_node(_define_method(
68
- ConstructorDefinition, position, 'initialize', nil, args, &block))
69
- end
70
-
71
- def _define_method(klass, position, name, type, args)
72
- klass.new(nil, position, name) do |method|
73
- signature = {:return => type}
74
- if Arguments === args[0]
75
- args_node = args[0]
76
- args_node.parent = method
77
- else
78
- args_node = Arguments.new(method, position) do |args_node|
79
- arg_list = args.map do |arg_name, arg_type, arg_position|
80
- signature[arg_name.intern] = arg_type
81
- arg_position ||= position
82
- RequiredArgument.new(args_node, arg_position, arg_name)
83
- end
84
- [arg_list, nil, nil, nil]
85
- end
86
- end
87
- [
88
- signature,
89
- args_node,
90
- if block_given?
91
- yield(method)
92
- end
93
- ]
94
- end
95
- end
96
-
97
- def declare_field(position, name, type)
98
- field = FieldDeclaration.new(nil, position || self.position, name)
99
- field.type = type.dup
100
- append_node(field)
101
- end
102
-
103
- def infer(typer, expression)
104
- resolve_if(typer) do
105
- @superclass = superclass_node.type_reference(typer) if superclass_node
106
- @annotations.each {|a| a.infer(typer, true)} if @annotations
107
- @interfaces.concat(@interface_nodes.map{|n| n.type_reference(typer)})
108
- typer.define_type(self, name, superclass, @interfaces) do
109
- static_scope.self_type = typer.self_type
110
- typer.infer(body, false) if body
111
- end
112
- end
113
- end
114
-
115
- def implements(*types)
116
- raise ArgumentError if types.any? {|x| x.nil?}
117
- types.each do |type|
118
- if Mirah::AST::TypeReference === type
119
- @interfaces << type
120
- else
121
- @interface_nodes << type
122
- end
123
- end
124
- end
125
-
126
- def top_level?
127
- true
128
- end
129
- end
130
-
131
- class Implements < Node
132
- def infer(typer, expression)
133
- resolve_if(typer) do
134
- klass = parent
135
- klass = klass.parent until ClassDefinition === klass
136
- interfaces = children.map {|i| i.type_reference(typer) }
137
- klass.implements(*interfaces)
138
- typer.no_type
139
- end
140
- end
141
- def compile(*args)
142
- end
143
- end
144
-
145
- defmacro('implements') do |transformer, fcall, parent|
146
- Implements.new(fcall.parent, fcall.position) do |node|
147
- fcall.parameters.map {|i| i.parent = node; i}
148
- end
149
- end
150
-
151
- class InterfaceDeclaration < ClassDefinition
152
- attr_accessor :superclass, :interfaces
153
- child :interface_nodes
154
- child :body
155
-
156
- def initialize(parent, position, name, annotations)
157
- super(parent, position, name, annotations) {|p| }
158
- @abstract = true
159
- self.name = name
160
- @children = [[], nil]
161
- @children = yield(self)
162
- end
163
-
164
- def infer(typer, expression)
165
- resolve_if(typer) do
166
- @interfaces = interface_nodes.map {|i| i.type_reference(typer)}
167
- super
168
- end
169
- end
170
-
171
- def superclass_node
172
- nil
173
- end
174
-
175
- def top_level?
176
- true
177
- end
178
- end
179
-
180
- class ClosureDefinition < ClassDefinition
181
- attr_accessor :enclosing_type
182
- def initialize(parent, position, name, enclosing_type)
183
- super(parent, position, name, []) do
184
- [nil, nil]
185
- end
186
- @enclosing_type = enclosing_type
187
- end
188
- end
189
-
190
- defmacro('interface') do |transformer, fcall, parent|
191
- raise Mirah::SyntaxError.new("Interface name required", fcall) unless fcall.parameters.size > 0
192
- interfaces = fcall.parameters
193
- interface_name = interfaces.shift
194
- if (Call === interface_name &&
195
- interface_name.parameters.size == 1)
196
- interfaces.unshift(interface_name.parameters[0])
197
- interface_name = interface_name.target
198
- end
199
- raise 'Interface body required' unless fcall.block
200
- InterfaceDeclaration.new(parent, fcall.position,
201
- interface_name.name,
202
- transformer.annotations) do |interface|
203
- interfaces.each {|x| x.parent = interface}
204
- [interfaces,
205
- if fcall.block.body
206
- fcall.block.body.parent = interface
207
- fcall.block.body
208
- end
209
- ]
210
- end
211
- end
212
-
213
- class FieldDeclaration < Node
214
- include Annotated
215
- include Named
216
- include ClassScoped
217
- include Typed
218
-
219
- child :type_node
220
- attr_accessor :type
221
- attr_accessor :static
222
-
223
- def initialize(parent, position, name, annotations=[], static = false, &block)
224
- @annotations = annotations
225
- super(parent, position, &block)
226
- self.name = name
227
- @static = static
228
- end
229
-
230
- def infer(typer, expression)
231
- resolve_if(typer) do
232
- @annotations.each {|a| a.infer(typer, true)} if @annotations
233
- @type = type_node.type_reference(typer)
234
- end
235
- end
236
-
237
- def resolved!(typer)
238
- if static
239
- typer.learn_static_field_type(class_scope, name, @inferred_type)
240
- else
241
- typer.learn_field_type(class_scope, name, @inferred_type)
242
- end
243
- super
244
- end
245
- end
246
-
247
- class FieldAssignment < Node
248
- include Annotated
249
- include Named
250
- include Valued
251
- include ClassScoped
252
-
253
- child :value
254
- attr_accessor :static
255
-
256
- def initialize(parent, position, name, annotations=[], static = false, &block)
257
- @annotations = annotations
258
- super(parent, position, &block)
259
- self.name = name
260
- @static = static
261
- end
262
-
263
- def infer(typer, expression)
264
- resolve_if(typer) do
265
- @annotations.each {|a| a.infer(typer, true)} if @annotations
266
- if static
267
- typer.learn_static_field_type(class_scope, name, typer.infer(value, true))
268
- else
269
- typer.learn_field_type(class_scope, name, typer.infer(value, true))
270
- end
271
- end
272
- end
273
- end
274
-
275
- class Field < Node
276
- include Annotated
277
- include Named
278
- include ClassScoped
279
-
280
- attr_accessor :static
281
-
282
- def initialize(parent, position, name, annotations=[], static = false, &block)
283
- @annotations = annotations
284
- super(parent, position, &block)
285
- self.name = name
286
- @static = static
287
- end
288
-
289
- def infer(typer, expression)
290
- resolve_if(typer) do
291
- @annotations.each {|a| a.infer(typer, true)} if @annotations
292
- if static
293
- typer.static_field_type(class_scope, name)
294
- else
295
- typer.field_type(class_scope, name)
296
- end
297
- end
298
- end
299
- end
300
-
301
- class AccessLevel < Node
302
- include ClassScoped
303
- include Named
304
-
305
- def initialize(parent, line_number, name)
306
- super(parent, line_number)
307
- self.name = name
308
- class_scope.current_access_level = name.to_sym
309
- end
310
-
311
- def infer(typer, expression)
312
- typer.no_type
313
- end
314
- end
315
-
316
- class Include < Node
317
- include Scoped
318
-
319
- def infer(typer, expression)
320
- children.each do |type|
321
- typeref = type.type_reference(typer)
322
- the_scope = scope.static_scope
323
- the_scope.self_type = the_scope.self_type.include(typeref)
324
- end
325
- end
326
- end
327
-
328
- defmacro("include") do |transformer, fcall, parent|
329
- raise "Included Class name required" unless fcall.parameters.size > 0
330
- Include.new(parent, fcall.position) do |include_node|
331
- fcall.parameters.map do |constant|
332
- constant.parent = include_node
333
- constant
334
- end
335
- end
336
- end
337
-
338
- class Constant < Node
339
- include Named
340
- include Scoped
341
- attr_accessor :array
342
-
343
- def initialize(parent, position, name)
344
- self.name = name
345
- super(parent, position, [])
346
- end
347
-
348
- def infer(typer, expression)
349
- @inferred_type ||= begin
350
- # TODO lookup constant, inline if we're supposed to.
351
- typer.type_reference(scope, name, @array, true)
352
- end
353
- end
354
-
355
- def type_reference(typer)
356
- typer.type_reference(scope, @name, @array)
357
- end
358
- end
359
- end