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
|
@@ -20,14 +20,14 @@ def rot13 (value:string)
|
|
|
20
20
|
d = ' '.toCharArray[0]
|
|
21
21
|
value.toCharArray.each do |c|
|
|
22
22
|
testChar = Character.toLowerCase(c)
|
|
23
|
-
if testChar <= 'm'.toCharArray[0] && testChar >= 'a'.toCharArray[0] then
|
|
23
|
+
if testChar <= 'm'.toCharArray[0] && testChar >= 'a'.toCharArray[0] then
|
|
24
24
|
d = char(c + 13)
|
|
25
25
|
end
|
|
26
|
-
if testChar <= 'z'.toCharArray[0] && testChar >= 'n'.toCharArray[0] then
|
|
27
|
-
d = char(c - 13)
|
|
28
|
-
end
|
|
26
|
+
if testChar <= 'z'.toCharArray[0] && testChar >= 'n'.toCharArray[0] then
|
|
27
|
+
d = char(c - 13)
|
|
28
|
+
end
|
|
29
29
|
result += d
|
|
30
|
-
end
|
|
30
|
+
end
|
|
31
31
|
result
|
|
32
32
|
end
|
|
33
33
|
|
|
@@ -15,17 +15,17 @@
|
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Java encodes strings in UTF-16, which represents each character with one
|
|
18
|
-
* or two 16-bit values. The length method of String objects returns the
|
|
19
|
-
* number of 16-bit values used to encode a string, so the number of bytes
|
|
18
|
+
* or two 16-bit values. The length method of String objects returns the
|
|
19
|
+
* number of 16-bit values used to encode a string, so the number of bytes
|
|
20
20
|
* can be determined by doubling that number.
|
|
21
|
-
*/
|
|
21
|
+
*/
|
|
22
22
|
|
|
23
23
|
s = "Hello, world!"
|
|
24
24
|
puts s.length() * 2
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* Another way to know the byte length of a string is to explicitly
|
|
27
|
+
* Another way to know the byte length of a string is to explicitly
|
|
28
28
|
* specify the charset we desire.
|
|
29
|
-
*/
|
|
29
|
+
*/
|
|
30
30
|
puts s.getBytes("UTF-16").length
|
|
31
31
|
puts s.getBytes("UTF-8").length
|
data/examples/swing.mirah
CHANGED
data/examples/test.edb
CHANGED
data/javalib/mirah-bootstrap.jar
CHANGED
|
Binary file
|
|
Binary file
|
data/javalib/mirah-parser.jar
CHANGED
|
Binary file
|
|
Binary file
|
data/lib/duby.rb
CHANGED
data/lib/mirah.rb
CHANGED
|
@@ -15,18 +15,25 @@
|
|
|
15
15
|
|
|
16
16
|
require 'fileutils'
|
|
17
17
|
require 'rbconfig'
|
|
18
|
+
require 'bitescript'
|
|
19
|
+
|
|
20
|
+
$CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-builtins.jar'
|
|
21
|
+
$CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-parser.jar'
|
|
22
|
+
$CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-bootstrap.jar'
|
|
23
|
+
$CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-util.jar'
|
|
24
|
+
$CLASSPATH << File.dirname(__FILE__) + '/../javalib/dynalink-0.2.jar'
|
|
25
|
+
|
|
18
26
|
require 'mirah/version'
|
|
19
27
|
require 'mirah/transform'
|
|
20
28
|
require 'mirah/ast'
|
|
21
|
-
require 'mirah/typer'
|
|
22
29
|
require 'mirah/compiler'
|
|
23
30
|
require 'mirah/env'
|
|
24
31
|
require 'mirah/errors'
|
|
25
|
-
require '
|
|
32
|
+
require 'mirah/typer'
|
|
33
|
+
require 'mirah/jvm/types'
|
|
26
34
|
|
|
27
35
|
require 'mirah/jvm/compiler'
|
|
28
|
-
|
|
29
|
-
Dir[File.dirname(__FILE__) + "/mirah/plugin/*"].each {|file| require "#{file}" if file =~ /\.rb$/}
|
|
36
|
+
#Dir[File.dirname(__FILE__) + "/mirah/plugin/*"].each {|file| require "#{file}" if file =~ /\.rb$/}
|
|
30
37
|
require 'jruby'
|
|
31
38
|
|
|
32
39
|
require 'mirah/commands'
|
|
@@ -57,30 +64,45 @@ module Mirah
|
|
|
57
64
|
puts message
|
|
58
65
|
return
|
|
59
66
|
end
|
|
60
|
-
puts "#{position.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
67
|
+
puts "#{position.source.name}:#{position.start_line}: #{message}"
|
|
68
|
+
puts underline(position)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.underline(position)
|
|
72
|
+
start_line = position.start_line - position.source.initial_line
|
|
73
|
+
end_line = position.end_line - position.source.initial_line
|
|
74
|
+
|
|
75
|
+
start_col = position.start_column
|
|
76
|
+
end_col = position.end_column
|
|
77
|
+
adjustment = if start_line == 0
|
|
78
|
+
position.source.initial_column
|
|
79
|
+
else
|
|
80
|
+
1
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
start_col -= adjustment
|
|
84
|
+
end_col -= adjustment
|
|
85
|
+
|
|
86
|
+
result = ""
|
|
87
|
+
position.source.contents.each_line.with_index do |line, lineno|
|
|
88
|
+
break if lineno > end_line
|
|
89
|
+
next if lineno < start_line
|
|
90
|
+
|
|
91
|
+
chomped = line.chomp
|
|
92
|
+
result << chomped
|
|
93
|
+
result << "\n"
|
|
94
|
+
|
|
95
|
+
start = 0
|
|
96
|
+
start = start_col if lineno == start_line
|
|
97
|
+
|
|
98
|
+
result << " " * start
|
|
99
|
+
|
|
100
|
+
endcol = chomped.size
|
|
101
|
+
endcol = end_col if lineno == end_line
|
|
102
|
+
|
|
103
|
+
result << "^" * [endcol - start, 1].max
|
|
104
|
+
result << "\n"
|
|
84
105
|
end
|
|
106
|
+
result
|
|
85
107
|
end
|
|
86
108
|
end
|
data/lib/mirah/ast.rb
CHANGED
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
require 'mirah/util/delegate'
|
|
17
17
|
require 'mirah/transform'
|
|
18
18
|
require 'mirah/ast/scope'
|
|
19
|
-
require 'jruby/core_ext'
|
|
20
19
|
|
|
21
20
|
module Mirah
|
|
22
21
|
module AST
|
|
@@ -24,610 +23,21 @@ module Mirah
|
|
|
24
23
|
attr_accessor :verbose
|
|
25
24
|
end
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
java_import 'mirah.lang.ast.Array'
|
|
27
|
+
java_import 'mirah.lang.ast.Annotation'
|
|
28
|
+
java_import 'mirah.lang.ast.Constant'
|
|
29
|
+
java_import 'mirah.lang.ast.EmptyArray'
|
|
30
|
+
java_import 'mirah.lang.ast.Fixnum'
|
|
31
|
+
java_import 'mirah.lang.ast.HashEntry'
|
|
32
|
+
java_import 'mirah.lang.ast.LocalAccess'
|
|
33
|
+
java_import 'mirah.lang.ast.Node'
|
|
34
|
+
java_import 'mirah.lang.ast.NodeList'
|
|
35
|
+
java_import 'mirah.lang.ast.Noop'
|
|
36
|
+
java_import 'mirah.lang.ast.OptionalArgument'
|
|
37
|
+
java_import 'mirah.lang.ast.Position'
|
|
38
|
+
java_import 'mirah.lang.ast.SimpleString'
|
|
39
|
+
java_import 'mirah.lang.ast.TypeName'
|
|
40
|
+
java_import 'mirah.lang.ast.TypeRef'
|
|
34
41
|
|
|
35
|
-
attr_accessor :children
|
|
36
|
-
attr_accessor :parent
|
|
37
|
-
attr_accessor :position
|
|
38
|
-
attr_accessor :newline
|
|
39
|
-
attr_accessor :inferred_type
|
|
40
|
-
|
|
41
|
-
# defines children of a node by name,
|
|
42
|
-
# respecting call order.
|
|
43
|
-
#
|
|
44
|
-
# @param [Symbol] name the name of the child node
|
|
45
|
-
def self.child(name)
|
|
46
|
-
@children ||= []
|
|
47
|
-
index = @children.size
|
|
48
|
-
class_eval <<-EOF
|
|
49
|
-
def #{name}
|
|
50
|
-
@children[#{index}]
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def #{name}=(node)
|
|
54
|
-
@children[#{index}] = _set_parent(node)
|
|
55
|
-
end
|
|
56
|
-
EOF
|
|
57
|
-
@children << name
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def self.child_name(i)
|
|
61
|
-
@children[i] if @children
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def child_nodes
|
|
65
|
-
java.util.ArrayList.new(@children)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
#
|
|
69
|
-
# @param [Mirah::AST::Node] parent the parent node
|
|
70
|
-
# @param [JMetaPosition] position the location in the source code of the node
|
|
71
|
-
# @param [Array] children the list of child nodes
|
|
72
|
-
# @yield [self] yields the node being initialized, expects the list of children as the result.
|
|
73
|
-
# takes priority over the `children` argument.
|
|
74
|
-
#
|
|
75
|
-
def initialize(parent, position, children = [])
|
|
76
|
-
# JRuby 1.6.x doesn't seem to like become_java! as much (see bottom of class)
|
|
77
|
-
if JRUBY_VERSION < '1.7'
|
|
78
|
-
JRuby.reference(self.class).setRubyClassAllocator(JRuby.reference(self.class).reified_class)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
unless parent.nil? || Mirah::AST::Node === parent
|
|
82
|
-
raise "Mirah::AST::Node.new parent #{parent.class} must be nil or === Mirah::AST::Node."
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
@parent = parent
|
|
86
|
-
@newline = false
|
|
87
|
-
@inferred_type = nil
|
|
88
|
-
@resolved = false
|
|
89
|
-
@position = position
|
|
90
|
-
if block_given?
|
|
91
|
-
@children ||= []
|
|
92
|
-
@children = yield(self) || []
|
|
93
|
-
else
|
|
94
|
-
@children = children
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def _dump(depth)
|
|
99
|
-
to_skip = %w(@parent @newline @inferred_type @resolved @proxy @scope @class_scope @static_scope @typer)
|
|
100
|
-
vars = {}
|
|
101
|
-
instance_variables.each do |name|
|
|
102
|
-
next if to_skip.include?(name)
|
|
103
|
-
vars[name] = instance_variable_get(name)
|
|
104
|
-
begin
|
|
105
|
-
Mirah::AST::Unquote.extract_values do
|
|
106
|
-
Marshal.dump(vars[name]) if AST.verbose
|
|
107
|
-
end
|
|
108
|
-
rescue
|
|
109
|
-
puts "#{self}: Failed to marshal #{name}"
|
|
110
|
-
puts inspect
|
|
111
|
-
puts $!, $@
|
|
112
|
-
raise $!
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
Marshal.dump(vars)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def self._load(vars)
|
|
119
|
-
node = self.allocate
|
|
120
|
-
Marshal.load(vars).each do |name, value|
|
|
121
|
-
node.instance_variable_set(name, value)
|
|
122
|
-
end
|
|
123
|
-
node.children.each do |child|
|
|
124
|
-
node._set_parent(child)
|
|
125
|
-
end
|
|
126
|
-
node.validate_children
|
|
127
|
-
node
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def validate_children
|
|
131
|
-
validate_name if respond_to?(:validate_name)
|
|
132
|
-
children.each_with_index do |child, i|
|
|
133
|
-
validate_child(child, i)
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def validate_child(child, i)
|
|
138
|
-
name = self.class.child_name(i)
|
|
139
|
-
validator = :"validate_#{name}"
|
|
140
|
-
if name && respond_to?(validator)
|
|
141
|
-
send validator
|
|
142
|
-
else
|
|
143
|
-
if UnquotedValue === child
|
|
144
|
-
self[i] = child.node
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def line_number
|
|
150
|
-
if @position
|
|
151
|
-
@position.start_line + 1
|
|
152
|
-
else
|
|
153
|
-
0
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def log(message)
|
|
158
|
-
puts "* [AST] [#{simple_name}] " + message if AST.verbose
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def inspect_children(indent = 0)
|
|
162
|
-
indent_str = ' ' * indent
|
|
163
|
-
str = ''
|
|
164
|
-
children.each_with_index do |child, i|
|
|
165
|
-
extra_indent = 0
|
|
166
|
-
if child
|
|
167
|
-
name = self.class.child_name(i)
|
|
168
|
-
|
|
169
|
-
wrong_parent = lambda do |child|
|
|
170
|
-
if Node === child && child.parent != self
|
|
171
|
-
"\n#{indent_str} (wrong parent)"
|
|
172
|
-
else
|
|
173
|
-
""
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
if Mirah::AST.verbose && name
|
|
178
|
-
str << "\n#{indent_str} #{name}:"
|
|
179
|
-
extra_indent = 1
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
case child
|
|
183
|
-
when ::Array
|
|
184
|
-
child.each do |ary_child|
|
|
185
|
-
|
|
186
|
-
str << wrong_parent[ary_child] if Mirah::AST.verbose
|
|
187
|
-
|
|
188
|
-
str << "\n#{ary_child.inspect(indent + extra_indent + 1)}"
|
|
189
|
-
end
|
|
190
|
-
when ::Hash, ::String
|
|
191
|
-
str << "\n#{indent_str} #{child.inspect}"
|
|
192
|
-
else
|
|
193
|
-
str << wrong_parent[child] if Mirah::AST.verbose
|
|
194
|
-
|
|
195
|
-
begin
|
|
196
|
-
str << "\n#{child.inspect(indent + extra_indent + 1)}"
|
|
197
|
-
rescue ArgumentError => ex
|
|
198
|
-
str << "\n#{indent_str} #{child.inspect}"
|
|
199
|
-
end
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
end
|
|
203
|
-
str
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def inspect(indent = 0)
|
|
207
|
-
indent_str = ' ' * indent
|
|
208
|
-
indent_str << to_s << inspect_children(indent)
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
def simple_name
|
|
212
|
-
self.class.name.split("::")[-1]
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
def to_s; simple_name; end
|
|
216
|
-
|
|
217
|
-
def string_value
|
|
218
|
-
raise Mirah::SyntaxError.new("Can't use #{self.class} as string literal")
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
def [](index) children[index] end
|
|
222
|
-
|
|
223
|
-
def []=(index, node)
|
|
224
|
-
node.parent = self
|
|
225
|
-
@children[index] = node
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
def each(&b) children.each(&b) end
|
|
229
|
-
|
|
230
|
-
def <<(node)
|
|
231
|
-
@children << _set_parent(node)
|
|
232
|
-
self
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
def insert(index, node)
|
|
236
|
-
node.parent = self
|
|
237
|
-
@children.insert(index, node)
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
def empty?
|
|
241
|
-
@children.empty?
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
def resolved!(typer=nil)
|
|
245
|
-
log "#{to_s} resolved!"
|
|
246
|
-
@resolved = true
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
def resolved?; @resolved end
|
|
250
|
-
|
|
251
|
-
def resolve_if(typer)
|
|
252
|
-
unless resolved?
|
|
253
|
-
@inferred_type = yield
|
|
254
|
-
@inferred_type ? resolved!(typer) : typer.defer(self)
|
|
255
|
-
end
|
|
256
|
-
@inferred_type
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
def self.===(other)
|
|
260
|
-
super || (other.kind_of?(NodeProxy) && (self === other.__getobj__))
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
def _set_parent(node)
|
|
264
|
-
case node
|
|
265
|
-
when Node
|
|
266
|
-
node.parent = self
|
|
267
|
-
when ::Array
|
|
268
|
-
node.each {|x| x.parent = self if x}
|
|
269
|
-
end
|
|
270
|
-
node
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
def initialize_copy(other)
|
|
274
|
-
# bug: node is deferred, but it's parent isn't
|
|
275
|
-
# parent gets duped
|
|
276
|
-
# duped parent is inferred so it's children aren't
|
|
277
|
-
# original node gets inferred, but not the duplicate child
|
|
278
|
-
@inferred_type = @resolved = nil
|
|
279
|
-
@parent = nil
|
|
280
|
-
@children = []
|
|
281
|
-
other.children.each do |child|
|
|
282
|
-
case child
|
|
283
|
-
when ::Array
|
|
284
|
-
self << child.map {|x| x.dup}
|
|
285
|
-
when nil
|
|
286
|
-
self << nil
|
|
287
|
-
else
|
|
288
|
-
self << child.dup
|
|
289
|
-
end
|
|
290
|
-
end
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
def inferred_type!
|
|
294
|
-
unless @inferred_type
|
|
295
|
-
raise Mirah::InternalCompilerError.new(
|
|
296
|
-
"Internal Error: #{self.class} never inferred", self)
|
|
297
|
-
end
|
|
298
|
-
inferred_type
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
def top_level?
|
|
302
|
-
false
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
if JRUBY_VERSION >= '1.7'
|
|
306
|
-
become_java!
|
|
307
|
-
end
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
class ErrorNode < Node
|
|
311
|
-
def initialize(parent, error)
|
|
312
|
-
super(parent, error.position)
|
|
313
|
-
@error = error
|
|
314
|
-
@inferred_type = TypeReference::ErrorType
|
|
315
|
-
@resolved = true
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
def infer(typer, expression)
|
|
319
|
-
end
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
module Named
|
|
323
|
-
attr_reader :name
|
|
324
|
-
|
|
325
|
-
def name=(name)
|
|
326
|
-
if Node === name
|
|
327
|
-
name.parent = self
|
|
328
|
-
end
|
|
329
|
-
@name = name
|
|
330
|
-
end
|
|
331
|
-
|
|
332
|
-
def to_s
|
|
333
|
-
"#{super}(#{name})"
|
|
334
|
-
end
|
|
335
|
-
|
|
336
|
-
def string_value
|
|
337
|
-
name
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
def validate_name
|
|
341
|
-
if UnquotedValue === @name
|
|
342
|
-
@name = @name.name
|
|
343
|
-
end
|
|
344
|
-
end
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
module Typed
|
|
348
|
-
attr_accessor :type
|
|
349
|
-
end
|
|
350
|
-
|
|
351
|
-
module Valued
|
|
352
|
-
include Typed
|
|
353
|
-
attr_accessor :value
|
|
354
|
-
end
|
|
355
|
-
|
|
356
|
-
module Literal
|
|
357
|
-
include Typed
|
|
358
|
-
attr_accessor :literal
|
|
359
|
-
|
|
360
|
-
def to_s
|
|
361
|
-
"#{super}(#{literal.inspect})"
|
|
362
|
-
end
|
|
363
|
-
|
|
364
|
-
def string_value
|
|
365
|
-
literal.to_s
|
|
366
|
-
end
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
module Annotated
|
|
370
|
-
attr_accessor :annotations
|
|
371
|
-
|
|
372
|
-
def annotation(name)
|
|
373
|
-
name = name.to_s
|
|
374
|
-
annotations.find {|a| a.name == name}
|
|
375
|
-
end
|
|
376
|
-
end
|
|
377
|
-
|
|
378
|
-
module Binding
|
|
379
|
-
def binding_type(mirah=nil)
|
|
380
|
-
static_scope.binding_type(defining_class, mirah)
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
def binding_type=(type)
|
|
384
|
-
static_scope.binding_type = type
|
|
385
|
-
end
|
|
386
|
-
|
|
387
|
-
def has_binding?
|
|
388
|
-
static_scope.has_binding?
|
|
389
|
-
end
|
|
390
|
-
end
|
|
391
|
-
|
|
392
|
-
class NodeProxy < Mirah::Util::DelegateClass(Node)
|
|
393
|
-
include Java::DubyLangCompiler::Node
|
|
394
|
-
include Java::DubyLangCompiler.Call
|
|
395
|
-
|
|
396
|
-
def __inline__(node)
|
|
397
|
-
node.parent = parent
|
|
398
|
-
__setobj__(node)
|
|
399
|
-
end
|
|
400
|
-
|
|
401
|
-
def dup
|
|
402
|
-
value = __getobj__.dup
|
|
403
|
-
if value.respond_to?(:proxy=)
|
|
404
|
-
new = super
|
|
405
|
-
new.__setobj__(value)
|
|
406
|
-
new.proxy = new
|
|
407
|
-
new
|
|
408
|
-
else
|
|
409
|
-
value
|
|
410
|
-
end
|
|
411
|
-
end
|
|
412
|
-
|
|
413
|
-
def _dump(depth)
|
|
414
|
-
Marshal.dump(__getobj__)
|
|
415
|
-
end
|
|
416
|
-
|
|
417
|
-
def self._load(str)
|
|
418
|
-
value = Marshal.load(str)
|
|
419
|
-
if value.respond_to?(:proxy=)
|
|
420
|
-
proxy = NodeProxy.new(value)
|
|
421
|
-
proxy.proxy = proxy
|
|
422
|
-
else
|
|
423
|
-
value
|
|
424
|
-
end
|
|
425
|
-
end
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
class TypeReference < Node
|
|
429
|
-
include Named
|
|
430
|
-
attr_accessor :array
|
|
431
|
-
alias array? array
|
|
432
|
-
attr_accessor :meta
|
|
433
|
-
alias meta? meta
|
|
434
|
-
|
|
435
|
-
def initialize(name, array = false, meta = false, position=nil)
|
|
436
|
-
super(nil, position)
|
|
437
|
-
self.name = name
|
|
438
|
-
@array = array
|
|
439
|
-
@meta = meta
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
def type_reference(typer)
|
|
443
|
-
typer.type_reference(nil, name, array, meta)
|
|
444
|
-
end
|
|
445
|
-
|
|
446
|
-
def to_s
|
|
447
|
-
"Type(#{name}#{array? ? ' array' : ''}#{meta? ? ' meta' : ''})"
|
|
448
|
-
end
|
|
449
|
-
|
|
450
|
-
def full_name
|
|
451
|
-
"#{name}#{array ? '[]' : ''}"
|
|
452
|
-
end
|
|
453
|
-
|
|
454
|
-
def ==(other)
|
|
455
|
-
to_s == other.to_s
|
|
456
|
-
end
|
|
457
|
-
|
|
458
|
-
def eql?(other)
|
|
459
|
-
self == other
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
def hash
|
|
463
|
-
to_s.hash
|
|
464
|
-
end
|
|
465
|
-
|
|
466
|
-
def is_parent(other)
|
|
467
|
-
# default behavior now is to disallow any polymorphic types
|
|
468
|
-
self == other
|
|
469
|
-
end
|
|
470
|
-
|
|
471
|
-
def compatible?(other)
|
|
472
|
-
# default behavior is only exact match right now
|
|
473
|
-
self == other ||
|
|
474
|
-
error? || other.error? ||
|
|
475
|
-
unreachable? || other.unreachable?
|
|
476
|
-
end
|
|
477
|
-
|
|
478
|
-
def iterable?
|
|
479
|
-
array?
|
|
480
|
-
end
|
|
481
|
-
|
|
482
|
-
def component_type
|
|
483
|
-
AST.type(nil, name) if array?
|
|
484
|
-
end
|
|
485
|
-
|
|
486
|
-
def basic_type
|
|
487
|
-
if array? || meta?
|
|
488
|
-
TypeReference.new(name, false, false)
|
|
489
|
-
else
|
|
490
|
-
self
|
|
491
|
-
end
|
|
492
|
-
end
|
|
493
|
-
|
|
494
|
-
def narrow(other)
|
|
495
|
-
# only exact match allowed for now, so narrowing is a noop
|
|
496
|
-
if error? || unreachable?
|
|
497
|
-
other
|
|
498
|
-
else
|
|
499
|
-
self
|
|
500
|
-
end
|
|
501
|
-
end
|
|
502
|
-
|
|
503
|
-
def unmeta
|
|
504
|
-
TypeReference.new(name, array, false)
|
|
505
|
-
end
|
|
506
|
-
|
|
507
|
-
def meta
|
|
508
|
-
TypeReference.new(name, array, true)
|
|
509
|
-
end
|
|
510
|
-
|
|
511
|
-
def void?
|
|
512
|
-
name == :void
|
|
513
|
-
end
|
|
514
|
-
|
|
515
|
-
def error?
|
|
516
|
-
name == :error
|
|
517
|
-
end
|
|
518
|
-
|
|
519
|
-
def null?
|
|
520
|
-
name == :null
|
|
521
|
-
end
|
|
522
|
-
|
|
523
|
-
def unreachable?
|
|
524
|
-
name == :unreachable
|
|
525
|
-
end
|
|
526
|
-
|
|
527
|
-
def block?
|
|
528
|
-
name == :block
|
|
529
|
-
end
|
|
530
|
-
|
|
531
|
-
def primitive?
|
|
532
|
-
true
|
|
533
|
-
end
|
|
534
|
-
|
|
535
|
-
def _dump(depth)
|
|
536
|
-
Marshal.dump([name, array?, meta?])
|
|
537
|
-
end
|
|
538
|
-
|
|
539
|
-
def self._load(str)
|
|
540
|
-
AST::Type(*Marshal.load(str))
|
|
541
|
-
end
|
|
542
|
-
|
|
543
|
-
NoType = TypeReference.new(:notype)
|
|
544
|
-
NullType = TypeReference.new(:null)
|
|
545
|
-
ErrorType = TypeReference.new(:error)
|
|
546
|
-
UnreachableType = TypeReference.new(:unreachable)
|
|
547
|
-
BlockType = TypeReference.new(:block)
|
|
548
|
-
end
|
|
549
|
-
|
|
550
|
-
class TypeDefinition < TypeReference
|
|
551
|
-
attr_accessor :superclass, :interfaces
|
|
552
|
-
|
|
553
|
-
def initialize(name, superclass, interfaces)
|
|
554
|
-
super(name, false)
|
|
555
|
-
|
|
556
|
-
@superclass = superclass
|
|
557
|
-
@interfaces = interfaces
|
|
558
|
-
end
|
|
559
|
-
end
|
|
560
|
-
|
|
561
|
-
def self.type_factory
|
|
562
|
-
Thread.current[:ast_type_factory]
|
|
563
|
-
end
|
|
564
|
-
|
|
565
|
-
def self.type_factory=(factory)
|
|
566
|
-
Thread.current[:ast_type_factory] = factory
|
|
567
|
-
end
|
|
568
|
-
|
|
569
|
-
# Shortcut method to construct type references
|
|
570
|
-
def self.type(scope, typesym, array = false, meta = false)
|
|
571
|
-
factory = type_factory
|
|
572
|
-
if factory
|
|
573
|
-
factory.type(scope, typesym, array, meta)
|
|
574
|
-
else
|
|
575
|
-
TypeReference.new(typesym, array, meta)
|
|
576
|
-
end
|
|
577
|
-
end
|
|
578
|
-
|
|
579
|
-
def self.no_type
|
|
580
|
-
factory = type_factory
|
|
581
|
-
if factory
|
|
582
|
-
factory.no_type
|
|
583
|
-
else
|
|
584
|
-
TypeReference::NoType
|
|
585
|
-
end
|
|
586
|
-
end
|
|
587
|
-
|
|
588
|
-
def self.error_type
|
|
589
|
-
TypeReference::ErrorType
|
|
590
|
-
end
|
|
591
|
-
|
|
592
|
-
def self.unreachable_type
|
|
593
|
-
factory = type_factory
|
|
594
|
-
if factory
|
|
595
|
-
factory.unreachable_type
|
|
596
|
-
else
|
|
597
|
-
TypeReference::UnreachableType
|
|
598
|
-
end
|
|
599
|
-
end
|
|
600
|
-
|
|
601
|
-
def self.block_type
|
|
602
|
-
TypeReference::BlockType
|
|
603
|
-
end
|
|
604
|
-
|
|
605
|
-
def self.fixnum(parent, position, literal)
|
|
606
|
-
Fixnum.new(parent, position, literal)
|
|
607
|
-
end
|
|
608
|
-
|
|
609
|
-
def self.float(parent, position, literal)
|
|
610
|
-
Float.new(parent, position, literal)
|
|
611
|
-
end
|
|
612
|
-
|
|
613
|
-
def self.defmacro(name, &block)
|
|
614
|
-
@macros ||= {}
|
|
615
|
-
raise "Conflicting macros for #{name}" if @macros[name]
|
|
616
|
-
@macros[name] = block
|
|
617
|
-
end
|
|
618
|
-
|
|
619
|
-
def self.macro(name)
|
|
620
|
-
@macros[name]
|
|
621
|
-
end
|
|
622
42
|
end
|
|
623
43
|
end
|
|
624
|
-
|
|
625
|
-
require 'mirah/ast/local'
|
|
626
|
-
require 'mirah/ast/call'
|
|
627
|
-
require 'mirah/ast/flow'
|
|
628
|
-
require 'mirah/ast/literal'
|
|
629
|
-
require 'mirah/ast/method'
|
|
630
|
-
require 'mirah/ast/class'
|
|
631
|
-
require 'mirah/ast/structure'
|
|
632
|
-
require 'mirah/ast/type'
|
|
633
|
-
require 'mirah/ast/intrinsics'
|