mirah 0.1.4-java → 0.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/History.txt +531 -0
  5. data/README.md +23 -10
  6. data/Rakefile +239 -156
  7. data/TODO.md +71 -10
  8. data/bin/mirah +1 -1
  9. data/bin/mirahc +1 -1
  10. data/dist/mirahc.jar +0 -0
  11. data/examples/bintrees.mirah +2 -2
  12. data/examples/construction.mirah +2 -2
  13. data/examples/fields.mirah +1 -1
  14. data/examples/fractal.mirah +1 -1
  15. data/examples/fractal.rb +70 -0
  16. data/examples/interfaces.mirah +1 -1
  17. data/examples/java_thing.mirah +1 -1
  18. data/examples/macros/square.mirah +3 -3
  19. data/examples/macros/square_int.mirah +3 -3
  20. data/examples/macros/string_each_char.mirah +6 -6
  21. data/examples/rosettacode/100-doors.mirah +0 -2
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +3 -3
  23. data/examples/rosettacode/empty-string.mirah +1 -1
  24. data/examples/rosettacode/fizz-buzz.mirah +4 -4
  25. data/examples/rosettacode/is-string-numeric.mirah +7 -7
  26. data/examples/rosettacode/palindrome.mirah +2 -2
  27. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  28. data/examples/rosettacode/rot-13.mirah +1 -1
  29. data/examples/{edb.mirah → rosettacode/simple_character_math.mirah} +13 -4
  30. data/examples/rosettacode/string-case.mirah +2 -2
  31. data/examples/rosettacode/string-length.mirah +1 -1
  32. data/examples/swing.mirah +9 -14
  33. data/extensions_and_macros.md +117 -0
  34. data/lib/mirah.rb +1 -1
  35. data/lib/mirah/errors.rb +3 -1
  36. data/lib/mirah/transform/ast_ext.rb +3 -2
  37. data/lib/mirah/util/process_errors.rb +1 -2
  38. data/lib/mirah/version.rb +1 -1
  39. data/test/A.class +0 -0
  40. data/test/core/util/jvm_version_test.rb +10 -0
  41. data/test/core/util/mirah_arguments_test.rb +51 -4
  42. data/test/fixtures/cp1251_test.mirah +7 -0
  43. data/test/fixtures/org/foo/AbstractExecutorJava8.java +30 -0
  44. data/test/fixtures/org/foo/ClassWithSelfReferencingTypeParameter.java +24 -0
  45. data/test/fixtures/org/foo/InnerInterfaceClass.java +12 -0
  46. data/test/fixtures/org/foo/IntAnno.class +0 -0
  47. data/test/fixtures/org/foo/TypeFixtureJava8.java +10 -0
  48. data/test/fixtures/utf8_test.mirah +7 -0
  49. data/test/jvm/access_levels_test.rb +31 -0
  50. data/test/jvm/annotations_test.rb +3 -6
  51. data/test/jvm/blocks_test.rb +303 -120
  52. data/test/jvm/cast_test.rb +123 -50
  53. data/test/jvm/closure_test.rb +242 -0
  54. data/test/jvm/constructors_test.rb +1 -3
  55. data/test/jvm/example_test.rb +6 -2
  56. data/test/jvm/extensions/array_extensions_test.rb +181 -0
  57. data/test/jvm/extensions/collection_extensions_test.rb +195 -0
  58. data/test/jvm/{enumerable_test.rb → extensions/enumerable_test.rb} +81 -13
  59. data/test/jvm/extensions/hash_extensions_test.rb +56 -0
  60. data/test/jvm/extensions/list_extensions_test.rb +143 -0
  61. data/test/jvm/extensions/lock_extensions_test.rb +43 -0
  62. data/test/jvm/{numeric_extensions_test.rb → extensions/numeric_extensions_test.rb} +0 -0
  63. data/test/jvm/extensions/numeric_operators_test.rb +86 -0
  64. data/test/jvm/extensions/object_extensions_test.rb +122 -0
  65. data/test/jvm/{string_builder_extensions_test.rb → extensions/string_builder_extensions_test.rb} +0 -0
  66. data/test/jvm/{string_extensions_test.rb → extensions/string_extensions_test.rb} +57 -4
  67. data/test/jvm/generics_test.rb +14 -6
  68. data/test/jvm/import_test.rb +38 -1
  69. data/test/jvm/interface_test.rb +17 -0
  70. data/test/jvm/jvm_commands_test.rb +9 -0
  71. data/test/jvm/jvm_compiler_test.rb +568 -43
  72. data/test/jvm/macros_test.rb +343 -19
  73. data/test/jvm/main_method_test.rb +1 -3
  74. data/test/jvm/new_backend_test_helper.rb +54 -7
  75. data/test/jvm/rescue_test.rb +20 -5
  76. data/test/jvm/static_fields_test.rb +52 -10
  77. data/test/jvm/{mirror_compilation_test_helper.rb → string_test.rb} +10 -9
  78. data/test/jvm/varargs_test.rb +6 -16
  79. data/test/mirrors/base_type_test.rb +20 -7
  80. data/test/mirrors/bytecode_mirror_test.rb +8 -3
  81. data/test/mirrors/generics_test.rb +89 -10
  82. data/test/mirrors/member_test.rb +1 -1
  83. data/test/mirrors/method_lookup_test.rb +10 -3
  84. data/test/mirrors/mirrors_test.rb +20 -20
  85. data/test/mirrors/simple_async_mirror_loader_test.rb +1 -1
  86. data/test/mirrors/simple_mirror_loader_test.rb +1 -1
  87. data/test/newMirahClass$Closure2.class +0 -0
  88. data/test/newMirahClass.class +0 -0
  89. data/test/test_helper.rb +8 -1
  90. metadata +31 -16
  91. data/bin/bundler +0 -16
  92. data/bin/rake +0 -16
  93. data/examples/ant/example-build.xml~ +0 -7
  94. data/examples/test.edb +0 -9
  95. data/lib/mirah/compiler.rb +0 -67
  96. data/lib/mirah/parser.rb +0 -224
  97. data/lib/mirah/util/delegate.rb +0 -65
  98. data/test/jvm/list_extensions_test.rb +0 -23
@@ -1,224 +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
- require 'mirah/util/process_errors'
17
- require 'mirah/util/logging'
18
- require 'mirah/transform'
19
- require 'java'
20
-
21
- module Mirah
22
- class Parser
23
- include Mirah::Util::ProcessErrors
24
- include Mirah::Logging::Logged
25
-
26
- def initialize(state, typer, logging)
27
- @transformer = Mirah::Transform::Transformer.new(state, typer)
28
- @logging = logging
29
- end
30
-
31
- attr_accessor :transformer, :logging
32
-
33
- def parse_from_args(files_or_scripts)
34
- nodes = []
35
- inline = false
36
- puts "Parsing..." if logging
37
- expand_files(files_or_scripts).each do |script|
38
- if script == '-e'
39
- inline = true
40
- next
41
- elsif inline
42
- nodes << parse_inline(script)
43
- break
44
- else
45
- nodes << parse_file(script)
46
- end
47
- end
48
- raise 'nothing to parse? ' + files_or_scripts.inspect unless nodes.length > 0
49
- nodes = nodes.compact
50
- if self.logging
51
- nodes.each {|node| log "Parsed:\n #{format_ast(node)}"}
52
- end
53
- nodes
54
- end
55
-
56
- def parse_inline(source)
57
- puts " <inline script>" if logging
58
- parse_and_transform('DashE', source)
59
- end
60
-
61
- def parse_file(filename)
62
- puts " #{filename}" if logging
63
- parse_and_transform(filename, File.read(filename))
64
- end
65
-
66
- def parse_and_transform(filename, src)
67
- Mirah::AST.parse_ruby(transformer, src, filename)
68
- end
69
-
70
- def format_ast(ast)
71
- AstPrinter.new.scan(ast, ast)
72
- end
73
-
74
- def expand_files(files_or_scripts)
75
- expanded = []
76
- files_or_scripts.each do |filename|
77
- if File.directory?(filename)
78
- Dir[File.join(filename, '*')].each do |child|
79
- if File.directory?(child)
80
- files_or_scripts << child
81
- elsif child =~ /\.(duby|mirah)$/
82
- expanded << child
83
- end
84
- end
85
- else
86
- expanded << filename
87
- end
88
- end
89
- expanded
90
- end
91
-
92
- class AstPrinter < NodeScanner
93
- java_import "mirah.lang.ast.Node"
94
- def initialize
95
- @out = ""
96
- @indent = 0
97
- @newline = true
98
- end
99
- def puts(*args)
100
- print(*args)
101
- @newline = true
102
- @out << "\n"
103
- end
104
- def print(*args)
105
- @out << (" " * @indent) if @newline
106
- args.each {|arg| @out << arg}
107
- @newline = false
108
- @out
109
- end
110
- def indent
111
- @indent += 2
112
- end
113
- def dedent
114
- @indent -= 2
115
- end
116
- def enterNullChild(obj)
117
- puts("nil")
118
- end
119
-
120
- def startNode(node)
121
- print("[#{node.java_class.simple_name}")
122
- indent
123
- end
124
-
125
- def enterDefault(node, arg)
126
- startNode(node)
127
- puts
128
- true
129
- end
130
-
131
- def exitDefault(node, arg)
132
- dedent
133
- if @out[-2,2] =~ /^[\[\]"]\n/
134
- @out[-1,0] = "]"
135
- @out
136
- else
137
- no_children = @out.rindex(/[\]\n]/, -2) < @out.rindex("[")
138
- if no_children
139
- @out[-1,0] = "]"
140
- else
141
- puts("]")
142
- end
143
- end
144
- end
145
-
146
- %w(Boolean Fixnum Float CharLiteral).each do |name|
147
- eval(<<-EOF)
148
- def enter#{name}(node, arg)
149
- startNode(node)
150
- print(" ", node.value.to_s)
151
- true
152
- end
153
- EOF
154
- end
155
-
156
- def enterSimpleString(node, arg)
157
- first_child = @out.rindex(/[\]\n]/, -2) < @out.rindex("[")
158
- if first_child
159
- @newline = false
160
- @out[-1,1] = " "
161
- end
162
- print '"', node.value
163
- true
164
- end
165
-
166
- def exitSimpleString(node, arg)
167
- puts '"'
168
- end
169
-
170
- def enterTypeRefImpl(node, arg)
171
- startNode(node)
172
- print " #{node.name}"
173
- print " array" if node.isArray
174
- print " static" if node.isStatic
175
- true
176
- end
177
-
178
- def enterNodeList(node, arg)
179
- puts "["
180
- indent
181
- true
182
- end
183
-
184
- def enterBlockArgument(node, arg)
185
- enterDefault(node, arg)
186
- puts "optional" if node.optional
187
- true
188
- end
189
-
190
- def enterLoop(node, arg)
191
- enterDefault(node, arg)
192
- puts "skipFirstCheck" if node.skipFirstCheck
193
- puts "negative" if node.negative
194
- true
195
- end
196
-
197
- def exitFieldAccess(node, arg)
198
- puts "static" if node.isStatic
199
- exitDefault(node, arg)
200
- end
201
- alias exitFieldAssign exitFieldAccess
202
-
203
- def enterUnquote(node, arg)
204
- enterDefault(node, arg)
205
- object = node.object
206
- if object
207
- if object.kind_of?(Node)
208
- scan(object, arg)
209
- elsif object.kind_of?(java.util.List) && object.all? {|i| i.kind_of?(Node)}
210
- object.each {|o| scan(o, arg)}
211
- else
212
- str = if node.object.respond_to?(:toString)
213
- node.object.toString
214
- else
215
- node.object.inspect
216
- end
217
- puts "<", str, ">"
218
- end
219
- end
220
- object.nil?
221
- end
222
- end
223
- end
224
- end
@@ -1,65 +0,0 @@
1
- # Ripped from 1.8 stdlib
2
-
3
- module Mirah
4
- module Util
5
- class Delegator
6
- IgnoreBacktracePat = %r"\A#{Regexp.quote(__FILE__)}:\d+:in `"
7
- end
8
-
9
- def self.DelegateClass(superclass)
10
- klass = Class.new
11
- methods = superclass.public_instance_methods(true).map(&:to_s)
12
- methods -= ::Kernel.public_instance_methods(false).map(&:to_s)
13
- methods -= ["__id__", "__send__"] if RUBY_VERSION > '1.9' # avoid warnings
14
- methods |= ["to_s","to_a","inspect","==","=~","==="]
15
- klass.module_eval {
16
- def initialize(obj) # :nodoc:
17
- @_dc_obj = obj
18
- end
19
- def method_missing(m, *args) # :nodoc:
20
- unless @_dc_obj.respond_to?(m)
21
- super(m, *args)
22
- end
23
- @_dc_obj.__send__(m, *args)
24
- end
25
- def respond_to?(m, include_private = false) # :nodoc:
26
- return true if super
27
- return @_dc_obj.respond_to?(m, include_private)
28
- end
29
- def __getobj__ # :nodoc:
30
- @_dc_obj
31
- end
32
- def __setobj__(obj) # :nodoc:
33
- raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
34
- @_dc_obj = obj
35
- end
36
- def clone # :nodoc:
37
- new = super
38
- new.__setobj__(__getobj__.clone)
39
- new
40
- end
41
- def dup # :nodoc:
42
- new = super
43
- new.__setobj__(__getobj__.clone)
44
- new
45
- end
46
- }
47
- for method in methods
48
- begin
49
- klass.module_eval <<-EOS, __FILE__, __LINE__+1
50
- def #{method}(*args, &block)
51
- begin
52
- @_dc_obj.__send__(:#{method}, *args, &block)
53
- ensure
54
- $@.delete_if{|s| ::Mirah::Util::Delegator::IgnoreBacktracePat =~ s} if $@
55
- end
56
- end
57
- EOS
58
- rescue SyntaxError
59
- raise NameError, "invalid identifier %s" % method, caller(3)
60
- end
61
- end
62
- return klass
63
- end
64
- end
65
- end
@@ -1,23 +0,0 @@
1
- class ListExtensionsTest < Test::Unit::TestCase
2
- def test_bracket_getter
3
- cls, = compile(<<-EOF)
4
- x = [1,2]
5
- puts x[0]
6
- EOF
7
- assert_output("1\n") do
8
- cls.main(nil)
9
- end
10
- end
11
-
12
- def test_bracket_assignment
13
- cls, = compile(<<-EOF)
14
- import java.util.ArrayList
15
- x = ArrayList.new
16
- x[0]= "2"
17
- puts x
18
- EOF
19
- assert_output("[2]\n") do
20
- cls.main(nil)
21
- end
22
- end
23
- end