<PackageReference Include="Microsoft.CSharp" Version="4.6.0-preview6.19264.9" />

Operators

static class Operators
using Microsoft.CSharp.RuntimeBinder.Syntax; using System.Collections.Generic; namespace Microsoft.CSharp.RuntimeBinder.Semantics { internal static class Operators { private sealed class OperatorInfo { public readonly TokenKind TokenKind; public readonly PredefinedName MethodName; public readonly ExpressionKind ExpressionKind; public OperatorInfo(TokenKind kind, PredefinedName pn, ExpressionKind e) { TokenKind = kind; MethodName = pn; ExpressionKind = e; } } private static readonly OperatorInfo[] s_operatorInfos = new OperatorInfo[68] { new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Equal, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.PlusEqual, PredefinedName.PN_COUNT, (ExpressionKind)113), new OperatorInfo(TokenKind.MinusEqual, PredefinedName.PN_COUNT, (ExpressionKind)114), new OperatorInfo(TokenKind.SplatEqual, PredefinedName.PN_COUNT, (ExpressionKind)115), new OperatorInfo(TokenKind.SlashEqual, PredefinedName.PN_COUNT, (ExpressionKind)116), new OperatorInfo(TokenKind.PercentEqual, PredefinedName.PN_COUNT, (ExpressionKind)117), new OperatorInfo(TokenKind.AndEqual, PredefinedName.PN_COUNT, (ExpressionKind)120), new OperatorInfo(TokenKind.HatEqual, PredefinedName.PN_COUNT, (ExpressionKind)122), new OperatorInfo(TokenKind.BarEqual, PredefinedName.PN_COUNT, (ExpressionKind)121), new OperatorInfo(TokenKind.LeftShiftEqual, PredefinedName.PN_COUNT, (ExpressionKind)124), new OperatorInfo(TokenKind.RightShiftEqual, PredefinedName.PN_COUNT, (ExpressionKind)125), new OperatorInfo(TokenKind.Question, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.QuestionQuestion, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.LogicalOr, PredefinedName.PN_COUNT, ExpressionKind.LogicalOr), new OperatorInfo(TokenKind.LogicalAnd, PredefinedName.PN_COUNT, ExpressionKind.LogicalAnd), new OperatorInfo(TokenKind.Bar, PredefinedName.PN_OPBITWISEOR, ExpressionKind.BitwiseOr), new OperatorInfo(TokenKind.Hat, PredefinedName.PN_OPXOR, ExpressionKind.BitwiseExclusiveOr), new OperatorInfo(TokenKind.Ampersand, PredefinedName.PN_OPBITWISEAND, ExpressionKind.BitwiseAnd), new OperatorInfo(TokenKind.EqualEqual, PredefinedName.PN_OPEQUALITY, ExpressionKind.Eq), new OperatorInfo(TokenKind.NotEqual, PredefinedName.PN_OPINEQUALITY, ExpressionKind.NotEq), new OperatorInfo(TokenKind.LessThan, PredefinedName.PN_OPLESSTHAN, ExpressionKind.LessThan), new OperatorInfo(TokenKind.LessThanEqual, PredefinedName.PN_OPLESSTHANOREQUAL, ExpressionKind.LessThanOrEqual), new OperatorInfo(TokenKind.GreaterThan, PredefinedName.PN_OPGREATERTHAN, ExpressionKind.GreaterThan), new OperatorInfo(TokenKind.GreaterThanEqual, PredefinedName.PN_OPGREATERTHANOREQUAL, ExpressionKind.GreaterThanOrEqual), new OperatorInfo(TokenKind.Is, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.As, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.LeftShift, PredefinedName.PN_OPLEFTSHIFT, ExpressionKind.LeftShirt), new OperatorInfo(TokenKind.RightShift, PredefinedName.PN_OPRIGHTSHIFT, ExpressionKind.RightShift), new OperatorInfo(TokenKind.Plus, PredefinedName.PN_OPPLUS, ExpressionKind.Add), new OperatorInfo(TokenKind.Minus, PredefinedName.PN_OPMINUS, ExpressionKind.Subtract), new OperatorInfo(TokenKind.Splat, PredefinedName.PN_OPMULTIPLY, ExpressionKind.Multiply), new OperatorInfo(TokenKind.Slash, PredefinedName.PN_OPDIVISION, ExpressionKind.Divide), new OperatorInfo(TokenKind.Percent, PredefinedName.PN_OPMODULUS, ExpressionKind.Modulo), new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Plus, PredefinedName.PN_OPUNARYPLUS, ExpressionKind.UnaryPlus), new OperatorInfo(TokenKind.Minus, PredefinedName.PN_OPUNARYMINUS, ExpressionKind.Negate), new OperatorInfo(TokenKind.Tilde, PredefinedName.PN_OPCOMPLEMENT, ExpressionKind.BitwiseNot), new OperatorInfo(TokenKind.Bang, PredefinedName.PN_OPNEGATION, ExpressionKind.LogicalNot), new OperatorInfo(TokenKind.PlusPlus, PredefinedName.PN_OPINCREMENT, ExpressionKind.Add), new OperatorInfo(TokenKind.MinusMinus, PredefinedName.PN_OPDECREMENT, ExpressionKind.Subtract), new OperatorInfo(TokenKind.TypeOf, PredefinedName.PN_COUNT, ExpressionKind.TypeOf), new OperatorInfo(TokenKind.Checked, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Unchecked, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.MakeRef, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.RefValue, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.RefType, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.ArgList, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Splat, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Ampersand, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Colon, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.This, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Base, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Null, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.True, PredefinedName.PN_OPTRUE, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.False, PredefinedName.PN_OPFALSE, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.PlusPlus, PredefinedName.PN_COUNT, ExpressionKind.Add), new OperatorInfo(TokenKind.MinusMinus, PredefinedName.PN_COUNT, ExpressionKind.Subtract), new OperatorInfo(TokenKind.Dot, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Implicit, PredefinedName.PN_OPIMPLICITMN, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Explicit, PredefinedName.PN_OPEXPLICITMN, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_OPEQUALS, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_OPCOMPARE, ExpressionKind.ExpressionKindCount), new OperatorInfo(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.ExpressionKindCount) }; private static Dictionary<Name, string> s_operatorsByName; private static Dictionary<Name, string> GetOperatorByName() { Dictionary<Name, string> dictionary = new Dictionary<Name, string>(28) { { NameManager.GetPredefinedName(PredefinedName.PN_OPEQUALS), "equals" }, { NameManager.GetPredefinedName(PredefinedName.PN_OPCOMPARE), "compare" } }; OperatorInfo[] array = s_operatorInfos; foreach (OperatorInfo operatorInfo in array) { PredefinedName methodName = operatorInfo.MethodName; TokenKind tokenKind = operatorInfo.TokenKind; if (methodName != PredefinedName.PN_COUNT && tokenKind != TokenKind.Unknown) dictionary.Add(NameManager.GetPredefinedName(methodName), TokenFacts.GetText(tokenKind)); } return dictionary; } private static OperatorInfo GetInfo(OperatorKind op) { return s_operatorInfos[(uint)op]; } public static string OperatorOfMethodName(Name name) { return (s_operatorsByName ?? (s_operatorsByName = GetOperatorByName()))[name]; } public static string GetDisplayName(OperatorKind op) { return TokenFacts.GetText(GetInfo(op).TokenKind); } public static ExpressionKind GetExpressionKind(OperatorKind op) { return GetInfo(op).ExpressionKind; } } }