mirah 0.0.7-java → 0.0.8-java
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +181 -0
- data/README.txt +6 -10
- data/Rakefile +86 -9
- data/bin/mirah +2 -0
- data/bin/mirahc +2 -0
- data/bin/mirahp +2 -0
- data/{bin/dubyp → examples/interfaces.mirah} +16 -9
- data/examples/macros/square.mirah +12 -0
- data/examples/macros/square_int.mirah +12 -0
- data/examples/macros/string-each-char.mirah +14 -0
- data/examples/maven/README.txt +2 -0
- data/examples/maven/pom.xml +23 -0
- data/examples/maven/src/main/mirah/hello_mirah.mirah +9 -0
- data/examples/rosettacode/100-doors.mirah +44 -0
- data/examples/rosettacode/99-bottles-of-beer.mirah +13 -0
- data/examples/rosettacode/README.txt +9 -0
- data/examples/rosettacode/boolean-values.mirah +29 -0
- data/examples/rosettacode/comments.mirah +2 -0
- data/examples/rosettacode/copy-a-string.mirah +10 -0
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +40 -0
- data/examples/rosettacode/create-a-file.mirah +6 -0
- data/examples/rosettacode/empty-string.mirah +9 -0
- data/examples/rosettacode/factorial.mirah +10 -0
- data/examples/rosettacode/fibonacci.mirah +21 -0
- data/examples/rosettacode/file-size.mirah +5 -0
- data/examples/rosettacode/fizz-buzz.mirah +21 -0
- data/examples/rosettacode/flatten-a-list.mirah +24 -0
- data/examples/rosettacode/guess-the-number.mirah +21 -0
- data/examples/rosettacode/is-string-numeric.mirah +127 -0
- data/examples/rosettacode/palindrome.mirah +14 -0
- data/examples/rosettacode/repeat-a-string.mirah +9 -0
- data/examples/rosettacode/reverse-a-string.mirah +6 -0
- data/examples/rosettacode/rot-13.mirah +20 -0
- data/examples/rosettacode/user-input.mirah +4 -0
- data/examples/sort_closure.mirah +1 -1
- data/javalib/dynalink-0.2.jar +0 -0
- data/javalib/mirah-bootstrap.jar +0 -0
- data/lib/mirah.rb +7 -16
- data/lib/mirah/ast.rb +22 -92
- data/lib/mirah/ast/call.rb +41 -9
- data/lib/mirah/ast/class.rb +34 -6
- data/lib/mirah/ast/flow.rb +17 -5
- data/lib/mirah/ast/intrinsics.rb +50 -8
- data/lib/mirah/ast/literal.rb +7 -0
- data/lib/mirah/ast/local.rb +9 -1
- data/lib/mirah/ast/method.rb +21 -8
- data/lib/mirah/ast/scope.rb +1 -1
- data/lib/mirah/ast/structure.rb +81 -15
- data/lib/mirah/ast/type.rb +4 -0
- data/{bin/dubyc → lib/mirah/commands.rb} +4 -11
- data/lib/mirah/commands/base.rb +54 -0
- data/lib/mirah/commands/compile.rb +39 -0
- data/{examples/wiki/Rakefile → lib/mirah/commands/parse.rb} +18 -17
- data/lib/mirah/commands/run.rb +73 -0
- data/lib/mirah/compiler.rb +37 -417
- data/lib/mirah/compiler/call.rb +45 -0
- data/lib/mirah/compiler/class.rb +81 -0
- data/lib/mirah/compiler/flow.rb +109 -0
- data/lib/mirah/compiler/literal.rb +130 -0
- data/lib/mirah/compiler/local.rb +59 -0
- data/lib/mirah/compiler/method.rb +44 -0
- data/lib/mirah/compiler/structure.rb +65 -0
- data/lib/mirah/compiler/type.rb +27 -0
- data/lib/mirah/env.rb +4 -6
- data/lib/mirah/generator.rb +61 -0
- data/lib/mirah/jvm/compiler.rb +8 -867
- data/lib/mirah/jvm/compiler/base.rb +270 -0
- data/lib/mirah/jvm/compiler/java_source.rb +779 -0
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +851 -0
- data/lib/mirah/jvm/method_lookup.rb +21 -2
- data/lib/mirah/jvm/source_generator/builder.rb +10 -13
- data/lib/mirah/jvm/source_generator/loops.rb +99 -93
- data/lib/mirah/jvm/source_generator/precompile.rb +3 -2
- data/lib/mirah/jvm/typer.rb +3 -3
- data/lib/mirah/jvm/types.rb +10 -426
- data/lib/mirah/jvm/types/array_type.rb +62 -0
- data/lib/mirah/jvm/types/basic_types.rb +1 -0
- data/lib/mirah/jvm/types/dynamic_type.rb +46 -0
- data/lib/mirah/jvm/types/factory.rb +23 -5
- data/lib/mirah/jvm/types/interface_definition.rb +20 -0
- data/lib/mirah/jvm/types/intrinsics.rb +15 -3
- data/lib/mirah/jvm/types/meta_type.rb +45 -0
- data/lib/mirah/jvm/types/methods.rb +12 -5
- data/lib/mirah/jvm/types/null_type.rb +27 -0
- data/lib/mirah/jvm/types/primitive_type.rb +38 -0
- data/lib/mirah/jvm/types/source_mirror.rb +266 -0
- data/lib/mirah/jvm/types/type.rb +173 -0
- data/lib/mirah/jvm/types/type_definition.rb +55 -0
- data/lib/mirah/jvm/types/unreachable_type.rb +27 -0
- data/lib/mirah/jvm/types/void_type.rb +19 -0
- data/lib/mirah/parser.rb +90 -0
- data/lib/mirah/plugin/gwt.rb +5 -5
- data/lib/mirah/plugin/java.rb +1 -1
- data/lib/mirah/transform.rb +4 -321
- data/lib/mirah/transform/ast_ext.rb +63 -0
- data/lib/mirah/transform/error.rb +13 -0
- data/lib/mirah/transform/helper.rb +761 -0
- data/lib/mirah/transform/transformer.rb +255 -0
- data/lib/mirah/typer.rb +2 -383
- data/{bin/duby → lib/mirah/typer/base.rb} +12 -10
- data/lib/mirah/typer/simple.rb +377 -0
- data/lib/mirah/util/argument_processor.rb +114 -0
- data/lib/mirah/util/class_loader.rb +37 -0
- data/lib/mirah/util/compilation_state.rb +51 -0
- data/lib/mirah/util/process_errors.rb +33 -0
- data/lib/mirah/version.rb +1 -1
- data/lib/mirah_task.rb +3 -2
- data/test/{test_ast.rb → core/test_ast.rb} +6 -0
- data/test/{test_compilation.rb → core/test_compilation.rb} +0 -0
- data/test/{test_env.rb → core/test_env.rb} +24 -25
- data/test/{test_macros.rb → core/test_macros.rb} +2 -4
- data/test/{test_typer.rb → core/test_typer.rb} +0 -3
- data/test/jvm/bytecode_test_helper.rb +181 -0
- data/test/{test_javac_compiler.rb → jvm/javac_test_helper.rb} +38 -22
- data/test/jvm/test_enumerable.rb +304 -0
- data/test/{test_java_typer.rb → jvm/test_java_typer.rb} +2 -4
- data/test/{test_jvm_compiler.rb → jvm/test_jvm_compiler.rb} +146 -443
- data/test/jvm/test_macros.rb +147 -0
- data/test/jvm/test_main_method.rb +15 -0
- data/test/{test_gwt.rb → plugins/test_gwt.rb} +0 -2
- metadata +103 -91
- data/bin/jrubyp +0 -52
- data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +0 -339
- data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +0 -42
- data/examples/wiki/src/org/mirah/wiki/error.eduby.html +0 -2
- data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +0 -69
- data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +0 -7
- data/examples/wiki/src/org/mirah/wiki/view.eduby.html +0 -15
- data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
- data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
- data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
- data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
- data/examples/wiki/war/app.yaml +0 -21
- data/examples/wiki/war/public/favicon.ico +0 -0
- data/examples/wiki/war/public/images/appengine_duby.png +0 -0
- data/examples/wiki/war/public/images/back.gif +0 -0
- data/examples/wiki/war/public/images/dir.gif +0 -0
- data/examples/wiki/war/public/images/file.gif +0 -0
- data/examples/wiki/war/public/javascripts/prettify.js +0 -61
- data/examples/wiki/war/public/robots.txt +0 -0
- data/examples/wiki/war/public/stylesheets/main.css +0 -156
- data/examples/wiki/war/public/stylesheets/prettify.css +0 -1
- data/examples/wiki/war/public/stylesheets/sh_style.css +0 -66
- data/examples/wiki/war/public/stylesheets/source.css +0 -21
- data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
- data/examples/wiki/war/public/wmd/images/bg.png +0 -0
- data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
- data/examples/wiki/war/public/wmd/images/bold.png +0 -0
- data/examples/wiki/war/public/wmd/images/code.png +0 -0
- data/examples/wiki/war/public/wmd/images/h1.png +0 -0
- data/examples/wiki/war/public/wmd/images/hr.png +0 -0
- data/examples/wiki/war/public/wmd/images/img.png +0 -0
- data/examples/wiki/war/public/wmd/images/italic.png +0 -0
- data/examples/wiki/war/public/wmd/images/link.png +0 -0
- data/examples/wiki/war/public/wmd/images/ol.png +0 -0
- data/examples/wiki/war/public/wmd/images/redo.png +0 -0
- data/examples/wiki/war/public/wmd/images/separator.png +0 -0
- data/examples/wiki/war/public/wmd/images/ul.png +0 -0
- data/examples/wiki/war/public/wmd/images/undo.png +0 -0
- data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
- data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
- data/examples/wiki/war/public/wmd/showdown.js +0 -421
- data/examples/wiki/war/public/wmd/wmd-base.js +0 -1799
- data/examples/wiki/war/public/wmd/wmd-plus.js +0 -311
- data/examples/wiki/war/public/wmd/wmd.js +0 -73
- data/examples/wiki/war/src/org/mirah/wiki/MirahWiki.duby +0 -339
- data/examples/wiki/war/src/org/mirah/wiki/edit.eduby.html +0 -42
- data/examples/wiki/war/src/org/mirah/wiki/error.eduby.html +0 -2
- data/examples/wiki/war/src/org/mirah/wiki/layout.eduby.html +0 -69
- data/examples/wiki/war/src/org/mirah/wiki/parser.eduby.html +0 -7
- data/examples/wiki/war/src/org/mirah/wiki/view.eduby.html +0 -15
- data/javalib/dynalink-0.1.jar +0 -0
- data/javalib/jsr292-mock.jar +0 -0
- data/lib/mirah/class_loader.rb +0 -35
- data/lib/mirah/compilation_state.rb +0 -28
- data/lib/mirah/impl.rb +0 -273
- data/lib/mirah/jvm/base.rb +0 -267
- data/lib/mirah/jvm/source_compiler.rb +0 -760
- data/lib/mirah/transform2.rb +0 -752
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
def reverse(s:string)
|
3
|
+
StringBuilder.new(s).reverse.toString()
|
4
|
+
end
|
5
|
+
|
6
|
+
def palindrome?(s:string)
|
7
|
+
s.equals(reverse(s))
|
8
|
+
end
|
9
|
+
|
10
|
+
puts palindrome?("anna") # ==> true
|
11
|
+
puts palindrome?("Erik") # ==> false
|
12
|
+
puts palindrome?("palindroom-moordnilap") # ==> true
|
13
|
+
puts nil # ==> null
|
14
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def rot13 (value:string)
|
4
|
+
result = ""
|
5
|
+
d = ' '.toCharArray[0]
|
6
|
+
value.toCharArray.each do |c|
|
7
|
+
testChar = Character.toLowerCase(c)
|
8
|
+
if testChar <= 'm'.toCharArray[0] && testChar >= 'a'.toCharArray[0] then
|
9
|
+
d = char(c + 13)
|
10
|
+
end
|
11
|
+
if testChar <= 'z'.toCharArray[0] && testChar >= 'n'.toCharArray[0] then
|
12
|
+
d = char(c - 13)
|
13
|
+
end
|
14
|
+
result += d
|
15
|
+
end
|
16
|
+
result
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
puts rot13("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
data/examples/sort_closure.mirah
CHANGED
@@ -18,5 +18,5 @@ import java.util.ArrayList
|
|
18
18
|
|
19
19
|
list = ArrayList.new [9,5,2,6,8,5,0,3,6,1,8,3,6,4,7,5,0,8,5,6,7,2,3]
|
20
20
|
puts "unsorted: #{list}"
|
21
|
-
Collections.sort(list) {|a,b| Integer(a).compareTo(b)}
|
21
|
+
Collections.sort(list) {|a,b| Integer(a).compareTo(Integer(b))}
|
22
22
|
puts "sorted: #{list}"
|
Binary file
|
data/javalib/mirah-bootstrap.jar
CHANGED
Binary file
|
data/lib/mirah.rb
CHANGED
@@ -22,31 +22,26 @@ require 'mirah/typer'
|
|
22
22
|
require 'mirah/compiler'
|
23
23
|
require 'mirah/env'
|
24
24
|
require 'mirah/errors'
|
25
|
-
require '
|
26
|
-
|
27
|
-
require 'bitescript'
|
28
|
-
rescue LoadError
|
29
|
-
$: << File.dirname(__FILE__) + '/../../bitescript/lib'
|
30
|
-
require 'bitescript'
|
31
|
-
end
|
25
|
+
require 'bitescript'
|
26
|
+
|
32
27
|
require 'mirah/jvm/compiler'
|
33
28
|
require 'mirah/jvm/typer'
|
34
29
|
Dir[File.dirname(__FILE__) + "/mirah/plugin/*"].each {|file| require "#{file}" if file =~ /\.rb$/}
|
35
|
-
require 'mirah/impl'
|
36
|
-
require 'mirah/compilation_state'
|
37
30
|
require 'jruby'
|
38
31
|
|
32
|
+
require 'mirah/commands'
|
33
|
+
|
39
34
|
module Mirah
|
40
35
|
def self.run(*args)
|
41
|
-
|
36
|
+
Mirah::Commands::Run.new(args).execute
|
42
37
|
end
|
43
38
|
|
44
39
|
def self.compile(*args)
|
45
|
-
|
40
|
+
Mirah::Commands::Compile.new(args).execute
|
46
41
|
end
|
47
42
|
|
48
43
|
def self.parse(*args)
|
49
|
-
|
44
|
+
Mirah::Commands::Parse.new(args).execute
|
50
45
|
end
|
51
46
|
|
52
47
|
def self.plugins
|
@@ -89,7 +84,3 @@ module Mirah
|
|
89
84
|
end
|
90
85
|
end
|
91
86
|
end
|
92
|
-
|
93
|
-
if __FILE__ == $0
|
94
|
-
Mirah.run(ARGV[0], *ARGV[1..-1])
|
95
|
-
end
|
data/lib/mirah/ast.rb
CHANGED
@@ -37,6 +37,10 @@ module Mirah
|
|
37
37
|
attr_accessor :newline
|
38
38
|
attr_accessor :inferred_type
|
39
39
|
|
40
|
+
# defines children of a node by name,
|
41
|
+
# respecting call order.
|
42
|
+
#
|
43
|
+
# @param [Symbol] name the name of the child node
|
40
44
|
def self.child(name)
|
41
45
|
@children ||= []
|
42
46
|
index = @children.size
|
@@ -60,6 +64,13 @@ module Mirah
|
|
60
64
|
java.util.ArrayList.new(@children)
|
61
65
|
end
|
62
66
|
|
67
|
+
#
|
68
|
+
# @param [Mirah::AST::Node] parent the parent node
|
69
|
+
# @param [JMetaPosition] position the location in the source code of the node
|
70
|
+
# @param [Array] children the list of child nodes
|
71
|
+
# @yield [self] yields the node being initialized, expects the list of children as the result.
|
72
|
+
# takes priority over the `children` argument.
|
73
|
+
#
|
63
74
|
def initialize(parent, position, children = [])
|
64
75
|
JRuby.reference(self.class).setRubyClassAllocator(JRuby.reference(self.class).reified_class)
|
65
76
|
unless parent.nil? || Mirah::AST::Node === parent
|
@@ -271,6 +282,10 @@ module Mirah
|
|
271
282
|
end
|
272
283
|
inferred_type
|
273
284
|
end
|
285
|
+
|
286
|
+
def top_level?
|
287
|
+
false
|
288
|
+
end
|
274
289
|
end
|
275
290
|
|
276
291
|
|
@@ -356,99 +371,9 @@ module Mirah
|
|
356
371
|
end
|
357
372
|
end
|
358
373
|
|
359
|
-
class Constant < Node
|
360
|
-
include Named
|
361
|
-
include Scoped
|
362
|
-
attr_accessor :array
|
363
|
-
|
364
|
-
def initialize(parent, position, name)
|
365
|
-
self.name = name
|
366
|
-
super(parent, position, [])
|
367
|
-
end
|
368
|
-
|
369
|
-
def infer(typer, expression)
|
370
|
-
@inferred_type ||= begin
|
371
|
-
# TODO lookup constant, inline if we're supposed to.
|
372
|
-
typer.type_reference(scope, name, @array, true)
|
373
|
-
end
|
374
|
-
end
|
375
|
-
|
376
|
-
def type_reference(typer)
|
377
|
-
typer.type_reference(scope, @name, @array)
|
378
|
-
end
|
379
|
-
end
|
380
|
-
|
381
|
-
class Self < Node
|
382
|
-
include Scoped
|
383
|
-
def infer(typer, expression)
|
384
|
-
@inferred_type ||= scope.static_scope.self_type
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
class Annotation < Node
|
389
|
-
attr_reader :values
|
390
|
-
attr_accessor :runtime
|
391
|
-
alias runtime? runtime
|
392
|
-
|
393
|
-
child :name_node
|
394
|
-
|
395
|
-
def initialize(parent, position, name=nil, &block)
|
396
|
-
super(parent, position, &block)
|
397
|
-
if name
|
398
|
-
@name = if name.respond_to?(:class_name)
|
399
|
-
name.class_name
|
400
|
-
else
|
401
|
-
name.name
|
402
|
-
end
|
403
|
-
end
|
404
|
-
@values = {}
|
405
|
-
end
|
406
|
-
|
407
|
-
def name
|
408
|
-
@name
|
409
|
-
end
|
410
|
-
|
411
|
-
def type
|
412
|
-
BiteScript::ASM::Type.getObjectType(@name.tr('.', '/'))
|
413
|
-
end
|
414
|
-
|
415
|
-
def []=(name, value)
|
416
|
-
@values[name] = value
|
417
|
-
end
|
418
|
-
|
419
|
-
def [](name)
|
420
|
-
@values[name]
|
421
|
-
end
|
422
|
-
|
423
|
-
def infer(typer, expression)
|
424
|
-
@inferred ||= begin
|
425
|
-
@name = name_node.type_reference(typer).name if name_node
|
426
|
-
@values.each do |name, value|
|
427
|
-
if Node === value
|
428
|
-
@values[name] = annotation_value(value, typer)
|
429
|
-
end
|
430
|
-
end
|
431
|
-
true
|
432
|
-
end
|
433
|
-
end
|
434
|
-
|
435
|
-
def annotation_value(node, typer)
|
436
|
-
case node
|
437
|
-
when String
|
438
|
-
java.lang.String.new(node.literal)
|
439
|
-
when Array
|
440
|
-
node.children.map {|node| annotation_value(node, typer)}
|
441
|
-
else
|
442
|
-
# TODO Support other types
|
443
|
-
ref = value.type_refence(typer)
|
444
|
-
desc = BiteScript::Signature.class_id(ref)
|
445
|
-
BiteScript::ASM::Type.getType(desc)
|
446
|
-
end
|
447
|
-
end
|
448
|
-
end
|
449
|
-
|
450
374
|
class NodeProxy < DelegateClass(Node)
|
451
375
|
include Java::DubyLangCompiler::Node
|
376
|
+
include Java::DubyLangCompiler.Call
|
452
377
|
def __inline__(node)
|
453
378
|
node.parent = parent
|
454
379
|
__setobj__(node)
|
@@ -646,7 +571,12 @@ module Mirah
|
|
646
571
|
end
|
647
572
|
|
648
573
|
def self.unreachable_type
|
649
|
-
|
574
|
+
factory = type_factory
|
575
|
+
if factory
|
576
|
+
factory.unreachable_type
|
577
|
+
else
|
578
|
+
TypeReference::UnreachableType
|
579
|
+
end
|
650
580
|
end
|
651
581
|
|
652
582
|
def self.block_type
|
data/lib/mirah/ast/call.rb
CHANGED
@@ -50,11 +50,12 @@ module Mirah::AST
|
|
50
50
|
def validate_parameters
|
51
51
|
parameters.each_with_index do |child, i|
|
52
52
|
if UnquotedValue === child
|
53
|
-
|
54
|
-
|
55
|
-
parameters[i] =
|
53
|
+
children = child.nodes
|
54
|
+
children.each {|c| c.parent = self}
|
55
|
+
parameters[i] = children
|
56
56
|
end
|
57
57
|
end
|
58
|
+
parameters.flatten!
|
58
59
|
end
|
59
60
|
|
60
61
|
def infer(typer, expression)
|
@@ -169,6 +170,21 @@ module Mirah::AST
|
|
169
170
|
parameter_types << Mirah::AST.block_type if block
|
170
171
|
|
171
172
|
unless should_defer
|
173
|
+
class_name, array = self.type_name(true)
|
174
|
+
if class_name && parameters.size == 1 && typer.known_type(scope, class_name)
|
175
|
+
# Support casts to fully-qualified names and inner classes.
|
176
|
+
begin
|
177
|
+
type = inferred_type = typer.type_reference(scope, class_name, array)
|
178
|
+
@inferred_type = type unless (type && type.error?)
|
179
|
+
if @inferred_type
|
180
|
+
# cast operation
|
181
|
+
resolved!
|
182
|
+
self.cast = true
|
183
|
+
return @inferred_type
|
184
|
+
end
|
185
|
+
rescue
|
186
|
+
end
|
187
|
+
end
|
172
188
|
@inferred_type = typer.method_type(receiver_type, name,
|
173
189
|
parameter_types)
|
174
190
|
if @inferred_type.kind_of? InlineCode
|
@@ -203,6 +219,14 @@ module Mirah::AST
|
|
203
219
|
end
|
204
220
|
|
205
221
|
def type_reference(typer)
|
222
|
+
class_name, array = type_name
|
223
|
+
typer.type_reference(scope, class_name, array)
|
224
|
+
end
|
225
|
+
|
226
|
+
def type_name(force=false)
|
227
|
+
if !force && parameters && !parameters.empty?
|
228
|
+
return nil
|
229
|
+
end
|
206
230
|
if name == "[]"
|
207
231
|
# array type, top should be a constant; find the rest
|
208
232
|
array = true
|
@@ -216,19 +240,27 @@ module Mirah::AST
|
|
216
240
|
while !receiver.eql?(old_receiver)
|
217
241
|
old_receiver = receiver
|
218
242
|
case receiver
|
219
|
-
when Constant,
|
243
|
+
when Constant, Local, Annotation
|
220
244
|
elements.unshift(receiver.name)
|
245
|
+
when FunctionalCall
|
246
|
+
if receiver.parameters.nil? || receiver.parameters.empty?
|
247
|
+
elements.unshift(receiver.name)
|
248
|
+
else
|
249
|
+
return nil, nil
|
250
|
+
end
|
221
251
|
when Call
|
222
|
-
|
223
|
-
|
252
|
+
if receiver.parameters.nil? || receiver.parameters.empty?
|
253
|
+
elements.unshift(receiver.name)
|
254
|
+
receiver = receiver.target
|
255
|
+
else
|
256
|
+
return nil, nil
|
257
|
+
end
|
224
258
|
when String
|
225
259
|
elements.unshift(receiver.literal)
|
226
260
|
end
|
227
261
|
end
|
228
262
|
|
229
|
-
|
230
|
-
class_name = elements.join(".")
|
231
|
-
typer.type_reference(scope, class_name, array)
|
263
|
+
return elements.join("."), array
|
232
264
|
end
|
233
265
|
end
|
234
266
|
|
data/lib/mirah/ast/class.rb
CHANGED
@@ -54,13 +54,13 @@ module Mirah::AST
|
|
54
54
|
node
|
55
55
|
end
|
56
56
|
|
57
|
-
def define_method(position, name, type, *args)
|
58
|
-
append_node(_define_method(MethodDefinition, position, name, type, args))
|
57
|
+
def define_method(position, name, type, *args, &block)
|
58
|
+
append_node(_define_method(MethodDefinition, position, name, type, args, &block))
|
59
59
|
end
|
60
60
|
|
61
|
-
def define_static_method(position, name, type, *args)
|
61
|
+
def define_static_method(position, name, type, *args, &block)
|
62
62
|
append_node(
|
63
|
-
_define_method(StaticMethodDefinition, position, name, type, args))
|
63
|
+
_define_method(StaticMethodDefinition, position, name, type, args, &block))
|
64
64
|
end
|
65
65
|
|
66
66
|
def define_constructor(position, *args, &block)
|
@@ -122,6 +122,10 @@ module Mirah::AST
|
|
122
122
|
end
|
123
123
|
end
|
124
124
|
end
|
125
|
+
|
126
|
+
def top_level?
|
127
|
+
true
|
128
|
+
end
|
125
129
|
end
|
126
130
|
|
127
131
|
defmacro('implements') do |transformer, fcall, parent|
|
@@ -159,6 +163,10 @@ module Mirah::AST
|
|
159
163
|
def superclass_node
|
160
164
|
nil
|
161
165
|
end
|
166
|
+
|
167
|
+
def top_level?
|
168
|
+
true
|
169
|
+
end
|
162
170
|
end
|
163
171
|
|
164
172
|
class ClosureDefinition < ClassDefinition
|
@@ -307,8 +315,6 @@ module Mirah::AST
|
|
307
315
|
the_scope.self_type = the_scope.self_type.include(typeref)
|
308
316
|
end
|
309
317
|
end
|
310
|
-
|
311
|
-
def compile(compiler, expression); end
|
312
318
|
end
|
313
319
|
|
314
320
|
defmacro("include") do |transformer, fcall, parent|
|
@@ -320,4 +326,26 @@ module Mirah::AST
|
|
320
326
|
end
|
321
327
|
end
|
322
328
|
end
|
329
|
+
|
330
|
+
class Constant < Node
|
331
|
+
include Named
|
332
|
+
include Scoped
|
333
|
+
attr_accessor :array
|
334
|
+
|
335
|
+
def initialize(parent, position, name)
|
336
|
+
self.name = name
|
337
|
+
super(parent, position, [])
|
338
|
+
end
|
339
|
+
|
340
|
+
def infer(typer, expression)
|
341
|
+
@inferred_type ||= begin
|
342
|
+
# TODO lookup constant, inline if we're supposed to.
|
343
|
+
typer.type_reference(scope, name, @array, true)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
def type_reference(typer)
|
348
|
+
typer.type_reference(scope, @name, @array)
|
349
|
+
end
|
350
|
+
end
|
323
351
|
end
|
data/lib/mirah/ast/flow.rb
CHANGED
@@ -235,7 +235,7 @@ module Mirah
|
|
235
235
|
typer.defer(self)
|
236
236
|
return
|
237
237
|
end
|
238
|
-
if throwable.
|
238
|
+
if throwable.compatible?(arg_type) && !arg_type.meta?
|
239
239
|
resolved!
|
240
240
|
return @inferred_type
|
241
241
|
end
|
@@ -245,7 +245,7 @@ module Mirah
|
|
245
245
|
if arg_types.any? {|c| c.nil?}
|
246
246
|
typer.defer(self)
|
247
247
|
else
|
248
|
-
if arg_types[0] && throwable.
|
248
|
+
if arg_types[0] && throwable.compatible?(arg_types[0])
|
249
249
|
klass = children.shift
|
250
250
|
else
|
251
251
|
klass = Constant.new(self, position, 'RuntimeException')
|
@@ -315,20 +315,32 @@ module Mirah
|
|
315
315
|
class Rescue < Node
|
316
316
|
child :body
|
317
317
|
child :clauses
|
318
|
+
child :else_node
|
319
|
+
|
318
320
|
def initialize(parent, position, &block)
|
319
321
|
super(parent, position, &block)
|
320
|
-
@body, @clauses = children
|
321
322
|
end
|
322
323
|
|
323
324
|
def infer(typer, expression)
|
324
325
|
unless resolved?
|
325
|
-
types = [
|
326
|
+
types = []
|
327
|
+
body_type = typer.infer(body, else_node.nil?) if body
|
328
|
+
else_type = typer.infer(else_node, true) if else_node
|
329
|
+
if else_node
|
330
|
+
types << else_type
|
331
|
+
elsif body
|
332
|
+
types << body_type
|
333
|
+
end
|
334
|
+
types += clauses.map {|c| typer.infer(c, true)}
|
326
335
|
if types.any? {|t| t.nil?}
|
327
336
|
typer.defer(self)
|
328
337
|
else
|
329
338
|
# TODO check types for compatibility (maybe only if an expression)
|
330
339
|
resolved!
|
331
|
-
|
340
|
+
types.each do |type|
|
341
|
+
@inferred_type ||= type unless type.unreachable?
|
342
|
+
end
|
343
|
+
@inferred_type ||= types[0]
|
332
344
|
end
|
333
345
|
end
|
334
346
|
@inferred_type
|