mirah 0.1.2-java → 0.1.3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +225 -0
  3. data/Rakefile +108 -315
  4. data/TODO.md +100 -0
  5. data/bin/bundler +16 -0
  6. data/bin/rake +16 -0
  7. data/dist/mirahc.jar +0 -0
  8. data/examples/appengine/Readme +0 -1
  9. data/examples/literals.mirah +17 -0
  10. data/examples/macros/string_each_char.mirah +1 -1
  11. data/lib/mirah.rb +11 -21
  12. data/lib/mirah/transform/transformer.rb +1 -2
  13. data/lib/mirah/util/class_loader.rb +1 -1
  14. data/lib/mirah/util/logging.rb +0 -63
  15. data/lib/mirah/util/process_errors.rb +1 -0
  16. data/lib/mirah/version.rb +1 -1
  17. data/{examples/simple_class.mirah~ → test/artifacts/jar_test.rb} +7 -11
  18. data/{lib/mirah/commands.rb → test/artifacts/jruby_test.rb} +8 -5
  19. data/test/core/typer_test.rb +29 -11
  20. data/test/core/util/argument_processor_test.rb +24 -23
  21. data/test/core/util/class_loader_test.rb +7 -4
  22. data/test/core/util/{compilation_state_test.rb → jvm_version_test.rb} +20 -16
  23. data/test/fixtures/org/foo/ImplicitClassRetAnno.java +4 -0
  24. data/test/fixtures/org/foo/IntAnno.java +9 -0
  25. data/test/jvm/annotations_test.rb +11 -11
  26. data/test/jvm/blocks_test.rb +16 -12
  27. data/test/jvm/constructors_test.rb +8 -8
  28. data/test/jvm/enumerable_test.rb +48 -24
  29. data/test/jvm/generics_test.rb +3 -7
  30. data/test/jvm/import_test.rb +14 -0
  31. data/test/jvm/interface_test.rb +9 -24
  32. data/test/jvm/jvm_commands_test.rb +22 -4
  33. data/test/jvm/jvm_compiler_test.rb +124 -79
  34. data/test/jvm/list_extensions_test.rb +1 -1
  35. data/test/jvm/macros_test.rb +67 -14
  36. data/test/jvm/main_method_test.rb +1 -1
  37. data/test/jvm/new_backend_test_helper.rb +100 -3
  38. data/{lib/mirah/jvm/types/bitescript_ext.rb → test/jvm/static_fields_test.rb} +22 -21
  39. data/test/mirrors/base_type_test.rb +4 -3
  40. data/test/mirrors/bytecode_mirror_test.rb +35 -15
  41. data/test/mirrors/generics_test.rb +14 -5
  42. data/test/mirrors/member_test.rb +2 -1
  43. data/test/mirrors/method_lookup_test.rb +18 -6
  44. data/test/mirrors/mirrors_test.rb +87 -20
  45. data/test/mirrors/simple_async_mirror_loader_test.rb +7 -3
  46. data/test/mirrors/simple_mirror_loader_test.rb +5 -5
  47. data/test/test_helper.rb +25 -1
  48. metadata +18 -78
  49. data/bin/mirahp +0 -27
  50. data/bin/mirahp.cmd +0 -16
  51. data/examples/Fib.class +0 -0
  52. data/javalib/mirah-bootstrap.jar +0 -0
  53. data/javalib/mirah-builtins.jar +0 -0
  54. data/javalib/mirah-compiler.jar +0 -0
  55. data/javalib/mirah-mirrors.jar +0 -0
  56. data/javalib/mirah-newast-transitional.jar +0 -0
  57. data/javalib/mirah-parser.jar +0 -0
  58. data/javalib/mirah-util.jar +0 -0
  59. data/lib/mirah/ast.rb +0 -43
  60. data/lib/mirah/ast/scope.rb +0 -262
  61. data/lib/mirah/commands/base.rb +0 -59
  62. data/lib/mirah/commands/compile.rb +0 -39
  63. data/lib/mirah/commands/parse.rb +0 -36
  64. data/lib/mirah/commands/run.rb +0 -78
  65. data/lib/mirah/generator.rb +0 -150
  66. data/lib/mirah/jvm/compiler.rb +0 -50
  67. data/lib/mirah/jvm/compiler/base.rb +0 -421
  68. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +0 -1194
  69. data/lib/mirah/jvm/method_lookup.rb +0 -307
  70. data/lib/mirah/jvm/types.rb +0 -45
  71. data/lib/mirah/jvm/types/array_type.rb +0 -60
  72. data/lib/mirah/jvm/types/ast_ext.rb +0 -31
  73. data/lib/mirah/jvm/types/basic_types.rb +0 -41
  74. data/lib/mirah/jvm/types/block_type.rb +0 -15
  75. data/lib/mirah/jvm/types/boolean.rb +0 -70
  76. data/lib/mirah/jvm/types/enumerable.rb +0 -80
  77. data/lib/mirah/jvm/types/extensions.rb +0 -110
  78. data/lib/mirah/jvm/types/factory.rb +0 -830
  79. data/lib/mirah/jvm/types/floats.rb +0 -99
  80. data/lib/mirah/jvm/types/generic_type.rb +0 -72
  81. data/lib/mirah/jvm/types/implicit_nil_type.rb +0 -29
  82. data/lib/mirah/jvm/types/integers.rb +0 -131
  83. data/lib/mirah/jvm/types/interface_definition.rb +0 -20
  84. data/lib/mirah/jvm/types/intrinsics.rb +0 -385
  85. data/lib/mirah/jvm/types/literals.rb +0 -89
  86. data/lib/mirah/jvm/types/meta_type.rb +0 -54
  87. data/lib/mirah/jvm/types/methods.rb +0 -946
  88. data/lib/mirah/jvm/types/null_type.rb +0 -39
  89. data/lib/mirah/jvm/types/number.rb +0 -184
  90. data/lib/mirah/jvm/types/primitive_type.rb +0 -76
  91. data/lib/mirah/jvm/types/source_mirror.rb +0 -274
  92. data/lib/mirah/jvm/types/type.rb +0 -311
  93. data/lib/mirah/jvm/types/type_definition.rb +0 -72
  94. data/lib/mirah/jvm/types/void_type.rb +0 -19
  95. data/lib/mirah/util/compilation_state.rb +0 -60
  96. data/test/core/commands_test.rb +0 -89
  97. data/test/core/generator_test.rb +0 -26
  98. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  99. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  100. data/test/jvm/bytecode_test_helper.rb +0 -193
  101. data/test/jvm/factory_test.rb +0 -28
  102. data/test/jvm/java_typer_test.rb +0 -283
data/TODO.md ADDED
@@ -0,0 +1,100 @@
1
+
2
+ 0.1.3 checklist
3
+ =============
4
+
5
+ - check jar CLI
6
+ org.mirah:mirah doesn't work w/o JRuby currently
7
+ org.mirah:mirah-complete jar is also broken in 0.1.2, 0.1.1
8
+ :/
9
+ otoh, probably no one is using them since they don't work
10
+
11
+ - check jruby gem
12
+ 0.1.2 is the broken :(
13
+
14
+ - done: silence run compiler logging
15
+ - done: make sure in run mode we don't drop things on the filesystem
16
+ - silence logging by default in RunCommand, w/ options overriding it.
17
+
18
+
19
+ - Java 8
20
+ -- make asm new d/l dependency
21
+ -- find usages of org.jruby...asm & change them
22
+ -- rm jruby-complete asa d/l dep
23
+ -- add asm license file to dist bundle
24
+
25
+ - mirah-parser CI (ish)
26
+ - automated tests for distribution artifacts
27
+ - CI passing
28
+
29
+
30
+ ------------------
31
+
32
+
33
+
34
+
35
+
36
+ - Check mvn compile plugin
37
+ - move build artifacts to javalib for gem
38
+
39
+ - verify bytecode version of compiler
40
+ - silence logging from JRuby interfaces, unless overridden.
41
+
42
+ Misc
43
+ ===========
44
+ - mirah-parser maven artifact
45
+
46
+ - java 9
47
+ - implicit void methods w/ explicit return generate incorrect bytecode. Let's see if that's true of explicit. nope.
48
+ - get rid of all outputs that escape from tests
49
+ - default toString?
50
+
51
+ etc
52
+ =========
53
+
54
+ - Reflection Macros
55
+ - AST formatter that converts back to something the parser can parse
56
+
57
+ - switch to minitest
58
+
59
+ from notes, uncategorized
60
+ ============================
61
+ #fuzzy aka cast scoping
62
+ for rescue clauses
63
+ eg
64
+ e = nil
65
+ begin
66
+ rescue X => e
67
+ # e is "X" here
68
+ rescue Y => e
69
+ # e is "Y" here
70
+ end
71
+ puts e # e is LUB(X, Y)
72
+
73
+ #behavior literate, exec spec
74
+ list o example code + what the compiler says when you give it to the compiler
75
+ things like errors, & behavior
76
+
77
+ feature requests
78
+ ----------------
79
+ - goto: headius wants it
80
+ - synchronize intrinsic ala java's
81
+ - file scoped macros
82
+ - move macro / mirahc anno to separate class dir to improve javac interop
83
+
84
+ parser
85
+ -------
86
+
87
+ foo {|a| !a || ''.equals(a) }
88
+ doesn't parse
89
+
90
+ does now :)
91
+
92
+
93
+ blocks don't introduce new scopes when they are part of a macro currently :/
94
+
95
+
96
+ Release management
97
+ ------------------
98
+
99
+ keep version in fewer places
100
+ whew
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env jruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'bundler' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('bundler', 'bundler')
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env jruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rake' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rake', 'rake')
Binary file
@@ -3,7 +3,6 @@ Run rake to compile the application and start the development server:
3
3
  $ jruby -I `pwd`/../../lib -S rake
4
4
 
5
5
  Requirements:
6
- - jruby -S gem install bitescript
7
6
  - jruby -S gem install appengine-sdk -v=1.3.5.pre
8
7
 
9
8
  Datastore API:
@@ -0,0 +1,17 @@
1
+ str = 'non-interpolated string'
2
+ str2 = "interpolated is better than #{str}"
3
+ heredoc = <<EOS
4
+ this is a here doc
5
+ EOS
6
+ int = 42
7
+ char = ?a
8
+ float = 3.14159265358979323846264
9
+ regex = /\d(cow)+\w\\/ # in Java, this would be "\\\\d(cow)+\\\\w\\\\\\\\"
10
+ regex2 = /interpolated #{regex}/
11
+ list = [1, 2, 3]
12
+ list[2] = 4
13
+ array = byte[5]
14
+ array[0] = byte(0)
15
+ hash = { "one" => 1, "two" => 2 }
16
+ hash["three"] = 3
17
+
@@ -16,7 +16,7 @@
16
16
 
17
17
  macro def eachChar(value, block:Block)
18
18
  quote {
19
- `value`.toCharArray.each do |`block.arguments` |
19
+ `value`.toCharArray.each do |`block.arguments`|
20
20
  `block.body`
21
21
  end
22
22
  }
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
1
+ # Copyright (c) 2010-2014 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");
@@ -15,41 +15,30 @@
15
15
 
16
16
  require 'fileutils'
17
17
  require 'rbconfig'
18
- require 'bitescript'
19
18
 
20
- $CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-builtins.jar'
21
- $CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-parser.jar'
22
- $CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-bootstrap.jar'
23
- $CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-util.jar'
24
- $CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-compiler.jar'
25
- $CLASSPATH << File.dirname(__FILE__) + '/../javalib/mirah-mirrors.jar'
19
+ $CLASSPATH << File.dirname(__FILE__) + '/../dist/mirahc.jar'
26
20
 
27
21
  require 'mirah/version'
28
22
  require 'mirah/transform'
29
- require 'mirah/ast'
30
- require 'mirah/compiler'
31
23
  require 'mirah/env'
32
24
  require 'mirah/errors'
33
25
  require 'mirah/typer'
34
- require 'mirah/jvm/types'
35
26
 
36
- require 'mirah/jvm/compiler'
37
- #Dir[File.dirname(__FILE__) + "/mirah/plugin/*"].each {|file| require "#{file}" if file =~ /\.rb$/}
38
- require 'jruby'
27
+ require "mirah/util/process_errors"
28
+ require "mirah/util/logging"
29
+ require "mirah/util/class_loader"
39
30
 
40
- require 'mirah/commands'
41
31
 
42
32
  module Mirah
33
+ java_import 'org.mirah.tool.RunCommand'
34
+ java_import 'org.mirah.tool.Mirahc'
35
+
43
36
  def self.run(*args)
44
- Mirah::Commands::Run.new(args).execute
37
+ Mirah::RunCommand.run(args)
45
38
  end
46
39
 
47
40
  def self.compile(*args)
48
- Mirah::Commands::Compile.new(args).execute
49
- end
50
-
51
- def self.parse(*args)
52
- Mirah::Commands::Parse.new(args).execute
41
+ Mirah::Mirahc.new.compile(args)
53
42
  end
54
43
 
55
44
  def self.plugins
@@ -102,6 +91,7 @@ module Mirah
102
91
  endcol = end_col if lineno == end_line
103
92
 
104
93
  result << "^" * [endcol - start, 1].max
94
+
105
95
  result << "\n"
106
96
  end
107
97
  result
@@ -25,12 +25,11 @@ module Mirah
25
25
  attr_reader :errors, :state
26
26
  attr_accessor :filename
27
27
 
28
- def initialize(state, typer)
28
+ def initialize(typer)
29
29
  @errors = []
30
30
  @tmp_count = 0
31
31
  @annotations = []
32
32
  @extra_body = nil
33
- @state = state
34
33
  @typer = typer
35
34
  @types = typer.type_system if typer
36
35
  @files = {""=>{:filename => "", :line => 0, :code => ""}}
@@ -5,7 +5,7 @@ module Mirah
5
5
 
6
6
  # converts string to a java string w/ binary encoding
7
7
  # might be able to avoid this in 1.9 mode
8
- def ClassLoader.binary_string string
8
+ def self.binary_string string
9
9
  java.lang.String.new string.to_java_bytes, "ISO-8859-1"
10
10
  end
11
11
 
@@ -6,69 +6,6 @@ module Mirah
6
6
  java_import 'java.util.logging.Level'
7
7
 
8
8
  MirahLogger = Logger.getLogger('org.mirah')
9
- MirahHandler = ConsoleHandler.new
10
- MirahLogger.addHandler(MirahHandler)
11
- MirahLogger.use_parent_handlers = false
12
- MirahHandler.level = Level::ALL
13
-
14
- class LogFormatter < Formatter
15
- def initialize(use_color=true)
16
- @color = use_color
17
- @names = {}
18
- @inverse_names = {}
19
- end
20
-
21
- def format_name(sb, level, name)
22
- sb.append("\e[1m") if @color
23
- sb.append("* [")
24
- if @color && level > 800
25
- if level > 900
26
- sb.append("\e[31m")
27
- else
28
- sb.append("\e[34m")
29
- end
30
- end
31
- sb.append(shorten(name))
32
- sb.append("\e[39m") if @color
33
- sb.append('] ')
34
- sb.append("\e[0m") if @color
35
- end
36
-
37
- def shorten(name)
38
- short = @names[name]
39
- return short if short
40
- pieces = name.split('.')
41
- pieces.size.times do |i|
42
- key = pieces[-i - 1, i + 1]
43
- existing = @inverse_names[key]
44
- if existing.nil? || existing == [name]
45
- @inverse_names[key] = [name]
46
- return @names[name] = key.join('.')
47
- else
48
- existing.each {|i| @names[i] = nil}
49
- existing << name unless existing.include?(name)
50
- end
51
- end
52
- return name
53
- end
54
-
55
- def format(record)
56
- sb = java.lang.StringBuilder.new
57
- format_name(sb, record.level.int_value, record.logger_name)
58
- sb.append(formatMessage(record))
59
- sb.append("\n")
60
- if record.thrown
61
- sw = java.io.StringWriter.new
62
- pw = java.io.PrintWriter.new(sw)
63
- record.thrown.printStackTrace(pw)
64
- pw.close
65
- sb.append(sw.toString)
66
- end
67
- sb.toString
68
- end
69
- end
70
-
71
- MirahHandler.formatter = LogFormatter.new
72
9
 
73
10
  module Logged
74
11
  VLEVELS = [Level::CONFIG, Level::FINE, Level::FINER, Level::FINEST]
@@ -92,6 +92,7 @@ module Mirah
92
92
  end
93
93
  end
94
94
  end
95
+
95
96
  end
96
97
  end
97
98
  end
@@ -14,5 +14,5 @@
14
14
  # limitations under the License.
15
15
 
16
16
  module Mirah
17
- VERSION = "0.1.2"
17
+ VERSION = "0.1.3"
18
18
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
1
+ # Copyright (c) 2010-2014 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");
@@ -13,15 +13,11 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- class Foo
17
- def initialize
18
- puts 'constructor'
19
- @hello = 'Hello, '
20
- end
16
+ require 'test_helper'
21
17
 
22
- def hello(a:string)
23
- puts @hello; puts a
18
+ class JarTest < Test::Unit::TestCase
19
+ def test_happy_path
20
+ out = `java -jar dist/mirahc.jar run -e 'puts 1'`
21
+ assert_equal "1\n", out
24
22
  end
25
- end
26
-
27
- Foo.new.hello('Mirah')
23
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
1
+ # Copyright (c) 2010-2014 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");
@@ -13,7 +13,10 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- require 'mirah/commands/base'
17
- require 'mirah/commands/run'
18
- require 'mirah/commands/compile'
19
- require 'mirah/commands/parse'
16
+ require 'test_helper'
17
+
18
+ class JrubyTest < Test::Unit::TestCase
19
+ def test_happy_path_works
20
+ Mirah.compile '-e', '1+1'
21
+ end
22
+ end
@@ -42,7 +42,7 @@ class TyperTest < Test::Unit::TestCase
42
42
  def new_typer(n)
43
43
  @types = SimpleTypes.new(n.to_s)
44
44
  @typer = Mirah::Typer::Typer.new(@types, @scopes, nil, nil)
45
- @mirah = Transform::Transformer.new(Mirah::Util::CompilationState.new, @typer)
45
+ @mirah = Transform::Transformer.new(@typer)
46
46
  @typer
47
47
  end
48
48
 
@@ -214,12 +214,15 @@ class TyperTest < Test::Unit::TestCase
214
214
  assert_equal(@types.getFloatType(1.0), inferred_type(ast.get(1)).returnType)
215
215
  end
216
216
 
217
- def test_if
218
- ast = parse("if true; 1.0; else; ''; end").body
217
+ def test_if_incompatible_body_types_float_string
218
+ pend_on_jruby "1.7.13" do
219
+ ast = parse("if true; 1.0; else; ''; end").body
219
220
 
220
- # incompatible body types
221
- assert_equal(':error', infer(ast).name)
221
+ assert_equal(':error', infer(ast).name)
222
+ end
223
+ end
222
224
 
225
+ def test_if_not_error_on_same_type_float
223
226
  ast = parse("if true; 1.0; else; 2.0; end").body.get(0)
224
227
 
225
228
  assert_not_equal(':error', infer(ast).name)
@@ -227,7 +230,9 @@ class TyperTest < Test::Unit::TestCase
227
230
  assert_equal(@types.getBooleanType, inferred_type(ast.condition))
228
231
  assert_equal(@types.getFloatType(1.0), inferred_type(ast.body))
229
232
  assert_equal(@types.getFloatType(1.0), inferred_type(ast.elseBody))
233
+ end
230
234
 
235
+ def test_if
231
236
  typer = new_typer(:Bar)
232
237
 
233
238
  ast = parse("if foo; bar; else; baz; end").body.get(0)
@@ -266,9 +271,11 @@ class TyperTest < Test::Unit::TestCase
266
271
  end
267
272
 
268
273
  def test_rescue_w_different_type_raises_inference_error_when_expression
269
- ast = parse("1 + begin true; 1.0; rescue; ''; end")
270
- infer(ast, true)
271
- assert_errors_including "Incompatible types", @typer, ast
274
+ pend_on_jruby "1.7.13" do
275
+ ast = parse("1 + begin true; 1.0; rescue; ''; end")
276
+ infer(ast, true)
277
+ assert_errors_including "Incompatible types", @typer, ast
278
+ end
272
279
  end
273
280
 
274
281
  def test_rescue_w_different_type_doesnt_raise_inference_error_when_statement
@@ -280,7 +287,7 @@ class TyperTest < Test::Unit::TestCase
280
287
  def test_colon2
281
288
  ast = parse("java::lang::System.out")
282
289
  infer(ast)
283
- target_type = inferred_type(ast.body(0).target)
290
+ target_type = inferred_type(ast.body(0).get(0).target)
284
291
  assert_equal('java.lang.System', target_type.name)
285
292
  end
286
293
 
@@ -296,7 +303,18 @@ class TyperTest < Test::Unit::TestCase
296
303
  infer(ast)
297
304
  assert_equal(@types.getFixnumType(1), inferred_type(ast.body(2)))
298
305
  assert_equal(@types.getNullType, inferred_type(ast.body(3)))
299
- assert_kind_of(LocalAccess, ast.body(2))
300
- assert_kind_of(FunctionalCall, ast.body(3))
306
+
307
+ assert_kind_of(LocalAccess, ast.body(2).get(0))
308
+ assert_kind_of(FunctionalCall, ast.body(3).get(0).get(0))
309
+ end
310
+
311
+ def test_import
312
+ pend_on_jruby "1.7.13" do
313
+ ast = parse("import FooBar")
314
+ assert_equal("Void", infer(ast).name)
315
+ ast = parse("import foobar")
316
+ infer(ast)
317
+ assert_errors_including("Cannot find class foobar", @typer, ast)
318
+ end
301
319
  end
302
320
  end