mirah 0.0.12-java → 0.1.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. data/History.txt +372 -0
  2. data/README.txt +4 -5
  3. data/Rakefile +178 -55
  4. data/examples/appengine/Readme +3 -3
  5. data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
  6. data/examples/appengine/src/org/mirah/list.dhtml +1 -1
  7. data/examples/bintrees.mirah +1 -1
  8. data/examples/edb.mirah +1 -1
  9. data/examples/fib.mirah +1 -1
  10. data/examples/interfaces.mirah +1 -1
  11. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
  12. data/examples/maven/README.txt +1 -1
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
  14. data/examples/plugins/appengine/Rakefile +1 -1
  15. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
  16. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
  17. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
  18. data/examples/rosettacode/100-doors.mirah +6 -6
  19. data/examples/rosettacode/README.txt +3 -3
  20. data/examples/rosettacode/boolean-values.mirah +1 -1
  21. data/examples/rosettacode/comments.mirah +1 -1
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
  23. data/examples/rosettacode/factorial.mirah +1 -1
  24. data/examples/rosettacode/fibonacci.mirah +1 -1
  25. data/examples/rosettacode/fizz-buzz.mirah +2 -2
  26. data/examples/rosettacode/flatten-a-list.mirah +4 -4
  27. data/examples/rosettacode/guess-the-number.mirah +2 -2
  28. data/examples/rosettacode/hamming-numbers.mirah +4 -4
  29. data/examples/rosettacode/is-string-numeric.mirah +22 -22
  30. data/examples/rosettacode/palindrome.mirah +2 -2
  31. data/examples/rosettacode/random-numbers.mirah +1 -1
  32. data/examples/rosettacode/repeat-a-string.mirah +1 -1
  33. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  34. data/examples/rosettacode/rot-13.mirah +5 -5
  35. data/examples/rosettacode/secure-temporary-file.mirah +2 -2
  36. data/examples/rosettacode/sleep.mirah +1 -1
  37. data/examples/rosettacode/string-length.mirah +5 -5
  38. data/examples/swing.mirah +1 -1
  39. data/examples/test.edb +1 -1
  40. data/javalib/mirah-bootstrap.jar +0 -0
  41. data/javalib/mirah-builtins.jar +0 -0
  42. data/javalib/mirah-parser.jar +0 -0
  43. data/javalib/mirah-util.jar +0 -0
  44. data/lib/duby.rb +1 -1
  45. data/lib/mirah.rb +50 -28
  46. data/lib/mirah/ast.rb +15 -605
  47. data/lib/mirah/ast/scope.rb +98 -69
  48. data/lib/mirah/commands.rb +1 -1
  49. data/lib/mirah/commands/base.rb +7 -7
  50. data/lib/mirah/commands/compile.rb +3 -3
  51. data/lib/mirah/commands/parse.rb +7 -5
  52. data/lib/mirah/commands/run.rb +12 -19
  53. data/lib/mirah/compiler.rb +15 -23
  54. data/lib/mirah/errors.rb +16 -1
  55. data/lib/mirah/generator.rb +79 -39
  56. data/lib/mirah/jvm/compiler.rb +1 -19
  57. data/lib/mirah/jvm/compiler/base.rb +233 -90
  58. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
  59. data/lib/mirah/jvm/method_lookup.rb +134 -65
  60. data/lib/mirah/jvm/typer.rb +10 -5
  61. data/lib/mirah/jvm/types.rb +10 -2
  62. data/lib/mirah/jvm/types/array_type.rb +10 -12
  63. data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
  64. data/lib/mirah/jvm/types/basic_types.rb +26 -33
  65. data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
  66. data/lib/mirah/jvm/types/block_type.rb +15 -0
  67. data/lib/mirah/jvm/types/boolean.rb +8 -4
  68. data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
  69. data/lib/mirah/jvm/types/enumerable.rb +7 -7
  70. data/lib/mirah/jvm/types/extensions.rb +11 -6
  71. data/lib/mirah/jvm/types/factory.rb +624 -94
  72. data/lib/mirah/jvm/types/floats.rb +21 -15
  73. data/lib/mirah/jvm/types/generic_type.rb +72 -0
  74. data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
  75. data/lib/mirah/jvm/types/integers.rb +26 -71
  76. data/lib/mirah/jvm/types/interface_definition.rb +3 -3
  77. data/lib/mirah/jvm/types/intrinsics.rb +203 -168
  78. data/lib/mirah/jvm/types/literals.rb +6 -6
  79. data/lib/mirah/jvm/types/meta_type.rb +13 -4
  80. data/lib/mirah/jvm/types/methods.rb +281 -93
  81. data/lib/mirah/jvm/types/null_type.rb +17 -5
  82. data/lib/mirah/jvm/types/number.rb +10 -7
  83. data/lib/mirah/jvm/types/primitive_type.rb +17 -6
  84. data/lib/mirah/jvm/types/source_mirror.rb +12 -7
  85. data/lib/mirah/jvm/types/type.rb +107 -23
  86. data/lib/mirah/jvm/types/type_definition.rb +25 -10
  87. data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
  88. data/lib/mirah/jvm/types/void_type.rb +3 -3
  89. data/lib/mirah/parser.rb +154 -16
  90. data/lib/mirah/plugin/edb.rb +1 -1
  91. data/lib/mirah/transform.rb +1 -2
  92. data/lib/mirah/transform/ast_ext.rb +24 -43
  93. data/lib/mirah/transform/transformer.rb +29 -224
  94. data/lib/mirah/typer.rb +2 -16
  95. data/lib/mirah/util/argument_processor.rb +25 -10
  96. data/lib/mirah/util/class_loader.rb +1 -1
  97. data/lib/mirah/util/compilation_state.rb +16 -17
  98. data/lib/mirah/util/delegate.rb +2 -2
  99. data/lib/mirah/util/logging.rb +110 -0
  100. data/lib/mirah/util/process_errors.rb +69 -11
  101. data/lib/mirah/version.rb +1 -1
  102. data/test/core/commands_test.rb +6 -24
  103. data/test/core/env_test.rb +5 -5
  104. data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
  105. data/test/core/typer_test.rb +196 -158
  106. data/test/core/util/argument_processor_test.rb +10 -10
  107. data/test/core/util/class_loader_test.rb +6 -5
  108. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  109. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  110. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  111. data/test/jvm/annotations_test.rb +5 -5
  112. data/test/jvm/blocks_test.rb +140 -88
  113. data/test/jvm/bytecode_test_helper.rb +112 -94
  114. data/test/jvm/cast_test.rb +162 -0
  115. data/test/jvm/constructors_test.rb +18 -8
  116. data/test/jvm/enumerable_test.rb +77 -44
  117. data/test/jvm/example_test.rb +53 -0
  118. data/test/jvm/factory_test.rb +7 -1
  119. data/test/jvm/generics_test.rb +57 -0
  120. data/test/jvm/hash_test.rb +106 -0
  121. data/test/jvm/import_test.rb +81 -0
  122. data/test/jvm/interface_test.rb +73 -0
  123. data/test/jvm/java_typer_test.rb +92 -66
  124. data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
  125. data/test/jvm/jvm_compiler_test.rb +170 -604
  126. data/test/jvm/list_extensions_test.rb +23 -0
  127. data/test/jvm/macros_test.rb +197 -32
  128. data/test/jvm/main_method_test.rb +4 -4
  129. data/test/jvm/numeric_extensions_test.rb +13 -0
  130. data/test/jvm/rescue_test.rb +73 -16
  131. data/test/jvm/varargs_test.rb +65 -0
  132. data/test/test_helper.rb +1 -2
  133. metadata +234 -251
  134. data/examples/SortClosure$__xform_tmp_1.class +0 -0
  135. data/examples/SortClosure$__xform_tmp_2.class +0 -0
  136. data/examples/SortClosure.class +0 -0
  137. data/examples/macros/StringEachChar$Extension1.class +0 -0
  138. data/lib/mirah/ast/call.rb +0 -345
  139. data/lib/mirah/ast/class.rb +0 -359
  140. data/lib/mirah/ast/flow.rb +0 -381
  141. data/lib/mirah/ast/intrinsics.rb +0 -563
  142. data/lib/mirah/ast/literal.rb +0 -178
  143. data/lib/mirah/ast/local.rb +0 -112
  144. data/lib/mirah/ast/method.rb +0 -408
  145. data/lib/mirah/ast/structure.rb +0 -387
  146. data/lib/mirah/ast/type.rb +0 -146
  147. data/lib/mirah/commands/base.rb~ +0 -57
  148. data/lib/mirah/compiler/call.rb +0 -45
  149. data/lib/mirah/compiler/class.rb +0 -81
  150. data/lib/mirah/compiler/flow.rb +0 -109
  151. data/lib/mirah/compiler/literal.rb +0 -130
  152. data/lib/mirah/compiler/local.rb +0 -59
  153. data/lib/mirah/compiler/method.rb +0 -44
  154. data/lib/mirah/compiler/structure.rb +0 -65
  155. data/lib/mirah/jvm/compiler/java_source.rb +0 -787
  156. data/lib/mirah/jvm/method_lookup.rb~ +0 -247
  157. data/lib/mirah/jvm/source_generator/builder.rb +0 -468
  158. data/lib/mirah/jvm/source_generator/loops.rb +0 -131
  159. data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
  160. data/lib/mirah/plugin/gwt.rb +0 -189
  161. data/lib/mirah/plugin/java.rb +0 -70
  162. data/lib/mirah/transform/error.rb +0 -13
  163. data/lib/mirah/transform/helper.rb +0 -765
  164. data/lib/mirah/typer/simple.rb +0 -384
  165. data/lib/mirah/version.rb~ +0 -18
  166. data/test/core/ast_test.rb +0 -382
  167. data/test/core/compilation_test.rb +0 -130
  168. data/test/core/macros_test.rb +0 -61
  169. data/test/jvm/javac_test_helper.rb +0 -89
  170. data/test/jvm/jvm_compiler_test.rb~ +0 -2181
  171. data/test/plugins/gwt_test.rb +0 -69
data/lib/mirah/typer.rb CHANGED
@@ -14,23 +14,9 @@
14
14
  # limitations under the License.
15
15
 
16
16
  require 'mirah/errors'
17
- require 'mirah/typer/base'
18
- require 'mirah/typer/simple'
19
17
 
20
18
  module Mirah
21
19
  module Typer
22
- class << self
23
- attr_accessor :verbose
24
-
25
- def log(message)
26
- puts "* [#{name}] #{message}" if Typer.verbose
27
- end
28
- end
29
-
30
- InferenceError = Mirah::InferenceError
31
- end
32
-
33
- def self.typer_plugins
34
- @typer_plugins ||= []
20
+ java_import 'org.mirah.typer.Typer'
35
21
  end
36
- end
22
+ end
@@ -13,8 +13,11 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ require 'mirah/util/logging'
17
+
16
18
  module Mirah
17
19
  module Util
20
+
18
21
  class ArgumentProcessor
19
22
  def initialize(state, args)
20
23
  @state = state
@@ -49,7 +52,7 @@ module Mirah
49
52
  when '--help', '-h'
50
53
  args.shift
51
54
  print_help
52
-
55
+
53
56
  self.exit_status_code = 0
54
57
  break
55
58
  when '--java', '-j'
@@ -74,15 +77,26 @@ module Mirah
74
77
  plugin = args.shift
75
78
  require "mirah/plugin/#{plugin}"
76
79
  when '--verbose', '-V'
77
- Mirah::Typer.verbose = true
78
- Mirah::AST.verbose = true
79
- Mirah::JVM::Compiler::JVMBytecode.verbose = true
80
+ Mirah::Logging::MirahLogger.level = Mirah::Logging::Level::FINE
80
81
  state.verbose = true
81
82
  args.shift
83
+ when '--vmodule'
84
+ args.shift
85
+ spec = args.shift
86
+ spec.split(',').each do |item|
87
+ logger, level = item.split("=")
88
+ logger = java.util.logging.Logger.getLogger(logger)
89
+ (state.loggers ||= []) << logger
90
+ level = java.util.logging.Level.parse(level)
91
+ logger.setLevel(level)
92
+ end
93
+ when '--no-color'
94
+ args.shift
95
+ Mirah::Logging::MirahHandler.formatter = Mirah::Logging::LogFormatter.new(false)
82
96
  when '--version', '-v'
83
97
  args.shift
84
98
  print_version
85
-
99
+
86
100
  self.exit_status_code = 0 if args.empty?
87
101
  break
88
102
  when '--no-save-extensions'
@@ -90,14 +104,14 @@ module Mirah
90
104
  state.save_extensions = false
91
105
  else
92
106
  $stderr.puts "unrecognized flag: " + args[0]
93
-
107
+
94
108
  self.exit_status_code = 1
95
109
  break
96
110
  end
97
111
  end
98
-
112
+
99
113
  return if exit?
100
-
114
+
101
115
  state.destination ||= File.join(File.expand_path('.'), '')
102
116
  state.compiler_class ||= Mirah::JVM::Compiler::JVMBytecode
103
117
  end
@@ -111,7 +125,7 @@ module Mirah
111
125
  "#{$0} [flags] <files or -e SCRIPT>
112
126
  -c, --classpath PATH\tAdd PATH to the Java classpath for compilation
113
127
  --bootclasspath PATH\tSet the Java bootclasspath to PATH for compilation
114
- --cd DIR\t\tSwitch to the specified DIR befor compilation
128
+ --cd DIR\t\tSwitch to the specified DIR before compilation
115
129
  -d, --dir DIR\t\tUse DIR as the base dir for compilation, packages
116
130
  -e CODE\t\tCompile or run the inline script following -e
117
131
  \t\t\t (the class will be named \"DashE\")
@@ -123,7 +137,8 @@ module Mirah
123
137
  \t\t\t version (1.4, 1.5, 1.6, 1.7)
124
138
  -p, --plugin PLUGIN\trequire 'mirah/plugin/PLUGIN' before running
125
139
  -v, --version\t\tPrint the version of Mirah to the console
126
- -V, --verbose\t\tVerbose logging"
140
+ -V, --verbose\t\tVerbose logging
141
+ --vmodule logger.name=LEVEL[,...]\t\tSet the Level for the specified Java loggers"
127
142
  end
128
143
 
129
144
  def print_version
@@ -1,6 +1,6 @@
1
1
  module Mirah
2
2
  module Util
3
-
3
+
4
4
  ClassLoader = Java::OrgMirah::MirahClassLoader
5
5
 
6
6
  # converts string to a java string w/ binary encoding
@@ -20,6 +20,7 @@ module Mirah
20
20
  class CompilationState
21
21
  def initialize
22
22
  @save_extensions = true
23
+ set_jvm_version ENV_JAVA['java.specification.version']
23
24
  end
24
25
 
25
26
  attr_accessor :verbose, :destination
@@ -31,29 +32,27 @@ module Mirah
31
32
  attr_accessor :compiler_class
32
33
  attr_accessor :args
33
34
  attr_accessor :command
35
+ attr_accessor :loggers
34
36
 
35
- def classpath=(classpath)
36
- Mirah::AST.type_factory.classpath = classpath
37
- end
38
-
39
- def bootclasspath=(classpath)
40
- Mirah::AST.type_factory.bootclasspath = classpath
41
- end
37
+ attr_accessor :classpath, :bootclasspath
38
+ attr_reader :target_jvm_version
42
39
 
43
40
  def set_jvm_version(ver_str)
44
- case ver_str
45
- when '1.4'
46
- BiteScript.bytecode_version = BiteScript::JAVA1_4
47
- when '1.5'
48
- BiteScript.bytecode_version = BiteScript::JAVA1_5
49
- when '1.6'
50
- BiteScript.bytecode_version = BiteScript::JAVA1_6
51
- when '1.7'
52
- BiteScript.bytecode_version = BiteScript::JAVA1_7
41
+ @target_jvm_version = ver_str
42
+ @bytecode_version = case ver_str
43
+ when '1.4' then BiteScript::JAVA1_4
44
+ when '1.5' then BiteScript::JAVA1_5
45
+ when '1.6' then BiteScript::JAVA1_6
46
+ when '1.7' then BiteScript::JAVA1_7
53
47
  else
54
48
  $stderr.puts "invalid bytecode version specified: #{ver_str}"
55
49
  end
50
+ BiteScript.bytecode_version = @bytecode_version
51
+ end
52
+
53
+ def supports_invokedynamic?
54
+ @bytecode_version == BiteScript::JAVA1_7
56
55
  end
57
56
  end
58
57
  end
59
- end
58
+ end
@@ -5,7 +5,7 @@ module Mirah
5
5
  class Delegator
6
6
  IgnoreBacktracePat = %r"\A#{Regexp.quote(__FILE__)}:\d+:in `"
7
7
  end
8
-
8
+
9
9
  def self.DelegateClass(superclass)
10
10
  klass = Class.new
11
11
  methods = superclass.public_instance_methods(true).map(&:to_s)
@@ -62,4 +62,4 @@ module Mirah
62
62
  return klass
63
63
  end
64
64
  end
65
- end
65
+ end
@@ -0,0 +1,110 @@
1
+ module Mirah
2
+ module Logging
3
+ java_import 'java.util.logging.Logger'
4
+ java_import 'java.util.logging.Formatter'
5
+ java_import 'java.util.logging.ConsoleHandler'
6
+ java_import 'java.util.logging.Level'
7
+
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
+
73
+ module Logged
74
+ VLEVELS = [Level::CONFIG, Level::FINE, Level::FINER, Level::FINEST]
75
+ def logger
76
+ @logger ||= java.util.logging.Logger.getLogger(logger_name)
77
+ end
78
+
79
+ def logger_name
80
+ name = self.class.name.sub(/^Mirah::/, '').gsub('::', '.')
81
+ "org.mirah.ruby.#{name}"
82
+ end
83
+
84
+ def error(*args)
85
+ logger.log(Level::SEVERE, *args)
86
+ end
87
+
88
+ def warning(*args)
89
+ logger.log(Level::WARNING, *args)
90
+ end
91
+
92
+ def info(*args)
93
+ logger.log(Level::INFO, *args)
94
+ end
95
+
96
+ def log(*args)
97
+ vlog(1, *args)
98
+ end
99
+
100
+ def logging?(level=Level::FINE)
101
+ level = VLEVELS[level] unless level.kind_of?(Level)
102
+ logger.isLoggable(level)
103
+ end
104
+
105
+ def vlog(level, *args)
106
+ logger.log(VLEVELS[level], *args)
107
+ end
108
+ end
109
+ end
110
+ end
@@ -16,24 +16,82 @@
16
16
  module Mirah
17
17
  module Util
18
18
  module ProcessErrors
19
+ java_import 'org.mirah.typer.ErrorType'
20
+
19
21
  # errors - array of NodeErrors
20
22
  def process_errors(errors)
21
23
  errors.each do |ex|
22
- puts ex
23
- if ex.node
24
- Mirah.print_error(ex.message, ex.position)
24
+ if ex.kind_of?(ErrorType)
25
+ ex.message.each do |pair|
26
+ message, position = pair.to_a
27
+ if position
28
+ Mirah.print_error(message, position)
29
+ else
30
+ puts message
31
+ end
32
+ end if ex.message
25
33
  else
26
- puts ex.message
27
- end
28
- if ex.kind_of?(Mirah::InternalCompilerError) && ex.cause
29
- puts ex.cause
30
- puts ex.cause.backtrace
31
- elsif @verbose
32
- puts ex.backtrace
34
+ puts ex
35
+ if ex.respond_to?(:node) && ex.node
36
+ Mirah.print_error(ex.message, ex.position)
37
+ else
38
+ puts ex.message
39
+ end
40
+ error(ex.backtrace.join("\n")) if self.logging?
33
41
  end
34
42
  end
35
43
  throw :exit, 1 unless errors.empty?
36
44
  end
45
+
46
+ java_import 'mirah.lang.ast.NodeScanner'
47
+ class ErrorCollector < NodeScanner
48
+ def initialize(typer)
49
+ super()
50
+ @errors = {}
51
+ @typer = typer
52
+ end
53
+ def exitDefault(node, arg)
54
+ type = @typer.getInferredType(node)
55
+ type = type.resolve if type
56
+ if (type && type.isError)
57
+ @errors[type] ||= begin
58
+ if type.message.size == 1
59
+ m = type.message[0]
60
+ if m.size == 1
61
+ m << node rescue nil
62
+ elsif m.size == 2 && m[1] == nil
63
+ m[1] = node.position rescue nil
64
+ end
65
+ elsif type.message.size == 0
66
+ type.message << ["Error", node.position]
67
+ end
68
+ type
69
+ end
70
+ end
71
+ nil
72
+ end
73
+ def errors
74
+ @errors.values
75
+ end
76
+ end
77
+
78
+ def process_inference_errors(typer, nodes)
79
+ errors = []
80
+ nodes.each do |ast|
81
+ collector = ErrorCollector.new(typer)
82
+ ast.accept(collector, nil)
83
+ errors.concat(collector.errors)
84
+ end
85
+ failed = !errors.empty?
86
+ if failed
87
+ if block_given?
88
+ yield(errors)
89
+ else
90
+ puts "Inference Error:"
91
+ process_errors(errors)
92
+ end
93
+ end
94
+ end
37
95
  end
38
96
  end
39
- end
97
+ end
data/lib/mirah/version.rb CHANGED
@@ -14,5 +14,5 @@
14
14
  # limitations under the License.
15
15
 
16
16
  module Mirah
17
- VERSION = "0.0.12"
17
+ VERSION = "0.1.0"
18
18
  end
@@ -16,17 +16,13 @@ require 'test_helper'
16
16
 
17
17
 
18
18
  class CommandsTest < Test::Unit::TestCase
19
- def teardown
20
- Mirah::AST.type_factory = nil
21
- end
22
-
23
19
  class RaisesMirahErrorCommand < Mirah::Commands::Base
24
20
  def execute
25
21
  execute_base { raise Mirah::MirahError, "just an error" }
26
22
  end
27
23
  def command_name; :foo; end
28
24
  end
29
-
25
+
30
26
  class MirahProcessesErrorCommand < Mirah::Commands::Base
31
27
  include Mirah::Util::ProcessErrors
32
28
  def execute
@@ -34,7 +30,7 @@ class CommandsTest < Test::Unit::TestCase
34
30
  end
35
31
  def command_name; :foo; end
36
32
  end
37
-
33
+
38
34
  class SuccessfulCommand < Mirah::Commands::Base
39
35
  def execute
40
36
  execute_base { "something" }
@@ -53,43 +49,29 @@ class CommandsTest < Test::Unit::TestCase
53
49
  RaisesMirahErrorCommand.new(['-bad-argument']).execute
54
50
  end
55
51
  end
56
-
52
+
57
53
  def test_on_v_with_no_args_exits_without_running_command
58
54
  assert_zero_exit do
59
55
  RaisesMirahErrorCommand.new(['-v']).execute
60
56
  end
61
57
  end
62
-
58
+
63
59
  def test_on_j_option_when_command_is_not_compile_has_non_zero_exit_code
64
60
  assert_non_zero_exit do
65
61
  RaisesMirahErrorCommand.new(['-j']).execute
66
62
  end
67
63
  end
68
-
64
+
69
65
  def test_success_is_truthy
70
66
  assert SuccessfulCommand.new([]).execute, "expected it to be truthy"
71
67
  end
72
-
68
+
73
69
  def test_process_errors_causes_a_non_zero_exit
74
70
  assert_non_zero_exit do
75
71
  MirahProcessesErrorCommand.new([]).execute
76
72
  end
77
73
  end
78
74
 
79
- def test_run_says_no_main_and_exits_with_non_zero_with_no_main
80
- cmd = Mirah::Commands::Run.new([])
81
-
82
- #stub class generation, loading, return nil main
83
- def cmd.load_classes_and_find_main *args;nil;end
84
- def cmd.generate_class_map;end
85
-
86
- assert_non_zero_exit do
87
- assert_output "No main found\n" do
88
- cmd.execute
89
- end
90
- end
91
- end
92
-
93
75
  def assert_non_zero_exit
94
76
  ex = assert_raise SystemExit do
95
77
  yield