/// <summary>
        /// Creates a method symbol that can be used to describe an operator declaration.
        /// </summary>
        public static IMethodSymbol CreateOperatorSymbol(
            ImmutableArray <AttributeData> attributes,
            Accessibility accessibility,
            DeclarationModifiers modifiers,
            ITypeSymbol returnType,
            CodeGenerationOperatorKind operatorKind,
            ImmutableArray <IParameterSymbol> parameters,
            ImmutableArray <SyntaxNode> statements = default,
            ImmutableArray <AttributeData> returnTypeAttributes = default)
        {
            var expectedParameterCount = CodeGenerationOperatorSymbol.GetParameterCount(operatorKind);

            if (parameters.Length != expectedParameterCount)
            {
                var message = expectedParameterCount == 1 ?
                              WorkspacesResources.Invalid_number_of_parameters_for_unary_operator :
                              WorkspacesResources.Invalid_number_of_parameters_for_binary_operator;
                throw new ArgumentException(message, nameof(parameters));
            }

            var result = new CodeGenerationOperatorSymbol(null, attributes, accessibility, modifiers, returnType, operatorKind, parameters, returnTypeAttributes);

            CodeGenerationMethodInfo.Attach(result, modifiers.IsNew, modifiers.IsUnsafe, modifiers.IsPartial, modifiers.IsAsync, statements, handlesExpressions: default);
            return(result);
        }
예제 #2
0
 public CodeGenerationOperatorSymbol(
     INamedTypeSymbol containingType,
     ImmutableArray <AttributeData> attributes,
     Accessibility accessibility,
     DeclarationModifiers modifiers,
     ITypeSymbol returnType,
     CodeGenerationOperatorKind operatorKind,
     ImmutableArray <IParameterSymbol> parameters,
     ImmutableArray <AttributeData> returnTypeAttributes,
     string documentationCommentXml
     )
     : base(
         containingType,
         attributes,
         accessibility,
         modifiers,
         returnType,
         refKind: RefKind.None,
         explicitInterfaceImplementations: default,
         GetMetadataName(operatorKind),
         typeParameters: ImmutableArray <ITypeParameterSymbol> .Empty,
         parameters,
         returnTypeAttributes,
         documentationCommentXml
         )
 {
 }
        public static int GetParameterCount(CodeGenerationOperatorKind operatorKind)
        {
            switch (operatorKind)
            {
            case CodeGenerationOperatorKind.Addition:
            case CodeGenerationOperatorKind.BitwiseAnd:
            case CodeGenerationOperatorKind.BitwiseOr:
            case CodeGenerationOperatorKind.Concatenate:
            case CodeGenerationOperatorKind.Division:
            case CodeGenerationOperatorKind.Equality:
            case CodeGenerationOperatorKind.ExclusiveOr:
            case CodeGenerationOperatorKind.Exponent:
            case CodeGenerationOperatorKind.GreaterThan:
            case CodeGenerationOperatorKind.GreaterThanOrEqual:
            case CodeGenerationOperatorKind.Inequality:
            case CodeGenerationOperatorKind.IntegerDivision:
            case CodeGenerationOperatorKind.LeftShift:
            case CodeGenerationOperatorKind.LessThan:
            case CodeGenerationOperatorKind.LessThanOrEqual:
            case CodeGenerationOperatorKind.Like:
            case CodeGenerationOperatorKind.Modulus:
            case CodeGenerationOperatorKind.Multiplication:
            case CodeGenerationOperatorKind.RightShift:
            case CodeGenerationOperatorKind.Subtraction:
                return(2);

            case CodeGenerationOperatorKind.Increment:
            case CodeGenerationOperatorKind.Decrement:
            case CodeGenerationOperatorKind.False:
            case CodeGenerationOperatorKind.LogicalNot:
            case CodeGenerationOperatorKind.OnesComplement:
            case CodeGenerationOperatorKind.True:
            case CodeGenerationOperatorKind.UnaryPlus:
            case CodeGenerationOperatorKind.UnaryNegation:
                return(1);

            default:
                Debug.Fail("This switch statement should handle all possible CodeGenerationOperatorKinds");
                return(0);
            }
        }
        public static int GetParameterCount(CodeGenerationOperatorKind operatorKind)
        {
            switch (operatorKind)
            {
            case CodeGenerationOperatorKind.Addition:
            case CodeGenerationOperatorKind.BitwiseAnd:
            case CodeGenerationOperatorKind.BitwiseOr:
            case CodeGenerationOperatorKind.Concatenate:
            case CodeGenerationOperatorKind.Division:
            case CodeGenerationOperatorKind.Equality:
            case CodeGenerationOperatorKind.ExclusiveOr:
            case CodeGenerationOperatorKind.Exponent:
            case CodeGenerationOperatorKind.GreaterThan:
            case CodeGenerationOperatorKind.GreaterThanOrEqual:
            case CodeGenerationOperatorKind.Inequality:
            case CodeGenerationOperatorKind.IntegerDivision:
            case CodeGenerationOperatorKind.LeftShift:
            case CodeGenerationOperatorKind.LessThan:
            case CodeGenerationOperatorKind.LessThanOrEqual:
            case CodeGenerationOperatorKind.Like:
            case CodeGenerationOperatorKind.Modulus:
            case CodeGenerationOperatorKind.Multiplication:
            case CodeGenerationOperatorKind.RightShift:
            case CodeGenerationOperatorKind.UnsignedRightShift:
            case CodeGenerationOperatorKind.Subtraction:
                return(2);

            case CodeGenerationOperatorKind.Increment:
            case CodeGenerationOperatorKind.Decrement:
            case CodeGenerationOperatorKind.False:
            case CodeGenerationOperatorKind.LogicalNot:
            case CodeGenerationOperatorKind.OnesComplement:
            case CodeGenerationOperatorKind.True:
            case CodeGenerationOperatorKind.UnaryPlus:
            case CodeGenerationOperatorKind.UnaryNegation:
                return(1);

            default:
                throw ExceptionUtilities.UnexpectedValue(operatorKind);
            }
        }
 public CodeGenerationOperatorSymbol(
     INamedTypeSymbol containingType,
     IList<AttributeData> attributes,
     Accessibility accessibility,
     DeclarationModifiers modifiers,
     ITypeSymbol returnType,
     CodeGenerationOperatorKind operatorKind,
     IList<IParameterSymbol> parameters,
     IList<AttributeData> returnTypeAttributes) :
     base(containingType,
          attributes,
          accessibility,
          modifiers,
          returnType: returnType,
          explicitInterfaceSymbolOpt: null,
          name: GetMetadataName(operatorKind),
          typeParameters: SpecializedCollections.EmptyList<ITypeParameterSymbol>(),
          parameters: parameters,
          returnTypeAttributes: returnTypeAttributes)
 {
 }
 public CodeGenerationOperatorSymbol(
     INamedTypeSymbol containingType,
     IList <AttributeData> attributes,
     Accessibility accessibility,
     SymbolModifiers modifiers,
     ITypeSymbol returnType,
     CodeGenerationOperatorKind operatorKind,
     IList <IParameterSymbol> parameters,
     IList <AttributeData> returnTypeAttributes) :
     base(containingType,
          attributes,
          accessibility,
          modifiers,
          returnType: returnType,
          explicitInterfaceSymbolOpt: null,
          name: GetMetadataName(operatorKind),
          typeParameters: SpecializedCollections.EmptyList <ITypeParameterSymbol>(),
          parameters: parameters,
          returnTypeAttributes: returnTypeAttributes)
 {
 }
예제 #7
0
        internal static async Task TestAddUnsupportedOperatorAsync(
            string initial,
            CodeGenerationOperatorKind operatorKind,
            Accessibility accessibility    = Accessibility.Public,
            DeclarationModifiers modifiers = default(DeclarationModifiers),
            Type returnType = null,
            IList <Func <SemanticModel, IParameterSymbol> > parameters = null,
            string statements = null,
            CodeGenerationOptions codeGenerationOptions = default(CodeGenerationOptions),
            bool compareTokens = true)
        {
            using (var context = await TestContext.CreateAsync(initial, initial, ignoreResult: true))
            {
                var parameterSymbols = GetParameterSymbols(parameters, context);
                var parsedStatements = context.ParseStatements(statements);

                var method = CodeGenerationSymbolFactory.CreateOperatorSymbol(
                    null,
                    accessibility,
                    modifiers,
                    GetTypeSymbol(returnType)(context.SemanticModel),
                    operatorKind,
                    parameterSymbols,
                    parsedStatements);

                ArgumentException exception = null;
                try
                {
                    await context.Service.AddMethodAsync(context.Solution, (INamedTypeSymbol)context.GetDestination(), method, codeGenerationOptions);
                }
                catch (ArgumentException e)
                {
                    exception = e;
                }

                var expectedMessage = string.Format(WorkspacesResources.CannotCodeGenUnsupportedOperator, method.Name);
                Assert.True(exception != null && exception.Message.StartsWith(expectedMessage, StringComparison.Ordinal),
                            string.Format("\r\nExpected exception: {0}\r\nActual exception: {1}\r\n", expectedMessage, exception == null ? "no exception" : exception.Message));
            }
        }
 public static int GetParameterCount(CodeGenerationOperatorKind operatorKind)
 {
     switch (operatorKind)
     {
         case CodeGenerationOperatorKind.Addition:
         case CodeGenerationOperatorKind.BitwiseAnd:
         case CodeGenerationOperatorKind.BitwiseOr:
         case CodeGenerationOperatorKind.Concatenate:
         case CodeGenerationOperatorKind.Division:
         case CodeGenerationOperatorKind.Equality:
         case CodeGenerationOperatorKind.ExclusiveOr:
         case CodeGenerationOperatorKind.Exponent:
         case CodeGenerationOperatorKind.GreaterThan:
         case CodeGenerationOperatorKind.GreaterThanOrEqual:
         case CodeGenerationOperatorKind.Inequality:
         case CodeGenerationOperatorKind.IntegerDivision:
         case CodeGenerationOperatorKind.LeftShift:
         case CodeGenerationOperatorKind.LessThan:
         case CodeGenerationOperatorKind.LessThanOrEqual:
         case CodeGenerationOperatorKind.Like:
         case CodeGenerationOperatorKind.Modulus:
         case CodeGenerationOperatorKind.Multiplication:
         case CodeGenerationOperatorKind.RightShift:
         case CodeGenerationOperatorKind.Subtraction:
             return 2;
         case CodeGenerationOperatorKind.Increment:
         case CodeGenerationOperatorKind.Decrement:
         case CodeGenerationOperatorKind.False:
         case CodeGenerationOperatorKind.LogicalNot:
         case CodeGenerationOperatorKind.OnesComplement:
         case CodeGenerationOperatorKind.True:
         case CodeGenerationOperatorKind.UnaryPlus:
         case CodeGenerationOperatorKind.UnaryNegation:
             return 1;
         default:
             Debug.Fail("This switch statement should handle all possible CodeGenerationOperatorKinds");
             return 0;
     }
 }
예제 #9
0
 public CodeGenerationOperatorSymbol(
     INamedTypeSymbol containingType,
     ImmutableArray <AttributeData> attributes,
     Accessibility accessibility,
     DeclarationModifiers modifiers,
     ITypeSymbol returnType,
     CodeGenerationOperatorKind operatorKind,
     ImmutableArray <IParameterSymbol> parameters,
     ImmutableArray <AttributeData> returnTypeAttributes)
     : base(containingType,
            attributes,
            accessibility,
            modifiers,
            returnType: returnType,
            returnsByRef: false,
            explicitInterfaceSymbolOpt: null,
            name: GetMetadataName(operatorKind),
            typeParameters: ImmutableArray <ITypeParameterSymbol> .Empty,
            parameters: parameters,
            returnTypeAttributes: returnTypeAttributes)
 {
 }
 public static int GetParameterCount(CodeGenerationOperatorKind operatorKind)
 {
     switch (operatorKind)
     {
         case CodeGenerationOperatorKind.Addition:
         case CodeGenerationOperatorKind.BitwiseAnd:
         case CodeGenerationOperatorKind.BitwiseOr:
         case CodeGenerationOperatorKind.Concatenate:
         case CodeGenerationOperatorKind.Division:
         case CodeGenerationOperatorKind.Equality:
         case CodeGenerationOperatorKind.ExclusiveOr:
         case CodeGenerationOperatorKind.Exponent:
         case CodeGenerationOperatorKind.GreaterThan:
         case CodeGenerationOperatorKind.GreaterThanOrEqual:
         case CodeGenerationOperatorKind.Inequality:
         case CodeGenerationOperatorKind.IntegerDivision:
         case CodeGenerationOperatorKind.LeftShift:
         case CodeGenerationOperatorKind.LessThan:
         case CodeGenerationOperatorKind.LessThanOrEqual:
         case CodeGenerationOperatorKind.Like:
         case CodeGenerationOperatorKind.Modulus:
         case CodeGenerationOperatorKind.Multiplication:
         case CodeGenerationOperatorKind.RightShift:
         case CodeGenerationOperatorKind.Subtraction:
             return 2;
         case CodeGenerationOperatorKind.Increment:
         case CodeGenerationOperatorKind.Decrement:
         case CodeGenerationOperatorKind.False:
         case CodeGenerationOperatorKind.LogicalNot:
         case CodeGenerationOperatorKind.OnesComplement:
         case CodeGenerationOperatorKind.True:
         case CodeGenerationOperatorKind.UnaryPlus:
         case CodeGenerationOperatorKind.UnaryNegation:
             return 1;
         default:
             throw ExceptionUtilities.UnexpectedValue(operatorKind);
     }
 }
예제 #11
0
 private static string GetMetadataName(CodeGenerationOperatorKind operatorKind)
 {
     switch (operatorKind)
     {
         case CodeGenerationOperatorKind.Addition: return WellKnownMemberNames.AdditionOperatorName;
         case CodeGenerationOperatorKind.BitwiseAnd: return WellKnownMemberNames.BitwiseAndOperatorName;
         case CodeGenerationOperatorKind.BitwiseOr: return WellKnownMemberNames.BitwiseOrOperatorName;
         case CodeGenerationOperatorKind.Concatenate: return WellKnownMemberNames.ConcatenateOperatorName;
         case CodeGenerationOperatorKind.Decrement: return WellKnownMemberNames.DecrementOperatorName;
         case CodeGenerationOperatorKind.Division: return WellKnownMemberNames.DivisionOperatorName;
         case CodeGenerationOperatorKind.Equality: return WellKnownMemberNames.EqualityOperatorName;
         case CodeGenerationOperatorKind.ExclusiveOr: return WellKnownMemberNames.ExclusiveOrOperatorName;
         case CodeGenerationOperatorKind.Exponent: return WellKnownMemberNames.ExponentOperatorName;
         case CodeGenerationOperatorKind.False: return WellKnownMemberNames.FalseOperatorName;
         case CodeGenerationOperatorKind.GreaterThan: return WellKnownMemberNames.GreaterThanOperatorName;
         case CodeGenerationOperatorKind.GreaterThanOrEqual: return WellKnownMemberNames.GreaterThanOrEqualOperatorName;
         case CodeGenerationOperatorKind.Increment: return WellKnownMemberNames.IncrementOperatorName;
         case CodeGenerationOperatorKind.Inequality: return WellKnownMemberNames.InequalityOperatorName;
         case CodeGenerationOperatorKind.IntegerDivision: return WellKnownMemberNames.IntegerDivisionOperatorName;
         case CodeGenerationOperatorKind.LeftShift: return WellKnownMemberNames.LeftShiftOperatorName;
         case CodeGenerationOperatorKind.LessThan: return WellKnownMemberNames.LessThanOperatorName;
         case CodeGenerationOperatorKind.LessThanOrEqual: return WellKnownMemberNames.LessThanOrEqualOperatorName;
         case CodeGenerationOperatorKind.Like: return WellKnownMemberNames.LikeOperatorName;
         case CodeGenerationOperatorKind.LogicalNot: return WellKnownMemberNames.LogicalNotOperatorName;
         case CodeGenerationOperatorKind.Modulus: return WellKnownMemberNames.ModulusOperatorName;
         case CodeGenerationOperatorKind.Multiplication: return WellKnownMemberNames.MultiplyOperatorName;
         case CodeGenerationOperatorKind.OnesComplement: return WellKnownMemberNames.OnesComplementOperatorName;
         case CodeGenerationOperatorKind.RightShift: return WellKnownMemberNames.RightShiftOperatorName;
         case CodeGenerationOperatorKind.Subtraction: return WellKnownMemberNames.SubtractionOperatorName;
         case CodeGenerationOperatorKind.True: return WellKnownMemberNames.TrueOperatorName;
         case CodeGenerationOperatorKind.UnaryPlus: return WellKnownMemberNames.UnaryPlusOperatorName;
         case CodeGenerationOperatorKind.UnaryNegation: return WellKnownMemberNames.UnaryNegationOperatorName;
         default:
             Debug.Fail("This switch statement should handle all possible CodeGenerationOperatorKinds");
             return string.Empty;
     }
 }
 private static string GetMetadataName(CodeGenerationOperatorKind operatorKind)
 {
     switch (operatorKind)
     {
         case CodeGenerationOperatorKind.Addition: return WellKnownMemberNames.AdditionOperatorName;
         case CodeGenerationOperatorKind.BitwiseAnd: return WellKnownMemberNames.BitwiseAndOperatorName;
         case CodeGenerationOperatorKind.BitwiseOr: return WellKnownMemberNames.BitwiseOrOperatorName;
         case CodeGenerationOperatorKind.Concatenate: return WellKnownMemberNames.ConcatenateOperatorName;
         case CodeGenerationOperatorKind.Decrement: return WellKnownMemberNames.DecrementOperatorName;
         case CodeGenerationOperatorKind.Division: return WellKnownMemberNames.DivisionOperatorName;
         case CodeGenerationOperatorKind.Equality: return WellKnownMemberNames.EqualityOperatorName;
         case CodeGenerationOperatorKind.ExclusiveOr: return WellKnownMemberNames.ExclusiveOrOperatorName;
         case CodeGenerationOperatorKind.Exponent: return WellKnownMemberNames.ExponentOperatorName;
         case CodeGenerationOperatorKind.False: return WellKnownMemberNames.FalseOperatorName;
         case CodeGenerationOperatorKind.GreaterThan: return WellKnownMemberNames.GreaterThanOperatorName;
         case CodeGenerationOperatorKind.GreaterThanOrEqual: return WellKnownMemberNames.GreaterThanOrEqualOperatorName;
         case CodeGenerationOperatorKind.Increment: return WellKnownMemberNames.IncrementOperatorName;
         case CodeGenerationOperatorKind.Inequality: return WellKnownMemberNames.InequalityOperatorName;
         case CodeGenerationOperatorKind.IntegerDivision: return WellKnownMemberNames.IntegerDivisionOperatorName;
         case CodeGenerationOperatorKind.LeftShift: return WellKnownMemberNames.LeftShiftOperatorName;
         case CodeGenerationOperatorKind.LessThan: return WellKnownMemberNames.LessThanOperatorName;
         case CodeGenerationOperatorKind.LessThanOrEqual: return WellKnownMemberNames.LessThanOrEqualOperatorName;
         case CodeGenerationOperatorKind.Like: return WellKnownMemberNames.LikeOperatorName;
         case CodeGenerationOperatorKind.LogicalNot: return WellKnownMemberNames.LogicalNotOperatorName;
         case CodeGenerationOperatorKind.Modulus: return WellKnownMemberNames.ModulusOperatorName;
         case CodeGenerationOperatorKind.Multiplication: return WellKnownMemberNames.MultiplyOperatorName;
         case CodeGenerationOperatorKind.OnesComplement: return WellKnownMemberNames.OnesComplementOperatorName;
         case CodeGenerationOperatorKind.RightShift: return WellKnownMemberNames.RightShiftOperatorName;
         case CodeGenerationOperatorKind.Subtraction: return WellKnownMemberNames.SubtractionOperatorName;
         case CodeGenerationOperatorKind.True: return WellKnownMemberNames.TrueOperatorName;
         case CodeGenerationOperatorKind.UnaryPlus: return WellKnownMemberNames.UnaryPlusOperatorName;
         case CodeGenerationOperatorKind.UnaryNegation: return WellKnownMemberNames.UnaryNegationOperatorName;
         default:
             throw ExceptionUtilities.UnexpectedValue(operatorKind);
     }
 }
        private static string GetMetadataName(CodeGenerationOperatorKind operatorKind)
        {
            switch (operatorKind)
            {
            case CodeGenerationOperatorKind.Addition: return(WellKnownMemberNames.AdditionOperatorName);

            case CodeGenerationOperatorKind.BitwiseAnd: return(WellKnownMemberNames.BitwiseAndOperatorName);

            case CodeGenerationOperatorKind.BitwiseOr: return(WellKnownMemberNames.BitwiseOrOperatorName);

            case CodeGenerationOperatorKind.Concatenate: return(WellKnownMemberNames.ConcatenateOperatorName);

            case CodeGenerationOperatorKind.Decrement: return(WellKnownMemberNames.DecrementOperatorName);

            case CodeGenerationOperatorKind.Division: return(WellKnownMemberNames.DivisionOperatorName);

            case CodeGenerationOperatorKind.Equality: return(WellKnownMemberNames.EqualityOperatorName);

            case CodeGenerationOperatorKind.ExclusiveOr: return(WellKnownMemberNames.ExclusiveOrOperatorName);

            case CodeGenerationOperatorKind.Exponent: return(WellKnownMemberNames.ExponentOperatorName);

            case CodeGenerationOperatorKind.False: return(WellKnownMemberNames.FalseOperatorName);

            case CodeGenerationOperatorKind.GreaterThan: return(WellKnownMemberNames.GreaterThanOperatorName);

            case CodeGenerationOperatorKind.GreaterThanOrEqual: return(WellKnownMemberNames.GreaterThanOrEqualOperatorName);

            case CodeGenerationOperatorKind.Increment: return(WellKnownMemberNames.IncrementOperatorName);

            case CodeGenerationOperatorKind.Inequality: return(WellKnownMemberNames.InequalityOperatorName);

            case CodeGenerationOperatorKind.IntegerDivision: return(WellKnownMemberNames.IntegerDivisionOperatorName);

            case CodeGenerationOperatorKind.LeftShift: return(WellKnownMemberNames.LeftShiftOperatorName);

            case CodeGenerationOperatorKind.LessThan: return(WellKnownMemberNames.LessThanOperatorName);

            case CodeGenerationOperatorKind.LessThanOrEqual: return(WellKnownMemberNames.LessThanOrEqualOperatorName);

            case CodeGenerationOperatorKind.Like: return(WellKnownMemberNames.LikeOperatorName);

            case CodeGenerationOperatorKind.LogicalNot: return(WellKnownMemberNames.LogicalNotOperatorName);

            case CodeGenerationOperatorKind.Modulus: return(WellKnownMemberNames.ModulusOperatorName);

            case CodeGenerationOperatorKind.Multiplication: return(WellKnownMemberNames.MultiplyOperatorName);

            case CodeGenerationOperatorKind.OnesComplement: return(WellKnownMemberNames.OnesComplementOperatorName);

            case CodeGenerationOperatorKind.RightShift: return(WellKnownMemberNames.RightShiftOperatorName);

            case CodeGenerationOperatorKind.Subtraction: return(WellKnownMemberNames.SubtractionOperatorName);

            case CodeGenerationOperatorKind.True: return(WellKnownMemberNames.TrueOperatorName);

            case CodeGenerationOperatorKind.UnaryPlus: return(WellKnownMemberNames.UnaryPlusOperatorName);

            case CodeGenerationOperatorKind.UnaryNegation: return(WellKnownMemberNames.UnaryNegationOperatorName);

            default:
                throw ExceptionUtilities.UnexpectedValue(operatorKind);
            }
        }
 private static string GetMetadataName(CodeGenerationOperatorKind operatorKind)
 => operatorKind switch
 {
        /// <summary>
        /// Creates a method symbol that can be used to describe an operator declaration.
        /// </summary>
        public static IMethodSymbol CreateOperatorSymbol(IList <AttributeData> attributes, Accessibility accessibility, SymbolModifiers modifiers, ITypeSymbol returnType, CodeGenerationOperatorKind operatorKind, IList <IParameterSymbol> parameters, IList <SyntaxNode> statements = null, IList <AttributeData> returnTypeAttributes = null)
        {
            int expectedParameterCount = CodeGenerationOperatorSymbol.GetParameterCount(operatorKind);

            if (parameters.Count != expectedParameterCount)
            {
                var message = expectedParameterCount == 1 ?
                              WorkspacesResources.InvalidParameterCountForUnaryOperator :
                              WorkspacesResources.InvalidParameterCountForBinaryOperator;
                throw new ArgumentException(message, "parameters");
            }

            var result = new CodeGenerationOperatorSymbol(null, attributes, accessibility, modifiers, returnType, operatorKind, parameters, returnTypeAttributes);

            CodeGenerationMethodInfo.Attach(result, modifiers.IsNew, modifiers.IsUnsafe, modifiers.IsPartial, modifiers.IsAsync, statements, handlesExpressions: null);
            return(result);
        }
예제 #16
0
        /// <summary>
        /// Creates a method symbol that can be used to describe an operator declaration.
        /// </summary>
        public static IMethodSymbol CreateOperatorSymbol(IList<AttributeData> attributes, Accessibility accessibility, DeclarationModifiers modifiers, ITypeSymbol returnType, CodeGenerationOperatorKind operatorKind, IList<IParameterSymbol> parameters, IList<SyntaxNode> statements = null, IList<AttributeData> returnTypeAttributes = null)
        {
            int expectedParameterCount = CodeGenerationOperatorSymbol.GetParameterCount(operatorKind);
            if (parameters.Count != expectedParameterCount)
            {
                var message = expectedParameterCount == 1 ?
                    WorkspacesResources.InvalidParameterCountForUnaryOperator :
                    WorkspacesResources.InvalidParameterCountForBinaryOperator;
                throw new ArgumentException(message, nameof(parameters));
            }

            var result = new CodeGenerationOperatorSymbol(null, attributes, accessibility, modifiers, returnType, operatorKind, parameters, returnTypeAttributes);
            CodeGenerationMethodInfo.Attach(result, modifiers.IsNew, modifiers.IsUnsafe, modifiers.IsPartial, modifiers.IsAsync, statements, handlesExpressions: null);
            return result;
        }
        private static string GetMetadataName(CodeGenerationOperatorKind operatorKind)
        {
            switch (operatorKind)
            {
            case CodeGenerationOperatorKind.Addition: return(WellKnownMemberNames.AdditionOperatorName);

            case CodeGenerationOperatorKind.BitwiseAnd: return(WellKnownMemberNames.BitwiseAndOperatorName);

            case CodeGenerationOperatorKind.BitwiseOr: return(WellKnownMemberNames.BitwiseOrOperatorName);

            case CodeGenerationOperatorKind.Concatenate: return(WellKnownMemberNames.ConcatenateOperatorName);

            case CodeGenerationOperatorKind.Decrement: return(WellKnownMemberNames.DecrementOperatorName);

            case CodeGenerationOperatorKind.Division: return(WellKnownMemberNames.DivisionOperatorName);

            case CodeGenerationOperatorKind.Equality: return(WellKnownMemberNames.EqualityOperatorName);

            case CodeGenerationOperatorKind.ExclusiveOr: return(WellKnownMemberNames.ExclusiveOrOperatorName);

            case CodeGenerationOperatorKind.Exponent: return(WellKnownMemberNames.ExponentOperatorName);

            case CodeGenerationOperatorKind.False: return(WellKnownMemberNames.FalseOperatorName);

            case CodeGenerationOperatorKind.GreaterThan: return(WellKnownMemberNames.GreaterThanOperatorName);

            case CodeGenerationOperatorKind.GreaterThanOrEqual: return(WellKnownMemberNames.GreaterThanOrEqualOperatorName);

            case CodeGenerationOperatorKind.Increment: return(WellKnownMemberNames.IncrementOperatorName);

            case CodeGenerationOperatorKind.Inequality: return(WellKnownMemberNames.InequalityOperatorName);

            case CodeGenerationOperatorKind.IntegerDivision: return(WellKnownMemberNames.IntegerDivisionOperatorName);

            case CodeGenerationOperatorKind.LeftShift: return(WellKnownMemberNames.LeftShiftOperatorName);

            case CodeGenerationOperatorKind.LessThan: return(WellKnownMemberNames.LessThanOperatorName);

            case CodeGenerationOperatorKind.LessThanOrEqual: return(WellKnownMemberNames.LessThanOrEqualOperatorName);

            case CodeGenerationOperatorKind.Like: return(WellKnownMemberNames.LikeOperatorName);

            case CodeGenerationOperatorKind.LogicalNot: return(WellKnownMemberNames.LogicalNotOperatorName);

            case CodeGenerationOperatorKind.Modulus: return(WellKnownMemberNames.ModulusOperatorName);

            case CodeGenerationOperatorKind.Multiplication: return(WellKnownMemberNames.MultiplyOperatorName);

            case CodeGenerationOperatorKind.OnesComplement: return(WellKnownMemberNames.OnesComplementOperatorName);

            case CodeGenerationOperatorKind.RightShift: return(WellKnownMemberNames.RightShiftOperatorName);

            case CodeGenerationOperatorKind.Subtraction: return(WellKnownMemberNames.SubtractionOperatorName);

            case CodeGenerationOperatorKind.True: return(WellKnownMemberNames.TrueOperatorName);

            case CodeGenerationOperatorKind.UnaryPlus: return(WellKnownMemberNames.UnaryPlusOperatorName);

            case CodeGenerationOperatorKind.UnaryNegation: return(WellKnownMemberNames.UnaryNegationOperatorName);

            default:
                Debug.Fail("This switch statement should handle all possible CodeGenerationOperatorKinds");
                return(string.Empty);
            }
        }