Exemple #1
0
 internal static ExpressionSyntax GenerateNonEnumValueExpression(ITypeSymbol type, object value,
                                                                 bool canUseFieldReference)
 {
     return(value switch
     {
         bool val => GenerateBooleanLiteralExpression(val),
         string val => GenerateStringLiteralExpression(val),
         char val => GenerateCharLiteralExpression(val),
         sbyte val => GenerateLiteralExpression(type, val, LiteralSpecialValues.SByteSpecialValues, null,
                                                canUseFieldReference, (s, v) => SyntaxFactory.Literal(s, v), x => x < 0, x => (sbyte)-x, "128"),
         short val => GenerateLiteralExpression(type, val, LiteralSpecialValues.Int16SpecialValues, null,
                                                canUseFieldReference, (s, v) => SyntaxFactory.Literal(s, v), x => x < 0, x => (short)-x, "32768"),
         int val => GenerateLiteralExpression(type, val, LiteralSpecialValues.Int32SpecialValues, null,
                                              canUseFieldReference, SyntaxFactory.Literal, x => x < 0, x => - x, "2147483648"),
         long val => GenerateLiteralExpression(type, val, LiteralSpecialValues.Int64SpecialValues, null,
                                               canUseFieldReference, SyntaxFactory.Literal, x => x < 0, x => - x, "9223372036854775808"),
         byte val => GenerateNonNegativeLiteralExpression(type, val, LiteralSpecialValues.ByteSpecialValues, null,
                                                          canUseFieldReference, (s, v) => SyntaxFactory.Literal(s, v)),
         ushort val => GenerateNonNegativeLiteralExpression(type, val, LiteralSpecialValues.UInt16SpecialValues, null,
                                                            canUseFieldReference, (s, v) => SyntaxFactory.Literal(s, (uint)v)),
         uint val => GenerateNonNegativeLiteralExpression(type, val, LiteralSpecialValues.UInt32SpecialValues, null,
                                                          canUseFieldReference, SyntaxFactory.Literal),
         ulong val => GenerateNonNegativeLiteralExpression(type, val, LiteralSpecialValues.UInt64SpecialValues, null,
                                                           canUseFieldReference, SyntaxFactory.Literal),
         float val => GenerateSingleLiteralExpression(type, val, canUseFieldReference),
         double val => GenerateDoubleLiteralExpression(type, val, canUseFieldReference),
         decimal val => GenerateLiteralExpression(type, val, LiteralSpecialValues.DecimalSpecialValues, null,
                                                  canUseFieldReference, SyntaxFactory.Literal, x => x < 0, x => - x, null),
         _ => type == null || type.IsReferenceType || type is IPointerTypeSymbol || type.IsNullable()
                                 ? GenerateNullLiteral()
                                 : (ExpressionSyntax)CSharpSyntaxGenerator.DefaultExpression(type)
     });
        private static SyntaxNode CreateMemberAccessExpression(
            IFieldSymbol field, INamedTypeSymbol enumType, SpecialType underlyingSpecialType)
        {
            if (SyntaxFacts.IsValidIdentifier(field.Name))
            {
                return(CSharpSyntaxGenerator.MemberAccessExpression(
                           enumType.GenerateTypeSyntax(),
                           SyntaxFactory.IdentifierName(field.Name)));
            }

            return(CreateExplicitlyCastedLiteralValue(enumType, underlyingSpecialType, field.ConstantValue));
        }