Exemplo n.º 1
0
 public SendSizeAttribute(PrimitiveSizeType sizeType)
 {
     if (!Enum.IsDefined(typeof(PrimitiveSizeType), sizeType))
     {
         throw new InvalidEnumArgumentException(nameof(sizeType), (int)sizeType, typeof(PrimitiveSizeType));
     }
     TypeOfSize = sizeType;
 }
Exemplo n.º 2
0
 //If this CTOR is ever changed you MUST change: IsDefiningPolymorphicDefinition
 public WireDataContractAttribute(PrimitiveSizeType optionalSubtypeKeySize)
 {
     if (!Enum.IsDefined(typeof(PrimitiveSizeType), optionalSubtypeKeySize))
     {
         throw new InvalidEnumArgumentException(nameof(optionalSubtypeKeySize), (int)optionalSubtypeKeySize, typeof(PrimitiveSizeType));
     }
     OptionalSubTypeKeySize = optionalSubtypeKeySize;
 }
Exemplo n.º 3
0
 public SendSizeComplexArrayInvokationExpressionEmitter([NotNull] IArrayTypeSymbol arraySymbol, ISymbol member, PrimitiveSizeType sizeType, SerializationMode mode)
     : base(arraySymbol, member, mode)
 {
     if (!Enum.IsDefined(typeof(PrimitiveSizeType), sizeType))
     {
         throw new InvalidEnumArgumentException(nameof(sizeType), (int)sizeType, typeof(PrimitiveSizeType));
     }
     SizeType = sizeType;
 }
Exemplo n.º 4
0
 public RawDontTerminateLengthPrefixedStringTypeSerializationGenerator([NotNull] ITypeSymbol actualType, [NotNull] ISymbol member,
                                                                       SerializationMode mode, EncodingType encoding, PrimitiveSizeType sizeType)
     : base(actualType, member, mode, encoding)
 {
     if (!Enum.IsDefined(typeof(PrimitiveSizeType), sizeType))
     {
         throw new InvalidEnumArgumentException(nameof(sizeType), (int)sizeType, typeof(PrimitiveSizeType));
     }
     SizeType = sizeType;
 }
 private IInvokationExpressionEmittable CreateSendSizeExpressionEmitter(PrimitiveSizeType sizeType)
 {
     if (ActualType.ElementType.IsPrimitive())
     {
         return(new SendSizePrimitiveArrayInvokationExpressionEmitter(ActualType, Member, sizeType, Mode));
     }
     else
     {
         return(new SendSizeComplexArrayInvokationExpressionEmitter(ActualType, Member, sizeType, Mode));
     }
 }
        private IInvokationExpressionEmittable CreateSendSizeExpressionEmitter([NotNull] AttributeData sendSizeAttri)
        {
            if (sendSizeAttri == null)
            {
                throw new ArgumentNullException(nameof(sendSizeAttri));
            }

            //TODO: If this ever changes we're f****d.
            PrimitiveSizeType sizeType = InternalEnumExtensions.ParseFull <PrimitiveSizeType>(sendSizeAttri.ConstructorArguments.First().ToCSharpString(), true);

            return(CreateSendSizeExpressionEmitter(sizeType));
        }
        public override InvocationExpressionSyntax Create()
        {
            //Default to ASCII if no encoding specified
            EncodingType encodingType = EncodingType.ASCII;

            //Overriding default behavior.
            bool hasSaneDefaults = Member.ContainingType.HasAttributeExact <WireSaneDefaultsAttribute>(true);

            if (Member.HasAttributeExact <EncodingAttribute>())
            {
                encodingType = EncodingAttribute.Parse(Member.GetAttributeExact <EncodingAttribute>().ConstructorArguments.First().ToCSharpString());
            }

            if (Member.HasAttributeExact <KnownSizeAttribute>() && Member.HasAttributeExact <SendSizeAttribute>() && !hasSaneDefaults)
            {
                throw new InvalidOperationException($"Emit failed for Member: {ActualType} in Type: {Member.ContainingType.Name}. Cannot use Attributes: {nameof(SendSizeAttribute)} and {nameof(KnownSizeAttribute)} together.");
            }

            if (IsSendSizeString() && !Member.HasAttributeExact <DontTerminateAttribute>())
            {
                PrimitiveSizeType sendSize = SendSizeAttribute.Parse(Member.GetAttributeExact <SendSizeAttribute>().ConstructorArguments.First().ToCSharpString());
                var generator = new RawLengthPrefixedStringTypeSerializationGenerator(ActualType, Member, Mode, encodingType, sendSize);
                return(generator.Create());
            }
            else if (IsSendSizeString() || (hasSaneDefaults && !IsKnownSizeString()))             //SANE DEFAULT
            {
                //Dont Terminate attribute FOUND!
                PrimitiveSizeType sendSize = PrimitiveSizeType.Int32;                 //SANE DEFAULT size 65,000

                if (Member.HasAttributeExact <SendSizeAttribute>())
                {
                    sendSize = SendSizeAttribute.Parse(Member.GetAttributeExact <SendSizeAttribute>().ConstructorArguments.First().ToCSharpString());
                }

                var generator = new RawDontTerminateLengthPrefixedStringTypeSerializationGenerator(ActualType, Member, Mode, encodingType, sendSize);
                return(generator.Create());
            }
            else if (IsKnownSizeString())
            {
                int size = KnownSizeAttribute.Parse(Member.GetAttributeExact <KnownSizeAttribute>().ConstructorArguments.First().ToCSharpString());

                var generator = new RawKnownSizeStringTypeSerializerGenerator(ActualType, Member, Mode, encodingType, size, !Member.HasAttributeExact <DontTerminateAttribute>());
                return(generator.Create());
            }
            else
            {
                //If it's not knownsize or sendsize then let's emit the default!
                var generator = new RawDefaultStringTypeSerializerGenerator(ActualType, Member, Mode, encodingType, !Member.HasAttributeExact <DontTerminateAttribute>());
                return(generator.Create());
            }
        }
        public SendSizePrimitiveArrayInvokationExpressionEmitter([NotNull] IArrayTypeSymbol arraySymbol, ISymbol member, PrimitiveSizeType sizeType, SerializationMode mode)
            : base(arraySymbol, member, mode)
        {
            if (!Enum.IsDefined(typeof(PrimitiveSizeType), sizeType))
            {
                throw new InvalidEnumArgumentException(nameof(sizeType), (int)sizeType, typeof(PrimitiveSizeType));
            }
            SizeType = sizeType;

            if (!arraySymbol.ElementType.IsPrimitive())
            {
                throw new InvalidOperationException($"Type: {arraySymbol.ElementType.Name} must be primitive.");
            }
        }
Exemplo n.º 9
0
        private IInvokationExpressionEmittable CreateSendSizeExpressionEmitter([NotNull] AttributeData sendSizeAttri)
        {
            if (sendSizeAttri == null)
            {
                throw new ArgumentNullException(nameof(sendSizeAttri));
            }

            //TODO: If this ever changes we're f****d.
            PrimitiveSizeType sizeType = InternalEnumExtensions.ParseFull <PrimitiveSizeType>(sendSizeAttri.ConstructorArguments.First().ToCSharpString(), true);

            if (ActualType.ElementType.IsPrimitive())
            {
                return(new SendSizePrimitiveArrayInvokationExpressionEmitter(ActualType, Member, sizeType, Mode));
            }
            else
            {
                return(new SendSizeComplexArrayInvokationExpressionEmitter(ActualType, Member, sizeType, Mode));
            }
        }
Exemplo n.º 10
0
 private string ComputeTypeToSerializeTo()
 {
     if (Member.HasAttributeExact <EnumSizeAttribute>())
     {
         PrimitiveSizeType sizeType = EnumSizeAttribute.Parse(Member.GetAttributeExact <EnumSizeAttribute>().ConstructorArguments.First().ToCSharpString());
         return(sizeType.ToString());
     }
     else
     {
         //This is hacky but covers the case that enum array types can use this emitter.
         if (ActualType.IsEnumType())
         {
             return(ActualType.GetEnumUnderlyingType().Name);
         }
         else if (ActualType is IArrayTypeSymbol arraySymbol)
         {
             return(arraySymbol.ElementType.GetEnumUnderlyingType().Name);
         }
         else
         {
             throw new NotSupportedException($"Type: {ActualType.Name} cannot emit enum serialization.");
         }
     }
 }