mirah 0.0.12-java → 0.1.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. data/History.txt +372 -0
  2. data/README.txt +4 -5
  3. data/Rakefile +178 -55
  4. data/examples/appengine/Readme +3 -3
  5. data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
  6. data/examples/appengine/src/org/mirah/list.dhtml +1 -1
  7. data/examples/bintrees.mirah +1 -1
  8. data/examples/edb.mirah +1 -1
  9. data/examples/fib.mirah +1 -1
  10. data/examples/interfaces.mirah +1 -1
  11. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
  12. data/examples/maven/README.txt +1 -1
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
  14. data/examples/plugins/appengine/Rakefile +1 -1
  15. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
  16. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
  17. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
  18. data/examples/rosettacode/100-doors.mirah +6 -6
  19. data/examples/rosettacode/README.txt +3 -3
  20. data/examples/rosettacode/boolean-values.mirah +1 -1
  21. data/examples/rosettacode/comments.mirah +1 -1
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
  23. data/examples/rosettacode/factorial.mirah +1 -1
  24. data/examples/rosettacode/fibonacci.mirah +1 -1
  25. data/examples/rosettacode/fizz-buzz.mirah +2 -2
  26. data/examples/rosettacode/flatten-a-list.mirah +4 -4
  27. data/examples/rosettacode/guess-the-number.mirah +2 -2
  28. data/examples/rosettacode/hamming-numbers.mirah +4 -4
  29. data/examples/rosettacode/is-string-numeric.mirah +22 -22
  30. data/examples/rosettacode/palindrome.mirah +2 -2
  31. data/examples/rosettacode/random-numbers.mirah +1 -1
  32. data/examples/rosettacode/repeat-a-string.mirah +1 -1
  33. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  34. data/examples/rosettacode/rot-13.mirah +5 -5
  35. data/examples/rosettacode/secure-temporary-file.mirah +2 -2
  36. data/examples/rosettacode/sleep.mirah +1 -1
  37. data/examples/rosettacode/string-length.mirah +5 -5
  38. data/examples/swing.mirah +1 -1
  39. data/examples/test.edb +1 -1
  40. data/javalib/mirah-bootstrap.jar +0 -0
  41. data/javalib/mirah-builtins.jar +0 -0
  42. data/javalib/mirah-parser.jar +0 -0
  43. data/javalib/mirah-util.jar +0 -0
  44. data/lib/duby.rb +1 -1
  45. data/lib/mirah.rb +50 -28
  46. data/lib/mirah/ast.rb +15 -605
  47. data/lib/mirah/ast/scope.rb +98 -69
  48. data/lib/mirah/commands.rb +1 -1
  49. data/lib/mirah/commands/base.rb +7 -7
  50. data/lib/mirah/commands/compile.rb +3 -3
  51. data/lib/mirah/commands/parse.rb +7 -5
  52. data/lib/mirah/commands/run.rb +12 -19
  53. data/lib/mirah/compiler.rb +15 -23
  54. data/lib/mirah/errors.rb +16 -1
  55. data/lib/mirah/generator.rb +79 -39
  56. data/lib/mirah/jvm/compiler.rb +1 -19
  57. data/lib/mirah/jvm/compiler/base.rb +233 -90
  58. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
  59. data/lib/mirah/jvm/method_lookup.rb +134 -65
  60. data/lib/mirah/jvm/typer.rb +10 -5
  61. data/lib/mirah/jvm/types.rb +10 -2
  62. data/lib/mirah/jvm/types/array_type.rb +10 -12
  63. data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
  64. data/lib/mirah/jvm/types/basic_types.rb +26 -33
  65. data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
  66. data/lib/mirah/jvm/types/block_type.rb +15 -0
  67. data/lib/mirah/jvm/types/boolean.rb +8 -4
  68. data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
  69. data/lib/mirah/jvm/types/enumerable.rb +7 -7
  70. data/lib/mirah/jvm/types/extensions.rb +11 -6
  71. data/lib/mirah/jvm/types/factory.rb +624 -94
  72. data/lib/mirah/jvm/types/floats.rb +21 -15
  73. data/lib/mirah/jvm/types/generic_type.rb +72 -0
  74. data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
  75. data/lib/mirah/jvm/types/integers.rb +26 -71
  76. data/lib/mirah/jvm/types/interface_definition.rb +3 -3
  77. data/lib/mirah/jvm/types/intrinsics.rb +203 -168
  78. data/lib/mirah/jvm/types/literals.rb +6 -6
  79. data/lib/mirah/jvm/types/meta_type.rb +13 -4
  80. data/lib/mirah/jvm/types/methods.rb +281 -93
  81. data/lib/mirah/jvm/types/null_type.rb +17 -5
  82. data/lib/mirah/jvm/types/number.rb +10 -7
  83. data/lib/mirah/jvm/types/primitive_type.rb +17 -6
  84. data/lib/mirah/jvm/types/source_mirror.rb +12 -7
  85. data/lib/mirah/jvm/types/type.rb +107 -23
  86. data/lib/mirah/jvm/types/type_definition.rb +25 -10
  87. data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
  88. data/lib/mirah/jvm/types/void_type.rb +3 -3
  89. data/lib/mirah/parser.rb +154 -16
  90. data/lib/mirah/plugin/edb.rb +1 -1
  91. data/lib/mirah/transform.rb +1 -2
  92. data/lib/mirah/transform/ast_ext.rb +24 -43
  93. data/lib/mirah/transform/transformer.rb +29 -224
  94. data/lib/mirah/typer.rb +2 -16
  95. data/lib/mirah/util/argument_processor.rb +25 -10
  96. data/lib/mirah/util/class_loader.rb +1 -1
  97. data/lib/mirah/util/compilation_state.rb +16 -17
  98. data/lib/mirah/util/delegate.rb +2 -2
  99. data/lib/mirah/util/logging.rb +110 -0
  100. data/lib/mirah/util/process_errors.rb +69 -11
  101. data/lib/mirah/version.rb +1 -1
  102. data/test/core/commands_test.rb +6 -24
  103. data/test/core/env_test.rb +5 -5
  104. data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
  105. data/test/core/typer_test.rb +196 -158
  106. data/test/core/util/argument_processor_test.rb +10 -10
  107. data/test/core/util/class_loader_test.rb +6 -5
  108. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  109. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  110. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  111. data/test/jvm/annotations_test.rb +5 -5
  112. data/test/jvm/blocks_test.rb +140 -88
  113. data/test/jvm/bytecode_test_helper.rb +112 -94
  114. data/test/jvm/cast_test.rb +162 -0
  115. data/test/jvm/constructors_test.rb +18 -8
  116. data/test/jvm/enumerable_test.rb +77 -44
  117. data/test/jvm/example_test.rb +53 -0
  118. data/test/jvm/factory_test.rb +7 -1
  119. data/test/jvm/generics_test.rb +57 -0
  120. data/test/jvm/hash_test.rb +106 -0
  121. data/test/jvm/import_test.rb +81 -0
  122. data/test/jvm/interface_test.rb +73 -0
  123. data/test/jvm/java_typer_test.rb +92 -66
  124. data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
  125. data/test/jvm/jvm_compiler_test.rb +170 -604
  126. data/test/jvm/list_extensions_test.rb +23 -0
  127. data/test/jvm/macros_test.rb +197 -32
  128. data/test/jvm/main_method_test.rb +4 -4
  129. data/test/jvm/numeric_extensions_test.rb +13 -0
  130. data/test/jvm/rescue_test.rb +73 -16
  131. data/test/jvm/varargs_test.rb +65 -0
  132. data/test/test_helper.rb +1 -2
  133. metadata +234 -251
  134. data/examples/SortClosure$__xform_tmp_1.class +0 -0
  135. data/examples/SortClosure$__xform_tmp_2.class +0 -0
  136. data/examples/SortClosure.class +0 -0
  137. data/examples/macros/StringEachChar$Extension1.class +0 -0
  138. data/lib/mirah/ast/call.rb +0 -345
  139. data/lib/mirah/ast/class.rb +0 -359
  140. data/lib/mirah/ast/flow.rb +0 -381
  141. data/lib/mirah/ast/intrinsics.rb +0 -563
  142. data/lib/mirah/ast/literal.rb +0 -178
  143. data/lib/mirah/ast/local.rb +0 -112
  144. data/lib/mirah/ast/method.rb +0 -408
  145. data/lib/mirah/ast/structure.rb +0 -387
  146. data/lib/mirah/ast/type.rb +0 -146
  147. data/lib/mirah/commands/base.rb~ +0 -57
  148. data/lib/mirah/compiler/call.rb +0 -45
  149. data/lib/mirah/compiler/class.rb +0 -81
  150. data/lib/mirah/compiler/flow.rb +0 -109
  151. data/lib/mirah/compiler/literal.rb +0 -130
  152. data/lib/mirah/compiler/local.rb +0 -59
  153. data/lib/mirah/compiler/method.rb +0 -44
  154. data/lib/mirah/compiler/structure.rb +0 -65
  155. data/lib/mirah/jvm/compiler/java_source.rb +0 -787
  156. data/lib/mirah/jvm/method_lookup.rb~ +0 -247
  157. data/lib/mirah/jvm/source_generator/builder.rb +0 -468
  158. data/lib/mirah/jvm/source_generator/loops.rb +0 -131
  159. data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
  160. data/lib/mirah/plugin/gwt.rb +0 -189
  161. data/lib/mirah/plugin/java.rb +0 -70
  162. data/lib/mirah/transform/error.rb +0 -13
  163. data/lib/mirah/transform/helper.rb +0 -765
  164. data/lib/mirah/typer/simple.rb +0 -384
  165. data/lib/mirah/version.rb~ +0 -18
  166. data/test/core/ast_test.rb +0 -382
  167. data/test/core/compilation_test.rb +0 -130
  168. data/test/core/macros_test.rb +0 -61
  169. data/test/jvm/javac_test_helper.rb +0 -89
  170. data/test/jvm/jvm_compiler_test.rb~ +0 -2181
  171. data/test/plugins/gwt_test.rb +0 -69
@@ -24,4 +24,4 @@ module Mirah
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
@@ -2,8 +2,8 @@ module Mirah
2
2
  module JVM
3
3
  module Types
4
4
  class VoidType < PrimitiveType
5
- def initialize
6
- super('void', Java::JavaLang::Void)
5
+ def initialize(types)
6
+ super(types, 'void', Java::JavaLang::Void)
7
7
  end
8
8
 
9
9
  def void?
@@ -16,4 +16,4 @@ module Mirah
16
16
  end
17
17
  end
18
18
  end
19
- end
19
+ end
data/lib/mirah/parser.rb CHANGED
@@ -14,22 +14,22 @@
14
14
  # limitations under the License.
15
15
 
16
16
  require 'mirah/util/process_errors'
17
+ require 'mirah/util/logging'
17
18
  require 'mirah/transform'
18
19
  require 'java'
19
20
 
20
21
  module Mirah
21
22
  class Parser
22
23
  include Mirah::Util::ProcessErrors
23
-
24
- def initialize(state, logging)
25
- @transformer = Mirah::Transform::Transformer.new(state)
26
- Java::MirahImpl::Builtin.initialize_builtins(@transformer)
24
+ include Mirah::Logging::Logged
25
+
26
+ def initialize(state, typer, logging)
27
+ @transformer = Mirah::Transform::Transformer.new(state, typer)
27
28
  @logging = logging
28
- @verbose = state.verbose
29
29
  end
30
-
30
+
31
31
  attr_accessor :transformer, :logging
32
-
32
+
33
33
  def parse_from_args(files_or_scripts)
34
34
  nodes = []
35
35
  inline = false
@@ -46,25 +46,31 @@ module Mirah
46
46
  end
47
47
  end
48
48
  raise 'nothing to parse? ' + files_or_scripts.inspect unless nodes.length > 0
49
- nodes.compact
49
+ nodes = nodes.compact
50
+ if self.logging
51
+ nodes.each {|node| log "Parsed:\n #{format_ast(node)}"}
52
+ end
53
+ nodes
50
54
  end
51
-
55
+
52
56
  def parse_inline(source)
53
57
  puts " <inline script>" if logging
54
58
  parse_and_transform('DashE', source)
55
59
  end
56
-
60
+
57
61
  def parse_file(filename)
58
62
  puts " #{filename}" if logging
59
63
  parse_and_transform(filename, File.read(filename))
60
64
  end
61
-
65
+
62
66
  def parse_and_transform(filename, src)
63
- mirah_ast = AST.parse src, filename, false, transformer
64
- process_errors(transformer.errors)
65
- mirah_ast
67
+ Mirah::AST.parse_ruby(transformer, src, filename)
66
68
  end
67
-
69
+
70
+ def format_ast(ast)
71
+ AstPrinter.new.scan(ast, ast)
72
+ end
73
+
68
74
  def expand_files(files_or_scripts)
69
75
  expanded = []
70
76
  files_or_scripts.each do |filename|
@@ -82,5 +88,137 @@ module Mirah
82
88
  end
83
89
  expanded
84
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
85
223
  end
86
- end
224
+ end
@@ -24,7 +24,7 @@ Mirah::AST.defmacro('def_edb') do |transformer, fcall, parent|
24
24
  compiler.pre_cmd = ["def #{name}", "_edbout = StringBuilder.new"]
25
25
  compiler.post_cmd = ["_edbout.toString", "end"]
26
26
  src = compiler.compile(IO.read(path))
27
- ast = Mirah::AST.parse_ruby(src, path)
27
+ ast = Mirah::AST.parse_ruby(transformer, src, path)
28
28
  transformer.filename = path
29
29
  script = transformer.transform(ast, parent)
30
30
  script.body.parent = parent
@@ -15,8 +15,7 @@
15
15
 
16
16
  require 'base64'
17
17
  require 'jruby'
18
+
18
19
  require 'mirah/errors'
19
- require 'mirah/transform/error'
20
20
  require 'mirah/transform/transformer'
21
21
  require 'mirah/transform/ast_ext'
22
- require 'mirah/transform/helper'
@@ -1,57 +1,38 @@
1
1
  module Mirah
2
2
  module AST
3
- begin
4
- java_import 'mirah.impl.MirahParser'
5
- rescue NameError
6
- $CLASSPATH << File.dirname(__FILE__) + '/../../../javalib/mirah-parser.jar'
7
- java_import 'mirah.impl.MirahParser'
8
- end
9
- java_import 'jmeta.ErrorHandler'
10
-
11
- class MirahErrorHandler
12
- include ErrorHandler
13
- def warning(messages, positions)
14
- print "Warning: "
15
- messages.each_with_index do |message, i|
16
- jpos = positions[i]
17
- if jpos
18
- dpos = Mirah::Transform::Transformer::JMetaPosition.new(jpos, jpos)
19
- print "#{message} at "
20
- Mirah.print_error("", dpos)
21
- else
22
- print message
23
- end
24
- end
25
- end
26
- end
3
+ java_import 'mirah.impl.MirahParser'
4
+ java_import 'mirah.lang.ast.StringCodeSource'
5
+ java_import 'org.mirah.macros.Macro'
6
+ java_import 'org.mirah.util.SimpleDiagnostics'
27
7
 
28
8
  def parse(src, filename='dash_e', raise_errors=false, transformer=nil)
29
- ast = parse_ruby(src, filename)
30
- transformer ||= Transform::Transformer.new(Mirah::Util::CompilationState.new)
31
- transformer.filename = filename
32
- ast = transformer.transform(ast, nil)
33
- if raise_errors
34
- transformer.errors.each do |e|
35
- raise e.cause || e
36
- end
37
- end
38
- ast
9
+ raise ArgumentError unless transformer
10
+ parse_ruby(transformer, src, filename)
39
11
  end
40
12
  module_function :parse
41
13
 
42
- def parse_ruby(src, filename='-')
14
+ def parse_ruby(transformer, src, filename='-')
43
15
  raise ArgumentError if src.nil?
16
+ #filename = transformer.tag_filename(src, filename)
44
17
  parser = MirahParser.new
45
- parser.filename = filename
46
- parser.errorHandler = MirahErrorHandler.new
18
+ source = StringCodeSource.new(filename, src)
19
+ parser.diagnostics = SimpleDiagnostics.new(true)
47
20
  begin
48
- parser.parse(src)
49
- rescue => ex
50
- if ex.cause.kind_of? Java::Jmeta::SyntaxError
51
- ex = SyntaxError.wrap ex.cause, nil
21
+ ast = parser.parse(source)
22
+ if parser.diagnostics.error_count > 0
23
+ puts "#{parser.diagnostics.error_count} errors, exiting"
24
+ throw :exit, 1
52
25
  end
26
+ return ast
27
+ rescue NativeException => ex
28
+ ex.cause.printStackTrace
29
+ raise ex
30
+ rescue => ex
31
+ # if ex.cause.kind_of? Java::OrgMirahMmeta::SyntaxError
32
+ # ex = SyntaxError.wrap ex.cause, nil
33
+ # end
53
34
 
54
- if ex.cause.respond_to? :position
35
+ if ex.respond_to? :position
55
36
  position = ex.cause.position
56
37
  Mirah.print_error(ex.cause.message, position)
57
38
  end
@@ -60,4 +41,4 @@ module Mirah
60
41
  end
61
42
  module_function :parse_ruby
62
43
  end
63
- end
44
+ end
@@ -1,41 +1,39 @@
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
+
1
16
  module Mirah
2
17
  module Transform
3
18
  class Transformer
4
19
  begin
5
- include Java::DubyLangCompiler.Compiler
20
+ java_import 'org.mirah.macros.Compiler'
6
21
  rescue NameError
7
- $CLASSPATH << File.dirname(__FILE__) + '/../../../javalib/mirah-bootstrap.jar'
8
- include Java::DubyLangCompiler.Compiler
22
+ # builtins not compiled yet
9
23
  end
10
24
 
11
25
  attr_reader :errors, :state
12
26
  attr_accessor :filename
13
- def initialize(state)
27
+
28
+ def initialize(state, typer)
14
29
  @errors = []
15
30
  @tmp_count = 0
16
31
  @annotations = []
17
- @scopes = []
18
32
  @extra_body = nil
19
33
  @state = state
20
- @helper = Mirah::Transform::Helper.new(self)
21
- end
22
-
23
- def destination
24
- @state.destination
25
- end
26
-
27
- def verbose?
28
- @state.verbose
29
- end
30
-
31
- def annotations
32
- result, @annotations = @annotations, []
33
- return result
34
- end
35
-
36
- def add_annotation(annotation)
37
- @annotations << annotation
38
- Mirah::AST::Noop.new(annotation.parent, annotation.position)
34
+ @typer = typer
35
+ @types = typer.type_system if typer
36
+ @files = {""=>{:filename => "", :line => 0, :code => ""}}
39
37
  end
40
38
 
41
39
  def tmp(format="__xform_tmp_%d")
@@ -44,214 +42,21 @@ module Mirah
44
42
 
45
43
  class JMetaPosition
46
44
  attr_accessor :start_line, :end_line, :start_offset, :end_offset, :file
47
- attr_accessor :startpos, :endpos, :start_col, :end_col
45
+ attr_accessor :startpos, :endpos, :start_column, :end_column, :source
48
46
 
49
- def initialize(startpos, endpos)
47
+ def initialize(transformer, startpos, endpos, source)
50
48
  @startpos = startpos
51
49
  @endpos = endpos
52
- @file = startpos.filename
50
+ @transformer = transformer
53
51
  @start_line = startpos.line
54
52
  @start_offset = startpos.pos
55
- @start_col = startpos.col
53
+ @start_column = startpos.col
56
54
  @end_line = endpos.line
57
55
  @end_offset = endpos.pos
58
- @end_col = endpos.col
59
- end
60
-
61
- def +(other)
62
- JMetaPosition.new(@startpos, other.endpos)
63
- end
64
- end
65
-
66
- def position(node)
67
- JMetaPosition.new(node.start_position, node.end_position)
68
- end
69
-
70
- def camelize(name)
71
- name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
72
- end
73
-
74
- def transform(node, parent)
75
- return nil if node.nil?
76
- begin
77
- top = @extra_body.nil?
78
- if top
79
- return nil if !node.children.empty? && node.children.all?(&:nil?)
80
-
81
- @extra_body = Mirah::AST::Body.new(nil, position(node))
82
- end
83
- method = "transform_#{camelize(node[0])}"
84
- result = @helper.send method, node, parent
85
- if top
86
- body = result.body
87
- if body.kind_of?(Mirah::AST::Body) && @extra_body.empty?
88
- @extra_body = body
89
- else
90
- result.body = @extra_body
91
- body.parent = @extra_body
92
- @extra_body.children.insert(0, body)
93
- end
94
- end
95
- return result
96
- rescue Error => ex
97
- @errors << ex
98
- Mirah::AST::ErrorNode.new(parent, ex)
99
- # rescue Exception => ex
100
- # error = Error.new(ex.message, position(node), ex)
101
- # @errors << error
102
- # Mirah::AST::ErrorNode.new(parent, error)
103
- end
104
- end
105
-
106
- def captured?(node)
107
- depth = node.depth
108
- scope = @scopes[-1]
109
- while depth > 0
110
- depth -= 1
111
- scope = scope.enclosing_scope
112
- end
113
- scope.isCaptured(node.index)
114
- end
115
-
116
- def eval(src, filename='-', parent=nil, *vars)
117
- node = Mirah::AST.parse_ruby(src, filename)
118
- mirah_node = transform(node, nil).body
119
- mirah_node.parent = parent
120
- mirah_node
121
- end
122
-
123
- def dump_ast(node, call=nil)
124
- encoded = nil
125
- values = Mirah::AST::Unquote.extract_values do
126
- encoded = Base64.encode64(Marshal.dump(node))
127
- end
128
- scope = call.scope.static_scope if call
129
- result = Mirah::AST::Array.new(nil, node.position)
130
- if encoded.size < 65535
131
- result << Mirah::AST::String.new(result, node.position, encoded)
132
- else
133
- strings = Mirah::AST::StringConcat.new(result, node.position)
134
- result << strings
135
- while encoded.size >= 65535
136
- chunk = encoded[0, 65535]
137
- encoded[0, 65535] = ""
138
- strings << Mirah::AST::String.new(strings, node.position, chunk)
139
- end
140
- strings << Mirah::AST::String.new(strings, node.position, encoded)
141
- end
142
- values.each do |value|
143
- if call
144
- scoped_value = Mirah::AST::ScopedBody.new(result, value.position)
145
- scoped_value << value
146
- scoped_value.static_scope = scope
147
- else
148
- scoped_value = value
149
- end
150
- result << scoped_value
151
- end
152
- return result
153
- end
154
-
155
- def load_ast(args)
156
- nodes = args.to_a
157
- encoded = nodes.shift
158
- Mirah::AST::Unquote.inject_values(nodes) do
159
- result = Marshal.load(Base64.decode64(encoded))
160
- if Mirah::AST::UnquotedValue === result
161
- result.node
162
- else
163
- result
164
- end
165
- end
166
- end
167
-
168
- def __ruby_eval(code, arg)
169
- self.instance_eval(code)
170
- end
171
-
172
- def fixnum(value)
173
- node = eval("1")
174
- node.literal = value
175
- node
176
- end
177
-
178
- def constant(name, array=false)
179
- node = eval("Foo")
180
- node.name = name
181
- node.array = array
182
- node
183
- end
184
-
185
- def cast(type, value)
186
- if value.kind_of?(String)
187
- value = Mirah::AST::Local.new(@extra_body, @extra_body.position, value)
188
- end
189
- fcall = eval("Foo()")
190
- fcall.name = type
191
- fcall.parameters = [value]
192
- fcall
193
- end
194
-
195
- def string(value)
196
- node = eval('"Foo"')
197
- node.literal = value
198
- node
199
- end
200
-
201
- def empty_array(type_node, size_node)
202
- node = eval('int[0]')
203
- node.type_node = type_node
204
- node.size = size_node
205
- node
206
- end
207
-
208
- def find_class(name)
209
- AST.type(nil, name, false, false)
210
- end
211
-
212
- def expand(fvcall, parent)
213
- result = yield self, fvcall, parent
214
- unless AST::Node === result
215
- raise Error.new('Invalid macro result', fvcall.position)
216
- end
217
- result
218
- end
219
-
220
- def append_node(node)
221
- @extra_body << node
222
- node
223
- end
224
-
225
- def define_class(position, name, &block)
226
- append_node Mirah::AST::ClassDefinition.new(@extra_body, position, name, &block)
227
- end
228
-
229
- def defineClass(name, superclass=nil, interfaces=nil)
230
- define_class(@extra_body.position, name) do |class_def|
231
- superclass = Mirah::AST::Constant.new(class_def, class_def.position, superclass)
232
- superclass.parent = class_def
233
- if interfaces
234
- class_def.implements(*interfaces.map {|i| Mirah::AST::Constant.new(class_def, class_def.position, i)})
235
- end
236
- [superclass, body(class_def)]
237
- end
238
- end
239
-
240
- def body(parent=nil)
241
- parent ||= @extra_body
242
- Mirah::AST::Body.new(parent, parent.position)
243
- end
244
-
245
- def define_closure(position, name, enclosing_type)
246
- target = self
247
- parent = @extra_body
248
- enclosing_type = enclosing_type.unmeta
249
- if enclosing_type.respond_to?(:node) && enclosing_type.node
250
- parent = target = enclosing_type.node
56
+ @end_column = endpos.col
57
+ @source = source
251
58
  end
252
- target.append_node(Mirah::AST::ClosureDefinition.new(
253
- parent, position, name, enclosing_type))
254
59
  end
255
60
  end
256
61
  end
257
- end
62
+ end