fix assignments
which was letting ruby instances through also rename the doubious copy
This commit is contained in:
parent
6a58a71c0a
commit
172327f045
@ -10,7 +10,7 @@ module Ruby
|
||||
raise "not named left #{name.class}" unless name.is_a?(Symbol)
|
||||
case value
|
||||
when Named , Constant
|
||||
return copy
|
||||
return self.vool_brother.new(name,@value.to_vool)
|
||||
when SendStatement
|
||||
return normalize_send
|
||||
else
|
||||
@ -18,19 +18,23 @@ module Ruby
|
||||
end
|
||||
end
|
||||
|
||||
def copy(value = nil)
|
||||
value ||= @value
|
||||
self.vool_brother.new(name,value)
|
||||
end
|
||||
|
||||
# sends may have complex args that get hoisted in vool:ing them
|
||||
# in which case we have to assign the simplified, otherwise the
|
||||
# plain send
|
||||
def normalize_send
|
||||
statements = value.to_vool
|
||||
return copy( statements ) if statements.is_a?(Vool::SendStatement)
|
||||
assign = statements.statements.pop
|
||||
statements << copy(assign)
|
||||
return assignment( statements ) if statements.is_a?(Vool::SendStatement)
|
||||
# send has hoisted assigns, so we make an assign out of the "pure" send
|
||||
statements << assignment(statements.statements.pop)
|
||||
statements
|
||||
end
|
||||
|
||||
# create same type assignment with the value (a send)
|
||||
def assignment(value)
|
||||
value ||= @value
|
||||
self.vool_brother.new(name,value)
|
||||
end
|
||||
|
||||
def to_s(depth = 0)
|
||||
at_depth(depth , "#{@name} = #{@value}")
|
||||
end
|
||||
|
@ -25,28 +25,40 @@ module Ruby
|
||||
assert_equal IvarAssignment , lst.class
|
||||
end
|
||||
end
|
||||
class TestAssignmentVool < MiniTest::Test
|
||||
class TestAssignmentVoolBar < MiniTest::Test
|
||||
include RubyTests
|
||||
|
||||
def setup
|
||||
@lst = compile( "foo = bar").to_vool
|
||||
end
|
||||
def test_local
|
||||
lst = compile( "foo = bar").to_vool
|
||||
assert_equal Vool::LocalAssignment , lst.class
|
||||
assert_equal Vool::LocalAssignment , @lst.class
|
||||
end
|
||||
def test_bar
|
||||
assert_equal Vool::SendStatement , @lst.value.class
|
||||
end
|
||||
def test_local_name
|
||||
lst = compile( "foo = bar").to_vool
|
||||
assert_equal :foo , lst.name
|
||||
assert_equal :foo , @lst.name
|
||||
end
|
||||
end
|
||||
class TestAssignmentVoolInst < MiniTest::Test
|
||||
include RubyTests
|
||||
def setup
|
||||
@lst = compile( "@foo = bar").to_vool
|
||||
end
|
||||
def test_instance
|
||||
lst = compile( "@foo = bar").to_vool
|
||||
assert_equal Vool::IvarAssignment , lst.class
|
||||
assert_equal Vool::IvarAssignment , @lst.class
|
||||
end
|
||||
def test_instance_name
|
||||
lst = compile( "@foo = bar").to_vool
|
||||
assert_equal :foo , lst.name
|
||||
assert_equal :foo , @lst.name
|
||||
end
|
||||
end
|
||||
class TestAssignmentVoolConst < MiniTest::Test
|
||||
include RubyTests
|
||||
def setup
|
||||
@lst = compile( "foo = 5").to_vool
|
||||
end
|
||||
def test_const
|
||||
lst = compile( "@foo = 5").to_vool
|
||||
assert_equal Vool::IvarAssignment , lst.class
|
||||
assert_equal Vool::IntegerConstant , @lst.value.class
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user