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
|
@@ -16,95 +16,141 @@
|
|
|
16
16
|
module Mirah
|
|
17
17
|
module JVM
|
|
18
18
|
module MethodLookup
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
java_import 'mirah.lang.ast.ConstructorDefinition'
|
|
20
|
+
|
|
21
|
+
def find_method2(mapped_type, name, mapped_params, macro_params, meta, scope=nil, &block)
|
|
22
|
+
find_method(mapped_type, name, mapped_params, macro_params, meta, scope, &block)
|
|
23
|
+
rescue NameError => ex
|
|
24
|
+
raise ex unless ex.message.include?(name)
|
|
25
|
+
if block_given?
|
|
26
|
+
block.call(ex)
|
|
27
|
+
end
|
|
28
|
+
ex
|
|
29
|
+
end
|
|
21
30
|
|
|
22
|
-
def find_method(mapped_type, name, mapped_params, meta)
|
|
23
|
-
|
|
31
|
+
def find_method(mapped_type, name, mapped_params, macro_params, meta, scope=nil, &block)
|
|
32
|
+
if mapped_type.error?
|
|
33
|
+
raise "WTF?!?"
|
|
34
|
+
end
|
|
24
35
|
|
|
25
|
-
if name == 'new'
|
|
26
|
-
|
|
27
|
-
|
|
36
|
+
if name == 'new' && meta # we're calling SomeClass.new
|
|
37
|
+
name = "<init>"
|
|
38
|
+
constructor = true
|
|
39
|
+
mapped_type = mapped_type.unmeta
|
|
40
|
+
meta = false
|
|
41
|
+
elsif name == 'new' && !meta # we're calling some_instance.new
|
|
42
|
+
constructor = false
|
|
43
|
+
elsif name == '<init>' && !meta # how do we get here?
|
|
44
|
+
constructor = true
|
|
45
|
+
elsif name == 'initialize' && !meta && scope
|
|
46
|
+
context = scope.context
|
|
47
|
+
if context.kind_of?(ConstructorDefinition) || context.findAncesor(ConstructorDefinition.class)
|
|
28
48
|
constructor = true
|
|
29
|
-
|
|
30
|
-
constructor = false
|
|
49
|
+
name = '<init>'
|
|
31
50
|
end
|
|
32
51
|
end
|
|
33
52
|
|
|
34
|
-
|
|
53
|
+
if block_given?
|
|
35
54
|
if constructor
|
|
36
|
-
|
|
55
|
+
mapped_type.add_method_listener('initialize') {block.call(find_method2(mapped_type.meta, 'new', mapped_params, macro_params, true))}
|
|
37
56
|
else
|
|
38
|
-
|
|
57
|
+
mapped_type.add_method_listener(name) {block.call(find_method2(mapped_type, name, mapped_params, macro_params, meta))}
|
|
58
|
+
end
|
|
59
|
+
block.call(find_method(mapped_type, name, mapped_params, macro_params, meta))
|
|
60
|
+
return
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
begin
|
|
64
|
+
unless mapped_params.any? {|p| p.nil? || p.isError}
|
|
65
|
+
if constructor
|
|
66
|
+
method = mapped_type.constructor(*mapped_params)
|
|
67
|
+
else
|
|
68
|
+
method = mapped_type.java_method(name, *mapped_params)
|
|
69
|
+
end
|
|
39
70
|
end
|
|
40
|
-
rescue NameError
|
|
71
|
+
rescue NameError => ex
|
|
72
|
+
# TODO return nil instead of raising an exception if the method doesn't exist.
|
|
73
|
+
raise ex unless ex.message =~ /#{Regexp.quote(mapped_type.name)}\.#{Regexp.quote(name)}|No constructor #{Regexp.quote(mapped_type.name)}/
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
macro = mapped_type.macro(name, macro_params)
|
|
77
|
+
if method && macro
|
|
78
|
+
method = nil # Need full lookup to determine precedence.
|
|
79
|
+
elsif method.nil? && macro
|
|
80
|
+
method = macro
|
|
81
|
+
elsif method.nil?
|
|
41
82
|
# exact args failed, do a deeper search
|
|
42
|
-
log "No exact match for #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})"
|
|
83
|
+
log "No exact match for #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})" if mapped_params.all?
|
|
43
84
|
|
|
44
|
-
method = find_jls(mapped_type, name, mapped_params, meta, constructor)
|
|
85
|
+
method = find_jls(mapped_type, name, mapped_params, macro_params, meta, constructor, scope)
|
|
45
86
|
|
|
46
87
|
unless method
|
|
47
|
-
log "Failed to locate method #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})"
|
|
88
|
+
log "Failed to locate method #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})" if mapped_params.all?
|
|
48
89
|
return nil
|
|
49
90
|
end
|
|
50
91
|
end
|
|
51
92
|
|
|
52
|
-
log "Found method #{method.declaring_class.name}.#{name}(#{method.argument_types.map(&:name).join ', '}) from #{mapped_type.name}"
|
|
93
|
+
log "Found method #{method.declaring_class.name}.#{name}(#{method.argument_types.map(&:name).join ', '}) from #{mapped_type.name}" if method
|
|
53
94
|
return method
|
|
54
95
|
end
|
|
55
96
|
|
|
56
|
-
def find_jls(mapped_type, name, mapped_params, meta, constructor)
|
|
97
|
+
def find_jls(mapped_type, name, mapped_params, macro_params, meta, constructor, scope=nil)
|
|
57
98
|
interfaces = []
|
|
58
|
-
if constructor
|
|
59
|
-
|
|
99
|
+
by_name = if constructor
|
|
100
|
+
mapped_type.unmeta.declared_constructors
|
|
60
101
|
elsif meta
|
|
61
|
-
|
|
102
|
+
mapped_type.declared_class_methods(name)
|
|
62
103
|
else
|
|
63
|
-
|
|
64
|
-
cls = mapped_type
|
|
65
|
-
while cls && !cls.error?
|
|
66
|
-
by_name += cls.declared_instance_methods(name)
|
|
67
|
-
interfaces.concat(cls.interfaces)
|
|
68
|
-
cls = cls.superclass
|
|
69
|
-
end
|
|
70
|
-
if mapped_type.interface? # TODO or abstract
|
|
71
|
-
seen = {}
|
|
72
|
-
until interfaces.empty?
|
|
73
|
-
interface = interfaces.pop
|
|
74
|
-
next if seen[interface] || interface.error?
|
|
75
|
-
seen[interface] = true
|
|
76
|
-
interfaces.concat(interface.interfaces)
|
|
77
|
-
by_name += interface.declared_instance_methods(name)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
104
|
+
mapped_type.find_callable_methods(name)
|
|
80
105
|
end
|
|
81
|
-
|
|
82
|
-
|
|
106
|
+
method = find_jls2(mapped_type, name, mapped_params, meta, by_name, true, scope)
|
|
107
|
+
return method if (constructor || macro_params.nil?)
|
|
108
|
+
macros = mapped_type.find_callable_macros(name)
|
|
109
|
+
if macros.size != 0
|
|
110
|
+
log "Found potential macro match for #{mapped_type.name}.#{name}(#{macro_params.map(&:full_name).join ', '})"
|
|
111
|
+
macro = find_jls2(mapped_type, name, macro_params, meta, macros, false, scope)
|
|
112
|
+
end
|
|
113
|
+
if macro && method
|
|
114
|
+
raise "Ambiguous targets invoking #{mapped_type}.#{name}:\n#{macro} and #{method}"
|
|
115
|
+
end
|
|
116
|
+
macro || method
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def find_jls2(mapped_type, name, mapped_params, meta, by_name, include_fields=true, scope=nil)
|
|
120
|
+
return nil if mapped_params.any? {|p| p.nil? || p.isError}
|
|
121
|
+
|
|
122
|
+
# filter by arity, varargs
|
|
123
|
+
by_name_and_arity = by_name.select {|m| m.argument_types.size == mapped_params.size }
|
|
83
124
|
|
|
84
125
|
phase1_methods = phase1(mapped_params, by_name_and_arity)
|
|
85
126
|
|
|
86
127
|
if phase1_methods.size > 1
|
|
87
128
|
method_list = phase1_methods.map do |m|
|
|
88
|
-
|
|
89
|
-
|
|
129
|
+
case m.member
|
|
130
|
+
when BiteScript::ASM::MethodMirror
|
|
131
|
+
m.member.inspect
|
|
132
|
+
else
|
|
133
|
+
"#{m.name}(#{m.parameter_types.map(&:name).join(', ')})"
|
|
134
|
+
end
|
|
90
135
|
end.join("\n")
|
|
91
136
|
raise "Ambiguous targets invoking #{mapped_type}.#{name}:\n#{method_list}"
|
|
92
137
|
end
|
|
93
138
|
|
|
94
139
|
phase1_methods[0] ||
|
|
95
140
|
phase2(mapped_params, by_name) ||
|
|
96
|
-
phase3(mapped_params, by_name) ||
|
|
97
|
-
|
|
98
|
-
|
|
141
|
+
phase3(mapped_params, by_name)[0] ||
|
|
142
|
+
(include_fields &&
|
|
143
|
+
(field_lookup(mapped_params, mapped_type, meta, name, scope) ||
|
|
144
|
+
inner_class(mapped_params, mapped_type, meta, name)))
|
|
99
145
|
end
|
|
100
146
|
|
|
101
147
|
def phase1(mapped_params, potentials)
|
|
102
|
-
log "Beginning JLS phase 1 search with params (#{mapped_params.map(&:name)})"
|
|
148
|
+
log "Beginning JLS phase 1 search with params (#{mapped_params.map(&:name).join ', '})"
|
|
103
149
|
|
|
104
150
|
# cycle through methods looking for more specific matches; gather matches of equal specificity
|
|
105
151
|
methods = potentials.inject([]) do |currents, potential|
|
|
106
152
|
method_params = potential.argument_types
|
|
107
|
-
|
|
153
|
+
next currents unless method_params.all?
|
|
108
154
|
|
|
109
155
|
# exact match always wins; duplicates not possible
|
|
110
156
|
if each_is_exact(mapped_params, method_params)
|
|
@@ -114,7 +160,7 @@ module Mirah
|
|
|
114
160
|
# otherwise, check for potential match and compare to current
|
|
115
161
|
# TODO: missing ambiguity check; picks last method of equal specificity
|
|
116
162
|
if each_is_exact_or_subtype_or_convertible(mapped_params, method_params)
|
|
117
|
-
if currents.
|
|
163
|
+
if !currents.empty?
|
|
118
164
|
if is_more_specific?(potential.argument_types, currents[0].argument_types)
|
|
119
165
|
# potential is better, dump all currents
|
|
120
166
|
currents = [potential]
|
|
@@ -146,14 +192,33 @@ module Mirah
|
|
|
146
192
|
end
|
|
147
193
|
|
|
148
194
|
def phase3(mapped_params, potentials)
|
|
149
|
-
|
|
195
|
+
potential_varargs = potentials.select{|m| m.varargs? }
|
|
196
|
+
methods = potential_varargs.inject([]) do |currents, potential|
|
|
197
|
+
method_params = potential.argument_types
|
|
198
|
+
# match n-1 params of potential
|
|
199
|
+
non_varargs_params, possible_varargs_params = mapped_params.partition.with_index{|param,i| i < method_params.size-1}
|
|
200
|
+
|
|
201
|
+
vararg_types = possible_varargs_params.size.times.map{ method_params.last.component_type }
|
|
202
|
+
|
|
203
|
+
if each_is_exact(non_varargs_params, method_params[0..-2]) &&
|
|
204
|
+
each_is_exact(possible_varargs_params, vararg_types)
|
|
205
|
+
return [potential]
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
if each_is_exact_or_subtype_or_convertible(non_varargs_params, method_params[0..-2]) &&
|
|
209
|
+
each_is_exact_or_subtype_or_convertible(possible_varargs_params, vararg_types)
|
|
210
|
+
currents << potential
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
currents
|
|
214
|
+
end
|
|
150
215
|
end
|
|
151
216
|
|
|
152
|
-
def field_lookup(mapped_params, mapped_type, meta, name)
|
|
217
|
+
def field_lookup(mapped_params, mapped_type, meta, name, scope)
|
|
153
218
|
log("Attempting #{meta ? 'static' : 'instance'} field lookup for '#{name}' on class #{mapped_type}")
|
|
154
219
|
# if we get to this point, the potentials do not match, so we ignore them
|
|
155
|
-
|
|
156
|
-
|
|
220
|
+
|
|
221
|
+
|
|
157
222
|
# search for a field of the given name
|
|
158
223
|
if name =~ /_set$/
|
|
159
224
|
# setter
|
|
@@ -173,42 +238,46 @@ module Mirah
|
|
|
173
238
|
|
|
174
239
|
if (meta && !field.static?) ||
|
|
175
240
|
(!meta && field.static?)
|
|
176
|
-
|
|
241
|
+
return nil
|
|
177
242
|
end
|
|
178
243
|
|
|
179
244
|
# check accessibility
|
|
180
245
|
# TODO: protected field access check appropriate to current type
|
|
181
246
|
if setter
|
|
182
|
-
|
|
247
|
+
if field.final?
|
|
248
|
+
log "cannot set final field '#{name}' on class #{mapped_type}"
|
|
249
|
+
return nil
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
unless field.public?
|
|
253
|
+
from = " from #{scope.selfType.resolve.name}" if scope
|
|
254
|
+
log "cannot access field '#{name}' on class #{mapped_type}#{from}"
|
|
255
|
+
return nil
|
|
183
256
|
end
|
|
184
|
-
raise "cannot access field '#{name}' on class #{mapped_type}" unless field.public?
|
|
185
257
|
|
|
186
258
|
field
|
|
187
259
|
end
|
|
188
260
|
|
|
189
261
|
def inner_class(params, type, meta, name)
|
|
190
|
-
return unless params.
|
|
262
|
+
return unless params.empty? && meta
|
|
191
263
|
log("Attempting inner class lookup for '#{name}' on #{type}")
|
|
192
264
|
type.inner_class_getter(name)
|
|
193
265
|
end
|
|
194
266
|
|
|
195
267
|
def each_is_exact(incoming, target)
|
|
196
|
-
incoming.
|
|
197
|
-
target_type = target[i]
|
|
198
|
-
|
|
199
|
-
# exact match
|
|
200
|
-
return false unless target_type == in_type
|
|
201
|
-
end
|
|
202
|
-
return true
|
|
268
|
+
incoming.zip(target).all? { |in_type, target_type| target_type == in_type }
|
|
203
269
|
end
|
|
204
270
|
|
|
205
271
|
def each_is_exact_or_subtype_or_convertible(incoming, target)
|
|
206
|
-
incoming.
|
|
207
|
-
target_type = target[i]
|
|
272
|
+
incoming.zip(target).each do |in_type, target_type|
|
|
208
273
|
|
|
209
274
|
# exact match
|
|
210
275
|
next if target_type == in_type
|
|
211
276
|
|
|
277
|
+
unless target_type.respond_to?(:primitive?) && in_type.respond_to?(:primitive?)
|
|
278
|
+
puts "Huh?"
|
|
279
|
+
end
|
|
280
|
+
|
|
212
281
|
# primitive is safely convertible
|
|
213
282
|
if target_type.primitive?
|
|
214
283
|
if in_type.primitive?
|
data/lib/mirah/jvm/typer.rb
CHANGED
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
require 'mirah/typer'
|
|
17
16
|
require 'mirah/jvm/types'
|
|
18
17
|
require 'mirah/jvm/types/factory'
|
|
19
18
|
|
|
@@ -33,6 +32,13 @@ module Mirah
|
|
|
33
32
|
@known_types = @factory.known_types
|
|
34
33
|
@known_types['dynamic'] = DynamicType.new
|
|
35
34
|
@errors = []
|
|
35
|
+
self.scopes = transformer.scopes
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def define_type(node, name, superclass, interfaces)
|
|
39
|
+
scope = get_scope(node)
|
|
40
|
+
@factory.define_type(scope, node)
|
|
41
|
+
super(scope, name, superclass, interfaces)
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
def set_filename(scope, filename)
|
|
@@ -55,9 +61,9 @@ module Mirah
|
|
|
55
61
|
end
|
|
56
62
|
|
|
57
63
|
def type_definition(scope, name, superclass, interfaces)
|
|
58
|
-
imports = scope.
|
|
64
|
+
imports = scope.imports
|
|
59
65
|
name = imports[name] while imports.include?(name)
|
|
60
|
-
package = scope.
|
|
66
|
+
package = scope.package
|
|
61
67
|
unless name =~ /\./ || package.empty?
|
|
62
68
|
name = "#{package}.#{name}"
|
|
63
69
|
end
|
|
@@ -157,7 +163,6 @@ module Mirah
|
|
|
157
163
|
interfaces = self_type.interfaces.dup
|
|
158
164
|
until method || interfaces.empty?
|
|
159
165
|
interface = interfaces.pop
|
|
160
|
-
next if interface.error?
|
|
161
166
|
method = interface.find_method(
|
|
162
167
|
interface, method_def.name, arg_types, false)
|
|
163
168
|
end
|
|
@@ -169,4 +174,4 @@ module Mirah
|
|
|
169
174
|
end
|
|
170
175
|
end
|
|
171
176
|
end
|
|
172
|
-
end
|
|
177
|
+
end
|
data/lib/mirah/jvm/types.rb
CHANGED
|
@@ -16,14 +16,22 @@
|
|
|
16
16
|
require 'bitescript'
|
|
17
17
|
require 'mirah/ast'
|
|
18
18
|
require 'mirah/jvm/method_lookup'
|
|
19
|
-
require 'mirah/
|
|
19
|
+
require 'mirah/util/logging'
|
|
20
|
+
#require 'mirah/jvm/compiler'
|
|
20
21
|
require 'set'
|
|
22
|
+
module Mirah::JVM
|
|
23
|
+
module Types
|
|
24
|
+
end
|
|
25
|
+
end
|
|
21
26
|
require 'mirah/jvm/types/type'
|
|
22
27
|
require 'mirah/jvm/types/primitive_type'
|
|
23
28
|
require 'mirah/jvm/types/meta_type'
|
|
29
|
+
require 'mirah/jvm/types/generic_type'
|
|
24
30
|
require 'mirah/jvm/types/null_type'
|
|
31
|
+
require 'mirah/jvm/types/implicit_nil_type'
|
|
25
32
|
require 'mirah/jvm/types/unreachable_type'
|
|
26
33
|
require 'mirah/jvm/types/void_type'
|
|
34
|
+
require 'mirah/jvm/types/block_type'
|
|
27
35
|
require 'mirah/jvm/types/array_type'
|
|
28
36
|
require 'mirah/jvm/types/dynamic_type'
|
|
29
37
|
require 'mirah/jvm/types/type_definition'
|
|
@@ -34,6 +42,6 @@ require 'mirah/jvm/types/number'
|
|
|
34
42
|
require 'mirah/jvm/types/integers'
|
|
35
43
|
require 'mirah/jvm/types/boolean'
|
|
36
44
|
require 'mirah/jvm/types/floats'
|
|
37
|
-
require 'mirah/jvm/types/basic_types'
|
|
38
45
|
require 'mirah/jvm/types/literals'
|
|
46
|
+
require 'mirah/jvm/types/factory'
|
|
39
47
|
require 'mirah/jvm/types/extensions'
|
|
@@ -6,13 +6,10 @@ module Mirah
|
|
|
6
6
|
|
|
7
7
|
def initialize(component_type)
|
|
8
8
|
@component_type = component_type
|
|
9
|
-
|
|
10
|
-
#@type = java.lang.reflect.Array.newInstance(@component_type.jvm_type, 0).class
|
|
11
|
-
else
|
|
12
|
-
# FIXME: THIS IS WRONG, but I don't know how to fix it
|
|
13
|
-
#@type = @component_type
|
|
14
|
-
end
|
|
9
|
+
|
|
15
10
|
@name = component_type.name
|
|
11
|
+
@type_system = component_type.type_system
|
|
12
|
+
self.intrinsics
|
|
16
13
|
end
|
|
17
14
|
|
|
18
15
|
def array?
|
|
@@ -32,22 +29,23 @@ module Mirah
|
|
|
32
29
|
end
|
|
33
30
|
|
|
34
31
|
def superclass
|
|
32
|
+
object_type = @type_system.type(nil, 'java.lang.Object')
|
|
35
33
|
if component_type.primitive?
|
|
36
|
-
|
|
34
|
+
object_type
|
|
37
35
|
elsif component_type.array?
|
|
38
36
|
# fix covariance here for arrays of arrays
|
|
39
37
|
# see #55
|
|
40
|
-
|
|
38
|
+
object_type
|
|
41
39
|
else
|
|
42
|
-
if component_type ==
|
|
43
|
-
|
|
40
|
+
if component_type == object_type
|
|
41
|
+
object_type
|
|
44
42
|
else
|
|
45
43
|
component_type.superclass.array_type
|
|
46
44
|
end
|
|
47
45
|
end
|
|
48
46
|
end
|
|
49
47
|
|
|
50
|
-
def interfaces
|
|
48
|
+
def interfaces(include_parent=true)
|
|
51
49
|
[]
|
|
52
50
|
end
|
|
53
51
|
|
|
@@ -59,4 +57,4 @@ module Mirah
|
|
|
59
57
|
class ArrayMetaType < MetaType; end
|
|
60
58
|
end
|
|
61
59
|
end
|
|
62
|
-
end
|
|
60
|
+
end
|
|
@@ -13,15 +13,19 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
class Java::MirahLangAst::NodeImpl
|
|
17
|
+
def annotated_abstract?
|
|
18
|
+
annotations.each do |anno|
|
|
19
|
+
if anno.type.typeref.name == 'org.mirah.jvm.types.Modifiers'
|
|
20
|
+
anno.values.each do |entry|
|
|
21
|
+
if entry.key.identifier == 'flags'
|
|
22
|
+
entry.value.values.each do |value|
|
|
23
|
+
return true if value.identifier == 'ABSTRACT'
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
24
27
|
end
|
|
25
28
|
end
|
|
29
|
+
false
|
|
26
30
|
end
|
|
27
31
|
end
|