public override void LeaveCastExpression(CastExpression node)
{
var fromType = GetExpressionType(node.Target);
var toType = GetType(node.Type);
BindExpressionType(node, toType);
if (IsError(fromType) || IsError(toType))
return;
if (IsAssignableFrom(toType, fromType))
return;
if (TypeSystemServices.CanBeReachedByPromotion(toType, fromType))
return;
if (TypeSystemServices.IsFloatingPointNumber(toType) && fromType.IsEnum)
return;
var conversion = TypeSystemServices.FindExplicitConversionOperator(fromType, toType) ?? TypeSystemServices.FindImplicitConversionOperator(fromType, toType);
if (null != conversion)
{
node.ParentNode.Replace(node, CodeBuilder.CreateMethodInvocation(conversion, node.Target));
return;
}
if (toType.IsValueType)
{
if (TypeSystemServices.IsSystemObject(fromType))
return;
}
else if (!fromType.IsFinal)
return;
Error(CompilerErrorFactory.IncompatibleExpressionType(node, toType, fromType));
}