diff --git a/lib/vool/ruby_compiler.rb b/lib/vool/ruby_compiler.rb index f456734d..2302e570 100644 --- a/lib/vool/ruby_compiler.rb +++ b/lib/vool/ruby_compiler.rb @@ -37,6 +37,18 @@ module Vool arg.first end + def on_block(block_node) + sendd = process(block_node.children[0]) + args = process(block_node.children[1]) + body = process(block_node.children[2]) + sendd.block = BlockStatement.new(args , body) + sendd + end + + def on_args(args) + args.children.collect{|a| process(a)} + end + #basic Values def on_self exp SelfExpression.new diff --git a/lib/vool/statement.rb b/lib/vool/statement.rb index cfed51a7..c51760f9 100644 --- a/lib/vool/statement.rb +++ b/lib/vool/statement.rb @@ -65,6 +65,7 @@ end require_relative "statements/assign_statement" require_relative "statements/array_statement" require_relative "statements/basic_values" +require_relative "statements/block_statement" require_relative "statements/class_statement" require_relative "statements/hash_statement" require_relative "statements/if_statement" diff --git a/lib/vool/statements/block_statement.rb b/lib/vool/statements/block_statement.rb new file mode 100644 index 00000000..4fc78926 --- /dev/null +++ b/lib/vool/statements/block_statement.rb @@ -0,0 +1,29 @@ +module Vool + class BlockStatement < Statement + attr_reader :args , :body , :clazz + + def initialize( args , body , clazz = nil) + @args , @body = args , body + raise "no bod" unless @body + @clazz = clazz + end + + def to_mom( _ ) + raise "should not be called (call create_objects)" + end + + def each(&block) + block.call(self) + @body.each(&block) + end + + def normalize + BlockStatement.new( @args , @body.normalize) + end + + def create_objects(clazz) + end + + + end +end diff --git a/lib/vool/statements/send_statement.rb b/lib/vool/statements/send_statement.rb index 69899d77..c917ffd4 100644 --- a/lib/vool/statements/send_statement.rb +++ b/lib/vool/statements/send_statement.rb @@ -10,13 +10,17 @@ module Vool # As cache key we must use the type of the object (which is the first word of _every_ object) # as that is constant, and function implementations depend on the type (not class) class SendStatement < Statement - attr_reader :name , :receiver , :arguments + attr_reader :name , :receiver , :arguments , :block def initialize(name , receiver , arguments ) @name , @receiver , @arguments = name , receiver , arguments @arguments ||= [] end + def block=( block ) + @block = block + end + def normalize statements = Statements.new([]) arguments = [] diff --git a/test/vool/ruby_compiler/test_block_statement.rb b/test/vool/ruby_compiler/test_block_statement.rb new file mode 100644 index 00000000..b329bf9a --- /dev/null +++ b/test/vool/ruby_compiler/test_block_statement.rb @@ -0,0 +1,29 @@ +require_relative "helper" + +module Vool + class TestBlockStatement < MiniTest::Test + + def setup() + input = "plus_one{|arg1| arg1 + 1 } " + @lst = RubyCompiler.compile( input ) + end + def test_method + assert_equal SendStatement , @lst.class + end + def test_block + assert_equal BlockStatement , @lst.block.class + end + + def test_method_name + assert_equal :plus_one , @lst.name + end + + def test_block_args + assert_equal [:arg1] , @lst.block.args + end + def test_block_body + assert_equal SendStatement , @lst.block.body.class + assert_equal 1 , @lst.block.body.arguments.length + end + end +end