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
@@ -14,11 +14,11 @@
14
14
  # limitations under the License.
15
15
 
16
16
 
17
- def reverse(s:string)
17
+ def reverse(s:String)
18
18
  StringBuilder.new(s).reverse.toString()
19
19
  end
20
20
 
21
- def palindrome?(s:string)
21
+ def palindrome?(s:String)
22
22
  s.equals(reverse(s))
23
23
  end
24
24
 
@@ -14,7 +14,7 @@
14
14
  # limitations under the License.
15
15
 
16
16
 
17
- def reverse(s:string)
17
+ def reverse(s:String)
18
18
  StringBuilder.new(s).reverse
19
19
  end
20
20
 
@@ -15,7 +15,7 @@
15
15
 
16
16
 
17
17
 
18
- def rot13 (value:string)
18
+ def rot13 (value:String)
19
19
  result = ""
20
20
  d = ' '.toCharArray[0]
21
21
  value.toCharArray.each do |c|
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
1
+ # Copyright (c) 2015 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,6 +13,15 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- def_edb :render, 'test.edb'
17
- @message = "Hello"
18
- puts render
16
+
17
+ # A simple example of counting
18
+ # the characters in a name. Part of a test
19
+ # to kick the tires - @aspleenic
20
+
21
+ puts "Enter a name: "
22
+
23
+ s = System.console.readLine()
24
+ puts "The name you entered was #{s}"
25
+
26
+ name_length = s.length
27
+ puts "Your Name is #{name_length} characters long (that includes spaces)"
@@ -15,5 +15,5 @@
15
15
 
16
16
 
17
17
  str = "alphaBETA"
18
- puts str.toUpperCase()
19
- puts str.toLowerCase()
18
+ puts str.toUpperCase
19
+ puts str.toLowerCase
@@ -21,7 +21,7 @@
21
21
  */
22
22
 
23
23
  s = "Hello, world!"
24
- puts s.length() * 2
24
+ puts s.length * 2
25
25
 
26
26
  /**
27
27
  * Another way to know the byte length of a string is to explicitly
@@ -16,20 +16,15 @@
16
16
  import javax.swing.JFrame
17
17
  import javax.swing.JButton
18
18
 
19
- # FIXME blocks need to be inside a MethodDefinition, but main doesn't
20
- # have one.
21
- def self.run
22
- frame = JFrame.new "Welcome to Mirah"
23
- frame.setSize 300, 300
24
- frame.setVisible true
19
+ frame = JFrame.new "Welcome to Mirah"
20
+ frame.setSize 300, 300
25
21
 
26
- button = JButton.new "Press me"
27
- frame.add button
28
- frame.show
22
+ button = JButton.new "Press me"
23
+ frame.add button
24
+ frame.show
29
25
 
30
- button.addActionListener do |event|
31
- JButton(event.getSource).setText "Mirah Rocks!"
32
- end
26
+ button.addActionListener do |event|
27
+ JButton(event.getSource).setText "Mirah Rocks!"
33
28
  end
34
-
35
- run
29
+ frame.setVisible true
30
+ frame.setDefaultCloseOperation JFrame.EXIT_ON_CLOSE
@@ -0,0 +1,117 @@
1
+ Extensions and Macros
2
+ ==============
3
+
4
+
5
+ macro compile & load:
6
+
7
+ compile klass$Extension1,
8
+ load klass$Extension1,
9
+ 1..n
10
+ *hand wave*
11
+
12
+ if encounter klass with annotation $Extensions,
13
+ then
14
+ - strip $Extensions
15
+ - create klass$Extensions with just the annotation
16
+ - compile to macrodest
17
+
18
+ compile klass$Extensions referring to Extension1..n, so that it can be loaded from bytecode later
19
+
20
+
21
+ macro load from bytecode:
22
+ look up klass$Extensions
23
+ gather Extension1..n
24
+
25
+ Maybe could do:
26
+
27
+ klass$Extensions
28
+ klass$Extensions$Macro1
29
+
30
+ instead of Extension...
31
+
32
+ $Extensions(....)
33
+ class klass$Extensions
34
+
35
+ end
36
+
37
+
38
+ #-------
39
+
40
+
41
+ extension compile &load
42
+
43
+ extension AExt
44
+ for_class A
45
+
46
+ def aa: String
47
+ toString
48
+ end
49
+ end
50
+
51
+ transform ->
52
+
53
+
54
+ class AExt
55
+ def self.aa(zelf: A)
56
+ zelf.toString
57
+ end
58
+
59
+ macro def aa
60
+ quote {`@call.target`.toString}
61
+ end
62
+ macro_register A
63
+ end
64
+
65
+ $Extensions[....]
66
+ class AExt$Extensions;end
67
+
68
+ compile
69
+
70
+ macro loading:
71
+
72
+ load klass
73
+ look in macroclasspath for klass$mirahExtensions, which has references to all the extensions
74
+
75
+
76
+ class A
77
+ macro def a
78
+ quote { puts "a" }
79
+ end
80
+ end
81
+
82
+ ->
83
+
84
+ options:
85
+ ->
86
+ $Extensions[A$Extension1]
87
+ class A
88
+ #...
89
+ end
90
+
91
+ -> $Extensions ->
92
+
93
+ mirah -d classes --macro-dest macro-classes
94
+ classes/A.class
95
+ macro-classes/A$mirahExtensions.class
96
+ macro-classes/A$Extension1.class
97
+
98
+ loading macros / extensions
99
+
100
+
101
+ macros on classpath
102
+ macros on macroclasspath
103
+ extensions on classpath
104
+ extensions on macroclasspath
105
+
106
+
107
+ extension decomposition
108
+
109
+ extension Foo of String
110
+ def hello
111
+ puts "hello, #{self}"
112
+ end
113
+ end
114
+
115
+ ->
116
+
117
+ class
@@ -16,7 +16,7 @@
16
16
  require 'fileutils'
17
17
  require 'rbconfig'
18
18
 
19
- $CLASSPATH << File.dirname(__FILE__) + '/../dist/mirahc.jar'
19
+ $CLASSPATH << ENV.fetch('MIRAHC_JAR',File.expand_path("../../dist/mirahc.jar",__FILE__))
20
20
 
21
21
  require 'mirah/version'
22
22
  require 'mirah/transform'
@@ -16,11 +16,13 @@
16
16
  module Mirah
17
17
  class MirahError < StandardError
18
18
  attr_accessor :position
19
+ attr_accessor :diagnostic
19
20
  attr_accessor :cause
20
21
 
21
- def initialize(message, position=nil)
22
+ def initialize(message, position=nil, diagnostic=nil)
22
23
  super(message)
23
24
  @position = position
25
+ @diagnostic = diagnostic
24
26
  end
25
27
 
26
28
  def inspect
@@ -16,10 +16,11 @@ module Mirah
16
16
  #filename = transformer.tag_filename(src, filename)
17
17
  parser = MirahParser.new
18
18
  source = StringCodeSource.new(filename, src)
19
- parser.diagnostics = SimpleDiagnostics.new(true)
19
+ diagnostics = SimpleDiagnostics.new(true)
20
+ # parser.diagnostics = diagnostics # Field "diagnostics" does not seem to exist in the current mirah/mmeta source code, but it did exist in an ancient mmeta.jar.
20
21
  begin
21
22
  ast = parser.parse(source)
22
- if parser.diagnostics.error_count > 0
23
+ if diagnostics.error_count > 0
23
24
  puts "#{parser.diagnostics.error_count} errors, exiting"
24
25
  throw :exit, 1
25
26
  end
@@ -51,8 +51,7 @@ module Mirah
51
51
  @typer = typer
52
52
  end
53
53
  def exitDefault(node, arg)
54
- type = @typer.getInferredType(node)
55
- type = type.resolve if type
54
+ type = @typer.getResolvedType(node)
56
55
  if (type && type.isError)
57
56
  @errors[type] ||= begin
58
57
  if type.message.size == 1
@@ -14,5 +14,5 @@
14
14
  # limitations under the License.
15
15
 
16
16
  module Mirah
17
- VERSION = "0.1.4"
17
+ VERSION = "0.2.0"
18
18
  end
Binary file
@@ -36,6 +36,16 @@ class JvmVersionTest < Test::Unit::TestCase
36
36
  end
37
37
  end
38
38
 
39
+ def test_java_8_supports_default_methods
40
+ jvm_version = JvmVersion.new "1.8"
41
+ assert jvm_version.supports_default_interface_methods
42
+ end
43
+
44
+ def test_java_7_does_not_support_default_methods
45
+ jvm_version = JvmVersion.new "1.7"
46
+ assert !jvm_version.supports_default_interface_methods
47
+ end
48
+
39
49
  def opcode spec_version
40
50
  Opcodes.const_get("V#{spec_version.sub('.','_')}")
41
51
  end
@@ -16,6 +16,8 @@ require 'test_helper'
16
16
 
17
17
  class MirahArgumentsTest < Test::Unit::TestCase
18
18
  java_import 'org.mirah.tool.MirahArguments'
19
+ java_import 'java.io.File'
20
+
19
21
  def test_arg_dash_v_prints_version_and_has_exit_0
20
22
  arg_processor = MirahArguments.new
21
23
 
@@ -27,7 +29,6 @@ class MirahArgumentsTest < Test::Unit::TestCase
27
29
  assert_equal 0, arg_processor.exit_status
28
30
  end
29
31
 
30
-
31
32
  def test_on_invalid_arg_prints_error_and_exits_1
32
33
  arg_processor = MirahArguments.new
33
34
 
@@ -40,13 +41,52 @@ class MirahArgumentsTest < Test::Unit::TestCase
40
41
  end
41
42
 
42
43
  def test_arg_bootclasspath_sets_bootclasspath_with_absolute_paths
43
- path = "class:path"
44
+ path = Mirah::Env.encode_paths %w[class path]
44
45
  arg_processor = MirahArguments.new
45
46
 
46
47
  arg_processor.apply_args ["--bootclasspath", path]
47
48
 
48
- assert_equal path.split(":").map{|p|"file:%s" % File.expand_path(p) }.join(":"),
49
- arg_processor.real_bootclasspath.map{|u| u.to_s }.join(":")
49
+ assert_equal_classpaths path,
50
+ arg_processor.real_bootclasspath
51
+ end
52
+
53
+ def test_flag_classpath_overrides_env
54
+ env = { "CLASSPATH" => Mirah::Env.encode_paths(%w[some classpath]) }
55
+
56
+ path = Mirah::Env.encode_paths %w[class path]
57
+
58
+ arg_processor = MirahArguments.new env
59
+ arg_processor.apply_args ["--classpath", path]
60
+
61
+ assert_equal_classpaths path,
62
+ arg_processor.real_classpath
63
+ end
64
+
65
+ def test_classpath_is_from_env_without_flag
66
+ path = Mirah::Env.encode_paths %w[class path]
67
+ env = { "CLASSPATH" => path }
68
+
69
+ arg_processor = MirahArguments.new env
70
+ arg_processor.apply_args []
71
+
72
+ assert_equal_classpaths path,
73
+ arg_processor.real_classpath
74
+ end
75
+
76
+ def test_classpath_defaults_to_cwd
77
+ arg_processor = MirahArguments.new({})
78
+ arg_processor.apply_args []
79
+
80
+ assert_equal_classpaths ".",
81
+ arg_processor.real_classpath
82
+ end
83
+
84
+ def test_classpath_is_destination_when_no_flag_or_env
85
+ arg_processor = MirahArguments.new({})
86
+ arg_processor.apply_args ["-d", "some/path"]
87
+
88
+ assert_equal_classpaths "some/path",
89
+ arg_processor.real_classpath
50
90
  end
51
91
 
52
92
  def test_dash_h_prints_help_and_exits
@@ -62,4 +102,11 @@ class MirahArgumentsTest < Test::Unit::TestCase
62
102
  assert arg_processor.exit?
63
103
  assert_equal 0, arg_processor.exit_status
64
104
  end
105
+
106
+ def assert_equal_classpaths expected, actual_classpath_list
107
+ normalized_expected = Mirah::Env.decode_paths(expected).
108
+ map { |p| "#{File.new(::File.expand_path(p)).toURI.toURL}#{"./" if p == "." }" }
109
+ assert_equal Mirah::Env.encode_paths(normalized_expected),
110
+ Mirah::Env.encode_paths(actual_classpath_list.map{ |u| u.to_s })
111
+ end
65
112
  end
@@ -0,0 +1,7 @@
1
+ class ��������1251
2
+ def ����
3
+ end
4
+ def self.main(args:String[]):void
5
+ puts 'cp1251 encoding test'
6
+ end
7
+ end
@@ -0,0 +1,30 @@
1
+ /*
2
+ Copyright (c) 2015 The Mirah project authors. All Rights Reserved.
3
+ All contributing project authors may be found in the NOTICE file.
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ */
17
+ package org.foo;
18
+
19
+ import java.util.Arrays;
20
+
21
+ public abstract class AbstractExecutorJava8 {
22
+
23
+ public abstract void execute();
24
+
25
+ public static void execute(AbstractExecutorJava8 o){
26
+ //to test inner classes generated by lambda do not prevent abstract method lookup
27
+ Arrays.asList(1, 2, 3).stream().filter((v) -> v > 1);
28
+ o.execute();
29
+ }
30
+ }
@@ -0,0 +1,24 @@
1
+ package org.foo;
2
+
3
+ public class ClassWithSelfReferencingTypeParameter<P extends ClassWithSelfReferencingTypeParameter<P>> {
4
+
5
+ P self;
6
+
7
+ @SuppressWarnings("unchecked")
8
+ public ClassWithSelfReferencingTypeParameter() {
9
+ this.self = (P) this;
10
+ }
11
+
12
+ public P foo() {
13
+ return self;
14
+ }
15
+
16
+ public P bar() {
17
+ return self;
18
+ }
19
+
20
+ public void baz() {
21
+ System.out.println("baz");
22
+ }
23
+ }
24
+