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); }
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); }
protected MatchFactorNode(UnaryOperatorType op = UnaryOperatorType.None, MatchFactorNode next = null) { OpType = op; Next = next; }
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); }
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; }
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); } }
public UnaryOperator(string tokenText, UnaryOperatorType operatorType, TypeSymbol operandType) : this(tokenText, operatorType, operandType, operandType) { }
public override String GetOperatorString(UnaryOperatorType operatorType) { return base.GetOperatorString(operatorType); }
public UnaryOperatorExpression(UnaryOperatorType op) { }
/// <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; }
public UnaryOperatorExpression(Expression expression, UnaryOperatorType op) { Expression = expression; Op = op; }
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)); }
public string _Visit(UnaryOperatorType op) { return(UnaryOperatorExpression.GetOperatorRole(op).Token); }
public ConstantUnaryOperator(UnaryOperatorType operatorType, ConstantExpression expression) { if (expression == null) throw new ArgumentNullException("expression"); this.operatorType = operatorType; this.expression = expression; }
public FindUnaryOperatorNavigator(IMethod op, UnaryOperatorType operatorType) { this.op = op; this.operatorType = operatorType; }
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); } }
private bool UnaryExpressionFor(ExternalMethod method, out UnaryOperatorType op) { return(Enum.TryParse(method.Name.Substring("op_".Length), true, out op)); }
static UnaryOperatorType GetRelatedPreOperator(UnaryOperatorType op) { switch (op) { case UnaryOperatorType.PostIncrement: return UnaryOperatorType.Increment; case UnaryOperatorType.PostDecrement: return UnaryOperatorType.Decrement; } throw new ArgumentException("op"); }
public UnaryOperatorExpression(Expression expression, UnaryOperatorType op) { }
static public ILUnaryOperatorInvokation GetILUnaryOperatorInvokation(this ILValue item, UnaryOperatorType type) { return(new ILUnaryOperatorInvokation(type, item)); }
SearchScope FindUnaryOperator(IMethod op, UnaryOperatorType operatorType) { return FindOperator(op, m => new FindUnaryOperatorNavigator(m, operatorType)); }
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); } }
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"); }
BinaryOperatorType GetEquivalentBinaryOperator(UnaryOperatorType op) { return op == UnaryOperatorType.Increment || op == UnaryOperatorType.PostIncrement ? BinaryOperatorType.Addition : BinaryOperatorType.Subtraction; }
static string GetUnaryOperatorText(UnaryOperatorType op) { return BooPrinterVisitor.GetUnaryOperatorText(op); }
OperatorResolveResult UnaryOperatorResolveResult(IType resultType, UnaryOperatorType op, ResolveResult expression, bool isLifted = false) { return new OperatorResolveResult( resultType, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), null, isLifted, new[] { expression }); }
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; } }
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; }
OperatorResolveResult UnaryOperatorResolveResult(IType resultType, UnaryOperatorType op, ResolveResult expression) { return new OperatorResolveResult(resultType, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), expression); }
public ILUnaryOperatorInvokation(UnaryOperatorType o, ILValue i) : this(i.GetValueType().GetUnaryOperator(o), i) { }