mirah 0.1.4-java → 0.2.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 (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
data/README.md CHANGED
@@ -6,6 +6,7 @@ Mirah
6
6
  * http://groups.google.com/group/mirah
7
7
  * http://github.com/mirah/mirah/issues
8
8
 
9
+
9
10
  DESCRIPTION
10
11
  -----------------
11
12
 
@@ -14,6 +15,7 @@ local type inference and a heavily Ruby-inspired syntax. Mirah
14
15
  currently includes a typer/compiler backend for the JVM which can
15
16
  output JVM bytecode.
16
17
 
18
+
17
19
  FEATURES
18
20
  -----------------
19
21
 
@@ -22,6 +24,7 @@ FEATURES
22
24
  * Fast as Java
23
25
  * No runtime library
24
26
 
27
+
25
28
  SYNOPSIS
26
29
  -----------------
27
30
 
@@ -30,41 +33,51 @@ SYNOPSIS
30
33
  mirahc <script.mirah>
31
34
  mirahc -e "inline script" # produces DashE.class
32
35
 
36
+
33
37
  REQUIREMENTS
34
38
  -----------------
35
39
 
36
40
  * Java 1.7 or higher.
37
41
 
42
+
38
43
  INSTALL
39
44
  -----------------
40
45
 
41
- RUBY
42
- -----------------
46
+ ### RUBY
43
47
 
44
48
  If your gem and rake are not from from JRuby, prefix the commands with `jruby -S`
45
49
 
46
50
  $ gem install mirah
47
51
 
48
- ZIP
49
- -----------------
52
+ ### JAR
53
+
54
+ Mirah is distributed as a jar through maven central. You can download the latest jar from
55
+ [maven.org](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.mirah%22%20a%3A%22mirah%22).
56
+
57
+ ### ZIP
50
58
 
51
59
  You can also install Mirah from a zip file. Download the latest stable
52
60
  release from https://github.com/mirah/mirah/downloads.
53
61
  Extract it, and add `bin` to your `$PATH` to be able to use `mirah`, `mirahc`, etc.
54
62
 
55
- SOURCE
56
- -----------------
63
+ ### SOURCE
57
64
 
58
- To build and install from source, you'll need jruby 1.7.12 or
65
+ Setup building locally and installing from source, you'll need jruby 1.7.12 or
59
66
  higher. Then just follow these commands.
60
67
 
68
+ #### To get the repository setup locally run the following:
69
+
61
70
  $ git clone http://github.com/mirah/mirah.git
62
71
  $ cd mirah
63
72
  $ bundle install
73
+
74
+ #### To install mirah as a gem from source:
75
+
64
76
  $ rake gem
65
77
  $ gem install pkg/mirah-*.gem
66
78
 
67
- For Java tools
68
- -----------------
79
+ #### To create the mirahc jar:
80
+
81
+ $ rake dist/mirahc.jar
69
82
 
70
- To build the Mirah jar from source run `rake jar` in the mirah directory.
83
+ This will create a mirahc.jar file in dist that you can run to compile mirah source files.
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2014 The Mirah project authors. All Rights Reserved.
1
+ # Copyright (c) 2010-2016 The Mirah project authors. All Rights Reserved.
2
2
  # All contributing project authors may be found in the NOTICE file.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,11 @@ require 'java'
25
25
  require 'jruby/compiler'
26
26
  require 'ant'
27
27
 
28
+ # We use jarjar to do some rewritting of packages in the parser.
29
+ ant.taskdef 'name' => 'jarjar',
30
+ 'classpath' => 'mirah-parser/javalib/jarjar-1.1.jar',
31
+ 'classname'=>"com.tonicsystems.jarjar.JarJarTask"
32
+
28
33
  #TODO update downloads st build reqs that are not run reqs go in a different dir
29
34
  # put run reqs in javalib
30
35
  # final artifacts got in dist
@@ -41,7 +46,11 @@ end
41
46
  task :default => :new_ci
42
47
 
43
48
  desc "run new backend ci"
44
- task :new_ci => [:'test:core', :'test:jvm', :'test:artifacts', 'dist/mirahc3.jar']
49
+ task :new_ci => [:'test:parser',
50
+ :'test:core',
51
+ :'test:jvm',
52
+ :'test:artifacts',
53
+ 'dist/mirahc3.jar']
45
54
 
46
55
  def run_tests tests
47
56
  results = tests.map do |name|
@@ -56,28 +65,29 @@ def run_tests tests
56
65
  puts "Errors in #{name}"
57
66
  end
58
67
  end
59
- fail if results.any?{|passed|!passed}
68
+ fail unless results.all? { |passed| passed }
60
69
  end
61
70
 
62
71
  desc "run full test suite"
63
72
  task :test do
64
- run_tests [ 'test:core', 'test:plugins', 'test:jvm', 'test:artifacts' ]
73
+ run_tests [ 'test:core',
74
+ 'test:jvm',
75
+ 'test:artifacts',
76
+ 'test:parser']
65
77
  end
66
78
 
67
79
  namespace :test do
68
80
 
69
- desc "run the core tests"
70
- Rake::TestTask.new :core => :compile do |t|
71
- t.libs << 'test'
72
- t.test_files = FileList["test/core/**/*test.rb"]
73
- java.lang.System.set_property("jruby.duby.enabled", "true")
81
+ desc "run parser tests"
82
+ Rake::TestTask.new :parser => ['build/mirah-parser.jar'] do |t|
83
+ t.test_files = FileList["mirah-parser/test/**/test*.rb"]
74
84
  end
75
85
 
76
- desc "run tests for plugins"
77
- Rake::TestTask.new :plugins => :compile do |t|
86
+
87
+ desc "run the core tests"
88
+ Rake::TestTask.new :core => :compile do |t|
78
89
  t.libs << 'test'
79
- t.test_files = FileList["test/plugins/**/*test.rb"]
80
- java.lang.System.set_property("jruby.duby.enabled", "true")
90
+ t.test_files = FileList["test/core/**/*test.rb"]
81
91
  end
82
92
 
83
93
  desc "run the artifact tests"
@@ -86,7 +96,6 @@ namespace :test do
86
96
  t.test_files = FileList["test/artifacts/**/*test.rb"]
87
97
  end
88
98
 
89
-
90
99
  desc "run jvm tests"
91
100
  task :jvm => 'test:jvm:all'
92
101
 
@@ -95,7 +104,7 @@ namespace :test do
95
104
 
96
105
  desc "run jvm tests using the new self hosted backend"
97
106
  task :all do
98
- run_tests ["test:jvm:mirror_compilation", "test:jvm:mirrors"]
107
+ run_tests ["test:jvm:rest", "test:jvm:mirrors"]
99
108
  end
100
109
 
101
110
  desc "run tests for mirror type system"
@@ -104,7 +113,7 @@ namespace :test do
104
113
  t.test_files = FileList["test/mirrors/**/*test.rb"]
105
114
  end
106
115
 
107
- Rake::TestTask.new :mirror_compilation => ["dist/mirahc.jar", :test_setup] do |t|
116
+ Rake::TestTask.new :rest => ["dist/mirahc.jar", :test_setup] do |t|
108
117
  t.libs << 'test' << 'test/jvm'
109
118
  t.ruby_opts.concat ["-r", "new_backend_test_helper"]
110
119
  t.test_files = FileList["test/jvm/**/*test.rb"]
@@ -117,17 +126,23 @@ task :clean_tmp_test_classes do
117
126
  FileUtils.mkdir_p "tmp_test/test_classes"
118
127
  end
119
128
 
120
-
121
-
122
129
  task :build_test_fixtures => 'tmp_test/fixtures/fixtures_built.txt'
123
130
  directory 'tmp_test/fixtures'
131
+
124
132
  file 'tmp_test/fixtures/fixtures_built.txt' => ['tmp_test/fixtures'] + Dir['test/fixtures/**/*.java'] do
133
+
134
+ javac_args = {
135
+ 'destdir' => "tmp_test/fixtures",
136
+ 'srcdir' => 'test/fixtures',
137
+ 'includeantruntime' => false,
138
+ 'debug' => true,
139
+ 'listfiles' => true
140
+ }
141
+ jvm_version = java.lang.System.getProperty('java.specification.version').to_f
142
+
143
+ javac_args['excludes'] = '**/*Java8.java' if jvm_version < 1.8
144
+ ant.javac javac_args
125
145
  `touch tmp_test/fixtures/fixtures_built.txt`
126
- ant.javac 'destdir' => "tmp_test/fixtures",
127
- 'srcdir' => 'test/fixtures',
128
- 'includeantruntime' => false,
129
- 'debug' => true,
130
- 'listfiles' => true
131
146
  end
132
147
 
133
148
  task :init do
@@ -142,6 +157,7 @@ task :clean do
142
157
  rm_f 'dist/mirahc.jar'
143
158
  rm_rf 'tmp'
144
159
  rm_rf 'tmp_test'
160
+ rm_rf 'pkg'
145
161
  end
146
162
 
147
163
  desc "clean downloaded dependencies"
@@ -157,6 +173,7 @@ task :jvm_backend => 'dist/mirahc.jar'
157
173
  desc "build backwards-compatible ruby jar"
158
174
  task :jar => :compile do
159
175
  ant.jar 'jarfile' => 'dist/mirah.jar' do
176
+ # TODO this is wrong. :(
160
177
  fileset 'dir' => 'lib'
161
178
  fileset 'dir' => 'build'
162
179
  fileset 'dir' => '.', 'includes' => 'bin/*'
@@ -203,11 +220,10 @@ end
203
220
  desc "Build all redistributable files"
204
221
  task :dist => [:gem, :zip]
205
222
 
206
- #TODO find/create ssl location for this jar
207
223
  file_create 'javalib/asm-5.jar' do
208
224
  require 'open-uri'
209
225
  puts "Downloading asm-5.jar"
210
- url = 'https://search.maven.org/remotecontent?filepath=org/ow2/asm/asm-all/5.0.3/asm-all-5.0.3.jar'
226
+ url = 'https://search.maven.org/remotecontent?filepath=org/ow2/asm/asm-all/5.0.4/asm-all-5.0.4.jar'
211
227
  open(url, 'rb') do |src|
212
228
  open('javalib/asm-5.jar', 'wb') do |dest|
213
229
  dest.write(src.read)
@@ -228,15 +244,10 @@ file_create 'javalib/mirahc-prev.jar' do
228
244
  end
229
245
  end
230
246
 
231
-
232
247
  def bootstrap_mirah_from(old_jar, new_jar)
233
-
234
- #typer_srcs = Dir['src/org/mirah/typer/**/*.mirah'].sort
235
- #typer_classes = typer_srcs.map {|s| s.sub 'src', build_dir }
236
- if false
237
- name = new_jar.sub /[.\/]/, '_'
248
+ name = new_jar.gsub /[\.\/]/, '_'
238
249
 
239
-
250
+ # Compile Java parts of the compiler.
240
251
  java_build_dir = "build/#{name}-java"
241
252
  java_jar = "#{java_build_dir}.jar"
242
253
  file java_jar => Dir["src/**/*.java"].sort do
@@ -256,185 +267,257 @@ if false
256
267
  end
257
268
  end
258
269
 
259
- bootstrap_build_dir = "build/#{name}-bootstrap"
260
- bootstrap_jar = "#{bootstrap_build_dir}.jar"
261
- bootstrap_srcs = Dir['src/org/mirah/{builtins,jvm/types,macros,util,}/*.mirah'].sort
262
- file bootstrap_jar => bootstrap_srcs do
263
- build_mirah_stuff old_jar, bootstrap_build_dir, bootstrap_srcs
264
- ant.jar 'jarfile' => bootstrap_jar do
265
- fileset 'dir' => bootstrap_build_dir
266
- end
267
- end
268
-
269
- typer_build_dir = "build/#{name}-typer"
270
- typer_jar = "#{typer_build_dir}.jar"
271
- file typer_jar => Dir['src/org/mirah/typer/**/*.mirah'].sort do
272
- build_mirah_stuff old_jar, typer_build_dir, typer_srcs
273
- ant.jar 'jarfile' => typer_jar do
274
- fileset 'dir' => typer_build_dir
275
- end
276
- end
277
-
278
- compiler_build_dir = "build/#{name}-compiler"
279
- compiler_jar = "#{compiler_build_dir}.jar"
280
- file compiler_jar => Dir['src/org/mirah/jvm/{compiler,mirrors,model}/**/*.mirah'].sort do
281
- build_mirah_stuff old_jar, compiler_build_dir, compiler_srcs
282
- ant.jar 'jarfile' => compiler_jar do
283
- fileset 'dir' => compiler_build_dir
270
+ core_build_dir = "build/#{name}-core"
271
+ core_jar = "#{core_build_dir}.jar"
272
+ core_mirah_srcs = Dir['src/org/mirah/*.mirah'].sort +
273
+ Dir['src/org/mirah/{jvm/types,macros,util}/*.mirah'].sort +
274
+ Dir['src/org/mirah/typer/**/*.mirah'].sort +
275
+ Dir['src/org/mirah/jvm/{compiler,mirrors,model}/**/*.mirah'].sort -
276
+ # org.mirah.MirahCommand depends on .tool., so remove from core
277
+ ['src/org/mirah/mirah_command.mirah']
278
+
279
+ file core_jar => core_mirah_srcs + [java_jar, old_jar, 'javalib/asm-5.jar', 'javalib/mirah-parser.jar'] do
280
+ compile_mirah_with_jar old_jar, core_build_dir, core_mirah_srcs, [java_jar]
281
+ ant.jar 'jarfile' => core_jar do
282
+ fileset 'dir' => core_build_dir
284
283
  end
285
284
  end
286
285
 
286
+ # Tool jar rule.
287
+ tool_mirah_srcs = Dir['src/org/mirah/tool/*.mirah'].sort +
288
+ ['src/org/mirah/mirah_command.mirah'] # add it back in here.
287
289
  tool_build_dir = "build/#{name}-tool"
288
290
  tool_jar = "#{tool_build_dir}.jar"
289
- file tool_jar => Dir['src/org/mirah/tool/**/*.mirah'].sort do
290
- build_mirah_stuff old_jar, tool_build_dir, tool_srcs
291
+ file tool_jar => tool_mirah_srcs + [core_jar, old_jar, 'javalib/asm-5.jar', 'javalib/mirah-parser.jar'] do
292
+ compile_mirah_with_jar old_jar, tool_build_dir, tool_mirah_srcs, [core_jar, java_jar]
291
293
  ant.jar 'jarfile' => tool_jar do
292
294
  fileset 'dir' => tool_build_dir
293
295
  end
294
296
  end
295
297
 
298
+ # Ant jar rule.
299
+ ant_mirah_srcs = Dir['src/org/mirah/ant/*.mirah'].sort
296
300
  ant_build_dir = "build/#{name}-ant"
297
301
  ant_jar = "#{ant_build_dir}.jar"
298
- file ant_jar => Dir['src/org/mirah/ant/**/*.mirah'].sort do
299
- build_mirah_stuff old_jar, ant_build_dir, ant_srcs
302
+ file ant_jar => ant_mirah_srcs + [core_jar, tool_jar, java_jar, old_jar, 'javalib/asm-5.jar', 'javalib/mirah-parser.jar'] do
303
+ ant_classpath = $CLASSPATH.grep(/ant/).map{|x| x.sub(/^file:/,'')}
304
+ compile_mirah_with_jar old_jar, ant_build_dir, ant_mirah_srcs, [core_jar, tool_jar, java_jar] + ant_classpath
300
305
  ant.jar 'jarfile' => ant_jar do
301
306
  fileset 'dir' => ant_build_dir
302
307
  end
303
308
  end
304
- jars = [java_jar, bootstrap_jar, typer_jar, compiler_jar, tool_jar, ant_jar]
309
+
310
+ # Extensions
311
+ # NB: we compile extensions with the current version of the compiler.
312
+ #
313
+ extensions_mirah_srcs = Dir['src/org/mirah/builtins/*.mirah'].sort
314
+ extensions_build_dir = "build/#{name}-extensions"
315
+ extensions_jar = "#{extensions_build_dir}.jar"
316
+ file extensions_jar => extensions_mirah_srcs + [core_jar, tool_jar, java_jar, 'javalib/asm-5.jar', 'javalib/mirah-parser.jar'] do
317
+
318
+ classpath = [core_jar, tool_jar, java_jar,
319
+ "javalib/mirah-parser.jar",
320
+ "javalib/asm-5.jar"].join(File::PATH_SEPARATOR)
321
+
322
+ runjava('-Xmx512m',
323
+ '-classpath', classpath,
324
+ 'org.mirah.MirahCommand',
325
+ '-d', extensions_build_dir,
326
+ '-classpath', classpath,
327
+ '--jvm', build_version,
328
+ *extensions_mirah_srcs)
329
+ ant.jar 'jarfile' => extensions_jar do
330
+ fileset 'dir' => extensions_build_dir
331
+ # TODO clean up
332
+ #metainf 'dir' => File.dirname(__FILE__), 'includes' => 'LICENSE,COPYING,NOTICE'
333
+ metainf 'dir' => File.dirname(__FILE__)+'/src/org/mirah/builtins',
334
+ 'includes' => 'services/*'
335
+ end
336
+ end
337
+ jars = [java_jar, core_jar, tool_jar, ant_jar, extensions_jar]
305
338
  file new_jar => jars +
306
339
  [old_jar, 'javalib/asm-5.jar', 'javalib/mirah-parser.jar'] do
340
+ # TODO use ant.jarjarto shade asm-5 in the fat jar
307
341
  ant.jar 'jarfile' => new_jar do
308
342
  jars.each {|j| zipfileset 'src' => j }
309
343
  zipfileset 'src' => 'javalib/asm-5.jar', 'includes' => 'org/objectweb/**/*'
310
344
  zipfileset 'src' => 'javalib/mirah-parser.jar'
311
345
  metainf 'dir' => File.dirname(__FILE__), 'includes' => 'LICENSE,COPYING,NOTICE'
346
+ metainf 'dir' => File.dirname(__FILE__)+'/src/org/mirah/builtins',
347
+ 'includes' => 'services/*'
348
+
312
349
  manifest do
313
350
  attribute 'name' => 'Main-Class', 'value' => 'org.mirah.MirahCommand'
314
351
  end
315
352
  end
316
-
317
353
  end
354
+ end
318
355
 
319
- else # original
320
-
321
-
322
- mirah_srcs = Dir['src/org/mirah/{builtins,jvm/types,macros,util,}/*.mirah'].sort +
323
- Dir['src/org/mirah/typer/**/*.mirah'].sort +
324
- Dir['src/org/mirah/jvm/{compiler,mirrors,model}/**/*.mirah'].sort +
325
- Dir['src/org/mirah/tool/*.mirah'].sort
326
-
327
- file new_jar => mirah_srcs + ['src/org/mirah/ant/compile.mirah'] + [old_jar, 'javalib/asm-5.jar', 'javalib/mirah-parser.jar'] do
328
- build_dir = 'build/bootstrap'
329
- rm_rf build_dir
330
- mkdir_p build_dir
331
-
332
- # Compile Java sources
333
- ant.javac 'source' => '1.6',
334
- 'target' => '1.6',
335
- 'destdir' => build_dir,
336
- 'srcdir' => 'src',
337
- 'includeantruntime' => false,
338
- 'debug' => true,
339
- 'listfiles' => true
340
-
341
- # mirahc needs to be 1.7 or lower
342
- build_version = java.lang.System.getProperty('java.specification.version')
343
- if build_version.to_f > 1.7
344
- build_version = '1.7'
356
+ # compiles to the build dir
357
+ def compile_mirah_with_jar old_jar, build_dir, mirah_srcs, classpath=[], clean=true
358
+ if clean
359
+ puts "cleaning #{build_dir} before compile"
360
+ rm_rf build_dir
361
+ mkdir_p build_dir
362
+ else
363
+ puts "skipping cleaning #{build_dir}"
345
364
  end
346
365
 
347
- default_class_path = ["javalib/mirah-parser.jar", build_dir,"javalib/asm-5.jar"].join(File::PATH_SEPARATOR)
366
+ default_class_path = ["javalib/mirah-parser.jar", build_dir, "javalib/asm-5.jar", *classpath].join(File::PATH_SEPARATOR)
348
367
 
349
368
  # Compile Mirah sources
350
369
  runjava('-Xmx512m',
370
+ '-jar',
351
371
  old_jar,
352
372
  '-d', build_dir,
353
373
  '-classpath', default_class_path,
354
374
  '--jvm', build_version,
355
-
356
- #'--verbose',
357
-
358
375
  *mirah_srcs)
359
-
360
- # compile ant stuff
361
- ant_classpath = $CLASSPATH.grep(/ant/).map{|x| x.sub(/^file:/,'')}.join(File::PATH_SEPARATOR)
362
- runjava '-Xmx512m',
363
- old_jar,
364
- '-d', build_dir,
365
- '-classpath', [default_class_path, ant_classpath].join(File::PATH_SEPARATOR),
366
- '--jvm', build_version,
367
- 'src/org/mirah/ant'
376
+ end
368
377
 
369
- # Build the jar
370
- ant.jar 'jarfile' => new_jar do
371
- fileset 'dir' => build_dir
372
- zipfileset 'src' => 'javalib/asm-5.jar', 'includes' => 'org/objectweb/**/*'
373
- zipfileset 'src' => 'javalib/mirah-parser.jar'
374
- metainf 'dir' => File.dirname(__FILE__), 'includes' => 'LICENSE,COPYING,NOTICE'
375
- manifest do
376
- attribute 'name' => 'Main-Class', 'value' => 'org.mirah.MirahCommand'
377
- end
378
+ bootstrap_mirah_from('javalib/mirahc-prev.jar', 'dist/mirahc.jar')
379
+ bootstrap_mirah_from('dist/mirahc.jar', 'dist/mirahc2.jar')
380
+ bootstrap_mirah_from('dist/mirahc2.jar', 'dist/mirahc3.jar')
381
+
382
+ # Parser tasks!
383
+
384
+ # TODO maybe add these back at some point?
385
+ #task :doc => 'build/mirahparser/lang/ast/Node.java' do
386
+ # ant.javadoc :sourcepath => 'build', :destdir => 'doc'
387
+ #end
388
+
389
+ mirah_parser_gen_src = 'build/mirah-parser-gen/mirahparser/impl/Mirah.mirah'
390
+ mirah_parser_build_dir = "build/mirah-parser"
391
+ parser_node_meta_class = "#{mirah_parser_build_dir}/org/mirahparser/ast/NodeMeta.class"
392
+ parser_node_java_gen_src = "#{mirah_parser_build_dir}-gen/mirahparser/lang/ast/Node.java"
393
+ parser_node_class = "#{mirah_parser_build_dir}/mirahparser/lang/ast/Node.class"
394
+ parser_meta_src = 'mirah-parser/src/org/mirah/ast/meta.mirah'
395
+ prev_jar = 'javalib/mirahc-prev.jar'
396
+ directory "#{mirah_parser_build_dir}/mirah-parser/mirahparser/impl"
397
+
398
+
399
+ file 'build/mirah-parser.jar' => ["#{mirah_parser_build_dir}/mirahparser/lang/ast/Node.class",
400
+ "#{mirah_parser_build_dir}/mirahparser/impl/MirahParser.class",
401
+ "#{mirah_parser_build_dir}/mirahparser/impl/MirahLexer.class"] do
402
+ ant.jarjar 'jarfile' => 'build/mirah-parser.jar' do
403
+ fileset 'dir' => mirah_parser_build_dir, 'includes' => 'mirahparser/impl/*.class'
404
+ fileset 'dir' => mirah_parser_build_dir, 'includes' => 'mirahparser/lang/ast/*.class'
405
+ fileset 'dir' => mirah_parser_build_dir, 'includes' => 'org/mirahparser/ast/*.class'
406
+ zipfileset 'src' => 'mirah-parser/javalib/mmeta-runtime.jar'
407
+ _element 'rule', 'pattern'=>'mmeta.**', 'result'=>'org.mirahparser.mmeta.@1'
408
+ manifest do
409
+ attribute 'name'=>"Main-Class", 'value'=>"mirahparser.impl.MirahParser"
378
410
  end
379
411
  end
380
- end # feature flag
381
412
  end
382
413
 
383
- def build_mirah_stuff old_jar, build_dir, mirah_srcs
384
-
385
- rm_rf build_dir
386
- mkdir_p build_dir
387
-
388
-
389
- # mirahc needs to be 1.7 or lower
390
- build_version = java.lang.System.getProperty('java.specification.version')
391
- if build_version.to_f > 1.7
392
- build_version = '1.7'
414
+ file 'dist/mirah-parser.jar' => 'build/mirah-parser.jar' do
415
+ # Mirahc picks up the built in classes instead of our versions.
416
+ # So we compile in a different package and then jarjar them to the correct
417
+ # one.
418
+ ant.jarjar 'jarfile' => 'dist/mirah-parser.jar' do
419
+ zipfileset 'src' => 'build/mirah-parser.jar'
420
+ _element 'rule', 'pattern'=>'mirahparser.**', 'result'=>'mirah.@1'
421
+ _element 'rule', 'pattern'=>'org.mirahparser.**', 'result'=>'org.mirah.@1'
422
+ manifest do
423
+ attribute 'name'=>"Main-Class", 'value'=>"mirah.impl.MirahParser"
393
424
  end
425
+ end
426
+ end
394
427
 
395
- default_class_path = ["javalib/mirah-parser.jar", build_dir,"javalib/asm-5.jar"].join(File::PATH_SEPARATOR)
396
-
397
- # Compile Mirah sources
398
- runjava('-Xmx512m',
399
- old_jar,
400
- '-d', build_dir,
401
- '-classpath', default_class_path,
402
- '--jvm', build_version,
403
- *mirah_srcs)
404
-
428
+ file 'javalib/mirah-parser.jar' => 'dist/mirah-parser.jar' do
429
+ cp 'dist/mirah-parser.jar', 'javalib/mirah-parser.jar'
430
+ end
405
431
 
406
-
407
- # compile ant stuff
408
- # ant_classpath = $CLASSPATH.grep(/ant/).map{|x| x.sub(/^file:/,'')}.join(File::PATH_SEPARATOR)
409
- # runjava '-Xmx512m',
410
- # old_jar,
411
- # '-d', build_dir,
412
- # '-classpath', [default_class_path, ant_classpath].join(File::PATH_SEPARATOR),
413
- # '--jvm', build_version,
414
- # 'src/org/mirah/ant'
432
+ file "#{mirah_parser_build_dir}/mirahparser/impl/MirahParser.class" => [
433
+ prev_jar,
434
+ mirah_parser_gen_src,
435
+ parser_node_meta_class,
436
+ "#{mirah_parser_build_dir}/mirahparser/impl/MirahLexer.class",
437
+ #"#{mirah_parser_build_dir}/mirahparser/impl/Tokens.class",
438
+ ] do
439
+ compile_mirah_with_jar prev_jar,
440
+ mirah_parser_build_dir,
441
+ [mirah_parser_gen_src],
442
+ [mirah_parser_build_dir,
443
+ 'mirah-parser/javalib/mmeta-runtime.jar',
444
+ prev_jar],
445
+ clean=false
446
+ end
415
447
 
416
- # Build the jar
417
- ant.jar 'jarfile' => new_jar do
418
- fileset 'dir' => build_dir
419
- zipfileset 'src' => 'javalib/asm-5.jar', 'includes' => 'org/objectweb/**/*'
420
- zipfileset 'src' => 'javalib/mirah-parser.jar'
421
- metainf 'dir' => File.dirname(__FILE__), 'includes' => 'LICENSE,COPYING,NOTICE'
422
- manifest do
423
- attribute 'name' => 'Main-Class', 'value' => 'org.mirah.MirahCommand'
424
- end
425
- end
448
+ file parser_node_meta_class => parser_meta_src do
449
+ compile_mirah_with_jar prev_jar,
450
+ mirah_parser_build_dir,
451
+ [parser_meta_src],
452
+ [mirah_parser_build_dir, prev_jar],
453
+ clean=false
454
+ #mirahc(parser_meta_src,
455
+ # :dest => mirah_parser_build_dir
456
+ # #:options => ['-V']
457
+ # )
458
+ end
459
+ parser_ast_srcs = Dir['mirah-parser/src/mirah/lang/ast/*.mirah'].sort
460
+ file parser_node_class =>
461
+ [prev_jar, parser_node_meta_class] + parser_ast_srcs do
462
+ compile_mirah_with_jar prev_jar,
463
+ mirah_parser_build_dir,
464
+ parser_ast_srcs,
465
+ [mirah_parser_build_dir,
466
+ 'mirah-parser/javalib/mmeta-runtime.jar', prev_jar],
467
+ clean = false
468
+ end
426
469
 
470
+ file parser_node_java_gen_src =>
471
+ [parser_node_meta_class] + parser_ast_srcs do
472
+ #TODO. --java is nolonger supported.
473
+ # compile_mirah_with_jar prev_jar,
474
+ # mirah_parser_build_dir,
475
+ # parser_ast_srcs,
476
+ # [mirah_parser_build_dir,
477
+ # 'mirah-parser/javalib/mmeta-runtime.jar']
478
+
479
+ mirahc('.',
480
+ :dir => 'mirah-parser/src/mirah/lang/ast',
481
+ :dest => 'build',
482
+ :classpath => ['build'],
483
+ :options => ['--java'])
484
+ end
427
485
 
486
+ parser_java_impl_src = Dir['mirah-parser/src/mirahparser/impl/*.java'].sort
487
+ parser_lexer_class = "#{mirah_parser_build_dir}/mirahparser/impl/MirahLexer.class"
488
+ file parser_lexer_class => parser_java_impl_src do
489
+ ant.javac 'srcDir' => 'mirah-parser/src',
490
+ 'destDir' => mirah_parser_build_dir,
491
+ 'source' => '1.6',
492
+ 'target' => '1.6',
493
+ 'debug' => true do
494
+ include 'name' => 'mirahparser/impl/Tokens.java'
495
+ include 'name' => 'mirahparser/impl/MirahLexer.java'
496
+ classpath 'path' => "#{mirah_parser_build_dir}:mirah-parser/javalib/mmeta-runtime.jar"
497
+ end
498
+ end
428
499
 
500
+ file mirah_parser_gen_src => 'mirah-parser/src/mirahparser/impl/Mirah.mmeta' do
501
+ ant.mkdir 'dir' => "#{mirah_parser_build_dir}-gen/mirahparser/impl"
502
+ runjava '-jar', 'mirah-parser/javalib/mmeta.jar',
503
+ '--tpl', 'node=mirah-parser/src/mirahparser/impl/node.xtm',
504
+ 'mirah-parser/src/mirahparser/impl/Mirah.mmeta',
505
+ mirah_parser_gen_src
429
506
  end
430
507
 
431
- bootstrap_mirah_from('javalib/mirahc-prev.jar', 'dist/mirahc.jar')
432
- bootstrap_mirah_from('dist/mirahc.jar', 'dist/mirahc2.jar')
433
- bootstrap_mirah_from('dist/mirahc2.jar', 'dist/mirahc3.jar')
434
508
 
509
+ def build_version
510
+ # mirahc needs to be 1.7 or lower
511
+ java_version = java.lang.System.getProperty('java.specification.version')
512
+ if java_version.to_f > 1.7
513
+ '1.7'
514
+ else
515
+ java_version
516
+ end
517
+ end
435
518
 
436
- def runjava(jar, *args)
437
- sh 'java', '-jar', jar, *args
519
+ def runjava(*args)
520
+ sh 'java',*args
438
521
  unless $?.success?
439
522
  exit $?.exitstatus
440
523
  end