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)
|
raise "not named left #{name.class}" unless name.is_a?(Symbol)
|
||||||
case value
|
case value
|
||||||
when Named , Constant
|
when Named , Constant
|
||||||
return copy
|
return self.vool_brother.new(name,@value.to_vool)
|
||||||
when SendStatement
|
when SendStatement
|
||||||
return normalize_send
|
return normalize_send
|
||||||
else
|
else
|
||||||
@ -18,19 +18,23 @@ module Ruby
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def copy(value = nil)
|
# sends may have complex args that get hoisted in vool:ing them
|
||||||
value ||= @value
|
# in which case we have to assign the simplified, otherwise the
|
||||||
self.vool_brother.new(name,value)
|
# plain send
|
||||||
end
|
|
||||||
|
|
||||||
def normalize_send
|
def normalize_send
|
||||||
statements = value.to_vool
|
statements = value.to_vool
|
||||||
return copy( statements ) if statements.is_a?(Vool::SendStatement)
|
return assignment( statements ) if statements.is_a?(Vool::SendStatement)
|
||||||
assign = statements.statements.pop
|
# send has hoisted assigns, so we make an assign out of the "pure" send
|
||||||
statements << copy(assign)
|
statements << assignment(statements.statements.pop)
|
||||||
statements
|
statements
|
||||||
end
|
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)
|
def to_s(depth = 0)
|
||||||
at_depth(depth , "#{@name} = #{@value}")
|
at_depth(depth , "#{@name} = #{@value}")
|
||||||
end
|
end
|
||||||
|
@ -25,28 +25,40 @@ module Ruby
|
|||||||
assert_equal IvarAssignment , lst.class
|
assert_equal IvarAssignment , lst.class
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
class TestAssignmentVool < MiniTest::Test
|
class TestAssignmentVoolBar < MiniTest::Test
|
||||||
include RubyTests
|
include RubyTests
|
||||||
|
def setup
|
||||||
|
@lst = compile( "foo = bar").to_vool
|
||||||
|
end
|
||||||
def test_local
|
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
|
end
|
||||||
def test_local_name
|
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
|
end
|
||||||
def test_instance
|
def test_instance
|
||||||
lst = compile( "@foo = bar").to_vool
|
assert_equal Vool::IvarAssignment , @lst.class
|
||||||
assert_equal Vool::IvarAssignment , lst.class
|
|
||||||
end
|
end
|
||||||
def test_instance_name
|
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
|
end
|
||||||
def test_const
|
def test_const
|
||||||
lst = compile( "@foo = 5").to_vool
|
assert_equal Vool::IntegerConstant , @lst.value.class
|
||||||
assert_equal Vool::IvarAssignment , lst.class
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user