public override object VisitCastExpression(CastExpression castExpression, object data) { base.VisitCastExpression(castExpression, data); // Handle methodof Match m = getMethodOrConstructorFromHandlePattern.Match(castExpression); if (m.Success) { IMethod method = m.Get <AstNode>("method").Single().Annotation <IMethod>(); if (m.Has("declaringType")) { Expression newNode = m.Get <AstType>("declaringType").Single().Detach().Member(method.Name); var methodDef = method.ResolveMethodDef(); if (methodDef == null) { newNode = newNode.Invoke(method.MethodSig.Params.Select(p => new TypeReferenceExpression(AstBuilder.ConvertType(p)))); } else { newNode = newNode.Invoke(methodDef.Parameters.Select(p => new TypeReferenceExpression(AstBuilder.ConvertType(p.Type, p.ParamDef)))); } newNode.AddAnnotation(method); m.Get <AstNode>("method").Single().ReplaceWith(newNode); } castExpression.ReplaceWith(m.Get <AstNode>("ldtokenNode").Single()); } return(null); }
public override void VisitCastExpression(CastExpression castExpression) { base.VisitCastExpression(castExpression); // Handle methodof Match m = getMethodOrConstructorFromHandlePattern.Match(castExpression); if (m.Success) { IMethod method = m.Get<AstNode>("method").Single().GetSymbol() as IMethod; if (m.Has("declaringType") && method != null) { Expression newNode = new MemberReferenceExpression(new TypeReferenceExpression(m.Get<AstType>("declaringType").Single().Detach()), method.Name); newNode = new InvocationExpression(newNode, method.Parameters.Select(p => new TypeReferenceExpression(context.TypeSystemAstBuilder.ConvertType(p.Type)))); m.Get<AstNode>("method").Single().ReplaceWith(newNode); } castExpression.ReplaceWith(m.Get<AstNode>("ldtokenNode").Single().CopyAnnotationsFrom(castExpression)); } }
public override object VisitCastExpression(CastExpression castExpression, object data) { base.VisitCastExpression(castExpression, data); // Handle methodof Match m = getMethodOrConstructorFromHandlePattern.Match(castExpression); if (m.Success) { var ilRanges = castExpression.GetAllRecursiveILRanges(); IMethod method = m.Get <AstNode>("method").Single().Annotation <IMethod>(); if (method != null && m.Has("declaringType")) { Expression newNode = m.Get <AstType>("declaringType").Single().Detach().Member(method.Name, method); newNode = newNode.Invoke(method.MethodSig.GetParameters().Select(p => new TypeReferenceExpression(AstBuilder.ConvertType(p, stringBuilder)))); newNode.AddAnnotation(method); m.Get <AstNode>("method").Single().ReplaceWith(newNode); } castExpression.ReplaceWith(m.Get <AstNode>("ldtokenNode").Single().WithAnnotation(ilRanges)); } return(null); }
public override void VisitCastExpression(CastExpression castExpression) { base.VisitCastExpression(castExpression); var expression = castExpression.Expression; if (expression is ParenthesizedExpression) expression = (expression as ParenthesizedExpression).Expression; object value = null; if (expression is PrimitiveExpression) value = (expression as PrimitiveExpression).Value; else if (expression is UnaryOperatorExpression && (expression as UnaryOperatorExpression).Expression is PrimitiveExpression) { var primitive = (expression as UnaryOperatorExpression).Expression as PrimitiveExpression; value = primitive.Value; } if (value != null) { var type = (castExpression.Type as PrimitiveType).KnownTypeCode; if ((type == KnownTypeCode.Int16 && value is short) || (type == KnownTypeCode.Int32 && value is int) || (type == KnownTypeCode.Int64 && value is long) || (type == KnownTypeCode.UInt16 && value is ushort) || (type == KnownTypeCode.UInt32 && value is uint) || (type == KnownTypeCode.UInt64 && value is ulong) || (type == KnownTypeCode.Double && value is double) || (type == KnownTypeCode.Single && value is float) || (type == KnownTypeCode.String && value is string) || (type == KnownTypeCode.Boolean && value is bool) || (type == KnownTypeCode.Char && value is char) || (type == KnownTypeCode.Byte && value is byte) || (type == KnownTypeCode.SByte && value is sbyte) || (type == KnownTypeCode.Decimal && value is decimal)) { castExpression.ReplaceWith(expression); } } }
public override void ExitCastExpression(CastExpression castExpression) { castExpression.ReplaceWith(castExpression.Base); }
public void VisitCastExpression(CastExpression node) { VisitChildren(node); // Implement primitive casts var result = resolver.Resolve(node) as ConversionResolveResult; if (result != null) { var expression = node.Expression; var fromType = resolver.Resolve(expression).Type; var isDynamic = fromType == SpecialType.Dynamic; var toCode = TypeCode(result.Type); expression.Remove(); // Integer cast if (IsIntegerTypeCode(toCode) && (!IsIntegerTypeCode(TypeCode(fromType)) || isDynamic)) { node.ReplaceWith(new BinaryOperatorExpression(expression, BinaryOperatorType.BitwiseOr, new PrimitiveExpression(0))); } // Boolean cast else if (isDynamic && toCode == KnownTypeCode.Boolean) { node.ReplaceWith(new UnaryOperatorExpression( UnaryOperatorType.Not, new UnaryOperatorExpression( UnaryOperatorType.Not, expression))); } // Floating-point cast else if (isDynamic && IsFloatingPointTypeCode(toCode)) { node.ReplaceWith(new UnaryOperatorExpression( UnaryOperatorType.Plus, expression)); } // No cast needed else { node.ReplaceWith(expression); } } }