private void HandleCastArgument(TypeReference parameterType, ExplicitCastExpression castArgument)
 {
     if (parameterType.FullName == currentTypeSystem.Char.FullName && castArgument.ExpressionType.FullName == currentTypeSystem.UInt16.FullName)
     {
         castArgument.TargetType = currentTypeSystem.Char;
     }
 }
 private void MarkDynamicArguments(CallSiteInfo callSiteInfo, IList <Expression> arguments)
 {
     V_0 = callSiteInfo.get_DynamicArgumentIndices().GetEnumerator();
     try
     {
         while (V_0.MoveNext())
         {
             V_1 = V_0.get_Current();
             if (arguments.get_Item(V_1).get_CodeNodeType() == 24 || arguments.get_Item(V_1).get_CodeNodeType() == 23 && (arguments.get_Item(V_1) as UnaryExpression).get_Operator() == 11 || arguments.get_Item(V_1).get_CodeNodeType() == 61 || arguments.get_Item(V_1).get_CodeNodeType() == 59 || DynamicElementAnalyzer.Analyze(arguments.get_Item(V_1)))
             {
                 continue;
             }
             V_2                = new ExplicitCastExpression(arguments.get_Item(V_1), this.objectTypeRef, null);
             stackVariable40    = new Boolean[1];
             stackVariable40[0] = true;
             V_2.set_DynamicPositioningFlags(stackVariable40);
             arguments.set_Item(V_1, V_2);
         }
     }
     finally
     {
         ((IDisposable)V_0).Dispose();
     }
     return;
 }
        private static Expression HandleAverage(HandlerContext handlerContext)
        {
            if (!handlerContext.QueryModelVisitor.RequiresClientProjection &&
                handlerContext.SelectExpression.Projection.Count == 1)
            {
                var expression = handlerContext.SelectExpression.Projection.First();

                if (!(expression.RemoveConvert() is SelectExpression))
                {
                    var inputType  = expression.Type;
                    var outputType = expression.Type;

                    var nonNullableInputType = inputType.UnwrapNullableType();
                    if (nonNullableInputType == typeof(int) ||
                        nonNullableInputType == typeof(long))
                    {
                        outputType = inputType.IsNullableType() ? typeof(double?) : typeof(double);
                    }

                    expression = new ExplicitCastExpression(expression, outputType);
                    var averageExpression = new SqlFunctionExpression("AVG", expression.Type, new [] { expression });

                    handlerContext.SelectExpression.SetProjectionExpression(averageExpression);

                    return((Expression)_transformClientExpressionMethodInfo
                           .MakeGenericMethod(averageExpression.Type)
                           .Invoke(null, new object [] { handlerContext }));
                }
            }

            return(handlerContext.EvalOnClient());
        }
        private VariableReference GetTypeArrayVariable(MethodInvocationExpression binderMethodInvocation)
        {
            int        typeArrayArgumentIndex = 2;
            Expression typeArrayArgument      = binderMethodInvocation.Arguments[typeArrayArgumentIndex];

            if (typeArrayArgument.CodeNodeType == CodeNodeType.LiteralExpression &&
                (typeArrayArgument as LiteralExpression).Value == null)
            {
                return(null);
            }

            VariableReferenceExpression typeArrayVariableReference = null;

            if (typeArrayArgument.CodeNodeType == CodeNodeType.VariableReferenceExpression)
            {
                typeArrayVariableReference = typeArrayArgument as VariableReferenceExpression;
            }
            else if (typeArrayArgument.CodeNodeType == CodeNodeType.ExplicitCastExpression)
            {
                ExplicitCastExpression cast = typeArrayArgument as ExplicitCastExpression;
                if (cast.ExpressionType.GetFriendlyFullName(null) == IEnumerableOfSystemType &&
                    cast.Expression.CodeNodeType == CodeNodeType.VariableReferenceExpression)
                {
                    typeArrayVariableReference = cast.Expression as VariableReferenceExpression;
                }
            }

            if (typeArrayVariableReference == null)
            {
                throw new Exception("Invalid argument: typeArguments.");
            }

            return(typeArrayVariableReference.Variable);
        }
Пример #5
0
        private void CastMethodArguments(MethodReference method, ExpressionCollection arguments)
        {
            for (int i = 0; i < arguments.Count; i++)
            {
                Expression argument = arguments[i];

                TypeReference parameterType = method.Parameters[i].ResolveParameterType(method);

                if (argument.HasType && parameterType != null && !(argument is LiteralExpression))
                {
                    TypeReference argumentType = argument.ExpressionType;
                    if ((IsUnsignedIntegerType(argumentType) && IsSignedIntegerType(parameterType)) || (IsSignedIntegerType(argumentType) && IsUnsignedIntegerType(parameterType)))
                    {
                        Expression toCast = argument;

                        if (argument is ExplicitCastExpression)
                        {
                            ExplicitCastExpression argumentCast = argument as ExplicitCastExpression;
                            if (IsIntegerType(argumentCast.TargetType))
                            {
                                toCast = argumentCast.Expression;
                            }
                        }

                        arguments[i] = new ExplicitCastExpression(toCast, parameterType, null);
                    }
                }
            }
        }
Пример #6
0
        private bool TryGetMethodReference(Expression expression, string castTargetTypeName, out MethodReference methodRef)
        {
            methodRef = null;

            ExplicitCastExpression cast = expression as ExplicitCastExpression;

            if (cast == null || cast.Expression.CodeNodeType != CodeNodeType.MethodInvocationExpression ||
                cast.TargetType == null || cast.TargetType.FullName != castTargetTypeName)
            {
                return(false);
            }

            MethodInvocationExpression methodInvoke = cast.Expression as MethodInvocationExpression;

            if (methodInvoke == null || methodInvoke.Arguments.Count > 2 || methodInvoke.Arguments.Count < 1 || methodInvoke.Arguments[0].CodeNodeType != CodeNodeType.MemberHandleExpression ||
                methodInvoke.Arguments.Count == 2 && methodInvoke.Arguments[1].CodeNodeType != CodeNodeType.MemberHandleExpression || methodInvoke.MethodExpression.Method == null ||
                methodInvoke.MethodExpression.Method.Name != "GetMethodFromHandle" || methodInvoke.MethodExpression.Method.DeclaringType == null ||
                methodInvoke.MethodExpression.Method.DeclaringType.FullName != "System.Reflection.MethodBase")
            {
                return(false);
            }

            methodRef = (methodInvoke.Arguments[0] as MemberHandleExpression).MemberReference as MethodReference;
            return(methodRef != null);
        }
 private Expression FixCaseLiteralValue(LiteralExpression literalCondition)
 {
     V_0 = this.theSwitch.get_Condition().get_ExpressionType();
     V_1 = Convert.ToInt32(literalCondition.get_Value()) + this.conditionOffset;
     literalCondition.set_Value(V_1);
     V_2 = this.context.get_MethodContext().get_Method().get_Module().get_TypeSystem();
     if (String.op_Equality(V_0.get_Name(), "System.Nullable`1") && V_0.get_HasGenericParameters())
     {
         V_0 = V_0.get_GenericParameters().get_Item(0);
     }
     if (String.op_Equality(V_0.get_FullName(), V_2.get_Char().get_FullName()))
     {
         return(new LiteralExpression((object)Convert.ToChar(V_1), V_2, null));
     }
     if (String.op_Equality(V_0.get_FullName(), V_2.get_Boolean().get_FullName()))
     {
         return(new LiteralExpression((object)Convert.ToBoolean(V_1), V_2, null));
     }
     V_3 = V_0.Resolve();
     if (V_3 == null || !V_3.get_IsEnum())
     {
         return(literalCondition);
     }
     V_4 = EnumHelper.GetEnumExpression(V_3, literalCondition, V_2);
     if (V_4 as LiteralExpression != null)
     {
         V_4 = new ExplicitCastExpression(V_4, V_3, null);
     }
     return(V_4);
 }
        private VariableReference GetArgumentArrayVariable(MethodInvocationExpression binderMethodInvocation)
        {
            int        argumentArrayIndex      = binderMethodInvocation.Arguments.Count - 1;
            Expression argumentArrayExpression = binderMethodInvocation.Arguments[argumentArrayIndex];
            VariableReferenceExpression argumentArrayVariableReference = null;

            if (argumentArrayExpression.CodeNodeType == CodeNodeType.VariableReferenceExpression)
            {
                argumentArrayVariableReference = argumentArrayExpression as VariableReferenceExpression;
            }
            else if (argumentArrayExpression.CodeNodeType == CodeNodeType.ExplicitCastExpression)
            {
                ExplicitCastExpression cast = argumentArrayExpression as ExplicitCastExpression;
                if (cast.ExpressionType.GetFriendlyFullName(null) == IEnumerableOfCSharpArgumentInfo &&
                    cast.Expression.CodeNodeType == CodeNodeType.VariableReferenceExpression)
                {
                    argumentArrayVariableReference = cast.Expression as VariableReferenceExpression;
                }
            }

            if (argumentArrayVariableReference == null)
            {
                throw new Exception("Invalid argument: argumentInfo.");
            }

            return(argumentArrayVariableReference.Variable);
        }
        public override ICodeNode VisitBoxExpression(BoxExpression node)
        {
            base.VisitBoxExpression(node);
            if (node.BoxedExpression.CodeNodeType == CodeNodeType.LiteralExpression && node.BoxedAs.FullName == currentTypeSystem.Boolean.FullName)
            {
                FixBooleanLiteral(node.BoxedExpression as LiteralExpression);
                return(node.BoxedExpression.CloneAndAttachInstructions(node.MappedInstructions));
            }

            if (node.BoxedExpression.CodeNodeType == CodeNodeType.ExplicitCastExpression && ((ExplicitCastExpression)node.BoxedExpression).Expression.CodeNodeType == CodeNodeType.ExplicitCastExpression)
            {
                // double cast in a boxed expression;
                ExplicitCastExpression outerCast = node.BoxedExpression as ExplicitCastExpression;
                ExplicitCastExpression innerCast = outerCast.Expression as ExplicitCastExpression;
                if (outerCast.TargetType.FullName == currentTypeSystem.Char.FullName &&
                    innerCast.TargetType.FullName == currentTypeSystem.UInt16.FullName)
                {
                    // Remove the outer cast, as it is produced by the box expression and doesn't have any instructions mapped.
                    // The inner cast contains the instruction, converting the stack value to 2-byte integer (which at this point is known to be char, not ushort).
                    innerCast.TargetType = currentTypeSystem.Char;
                    node.BoxedExpression = innerCast;
                }
            }
            return(node);
        }
        public override ICodeNode VisitReturnExpression(ReturnExpression node)
        {
            base.VisitReturnExpression(node);

            LiteralExpression literalValue = node.Value as LiteralExpression;

            if (literalValue != null)
            {
                if (isBoolReturnType)
                {
                    FixBooleanLiteral(literalValue);
                }
                else if (isCharReturnType)
                {
                    FixCharLiteral(literalValue);
                }
            }

            ExplicitCastExpression castValue = node.Value as ExplicitCastExpression;

            if (castValue != null)
            {
                if (castValue.ExpressionType.FullName != methodContext.Method.ReturnType.FullName)
                {
                    if (isCharReturnType && castValue.ExpressionType.FullName == currentTypeSystem.UInt16.FullName)
                    {
                        castValue.TargetType = currentTypeSystem.Char;
                    }
                }
            }

            return(node);
        }
Пример #11
0
        private void FixArguments(MethodReference method, ExpressionCollection arguments)
        {
            TypeDefinition declaringTypeDefinition = method.DeclaringType.Resolve();

            if (declaringTypeDefinition == null)
            {
                return;
            }
            List <MethodDefinition> sameNameMethods = GetSameNameMethods(declaringTypeDefinition, method, arguments);

            if (sameNameMethods.Count > 0)
            {
                for (int i = 0; i < arguments.Count; i++)
                {
                    TypeReference paramType = method.Parameters[i].ResolveParameterType(method);
                    if (!arguments[i].HasType)
                    {
                        continue;
                    }
                    if (arguments[i].ExpressionType.FullName == paramType.FullName)
                    {
                        continue;
                    }
                    if (ShouldAddCast(arguments[i], sameNameMethods, i, paramType))
                    {
                        arguments[i] = new ExplicitCastExpression(arguments[i], paramType, null);
                    }
                }
            }
        }
 private void HandleCastArgument(TypeReference parameterType, ExplicitCastExpression castArgument)
 {
     if (String.op_Equality(parameterType.get_FullName(), this.currentTypeSystem.get_Char().get_FullName()) && String.op_Equality(castArgument.get_ExpressionType().get_FullName(), this.currentTypeSystem.get_UInt16().get_FullName()))
     {
         castArgument.set_TargetType(this.currentTypeSystem.get_Char());
     }
     return;
 }
        public override void VisitExplicitCastExpression(ExplicitCastExpression node)
        {
            TypesDependingOn.UnionWith(Utilities.GetTypeReferenceTypesDepedningOn(node.ExpressionType));
            if (node.UnresolvedReferenceForAmbiguousCastToObject != null)
            {
                this.AmbiguousCastsToObject.Add(node);
            }

            base.VisitExplicitCastExpression(node);
        }
Пример #14
0
 public override void VisitExplicitCastExpression(ExplicitCastExpression node)
 {
     this.get_TypesDependingOn().UnionWith(Utilities.GetTypeReferenceTypesDepedningOn(node.get_ExpressionType()));
     if (node.get_UnresolvedReferenceForAmbiguousCastToObject() != null)
     {
         dummyVar0 = this.get_AmbiguousCastsToObject().Add(node);
     }
     this.VisitExplicitCastExpression(node);
     return;
 }
Пример #15
0
 public override ICodeNode VisitExplicitCastExpression(ExplicitCastExpression node)
 {
     if (node.get_Expression().get_CodeNodeType() != 22)
     {
         return(this.VisitExplicitCastExpression(node));
     }
     V_0 = node.get_ExpressionType().Resolve();
     if (V_0 == null || !V_0.get_IsEnum() || node.get_ExpressionType().get_IsArray())
     {
         return(node);
     }
     return(EnumHelper.GetEnumExpression(node.get_ExpressionType().Resolve(), node.get_Expression() as LiteralExpression, this.typeSystem));
 }
Пример #16
0
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        public virtual Expression Translate(
            MethodCallExpression methodCallExpression,
            IDiagnosticsLogger <DbLoggerCategory.Query> logger)
        {
            Check.NotNull(methodCallExpression, nameof(methodCallExpression));

            var method = methodCallExpression.Method;

            if (_supportedMethodTranslations.TryGetValue(method, out var sqlFunctionName))
            {
                return(new SqlFunctionExpression(
                           sqlFunctionName,
                           methodCallExpression.Type,
                           methodCallExpression.Arguments));
            }

            if (_truncateMethodInfos.Contains(method))
            {
                var firstArgument = methodCallExpression.Arguments[0];

                if (firstArgument.NodeType == ExpressionType.Convert)
                {
                    firstArgument = new ExplicitCastExpression(firstArgument, firstArgument.Type);
                }

                return(new SqlFunctionExpression(
                           "ROUND",
                           methodCallExpression.Type,
                           new[] { firstArgument, Expression.Constant(0), Expression.Constant(1) }));
            }

            if (_roundMethodInfos.Contains(method))
            {
                var firstArgument = methodCallExpression.Arguments[0];

                if (firstArgument.NodeType == ExpressionType.Convert)
                {
                    firstArgument = new ExplicitCastExpression(firstArgument, firstArgument.Type);
                }

                return(new SqlFunctionExpression(
                           "ROUND",
                           methodCallExpression.Type,
                           methodCallExpression.Arguments.Count == 1
                        ? new[] { firstArgument, Expression.Constant(0) }
                        : new[] { firstArgument, methodCallExpression.Arguments[1] }));
            }

            return(null);
        }
 public override ICodeNode VisitExplicitCastExpression(ExplicitCastExpression node)
 {
     if (node.get_Expression().get_CodeNodeType() == 22 && String.op_Equality(node.get_TargetType().get_FullName(), this.currentTypeSystem.get_Boolean().get_FullName()))
     {
         this.FixBooleanLiteral(node.get_Expression() as LiteralExpression);
         return(node.get_Expression().CloneAndAttachInstructions(node.get_MappedInstructions()));
     }
     if (node.get_Expression().get_CodeNodeType() != 22 || !String.op_Equality(node.get_TargetType().get_FullName(), this.currentTypeSystem.get_Char().get_FullName()))
     {
         return(this.VisitExplicitCastExpression(node));
     }
     this.FixCharLiteral(node.get_Expression() as LiteralExpression);
     return(node.get_Expression().CloneAndAttachInstructions(node.get_MappedInstructions()));
 }
        public virtual Expression Translate(MethodCallExpression methodCallExpression)
        {
            Check.NotNull(methodCallExpression, nameof(methodCallExpression));

            var method = methodCallExpression.Method;

            if (_supportedMethodTranslations.TryGetValue(method, out string sqlFunctionName))
            {
                return(new SqlFunctionExpression(
                           sqlFunctionName,
                           methodCallExpression.Type,
                           methodCallExpression.Arguments));
            }

            if (_truncateMethodInfos.Contains(method))
            {
                var firstArgument = methodCallExpression.Arguments[0];

                if (firstArgument.NodeType == ExpressionType.Convert)
                {
                    firstArgument = new ExplicitCastExpression(firstArgument, firstArgument.Type);
                }

                return(new SqlFunctionExpression(
                           "TRUNC",
                           methodCallExpression.Type,
                           new[] { firstArgument }));
            }

            if (_roundMethodInfos.Contains(method))
            {
                var firstArgument = methodCallExpression.Arguments[0];

                if (firstArgument.NodeType == ExpressionType.Convert)
                {
                    firstArgument = new ExplicitCastExpression(firstArgument, firstArgument.Type);
                }

                return(new SqlFunctionExpression(
                           "ROUND",
                           methodCallExpression.Type,
                           methodCallExpression.Arguments.Count == 1
                        ? new[] { firstArgument }
                        : new[] { firstArgument, methodCallExpression.Arguments[1] }));
            }

            return(null);
        }
Пример #19
0
 private void MarkDynamicArguments(CallSiteInfo callSiteInfo, IList <Expression> arguments)
 {
     foreach (int index in callSiteInfo.DynamicArgumentIndices)
     {
         if (arguments[index].CodeNodeType != CodeNodeType.BinaryExpression &&
             (arguments[index].CodeNodeType != CodeNodeType.UnaryExpression || (arguments[index] as UnaryExpression).Operator != UnaryOperator.None) &&
             arguments[index].CodeNodeType != CodeNodeType.DynamicIndexerExpression &&
             arguments[index].CodeNodeType != CodeNodeType.DynamicMemberReferenceExpression &&
             !DynamicElementAnalyzer.Analyze(arguments[index]))
         {
             ExplicitCastExpression theCastExpression = new ExplicitCastExpression(arguments[index], objectTypeRef, null);
             theCastExpression.DynamicPositioningFlags = new bool[] { true };
             arguments[index] = theCastExpression;
         }
     }
 }
        public override ICodeNode VisitExplicitCastExpression(ExplicitCastExpression node)
        {
            if (node.Expression.CodeNodeType == CodeNodeType.LiteralExpression && node.TargetType.FullName == currentTypeSystem.Boolean.FullName)
            {
                FixBooleanLiteral(node.Expression as LiteralExpression);
                return(node.Expression.CloneAndAttachInstructions(node.MappedInstructions));
            }

            if (node.Expression.CodeNodeType == CodeNodeType.LiteralExpression && node.TargetType.FullName == currentTypeSystem.Char.FullName)
            {
                FixCharLiteral(node.Expression as LiteralExpression);
                return(node.Expression.CloneAndAttachInstructions(node.MappedInstructions));
            }

            return(base.VisitExplicitCastExpression(node));
        }
 public override ICodeNode VisitExplicitCastExpression(ExplicitCastExpression node)
 {
     if (node.Expression.CodeNodeType == CodeNodeType.LiteralExpression)
     {
         TypeDefinition typeDef = node.ExpressionType.Resolve();
         if (typeDef != null && typeDef.IsEnum && !node.ExpressionType.IsArray)
         {
             return(EnumHelper.GetEnumExpression(node.ExpressionType.Resolve(), node.Expression as LiteralExpression, typeSystem));
         }
         return(node);
     }
     else
     {
         return(base.VisitExplicitCastExpression(node));
     }
 }
Пример #22
0
 private void CheckArguments(Mono.Collections.Generic.Collection <ParameterDefinition> parameters, ExpressionCollection arguments)
 {
     for (int i = 0; i < arguments.Count; i++)
     {
         Expression argument = arguments[i];
         if (argument.HasType)
         {
             TypeDefinition argumentType  = argument.ExpressionType.Resolve();
             TypeReference  parameterType = parameters[i].ParameterType;
             if (ShouldAddCast(argumentType, parameterType))
             {
                 arguments[i] = new ExplicitCastExpression(argument, parameterType, null);
             }
         }
     }
 }
Пример #23
0
        private static Expression HandleAverage(HandlerContext handlerContext)
        {
            if (!handlerContext.QueryModelVisitor.RequiresClientProjection &&
                handlerContext.SelectExpression.Projection.Count == 1)
            {
                PrepareSelectExpressionForAggregate(handlerContext.SelectExpression);

                var expression = handlerContext.SelectExpression.Projection.First();

                if (!(expression.RemoveConvert() is SelectExpression))
                {
                    var inputType  = handlerContext.QueryModel.SelectClause.Selector.Type;
                    var outputType = inputType;

                    var nonNullableInputType = inputType.UnwrapNullableType();
                    if (nonNullableInputType == typeof(int) ||
                        nonNullableInputType == typeof(long))
                    {
                        outputType = inputType.IsNullableType() ? typeof(double?) : typeof(double);
                    }

                    expression = (expression as ExplicitCastExpression)?.Operand ?? expression;
                    expression = UnwrapAliasExpression(expression);
                    expression = new ExplicitCastExpression(expression, outputType);
                    Expression averageExpression = new SqlFunctionExpression(
                        "AVG",
                        outputType,
                        new[] { expression });

                    if (nonNullableInputType == typeof(float))
                    {
                        averageExpression = new ExplicitCastExpression(averageExpression, inputType);
                    }

                    handlerContext.SelectExpression.SetProjectionExpression(averageExpression);

                    var averageExpressionType = averageExpression.Type;
                    var throwOnNullResult     = DetermineAggregateThrowingBehavior(handlerContext, averageExpressionType);

                    return((Expression)_transformClientExpressionMethodInfo
                           .MakeGenericMethod(averageExpressionType)
                           .Invoke(null, new object[] { handlerContext, throwOnNullResult }));
                }
            }

            return(handlerContext.EvalOnClient());
        }
Пример #24
0
        public override Expression VisitExplicitCast(ExplicitCastExpression explicitCastExpression)
        {
            var typeMapping = _typeMapper.FindMappingForExplicitCast(explicitCastExpression.Type);

            if (typeMapping == null)
            {
                throw new InvalidOperationException(RelationalStrings.UnsupportedType(explicitCastExpression.Type.Name));
            }

            Sql.Append("CAST(");
            Visit(explicitCastExpression.Operand);
            Sql.Append(" AS ");
            Sql.Append(typeMapping.StoreType);
            Sql.Append(")");

            return(explicitCastExpression);
        }
Пример #25
0
        public virtual Expression Translate(MethodCallExpression methodCallExpression)
        {
            var method = methodCallExpression.Method;

            if (SupportedMethodTranslations.TryGetValue(method, out var sqlFunctionName))
            {
                return(new SqlFunctionExpression(
                           sqlFunctionName,
                           methodCallExpression.Type,
                           methodCallExpression.Arguments));
            }

            if (TruncateMethodInfos.Contains(method))
            {
                var firstArgument = methodCallExpression.Arguments[0];

                if (firstArgument.NodeType == ExpressionType.Convert)
                {
                    firstArgument = new ExplicitCastExpression(firstArgument, firstArgument.Type);
                }

                return(new SqlFunctionExpression(
                           "TRUNC",
                           methodCallExpression.Type,
                           new[] { firstArgument, Expression.Constant(0) }));
            }

            if (RoundMethodInfos.Contains(method))
            {
                var firstArgument = methodCallExpression.Arguments[0];

                if (firstArgument.NodeType == ExpressionType.Convert)
                {
                    firstArgument = new ExplicitCastExpression(firstArgument, firstArgument.Type);
                }

                return(new SqlFunctionExpression(
                           "ROUND",
                           methodCallExpression.Type,
                           methodCallExpression.Arguments.Count == 1
                                                ? new[] { firstArgument, Expression.Constant(0) }
                                                : new[] { firstArgument, methodCallExpression.Arguments[1] }));
            }

            return(null);
        }
Пример #26
0
            public override ICodeNode VisitUnaryExpression(UnaryExpression node)
            {
                if (node.Operator == UnaryOperator.AddressDereference)
                {
                    if (node.Operand.CodeNodeType == CodeNodeType.ThisReferenceExpression)
                    {
                        return(node.Operand);
                    }

                    ExplicitCastExpression castOperand = node.Operand as ExplicitCastExpression;
                    if (castOperand != null && castOperand.TargetType.IsByReference)
                    {
                        TypeReference targetType = (castOperand.TargetType as ByReferenceType).ElementType;
                        return(new ExplicitCastExpression((Expression)Visit(castOperand.Expression), targetType, null));
                    }
                }
                return(base.VisitUnaryExpression(node));
            }
        public override Expression VisitExplicitCast(ExplicitCastExpression explicitCastExpression)
        {
            Sql.Append("CAST(");
            Visit(explicitCastExpression.Operand);
            Sql.Append(" AS ");
            var typeMapping = Dependencies.TypeMappingSource.FindMapping(explicitCastExpression.Type);

            if (typeMapping == null)
            {
                throw new InvalidOperationException($"Cannot cast to type '{explicitCastExpression.Type.Name}'");
            }

            var    storeTypeLower = typeMapping.StoreType.ToLower();
            string castMapping    = null;

            foreach (var kvp in CastMappings)
            {
                foreach (var storeType in kvp.Value)
                {
                    if (storeTypeLower.StartsWith(storeType))
                    {
                        castMapping = kvp.Key;
                        break;
                    }
                }
                if (castMapping != null)
                {
                    break;
                }
            }
            if (castMapping == "signed" && storeTypeLower.Contains("unsigned"))
            {
                castMapping = "unsigned";
            }
            else if (castMapping == null)
            {
                castMapping = "char";
            }

            Sql.Append(castMapping);
            Sql.Append(")");

            return(explicitCastExpression);
        }
Пример #28
0
        public override void VisitReturnExpression(ReturnExpression node)
        {
            base.VisitReturnExpression(node);

            if (decompiledMethodReturnType != null && node.Value != null && node.Value.HasType && ShouldAddCastToAssignment(decompiledMethodReturnType, node.Value.ExpressionType))
            {
                Expression toCast = node.Value;

                if (node.Value is ExplicitCastExpression)
                {
                    ExplicitCastExpression valueCast = node.Value as ExplicitCastExpression;
                    if (IsIntegerType(valueCast.TargetType))
                    {
                        toCast = valueCast.Expression;
                    }
                }

                node.Value = new ExplicitCastExpression(toCast, decompiledMethodReturnType, null);
            }
        }
        private void VisitInvocationArguments(ExpressionCollection arguments, MethodReference method)
        {
            Collection <ParameterDefinition> parameters = method.Parameters;

            for (int index = 0; index < arguments.Count; index++)
            {
                TypeReference paramType = parameters[index].ResolveParameterType(method);
                if (NeedsCast(arguments[index].ExpressionType, paramType))
                {
                    if (arguments[index].CodeNodeType == CodeNodeType.LiteralExpression)
                    {
                        arguments[index] = EnumHelper.GetEnumExpression(paramType.Resolve(), (arguments[index] as LiteralExpression), typeSystem);
                    }
                    else
                    {
                        arguments[index] = new ExplicitCastExpression(arguments[index], paramType, null);
                    }
                }
            }
        }
        /// <summary>
        /// 访问CAST AS表达式。
        /// </summary>
        /// <param name="explicitCastExpression">表达式。</param>
        /// <returns>返回访问后的表达式实例对象。</returns>
        public Expression VisitExplicitCast(ExplicitCastExpression explicitCastExpression)
        {
            _builder.Append("CAST(");

            Visit(explicitCastExpression.Operand);

            _builder.Append(" AS ");

            var typeMapping = _typeMapper.GetMapping(explicitCastExpression.Type);

            if (typeMapping == null)
            {
                throw new InvalidOperationException(string.Format(Resources.UnsupportedType, explicitCastExpression.Type.DisplayName(false)));
            }

            _builder.Append(typeMapping);

            _builder.Append(")");
            return(explicitCastExpression);
        }