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));
			}
		}
예제 #3
0
        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);
                }
            }
        }
예제 #5
0
 public override void ExitCastExpression(CastExpression castExpression)
 {
     castExpression.ReplaceWith(castExpression.Base);
 }
예제 #6
0
파일: Lower.cs 프로젝트: evanw/minisharp
        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);
                }
            }
        }