void VBNetTestUnaryOperatorExpressionTest(string program, UnaryOperatorType op)
		{
			UnaryOperatorExpression uoe = ParseUtil.ParseExpression<UnaryOperatorExpression>(program);
			Assert.AreEqual(op, uoe.Op);
			
			Assert.IsTrue(uoe.Expression is SimpleNameExpression);
		}
        internal static UnaryNumericPromotionDecision Decide(Type type, UnaryOperatorType @operator) {
            if (!IsNumericPromotion(type, @operator)) {
                return NonNumericPromotion;
            }

            return new UnaryNumericPromotionDecision(type, @operator);
        }
		void CSharpTestUnaryOperatorExpressionTest(string program, UnaryOperatorType op)
		{
			UnaryOperatorExpression uoe = ParseUtilCSharp.ParseExpression<UnaryOperatorExpression>(program);
			Assert.AreEqual(op, uoe.Op);
			
			Assert.IsTrue(uoe.Expression is IdentifierExpression);
		}
Esempio n. 4
0
		public UnaryOperatorResolveResult(IType resultType, UnaryOperatorType op, ResolveResult input)
			: base(resultType)
		{
			if (input == null)
				throw new ArgumentNullException("input");
			this.Operator = op;
			this.Input = input;
		}
        private static bool IsNumericPromotion(Type type, UnaryOperatorType @operator) {
            if (!type.IsNumeric() ||
                type.Equals(TypeSystem.Boolean) ||
                Array.IndexOf(_unaryOperators, @operator) == -1) {
                return false;
            }

            return true;
        }
		void TestUnaryOperatorExpressionTest(string program, UnaryOperatorType op)
		{
			UnaryOperatorExpression uoe = ParseUtilCSharp.ParseExpression<UnaryOperatorExpression>(program);
			Assert.AreEqual(op, uoe.Operator);
			
			Assert.IsTrue(uoe.Expression is IdentifierExpression);
			Assert.AreEqual(new TextLocation(1, 1), uoe.StartLocation);
			Assert.AreEqual(new TextLocation(1, program.Length + 1), uoe.EndLocation);
		}
        private UnaryNumericPromotionDecision(Type type, UnaryOperatorType @operator) {
            switch (@operator) {
                case UnaryOperatorType.BitNot:
                case UnaryOperatorType.Minus:
                case UnaryOperatorType.Plus:
                    if (Array.IndexOf(_convertableTypes, type) > -1) {
                        Type = new TypePromotionDecision(type, TypeSystem.Int);
                        return;
                    }

                    if (@operator == UnaryOperatorType.Minus && type.Equals(TypeSystem.Uint)) {
                        Type = new TypePromotionDecision(type, TypeSystem.Long);
                        return;
                    }

                    break;
            }

            Type = new TypePromotionDecision(type); 
        }
Esempio n. 8
0
 protected MatchFactorNode(UnaryOperatorType op = UnaryOperatorType.None, MatchFactorNode next = null)
 {
     OpType = op;
     Next = next;
 }
Esempio n. 9
0
        protected override object CompileUnaryExpression(UnaryExpression expression)
        {
            object            value     = CompileExpression(expression.Expression);
            UnaryOperatorType @operator = expression.Operator;

            if (expression.Expression is IdentifierExpression identifierExpression)
            {
                if (CompilerContext.ContainsPropety(identifierExpression.Name) == false)
                {
                    CompilerContext.ErrorHandler.ThrowError(new SyntaxError($"Identifier '{identifierExpression.Name}' is not defined", null));

                    return(null);
                }

                CompilerContext.DeleteProperty(identifierExpression);

                return(null);
            }

            if (expression.Expression is Function function)
            {
                if (CompilerContext.ContainsFunction(function.Name) == false)
                {
                    CompilerContext.ErrorHandler.ThrowError(new SyntaxError($"Function '{function.Name}' is not defined", null));

                    return(null);
                }

                CompilerContext.DeleteFunction(function);

                return(null);
            }

            if (DustType.GetDustType(value) == DustType.Number)
            {
                switch (@operator)
                {
                case UnaryOperatorType.PLUS_PLUS:
                    if (DustType.GetDustType(value) == DustType.Int)
                    {
                        return((int)value + 1);
                    }

                    return(Convert.ToSingle(value) + 1);

                case UnaryOperatorType.MINUS_MINUS:
                    if (DustType.GetDustType(value) == DustType.Int)
                    {
                        return((int)value - 1);
                    }

                    return(Convert.ToSingle(value) - 1);

                case UnaryOperatorType.TIMES_TIMES:
                    if (DustType.GetDustType(value) == DustType.Int)
                    {
                        return(Math.Pow((int)value, 2));
                    }

                    return(Math.Pow(Convert.ToSingle(value), 2));

                case UnaryOperatorType.DIVIDE_DIVIDE:
                    if (DustType.GetDustType(value) == DustType.Int)
                    {
                        return(Math.Sqrt((int)value));
                    }

                    return(Math.Sqrt(Convert.ToSingle(value)));
                }
            }

            if (DustType.GetDustType(value) == DustType.Bool)
            {
                switch (@operator)
                {
                case UnaryOperatorType.BANG:
                    if (DustType.GetDustType(value) == DustType.Bool)
                    {
                        return(!(bool)value);
                    }

                    break;
                }
            }

            return(null);
        }
Esempio n. 10
0
 ResolveResult UnaryNumericPromotion(UnaryOperatorType op, ref IType type, bool isNullable, ResolveResult expression)
 {
     // C# 4.0 spec: §7.3.6.1
     TypeCode code = ReflectionHelper.GetTypeCode(type);
     if (isNullable && SpecialType.NullType.Equals(type))
         code = TypeCode.SByte; // cause promotion of null to int32
     switch (op) {
         case UnaryOperatorType.Minus:
             if (code == TypeCode.UInt32) {
                 type = compilation.FindType(KnownTypeCode.Int64);
                 return Convert(expression, MakeNullable(type, isNullable),
                                isNullable ? Conversion.ImplicitNullableConversion : Conversion.ImplicitNumericConversion);
             }
             goto case UnaryOperatorType.Plus;
         case UnaryOperatorType.Plus:
         case UnaryOperatorType.BitNot:
             if (code >= TypeCode.Char && code <= TypeCode.UInt16) {
                 type = compilation.FindType(KnownTypeCode.Int32);
                 return Convert(expression, MakeNullable(type, isNullable),
                                isNullable ? Conversion.ImplicitNullableConversion : Conversion.ImplicitNumericConversion);
             }
             break;
     }
     return expression;
 }
Esempio n. 11
0
        public ResolveResult ResolveUnaryOperator(UnaryOperatorType op, ResolveResult expression)
        {
            if (SpecialType.Dynamic.Equals(expression.Type))
                return UnaryOperatorResolveResult(SpecialType.Dynamic, op, expression);

            // C# 4.0 spec: §7.3.3 Unary operator overload resolution
            string overloadableOperatorName = GetOverloadableOperatorName(op);
            if (overloadableOperatorName == null) {
                switch (op) {
                    case UnaryOperatorType.Dereference:
                        PointerType p = expression.Type as PointerType;
                        if (p != null)
                            return UnaryOperatorResolveResult(p.ElementType, op, expression);
                        else
                            return ErrorResult;
                    case UnaryOperatorType.AddressOf:
                        return UnaryOperatorResolveResult(new PointerType(expression.Type), op, expression);
                    case UnaryOperatorType.Await:
                        ResolveResult getAwaiterMethodGroup = ResolveMemberAccess(expression, "GetAwaiter", EmptyList<IType>.Instance, true);
                        ResolveResult getAwaiterInvocation = ResolveInvocation(getAwaiterMethodGroup, new ResolveResult[0]);
                        var getResultMethodGroup = CreateMemberLookup().Lookup(getAwaiterInvocation, "GetResult", EmptyList<IType>.Instance, true) as MethodGroupResolveResult;
                        if (getResultMethodGroup != null) {
                            var or = getResultMethodGroup.PerformOverloadResolution(compilation, new ResolveResult[0], allowExtensionMethods: false, conversions: conversions);
                            IType awaitResultType = or.GetBestCandidateWithSubstitutedTypeArguments().ReturnType;
                            return UnaryOperatorResolveResult(awaitResultType, UnaryOperatorType.Await, expression);
                        } else {
                            return UnaryOperatorResolveResult(SpecialType.UnknownType, UnaryOperatorType.Await, expression);
                        }
                    default:
                        throw new ArgumentException("Invalid value for UnaryOperatorType", "op");
                }
            }
            // If the type is nullable, get the underlying type:
            IType type = NullableType.GetUnderlyingType(expression.Type);
            bool isNullable = NullableType.IsNullable(expression.Type);

            // the operator is overloadable:
            OverloadResolution userDefinedOperatorOR = new OverloadResolution(compilation, new[] { expression }, conversions: conversions);
            foreach (var candidate in GetUserDefinedOperatorCandidates(type, overloadableOperatorName)) {
                userDefinedOperatorOR.AddCandidate(candidate);
            }
            if (userDefinedOperatorOR.FoundApplicableCandidate) {
                return CreateResolveResultForUserDefinedOperator(userDefinedOperatorOR);
            }

            expression = UnaryNumericPromotion(op, ref type, isNullable, expression);
            CSharpOperators.OperatorMethod[] methodGroup;
            CSharpOperators operators = CSharpOperators.Get(compilation);
            switch (op) {
                case UnaryOperatorType.Increment:
                case UnaryOperatorType.Decrement:
                case UnaryOperatorType.PostIncrement:
                case UnaryOperatorType.PostDecrement:
                    // C# 4.0 spec: §7.6.9 Postfix increment and decrement operators
                    // C# 4.0 spec: §7.7.5 Prefix increment and decrement operators
                    TypeCode code = ReflectionHelper.GetTypeCode(type);
                    if ((code >= TypeCode.SByte && code <= TypeCode.Decimal) || type.Kind == TypeKind.Enum || type.Kind == TypeKind.Pointer)
                        return UnaryOperatorResolveResult(expression.Type, op, expression);
                    else
                        return new ErrorResolveResult(expression.Type);
                case UnaryOperatorType.Plus:
                    methodGroup = operators.UnaryPlusOperators;
                    break;
                case UnaryOperatorType.Minus:
                    methodGroup = CheckForOverflow ? operators.CheckedUnaryMinusOperators : operators.UncheckedUnaryMinusOperators;
                    break;
                case UnaryOperatorType.Not:
                    methodGroup = operators.LogicalNegationOperators;
                    break;
                case UnaryOperatorType.BitNot:
                    if (type.Kind == TypeKind.Enum) {
                        if (expression.IsCompileTimeConstant && !isNullable) {
                            // evaluate as (E)(~(U)x);
                            var U = compilation.FindType(expression.ConstantValue.GetType());
                            var unpackedEnum = new ConstantResolveResult(U, expression.ConstantValue);
                            return CheckErrorAndResolveCast(expression.Type, ResolveUnaryOperator(op, unpackedEnum));
                        } else {
                            return UnaryOperatorResolveResult(expression.Type, op, expression);
                        }
                    } else {
                        methodGroup = operators.BitwiseComplementOperators;
                        break;
                    }
                default:
                    throw new InvalidOperationException();
            }
            OverloadResolution builtinOperatorOR = new OverloadResolution(compilation, new[] { expression }, conversions: conversions);
            foreach (var candidate in methodGroup) {
                builtinOperatorOR.AddCandidate(candidate);
            }
            CSharpOperators.UnaryOperatorMethod m = (CSharpOperators.UnaryOperatorMethod)builtinOperatorOR.BestCandidate;
            IType resultType = m.ReturnType;
            if (builtinOperatorOR.BestCandidateErrors != OverloadResolutionErrors.None) {
                // If there are any user-defined operators, prefer those over the built-in operators.
                // It'll be a more informative error.
                if (userDefinedOperatorOR.BestCandidate != null)
                    return CreateResolveResultForUserDefinedOperator(userDefinedOperatorOR);
                else
                    return new ErrorResolveResult(resultType);
            } else if (expression.IsCompileTimeConstant && m.CanEvaluateAtCompileTime) {
                object val;
                try {
                    val = m.Invoke(this, expression.ConstantValue);
                } catch (ArithmeticException) {
                    return new ErrorResolveResult(resultType);
                }
                return new ConstantResolveResult(resultType, val);
            } else {
                expression = Convert(expression, m.Parameters[0].Type, builtinOperatorOR.ArgumentConversions[0]);
                return UnaryOperatorResolveResult(resultType, op, expression);
            }
        }
Esempio n. 12
0
 public UnaryOperator(string tokenText, UnaryOperatorType operatorType, TypeSymbol operandType) : this(tokenText, operatorType, operandType, operandType)
 {
 }
Esempio n. 13
0
 public override String GetOperatorString(UnaryOperatorType operatorType)
 {
     return base.GetOperatorString(operatorType);
 }
Esempio n. 14
0
 public UnaryOperatorExpression(UnaryOperatorType op)
 {
 }
Esempio n. 15
0
		/// <summary>
		/// Perform given arithmetic operation.
		/// The arguments must be already converted to the correct types.
		/// </summary>
		object PerformUnaryOperation(object val, UnaryOperatorType op, Type argType)
		{
			checked {
				if (argType == typeof(bool)) {
					bool a = (bool)val;
					switch (op) {
							case UnaryOperatorType.Not:    return !a;
					}
				}
				
				if (argType == typeof(float)) {
					float a = (float)val;
					switch (op) {
							case UnaryOperatorType.Minus:  return -a;
							case UnaryOperatorType.Plus:   return +a;
					}
				}
				
				if (argType == typeof(double)) {
					double a = (double)val;
					switch (op) {
							case UnaryOperatorType.Minus:  return -a;
							case UnaryOperatorType.Plus:   return +a;
					}
				}
				
				if (argType == typeof(int)) {
					int a = (int)val;
					switch (op) {
							case UnaryOperatorType.Minus:  return -a;
							case UnaryOperatorType.Plus:   return +a;
							case UnaryOperatorType.BitNot: return ~a;
					}
				}
				
				if (argType == typeof(uint)) {
					uint a = (uint)val;
					switch (op) {
							case UnaryOperatorType.Plus:   return +a;
							case UnaryOperatorType.BitNot: return ~a;
					}
				}
				
				if (argType == typeof(long)) {
					long a = (long)val;
					switch (op) {
							case UnaryOperatorType.Minus:  return -a;
							case UnaryOperatorType.Plus:   return +a;
							case UnaryOperatorType.BitNot: return ~a;
					}
				}
				
				if (argType == typeof(ulong)) {
					ulong a = (ulong)val;
					switch (op) {
							case UnaryOperatorType.Plus:   return +a;
							case UnaryOperatorType.BitNot: return ~a;
					}
				}
			}
			
			return null;
		}
Esempio n. 16
0
		public UnaryOperatorExpression(Expression expression, UnaryOperatorType op) {
			Expression = expression;
			Op = op;
		}
Esempio n. 17
0
		public UnaryOperatorExpression(UnaryOperatorType op) {
			Op = op;
			expression = Expression.Null;
		}
		Value VisitUnaryOperator(OperatorResolveResult result, UnaryOperatorType operatorType, bool checkForOverflow = false)
		{
			Debug.Assert(result.Operands.Count == 1);
			var operand = Convert(result.Operands[0]).ToResolveResult(context);
			CSharpResolver resolver = new CSharpResolver(debuggerTypeSystem).WithCheckForOverflow(checkForOverflow);
			var val = resolver.ResolveUnaryOperator(operatorType, operand);
			if (val.IsCompileTimeConstant)
				return Convert(val);
			throw new GetValueException("Operator {0} is not supported for {1}!", operatorType, new CSharpAmbience().ConvertType(operand.Type));
		}
Esempio n. 19
0
 public string _Visit(UnaryOperatorType op)
 {
     return(UnaryOperatorExpression.GetOperatorRole(op).Token);
 }
Esempio n. 20
0
		public ConstantUnaryOperator(UnaryOperatorType operatorType, ConstantExpression expression)
		{
			if (expression == null)
				throw new ArgumentNullException("expression");
			this.operatorType = operatorType;
			this.expression = expression;
		}
Esempio n. 21
0
 public FindUnaryOperatorNavigator(IMethod op, UnaryOperatorType operatorType)
 {
     this.op = op;
     this.operatorType = operatorType;
 }
Esempio n. 22
0
        Expression ConvertUnaryOperator(InvocationExpression invocation, UnaryOperatorType op, bool? isChecked = null)
        {
            if (invocation.Arguments.Count < 1)
                return NotSupported(invocation);

            Expression expr = Convert(invocation.Arguments.ElementAt(0));
            if (expr == null)
                return null;

            UnaryOperatorExpression uoe = new UnaryOperatorExpression(op, expr);
            if (isChecked != null)
                uoe.AddAnnotation(isChecked.Value ? AddCheckedBlocks.CheckedAnnotation : AddCheckedBlocks.UncheckedAnnotation);

            switch (invocation.Arguments.Count) {
                case 1:
                    return uoe;
                case 2:
                    Match m = getMethodFromHandlePattern.Match(invocation.Arguments.ElementAt(1));
                    if (m.Success)
                        return uoe.WithAnnotation(m.Get<AstNode>("method").Single().Annotation<MethodReference>());
                    else
                        return null;
                default:
                    return NotSupported(invocation);
            }
        }
Esempio n. 23
0
 private bool UnaryExpressionFor(ExternalMethod method, out UnaryOperatorType op)
 {
     return(Enum.TryParse(method.Name.Substring("op_".Length), true, out op));
 }
Esempio n. 24
0
 static UnaryOperatorType GetRelatedPreOperator(UnaryOperatorType op)
 {
     switch (op)
     {
         case UnaryOperatorType.PostIncrement:
             return UnaryOperatorType.Increment;
         case UnaryOperatorType.PostDecrement:
             return UnaryOperatorType.Decrement;
     }
     throw new ArgumentException("op");
 }
Esempio n. 25
0
 public UnaryOperatorExpression(Expression expression, UnaryOperatorType op)
 {
 }
Esempio n. 26
0
 static public ILUnaryOperatorInvokation GetILUnaryOperatorInvokation(this ILValue item, UnaryOperatorType type)
 {
     return(new ILUnaryOperatorInvokation(type, item));
 }
Esempio n. 27
0
 SearchScope FindUnaryOperator(IMethod op, UnaryOperatorType operatorType)
 {
     return FindOperator(op, m => new FindUnaryOperatorNavigator(m, operatorType));
 }
Esempio n. 28
0
        public ResolveResult ResolveUnaryOperator(UnaryOperatorType op, ResolveResult expression)
        {
            if (expression.Type.Kind == TypeKind.Dynamic) {
                if (op == UnaryOperatorType.Await) {
                    return new AwaitResolveResult(SpecialType.Dynamic, new DynamicInvocationResolveResult(new DynamicMemberResolveResult(expression, "GetAwaiter"), DynamicInvocationType.Invocation, EmptyList<ResolveResult>.Instance), SpecialType.Dynamic, null, null, null);
                }
                else {
                    return UnaryOperatorResolveResult(SpecialType.Dynamic, op, expression);
                }
            }

            // C# 4.0 spec: §7.3.3 Unary operator overload resolution
            string overloadableOperatorName = GetOverloadableOperatorName(op);
            if (overloadableOperatorName == null) {
                switch (op) {
                    case UnaryOperatorType.Dereference:
                        PointerType p = expression.Type as PointerType;
                        if (p != null)
                            return UnaryOperatorResolveResult(p.ElementType, op, expression);
                        else
                            return ErrorResult;
                    case UnaryOperatorType.AddressOf:
                        return UnaryOperatorResolveResult(new PointerType(expression.Type), op, expression);
                    case UnaryOperatorType.Await: {
                        ResolveResult getAwaiterMethodGroup = ResolveMemberAccess(expression, "GetAwaiter", EmptyList<IType>.Instance, NameLookupMode.InvocationTarget);
                        ResolveResult getAwaiterInvocation = ResolveInvocation(getAwaiterMethodGroup, new ResolveResult[0], argumentNames: null, allowOptionalParameters: false);

                        var lookup = CreateMemberLookup();
                        IMethod getResultMethod;
                        IType awaitResultType;
                        var getResultMethodGroup = lookup.Lookup(getAwaiterInvocation, "GetResult", EmptyList<IType>.Instance, true) as MethodGroupResolveResult;
                        if (getResultMethodGroup != null) {
                            var getResultOR = getResultMethodGroup.PerformOverloadResolution(compilation, new ResolveResult[0], allowExtensionMethods: false, conversions: conversions);
                            getResultMethod = getResultOR.FoundApplicableCandidate ? getResultOR.GetBestCandidateWithSubstitutedTypeArguments() as IMethod : null;
                            awaitResultType = getResultMethod != null ? getResultMethod.ReturnType : SpecialType.UnknownType;
                        }
                        else {
                            getResultMethod = null;
                            awaitResultType = SpecialType.UnknownType;
                        }

                        var isCompletedRR = lookup.Lookup(getAwaiterInvocation, "IsCompleted", EmptyList<IType>.Instance, false);
                        var isCompletedProperty = (isCompletedRR is MemberResolveResult ? ((MemberResolveResult)isCompletedRR).Member as IProperty : null);
                        if (isCompletedProperty != null && (!isCompletedProperty.ReturnType.IsKnownType(KnownTypeCode.Boolean) || !isCompletedProperty.CanGet))
                            isCompletedProperty = null;

                        var interfaceOnCompleted = compilation.FindType(KnownTypeCode.INotifyCompletion).GetMethods().FirstOrDefault(x => x.Name == "OnCompleted");
                        var interfaceUnsafeOnCompleted = compilation.FindType(KnownTypeCode.ICriticalNotifyCompletion).GetMethods().FirstOrDefault(x => x.Name == "UnsafeOnCompleted");

                        IMethod onCompletedMethod = null;
                        var candidates = getAwaiterInvocation.Type.GetMethods().Where(x => x.ImplementedInterfaceMembers.Select(y => y.MemberDefinition).Contains(interfaceUnsafeOnCompleted)).ToList();
                        if (candidates.Count == 0) {
                            candidates = getAwaiterInvocation.Type.GetMethods().Where(x => x.ImplementedInterfaceMembers.Select(y => y.MemberDefinition).Contains(interfaceOnCompleted)).ToList();
                            if (candidates.Count == 1)
                                onCompletedMethod = candidates[0];
                        }
                        else if (candidates.Count == 1) {
                            onCompletedMethod = candidates[0];
                        }

                        return new AwaitResolveResult(awaitResultType, getAwaiterInvocation, getAwaiterInvocation.Type, isCompletedProperty, onCompletedMethod, getResultMethod);
                    }

                    default:
                        throw new ArgumentException("Invalid value for UnaryOperatorType", "op");
                }
            }
            // If the type is nullable, get the underlying type:
            IType type = NullableType.GetUnderlyingType(expression.Type);
            bool isNullable = NullableType.IsNullable(expression.Type);

            // the operator is overloadable:
            OverloadResolution userDefinedOperatorOR = CreateOverloadResolution(new[] { expression });
            foreach (var candidate in GetUserDefinedOperatorCandidates(type, overloadableOperatorName)) {
                userDefinedOperatorOR.AddCandidate(candidate);
            }
            if (userDefinedOperatorOR.FoundApplicableCandidate) {
                return CreateResolveResultForUserDefinedOperator(userDefinedOperatorOR, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow));
            }

            expression = UnaryNumericPromotion(op, ref type, isNullable, expression);
            CSharpOperators.OperatorMethod[] methodGroup;
            CSharpOperators operators = CSharpOperators.Get(compilation);
            switch (op) {
                case UnaryOperatorType.Increment:
                case UnaryOperatorType.Decrement:
                case UnaryOperatorType.PostIncrement:
                case UnaryOperatorType.PostDecrement:
                    // C# 4.0 spec: §7.6.9 Postfix increment and decrement operators
                    // C# 4.0 spec: §7.7.5 Prefix increment and decrement operators
                    TypeCode code = ReflectionHelper.GetTypeCode(type);
                    if ((code >= TypeCode.Char && code <= TypeCode.Decimal) || type.Kind == TypeKind.Enum || type.Kind == TypeKind.Pointer)
                        return UnaryOperatorResolveResult(expression.Type, op, expression, isNullable);
                    else
                        return new ErrorResolveResult(expression.Type);
                case UnaryOperatorType.Plus:
                    methodGroup = operators.UnaryPlusOperators;
                    break;
                case UnaryOperatorType.Minus:
                    methodGroup = CheckForOverflow ? operators.CheckedUnaryMinusOperators : operators.UncheckedUnaryMinusOperators;
                    break;
                case UnaryOperatorType.Not:
                    methodGroup = operators.LogicalNegationOperators;
                    break;
                case UnaryOperatorType.BitNot:
                    if (type.Kind == TypeKind.Enum) {
                        if (expression.IsCompileTimeConstant && !isNullable && expression.ConstantValue != null) {
                            // evaluate as (E)(~(U)x);
                            var U = compilation.FindType(expression.ConstantValue.GetType());
                            var unpackedEnum = new ConstantResolveResult(U, expression.ConstantValue);
                            return CheckErrorAndResolveUncheckedCast(expression.Type, ResolveUnaryOperator(op, unpackedEnum));
                        } else {
                            return UnaryOperatorResolveResult(expression.Type, op, expression, isNullable);
                        }
                    } else {
                        methodGroup = operators.BitwiseComplementOperators;
                        break;
                    }
                default:
                    throw new InvalidOperationException();
            }
            OverloadResolution builtinOperatorOR = CreateOverloadResolution(new[] { expression });
            foreach (var candidate in methodGroup) {
                builtinOperatorOR.AddCandidate(candidate);
            }
            CSharpOperators.UnaryOperatorMethod m = (CSharpOperators.UnaryOperatorMethod)builtinOperatorOR.BestCandidate;
            IType resultType = m.ReturnType;
            if (builtinOperatorOR.BestCandidateErrors != OverloadResolutionErrors.None) {
                if (userDefinedOperatorOR.BestCandidate != null) {
                    // If there are any user-defined operators, prefer those over the built-in operators.
                    // It'll be a more informative error.
                    return CreateResolveResultForUserDefinedOperator(userDefinedOperatorOR, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow));
                } else if (builtinOperatorOR.BestCandidateAmbiguousWith != null) {
                    // If the best candidate is ambiguous, just use the input type instead
                    // of picking one of the ambiguous overloads.
                    return new ErrorResolveResult(expression.Type);
                } else {
                    return new ErrorResolveResult(resultType);
                }
            } else if (expression.IsCompileTimeConstant && m.CanEvaluateAtCompileTime) {
                object val;
                try {
                    val = m.Invoke(this, expression.ConstantValue);
                } catch (ArithmeticException) {
                    return new ErrorResolveResult(resultType);
                }
                return new ConstantResolveResult(resultType, val);
            } else {
                expression = Convert(expression, m.Parameters[0].Type, builtinOperatorOR.ArgumentConversions[0]);
                return UnaryOperatorResolveResult(resultType, op, expression,
                                                  builtinOperatorOR.BestCandidate is OverloadResolution.ILiftedOperator);
            }
        }
Esempio n. 29
0
 static BinaryOperatorType GetEquivalentBinaryOperator(UnaryOperatorType op)
 {
     switch (op)
     {
         case UnaryOperatorType.PostIncrement:
         case UnaryOperatorType.Increment:
             return BinaryOperatorType.Addition;
         case UnaryOperatorType.PostDecrement:
         case UnaryOperatorType.Decrement:
             return BinaryOperatorType.Subtraction;
     }
     throw new ArgumentException("op");
 }
Esempio n. 30
0
 BinaryOperatorType GetEquivalentBinaryOperator(UnaryOperatorType op)
 {
     return op == UnaryOperatorType.Increment || op == UnaryOperatorType.PostIncrement
         ? BinaryOperatorType.Addition
         : BinaryOperatorType.Subtraction;
 }
Esempio n. 31
0
 static string GetUnaryOperatorText(UnaryOperatorType op)
 {
     return BooPrinterVisitor.GetUnaryOperatorText(op);
 }
Esempio n. 32
0
		OperatorResolveResult UnaryOperatorResolveResult(IType resultType, UnaryOperatorType op, ResolveResult expression, bool isLifted = false)
		{
			return new OperatorResolveResult(
				resultType, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow),
				null, isLifted, new[] { expression });
		}
Esempio n. 33
0
 static string GetOverloadableOperatorName(UnaryOperatorType op)
 {
     switch (op) {
         case UnaryOperatorType.Not:
             return "op_LogicalNot";
         case UnaryOperatorType.BitNot:
             return "op_OnesComplement";
         case UnaryOperatorType.Minus:
             return "op_UnaryNegation";
         case UnaryOperatorType.Plus:
             return "op_UnaryPlus";
         case UnaryOperatorType.Increment:
         case UnaryOperatorType.PostIncrement:
             return "op_Increment";
         case UnaryOperatorType.Decrement:
         case UnaryOperatorType.PostDecrement:
             return "op_Decrement";
         default:
             return null;
     }
 }
Esempio n. 34
0
		static string GetOperatorName (UnaryOperatorType type)
		{
			switch (type) {
			case UnaryOperatorType.Not:
				return "op_LogicalNot";
			case UnaryOperatorType.BitNot:
				return "op_OnesComplement";
			case UnaryOperatorType.Minus:
				return "op_UnaryNegation";
			case UnaryOperatorType.Plus:
				return "op_UnaryPlus";
			}
			return null;
		}
Esempio n. 35
0
 OperatorResolveResult UnaryOperatorResolveResult(IType resultType, UnaryOperatorType op, ResolveResult expression)
 {
     return new OperatorResolveResult(resultType, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), expression);
 }
Esempio n. 36
0
 public ILUnaryOperatorInvokation(UnaryOperatorType o, ILValue i) : this(i.GetValueType().GetUnaryOperator(o), i)
 {
 }