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
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