diff --git a/lib/ruby/method_statement.rb b/lib/ruby/method_statement.rb index 8759f796..9b60937c 100644 --- a/lib/ruby/method_statement.rb +++ b/lib/ruby/method_statement.rb @@ -9,9 +9,31 @@ module Ruby end def to_vool + if @body.is_a?(Statements) + @body << replace_return( @body.pop ) + else + @body = replace_return( @body ) + end Vool::MethodStatement.new( @name , @args.dup , @body.to_vool) end + def replace_return(statement) + case statement + when SendStatement , YieldStatement, Variable , Constant + return ReturnStatement.new( statement ) + when IvarAssignment + ret = ReturnStatement.new( InstanceVariable.new(statement.name) ) + return Statements.new([statement , ret]) + when LocalAssignment + ret = ReturnStatement.new( LocalVariable.new(statement.name) ) + return Statements.new([statement , ret]) + when ReturnStatement , IfStatement , WhileStatement ,BlockStatement + return statement + else + raise "Not implemented implicit return #{statement.class}" + end + end + def to_s(depth = 0) arg_str = @args.collect{|a| a.to_s}.join(', ') at_depth(depth , "def #{name}(#{arg_str})" , @body.to_s(depth + 1) , "end") diff --git a/lib/ruby/return_statement.rb b/lib/ruby/return_statement.rb index b9c96b38..cfed6a8d 100644 --- a/lib/ruby/return_statement.rb +++ b/lib/ruby/return_statement.rb @@ -5,7 +5,7 @@ module Ruby attr_reader :return_value def initialize(value) - @return_value = value + @return_value = value || NilConstant.new end def to_vool diff --git a/lib/ruby/statements.rb b/lib/ruby/statements.rb index 958256e7..653c75cf 100644 --- a/lib/ruby/statements.rb +++ b/lib/ruby/statements.rb @@ -23,6 +23,9 @@ module Ruby def shift @statements.shift end + def pop + @statements.pop + end def [](i) @statements[i] end diff --git a/lib/vool/while_statement.rb b/lib/vool/while_statement.rb index bf6da731..c192c9ea 100644 --- a/lib/vool/while_statement.rb +++ b/lib/vool/while_statement.rb @@ -29,7 +29,9 @@ module Vool end def to_s(depth = 0) - at_depth(depth , "while (#{@condition})" , @body.to_s(depth + 1) , "end" ) + lines =[ "while (#{@condition})" , @body.to_s(1) , "end"] + lines.unshift( @hoisted.to_s) if @hoisted + at_depth(depth , *lines ) end end