/// <code>
/// End-exclusive range:
/// if state
/// state = IsFalse({end})
/// true
/// else
/// state = IsTrue({begin})
/// end
///
/// End-inclusive range:
/// if state || IsTrue({begin})
/// state = IsFalse({end})
/// true
/// else
/// false
/// end
/// </code>
internal override MSA.Expression /*!*/ TransformRead(AstGenerator /*!*/ gen)
{
var begin = AstUtils.Box(_range.Begin.TransformRead(gen));
var end = AstUtils.Box(_range.End.TransformRead(gen));
// state:
// false <=> null
// true <=> non-null
if (_range.IsExclusive)
{
return(Ast.Condition(
Ast.ReferenceNotEqual(
_stateVariable.TransformReadVariable(gen, false),
AstUtils.Constant(null)
),
Ast.Block(
_stateVariable.TransformWriteVariable(gen, Methods.NullIfTrue.OpCall(end)),
AstUtils.Constant(true)
),
Ast.ReferenceNotEqual(
_stateVariable.TransformWriteVariable(gen, Methods.NullIfFalse.OpCall(begin)),
AstUtils.Constant(null)
)
));
}
else
{
return(Ast.Condition(
Ast.OrElse(
Ast.ReferenceNotEqual(
_stateVariable.TransformReadVariable(gen, false),
AstUtils.Constant(null)
),
Methods.IsTrue.OpCall(begin)
),
Ast.Block(
_stateVariable.TransformWriteVariable(gen, Methods.NullIfTrue.OpCall(end)),
AstUtils.Constant(true)
),
AstUtils.Constant(false)
));
}
}