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)); }