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.
- data/History.txt +372 -0
- data/README.txt +4 -5
- data/Rakefile +178 -55
- data/examples/appengine/Readme +3 -3
- data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
- data/examples/appengine/src/org/mirah/list.dhtml +1 -1
- data/examples/bintrees.mirah +1 -1
- data/examples/edb.mirah +1 -1
- data/examples/fib.mirah +1 -1
- data/examples/interfaces.mirah +1 -1
- data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
- data/examples/maven/README.txt +1 -1
- data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
- data/examples/plugins/appengine/Rakefile +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
- data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
- data/examples/rosettacode/100-doors.mirah +6 -6
- data/examples/rosettacode/README.txt +3 -3
- data/examples/rosettacode/boolean-values.mirah +1 -1
- data/examples/rosettacode/comments.mirah +1 -1
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
- data/examples/rosettacode/factorial.mirah +1 -1
- data/examples/rosettacode/fibonacci.mirah +1 -1
- data/examples/rosettacode/fizz-buzz.mirah +2 -2
- data/examples/rosettacode/flatten-a-list.mirah +4 -4
- data/examples/rosettacode/guess-the-number.mirah +2 -2
- data/examples/rosettacode/hamming-numbers.mirah +4 -4
- data/examples/rosettacode/is-string-numeric.mirah +22 -22
- data/examples/rosettacode/palindrome.mirah +2 -2
- data/examples/rosettacode/random-numbers.mirah +1 -1
- data/examples/rosettacode/repeat-a-string.mirah +1 -1
- data/examples/rosettacode/reverse-a-string.mirah +1 -1
- data/examples/rosettacode/rot-13.mirah +5 -5
- data/examples/rosettacode/secure-temporary-file.mirah +2 -2
- data/examples/rosettacode/sleep.mirah +1 -1
- data/examples/rosettacode/string-length.mirah +5 -5
- data/examples/swing.mirah +1 -1
- data/examples/test.edb +1 -1
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/duby.rb +1 -1
- data/lib/mirah.rb +50 -28
- data/lib/mirah/ast.rb +15 -605
- data/lib/mirah/ast/scope.rb +98 -69
- data/lib/mirah/commands.rb +1 -1
- data/lib/mirah/commands/base.rb +7 -7
- data/lib/mirah/commands/compile.rb +3 -3
- data/lib/mirah/commands/parse.rb +7 -5
- data/lib/mirah/commands/run.rb +12 -19
- data/lib/mirah/compiler.rb +15 -23
- data/lib/mirah/errors.rb +16 -1
- data/lib/mirah/generator.rb +79 -39
- data/lib/mirah/jvm/compiler.rb +1 -19
- data/lib/mirah/jvm/compiler/base.rb +233 -90
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
- data/lib/mirah/jvm/method_lookup.rb +134 -65
- data/lib/mirah/jvm/typer.rb +10 -5
- data/lib/mirah/jvm/types.rb +10 -2
- data/lib/mirah/jvm/types/array_type.rb +10 -12
- data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
- data/lib/mirah/jvm/types/basic_types.rb +26 -33
- data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
- data/lib/mirah/jvm/types/block_type.rb +15 -0
- data/lib/mirah/jvm/types/boolean.rb +8 -4
- data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
- data/lib/mirah/jvm/types/enumerable.rb +7 -7
- data/lib/mirah/jvm/types/extensions.rb +11 -6
- data/lib/mirah/jvm/types/factory.rb +624 -94
- data/lib/mirah/jvm/types/floats.rb +21 -15
- data/lib/mirah/jvm/types/generic_type.rb +72 -0
- data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
- data/lib/mirah/jvm/types/integers.rb +26 -71
- data/lib/mirah/jvm/types/interface_definition.rb +3 -3
- data/lib/mirah/jvm/types/intrinsics.rb +203 -168
- data/lib/mirah/jvm/types/literals.rb +6 -6
- data/lib/mirah/jvm/types/meta_type.rb +13 -4
- data/lib/mirah/jvm/types/methods.rb +281 -93
- data/lib/mirah/jvm/types/null_type.rb +17 -5
- data/lib/mirah/jvm/types/number.rb +10 -7
- data/lib/mirah/jvm/types/primitive_type.rb +17 -6
- data/lib/mirah/jvm/types/source_mirror.rb +12 -7
- data/lib/mirah/jvm/types/type.rb +107 -23
- data/lib/mirah/jvm/types/type_definition.rb +25 -10
- data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
- data/lib/mirah/jvm/types/void_type.rb +3 -3
- data/lib/mirah/parser.rb +154 -16
- data/lib/mirah/plugin/edb.rb +1 -1
- data/lib/mirah/transform.rb +1 -2
- data/lib/mirah/transform/ast_ext.rb +24 -43
- data/lib/mirah/transform/transformer.rb +29 -224
- data/lib/mirah/typer.rb +2 -16
- data/lib/mirah/util/argument_processor.rb +25 -10
- data/lib/mirah/util/class_loader.rb +1 -1
- data/lib/mirah/util/compilation_state.rb +16 -17
- data/lib/mirah/util/delegate.rb +2 -2
- data/lib/mirah/util/logging.rb +110 -0
- data/lib/mirah/util/process_errors.rb +69 -11
- data/lib/mirah/version.rb +1 -1
- data/test/core/commands_test.rb +6 -24
- data/test/core/env_test.rb +5 -5
- data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
- data/test/core/typer_test.rb +196 -158
- data/test/core/util/argument_processor_test.rb +10 -10
- data/test/core/util/class_loader_test.rb +6 -5
- data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
- data/test/jvm/annotations_test.rb +5 -5
- data/test/jvm/blocks_test.rb +140 -88
- data/test/jvm/bytecode_test_helper.rb +112 -94
- data/test/jvm/cast_test.rb +162 -0
- data/test/jvm/constructors_test.rb +18 -8
- data/test/jvm/enumerable_test.rb +77 -44
- data/test/jvm/example_test.rb +53 -0
- data/test/jvm/factory_test.rb +7 -1
- data/test/jvm/generics_test.rb +57 -0
- data/test/jvm/hash_test.rb +106 -0
- data/test/jvm/import_test.rb +81 -0
- data/test/jvm/interface_test.rb +73 -0
- data/test/jvm/java_typer_test.rb +92 -66
- data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
- data/test/jvm/jvm_compiler_test.rb +170 -604
- data/test/jvm/list_extensions_test.rb +23 -0
- data/test/jvm/macros_test.rb +197 -32
- data/test/jvm/main_method_test.rb +4 -4
- data/test/jvm/numeric_extensions_test.rb +13 -0
- data/test/jvm/rescue_test.rb +73 -16
- data/test/jvm/varargs_test.rb +65 -0
- data/test/test_helper.rb +1 -2
- metadata +234 -251
- data/examples/SortClosure$__xform_tmp_1.class +0 -0
- data/examples/SortClosure$__xform_tmp_2.class +0 -0
- data/examples/SortClosure.class +0 -0
- data/examples/macros/StringEachChar$Extension1.class +0 -0
- data/lib/mirah/ast/call.rb +0 -345
- data/lib/mirah/ast/class.rb +0 -359
- data/lib/mirah/ast/flow.rb +0 -381
- data/lib/mirah/ast/intrinsics.rb +0 -563
- data/lib/mirah/ast/literal.rb +0 -178
- data/lib/mirah/ast/local.rb +0 -112
- data/lib/mirah/ast/method.rb +0 -408
- data/lib/mirah/ast/structure.rb +0 -387
- data/lib/mirah/ast/type.rb +0 -146
- data/lib/mirah/commands/base.rb~ +0 -57
- data/lib/mirah/compiler/call.rb +0 -45
- data/lib/mirah/compiler/class.rb +0 -81
- data/lib/mirah/compiler/flow.rb +0 -109
- data/lib/mirah/compiler/literal.rb +0 -130
- data/lib/mirah/compiler/local.rb +0 -59
- data/lib/mirah/compiler/method.rb +0 -44
- data/lib/mirah/compiler/structure.rb +0 -65
- data/lib/mirah/jvm/compiler/java_source.rb +0 -787
- data/lib/mirah/jvm/method_lookup.rb~ +0 -247
- data/lib/mirah/jvm/source_generator/builder.rb +0 -468
- data/lib/mirah/jvm/source_generator/loops.rb +0 -131
- data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
- data/lib/mirah/plugin/gwt.rb +0 -189
- data/lib/mirah/plugin/java.rb +0 -70
- data/lib/mirah/transform/error.rb +0 -13
- data/lib/mirah/transform/helper.rb +0 -765
- data/lib/mirah/typer/simple.rb +0 -384
- data/lib/mirah/version.rb~ +0 -18
- data/test/core/ast_test.rb +0 -382
- data/test/core/compilation_test.rb +0 -130
- data/test/core/macros_test.rb +0 -61
- data/test/jvm/javac_test_helper.rb +0 -89
- data/test/jvm/jvm_compiler_test.rb~ +0 -2181
- 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
|
-
|
|
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::
|
|
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
|
|
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
|
|
@@ -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
|
-
|
|
36
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
when '1.5'
|
|
48
|
-
|
|
49
|
-
when '1.
|
|
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
|
data/lib/mirah/util/delegate.rb
CHANGED
|
@@ -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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
data/test/core/commands_test.rb
CHANGED
|
@@ -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
|