public SendSizeAttribute(PrimitiveSizeType sizeType) { if (!Enum.IsDefined(typeof(PrimitiveSizeType), sizeType)) { throw new InvalidEnumArgumentException(nameof(sizeType), (int)sizeType, typeof(PrimitiveSizeType)); } TypeOfSize = sizeType; }
//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; }
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; }
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."); } }
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)); } }
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."); } } }