diff --git a/lib/vool/statements/assignment_statement.rb b/lib/vool/statements/assignment_statement.rb index 8b665eb8..5dc6393d 100644 --- a/lib/vool/statements/assignment_statement.rb +++ b/lib/vool/statements/assignment_statement.rb @@ -4,6 +4,10 @@ module Vool def initialize(name , value ) @name , @value = name , value end + def collect(arr) + @value.collect(arr) + super + end end class LocalAssignment < Assignment end diff --git a/lib/vool/statements/if_statement.rb b/lib/vool/statements/if_statement.rb index 4774333a..2185c5c6 100644 --- a/lib/vool/statements/if_statement.rb +++ b/lib/vool/statements/if_statement.rb @@ -9,6 +9,12 @@ module Vool simplify_condition end + def collect(arr) + @if_true.collect(arr) + @if_false.collect(arr) + super + end + def simplify_condition return unless @condition.is_a?(ScopeStatement) @condition = @condition.first if @condition.single? diff --git a/lib/vool/statements/logical_statement.rb b/lib/vool/statements/logical_statement.rb index c861ab72..9fac70f9 100644 --- a/lib/vool/statements/logical_statement.rb +++ b/lib/vool/statements/logical_statement.rb @@ -1,11 +1,18 @@ module Vool # Logical Statements are guaranteed to return boolean - # either :and or :or, which may be written as && and || + # either :and or :or, which may be written as && and || class LogicalStatement < Statement attr_reader :name , :left , :right def initialize(name , left , right) @name , @left , @right = name , left , right end + + def collect(arr) + @receiver.collect(arr) + @arguments.collect(arr) + super + end + end end diff --git a/lib/vool/statements/method_statement.rb b/lib/vool/statements/method_statement.rb index 5a62f867..f5cbd523 100644 --- a/lib/vool/statements/method_statement.rb +++ b/lib/vool/statements/method_statement.rb @@ -6,5 +6,11 @@ module Vool @name , @args , @body = name , args , (body || []) end + def collect(arr) + @args.collect(arr) + @body.collect(arr) + super + end + end end diff --git a/lib/vool/statements/return_statement.rb b/lib/vool/statements/return_statement.rb index 8e014051..75bc5e89 100644 --- a/lib/vool/statements/return_statement.rb +++ b/lib/vool/statements/return_statement.rb @@ -5,5 +5,10 @@ module Vool def initialize(value) @return_value = value end + + def collect(arr) + @return_value.collect(arr) + super + end end end diff --git a/lib/vool/statements/send_statement.rb b/lib/vool/statements/send_statement.rb index e986a3cd..b0a5235d 100644 --- a/lib/vool/statements/send_statement.rb +++ b/lib/vool/statements/send_statement.rb @@ -5,5 +5,12 @@ module Vool def initialize(name , receiver , arguments = []) @name , @receiver , @arguments = name , receiver , arguments end + + def collect(arr) + @receiver.collect(arr) + @arguments.collect(arr) + super + end + end end diff --git a/lib/vool/statements/statements.rb b/lib/vool/statements/statements.rb index 13d9e4ab..9b78c4ae 100644 --- a/lib/vool/statements/statements.rb +++ b/lib/vool/statements/statements.rb @@ -16,6 +16,11 @@ module Vool def length @statements.length end + + def collect(arr) + @statements.each { |s| s.collect(arr) } + super + end end class ScopeStatement < Statements diff --git a/lib/vool/statements/while_statement.rb b/lib/vool/statements/while_statement.rb index efba9d6d..f596d50d 100644 --- a/lib/vool/statements/while_statement.rb +++ b/lib/vool/statements/while_statement.rb @@ -13,5 +13,11 @@ module Vool @condition = @condition.first if @condition.single? end + def collect(arr) + @condition.collect(arr) + @statements.collect(arr) + super + end + end end diff --git a/test/vool/helper.rb b/test/vool/compilers/helper.rb similarity index 100% rename from test/vool/helper.rb rename to test/vool/compilers/helper.rb diff --git a/test/vool/test_vool_compiler.rb b/test/vool/test_vool_compiler.rb new file mode 100644 index 00000000..b2987a97 --- /dev/null +++ b/test/vool/test_vool_compiler.rb @@ -0,0 +1,38 @@ +require_relative "helper" + +module Vool + class TestVoolCompiler < MiniTest::Test + include CompilerHelper + + def setup + Risc.machine.boot + end + + def create_method + VoolCompiler.compile in_Test("def meth; @ivar ;end") + test = Parfait.object_space.get_class_by_name(:Test) + test.get_method(:meth) + end + + def pest_creates_method_in_class + method = create_method + assert method , "No method created" + end + + def pest_method_has_source + method = create_method + assert_equal "(ivar :@ivar)", method.source.to_s + end + + def pest_method_has_no_args + method = create_method + assert_equal 1 , method.args_type.instance_length + end + + def pest_method_has_no_locals + method = create_method + assert_equal 1 , method.locals_type.instance_length + end + + end +end