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.
- data/History.txt +372 -0
- data/README.txt +4 -5
- data/Rakefile +178 -55
- data/examples/appengine/Readme +3 -3
- data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
- data/examples/appengine/src/org/mirah/list.dhtml +1 -1
- data/examples/bintrees.mirah +1 -1
- data/examples/edb.mirah +1 -1
- data/examples/fib.mirah +1 -1
- data/examples/interfaces.mirah +1 -1
- data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
- data/examples/maven/README.txt +1 -1
- data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
- data/examples/plugins/appengine/Rakefile +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
- data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
- data/examples/rosettacode/100-doors.mirah +6 -6
- data/examples/rosettacode/README.txt +3 -3
- data/examples/rosettacode/boolean-values.mirah +1 -1
- data/examples/rosettacode/comments.mirah +1 -1
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
- data/examples/rosettacode/factorial.mirah +1 -1
- data/examples/rosettacode/fibonacci.mirah +1 -1
- data/examples/rosettacode/fizz-buzz.mirah +2 -2
- data/examples/rosettacode/flatten-a-list.mirah +4 -4
- data/examples/rosettacode/guess-the-number.mirah +2 -2
- data/examples/rosettacode/hamming-numbers.mirah +4 -4
- data/examples/rosettacode/is-string-numeric.mirah +22 -22
- data/examples/rosettacode/palindrome.mirah +2 -2
- data/examples/rosettacode/random-numbers.mirah +1 -1
- data/examples/rosettacode/repeat-a-string.mirah +1 -1
- data/examples/rosettacode/reverse-a-string.mirah +1 -1
- data/examples/rosettacode/rot-13.mirah +5 -5
- data/examples/rosettacode/secure-temporary-file.mirah +2 -2
- data/examples/rosettacode/sleep.mirah +1 -1
- data/examples/rosettacode/string-length.mirah +5 -5
- data/examples/swing.mirah +1 -1
- data/examples/test.edb +1 -1
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/duby.rb +1 -1
- data/lib/mirah.rb +50 -28
- data/lib/mirah/ast.rb +15 -605
- data/lib/mirah/ast/scope.rb +98 -69
- data/lib/mirah/commands.rb +1 -1
- data/lib/mirah/commands/base.rb +7 -7
- data/lib/mirah/commands/compile.rb +3 -3
- data/lib/mirah/commands/parse.rb +7 -5
- data/lib/mirah/commands/run.rb +12 -19
- data/lib/mirah/compiler.rb +15 -23
- data/lib/mirah/errors.rb +16 -1
- data/lib/mirah/generator.rb +79 -39
- data/lib/mirah/jvm/compiler.rb +1 -19
- data/lib/mirah/jvm/compiler/base.rb +233 -90
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
- data/lib/mirah/jvm/method_lookup.rb +134 -65
- data/lib/mirah/jvm/typer.rb +10 -5
- data/lib/mirah/jvm/types.rb +10 -2
- data/lib/mirah/jvm/types/array_type.rb +10 -12
- data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
- data/lib/mirah/jvm/types/basic_types.rb +26 -33
- data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
- data/lib/mirah/jvm/types/block_type.rb +15 -0
- data/lib/mirah/jvm/types/boolean.rb +8 -4
- data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
- data/lib/mirah/jvm/types/enumerable.rb +7 -7
- data/lib/mirah/jvm/types/extensions.rb +11 -6
- data/lib/mirah/jvm/types/factory.rb +624 -94
- data/lib/mirah/jvm/types/floats.rb +21 -15
- data/lib/mirah/jvm/types/generic_type.rb +72 -0
- data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
- data/lib/mirah/jvm/types/integers.rb +26 -71
- data/lib/mirah/jvm/types/interface_definition.rb +3 -3
- data/lib/mirah/jvm/types/intrinsics.rb +203 -168
- data/lib/mirah/jvm/types/literals.rb +6 -6
- data/lib/mirah/jvm/types/meta_type.rb +13 -4
- data/lib/mirah/jvm/types/methods.rb +281 -93
- data/lib/mirah/jvm/types/null_type.rb +17 -5
- data/lib/mirah/jvm/types/number.rb +10 -7
- data/lib/mirah/jvm/types/primitive_type.rb +17 -6
- data/lib/mirah/jvm/types/source_mirror.rb +12 -7
- data/lib/mirah/jvm/types/type.rb +107 -23
- data/lib/mirah/jvm/types/type_definition.rb +25 -10
- data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
- data/lib/mirah/jvm/types/void_type.rb +3 -3
- data/lib/mirah/parser.rb +154 -16
- data/lib/mirah/plugin/edb.rb +1 -1
- data/lib/mirah/transform.rb +1 -2
- data/lib/mirah/transform/ast_ext.rb +24 -43
- data/lib/mirah/transform/transformer.rb +29 -224
- data/lib/mirah/typer.rb +2 -16
- data/lib/mirah/util/argument_processor.rb +25 -10
- data/lib/mirah/util/class_loader.rb +1 -1
- data/lib/mirah/util/compilation_state.rb +16 -17
- data/lib/mirah/util/delegate.rb +2 -2
- data/lib/mirah/util/logging.rb +110 -0
- data/lib/mirah/util/process_errors.rb +69 -11
- data/lib/mirah/version.rb +1 -1
- data/test/core/commands_test.rb +6 -24
- data/test/core/env_test.rb +5 -5
- data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
- data/test/core/typer_test.rb +196 -158
- data/test/core/util/argument_processor_test.rb +10 -10
- data/test/core/util/class_loader_test.rb +6 -5
- data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
- data/test/jvm/annotations_test.rb +5 -5
- data/test/jvm/blocks_test.rb +140 -88
- data/test/jvm/bytecode_test_helper.rb +112 -94
- data/test/jvm/cast_test.rb +162 -0
- data/test/jvm/constructors_test.rb +18 -8
- data/test/jvm/enumerable_test.rb +77 -44
- data/test/jvm/example_test.rb +53 -0
- data/test/jvm/factory_test.rb +7 -1
- data/test/jvm/generics_test.rb +57 -0
- data/test/jvm/hash_test.rb +106 -0
- data/test/jvm/import_test.rb +81 -0
- data/test/jvm/interface_test.rb +73 -0
- data/test/jvm/java_typer_test.rb +92 -66
- data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
- data/test/jvm/jvm_compiler_test.rb +170 -604
- data/test/jvm/list_extensions_test.rb +23 -0
- data/test/jvm/macros_test.rb +197 -32
- data/test/jvm/main_method_test.rb +4 -4
- data/test/jvm/numeric_extensions_test.rb +13 -0
- data/test/jvm/rescue_test.rb +73 -16
- data/test/jvm/varargs_test.rb +65 -0
- data/test/test_helper.rb +1 -2
- metadata +234 -251
- data/examples/SortClosure$__xform_tmp_1.class +0 -0
- data/examples/SortClosure$__xform_tmp_2.class +0 -0
- data/examples/SortClosure.class +0 -0
- data/examples/macros/StringEachChar$Extension1.class +0 -0
- data/lib/mirah/ast/call.rb +0 -345
- data/lib/mirah/ast/class.rb +0 -359
- data/lib/mirah/ast/flow.rb +0 -381
- data/lib/mirah/ast/intrinsics.rb +0 -563
- data/lib/mirah/ast/literal.rb +0 -178
- data/lib/mirah/ast/local.rb +0 -112
- data/lib/mirah/ast/method.rb +0 -408
- data/lib/mirah/ast/structure.rb +0 -387
- data/lib/mirah/ast/type.rb +0 -146
- data/lib/mirah/commands/base.rb~ +0 -57
- data/lib/mirah/compiler/call.rb +0 -45
- data/lib/mirah/compiler/class.rb +0 -81
- data/lib/mirah/compiler/flow.rb +0 -109
- data/lib/mirah/compiler/literal.rb +0 -130
- data/lib/mirah/compiler/local.rb +0 -59
- data/lib/mirah/compiler/method.rb +0 -44
- data/lib/mirah/compiler/structure.rb +0 -65
- data/lib/mirah/jvm/compiler/java_source.rb +0 -787
- data/lib/mirah/jvm/method_lookup.rb~ +0 -247
- data/lib/mirah/jvm/source_generator/builder.rb +0 -468
- data/lib/mirah/jvm/source_generator/loops.rb +0 -131
- data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
- data/lib/mirah/plugin/gwt.rb +0 -189
- data/lib/mirah/plugin/java.rb +0 -70
- data/lib/mirah/transform/error.rb +0 -13
- data/lib/mirah/transform/helper.rb +0 -765
- data/lib/mirah/typer/simple.rb +0 -384
- data/lib/mirah/version.rb~ +0 -18
- data/test/core/ast_test.rb +0 -382
- data/test/core/compilation_test.rb +0 -130
- data/test/core/macros_test.rb +0 -61
- data/test/jvm/javac_test_helper.rb +0 -89
- data/test/jvm/jvm_compiler_test.rb~ +0 -2181
- data/test/plugins/gwt_test.rb +0 -69
|
Binary file
|
|
Binary file
|
data/examples/SortClosure.class
DELETED
|
Binary file
|
|
Binary file
|
data/lib/mirah/ast/call.rb
DELETED
|
@@ -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
|
data/lib/mirah/ast/class.rb
DELETED
|
@@ -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
|