From 6b9e711763b9950a8f25044b60eec56919059f2b Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Wed, 24 Jul 2024 14:05:09 +0200 Subject: [PATCH 1/4] Protocol: remove members that are not NativeAOT/Trimming compatible. --- src/Tmds.DBus.Protocol/Dict.cs | 1 - src/Tmds.DBus.Protocol/MessageWriter.Array.cs | 56 - .../MessageWriter.Dictionary.cs | 61 +- .../MessageWriter.Struct.cs | 155 +-- .../MessageWriter.Variant.Dynamic.cs | 77 -- .../MessageWriter.WriteT.Dynamic.cs | 994 ---------------- .../MessageWriter.WriteT.cs | 4 - src/Tmds.DBus.Protocol/Reader.Array.cs | 42 - src/Tmds.DBus.Protocol/Reader.Dictionary.cs | 4 +- .../Reader.ReadT.Dynamic.cs | 1045 ----------------- src/Tmds.DBus.Protocol/Reader.ReadT.cs | 4 - src/Tmds.DBus.Protocol/Reader.Struct.cs | 309 ----- .../Reader.Variant.Dynamic.cs | 8 - src/Tmds.DBus.Protocol/Reader.cs | 2 - src/Tmds.DBus.Protocol/Strings.cs | 29 - src/Tmds.DBus.Protocol/TypeModel.Dynamic.cs | 134 --- src/Tmds.DBus.Protocol/TypeModel.cs | 8 - src/Tmds.DBus/DBusConnection.cs | 6 +- test/Tmds.DBus.Protocol.Tests/ReaderTests.cs | 77 +- test/Tmds.DBus.Protocol.Tests/WriterTests.cs | 21 - 20 files changed, 16 insertions(+), 3021 deletions(-) delete mode 100644 src/Tmds.DBus.Protocol/MessageWriter.Variant.Dynamic.cs delete mode 100644 src/Tmds.DBus.Protocol/MessageWriter.WriteT.Dynamic.cs delete mode 100644 src/Tmds.DBus.Protocol/Reader.ReadT.Dynamic.cs delete mode 100644 src/Tmds.DBus.Protocol/Reader.Struct.cs delete mode 100644 src/Tmds.DBus.Protocol/Reader.Variant.Dynamic.cs delete mode 100644 src/Tmds.DBus.Protocol/Strings.cs delete mode 100644 src/Tmds.DBus.Protocol/TypeModel.Dynamic.cs diff --git a/src/Tmds.DBus.Protocol/Dict.cs b/src/Tmds.DBus.Protocol/Dict.cs index 3d6472ce..d83d9840 100644 --- a/src/Tmds.DBus.Protocol/Dict.cs +++ b/src/Tmds.DBus.Protocol/Dict.cs @@ -35,7 +35,6 @@ public static implicit operator Variant(Dict value) void IDBusWritable.WriteTo(ref MessageWriter writer) => writer.WriteDictionary(_dict); - ICollection IDictionary.Keys => _dict.Keys; ICollection IDictionary.Values => _dict.Values; diff --git a/src/Tmds.DBus.Protocol/MessageWriter.Array.cs b/src/Tmds.DBus.Protocol/MessageWriter.Array.cs index 3739a257..d24f92e6 100644 --- a/src/Tmds.DBus.Protocol/MessageWriter.Array.cs +++ b/src/Tmds.DBus.Protocol/MessageWriter.Array.cs @@ -119,19 +119,6 @@ public void WriteArray(ReadOnlySpan value) public void WriteArray(IEnumerable value) => WriteArrayOfT(value); - [RequiresUnreferencedCode(Strings.UseNonGenericWriteArray)] - [Obsolete(Strings.UseNonGenericWriteArrayObsolete)] - public void WriteArray(IEnumerable value) - where T : notnull - { - ArrayStart arrayStart = WriteArrayStart(TypeModel.GetTypeAlignment()); - foreach (var item in value) - { - Write(item); - } - WriteArrayEnd(arrayStart); - } - internal void WriteArray(ReadOnlySpan value) where T : notnull { @@ -183,49 +170,6 @@ internal void WriteArray(ReadOnlySpan value) } } - [RequiresUnreferencedCode(Strings.UseNonGenericWriteArray)] - [Obsolete(Strings.UseNonGenericWriteArrayObsolete)] - public void WriteArray(T[] value) - where T : notnull - { - if (typeof(T) == typeof(byte)) - { - WriteArray((byte[])(object)value); - } - else if (typeof(T) == typeof(short)) - { - WriteArray((short[])(object)value); - } - else if (typeof(T) == typeof(ushort)) - { - WriteArray((ushort[])(object)value); - } - else if (typeof(T) == typeof(int)) - { - WriteArray((int[])(object)value); - } - else if (typeof(T) == typeof(uint)) - { - WriteArray((uint[])(object)value); - } - else if (typeof(T) == typeof(long)) - { - WriteArray((long[])(object)value); - } - else if (typeof(T) == typeof(ulong)) - { - WriteArray((ulong[])(object)value); - } - else if (typeof(T) == typeof(double)) - { - WriteArray((double[])(object)value); - } - else - { - WriteArrayOfT(value.AsSpan()); - } - } - private unsafe void WriteArrayOfNumeric(ReadOnlySpan value) where T : unmanaged { WriteInt32(value.Length * sizeof(T)); diff --git a/src/Tmds.DBus.Protocol/MessageWriter.Dictionary.cs b/src/Tmds.DBus.Protocol/MessageWriter.Dictionary.cs index 34ca420c..c5305f8c 100644 --- a/src/Tmds.DBus.Protocol/MessageWriter.Dictionary.cs +++ b/src/Tmds.DBus.Protocol/MessageWriter.Dictionary.cs @@ -29,9 +29,7 @@ public void WriteDictionary(KeyValuePair[] value) public void WriteDictionary(Dictionary value) => WriteDictionary(value); - [RequiresUnreferencedCode(Strings.UseNonGenericWriteDictionary)] - [Obsolete(Strings.UseNonGenericWriteDictionaryObsolete)] - public void WriteDictionary(IEnumerable> value) + private void WriteDictionary(IEnumerable> value) where TKey : notnull where TValue : notnull { @@ -45,9 +43,7 @@ public void WriteDictionary(IEnumerable WriteDictionaryEnd(arrayStart); } - [RequiresUnreferencedCode(Strings.UseNonGenericWriteDictionary)] - [Obsolete(Strings.UseNonGenericWriteDictionaryObsolete)] - public void WriteDictionary(KeyValuePair[] value) + private void WriteDictionary(KeyValuePair[] value) where TKey : notnull where TValue : notnull { @@ -61,9 +57,7 @@ public void WriteDictionary(KeyValuePair[] value) WriteDictionaryEnd(arrayStart); } - [RequiresUnreferencedCode(Strings.UseNonGenericWriteDictionary)] - [Obsolete(Strings.UseNonGenericWriteDictionaryObsolete)] - public void WriteDictionary(Dictionary value) + internal void WriteDictionary(Dictionary value) where TKey : notnull where TValue : notnull { @@ -76,53 +70,4 @@ public void WriteDictionary(Dictionary value) } WriteDictionaryEnd(arrayStart); } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteVariantDictionary)] - [Obsolete(Strings.UseNonGenericWriteVariantDictionaryObsolete)] - public void WriteVariantDictionary(IEnumerable> value) - where TKey : notnull - where TValue : notnull - { - WriteDictionarySignature(ref this); - WriteDictionary(value); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteVariantDictionary)] - [Obsolete(Strings.UseNonGenericWriteVariantDictionaryObsolete)] - public void WriteVariantDictionary(KeyValuePair[] value) - where TKey : notnull - where TValue : notnull - { - WriteDictionarySignature(ref this); - WriteDictionary(value); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteVariantDictionary)] - [Obsolete(Strings.UseNonGenericWriteVariantDictionaryObsolete)] - public void WriteVariantDictionary(Dictionary value) - where TKey : notnull - where TValue : notnull - { - WriteDictionarySignature(ref this); - WriteDictionary(value); - } - - // This method writes a Dictionary without using generics at the 'cost' of boxing. - // private void WriteDictionary(IDictionary value) - // { - // ArrayStart arrayStart = WriteDictionaryStart(); - // foreach (System.Collections.DictionaryEntry de in dictionary) - // { - // WriteDictionaryEntryStart(); - // Write(de.Key, asVariant: keyType == typeof(object)); - // Write(de.Value, asVariant: valueType == typeof(object)); - // } - // WriteDictionaryEnd(ref arrayStart); - // } - - private static void WriteDictionarySignature(ref MessageWriter writer) where TKey : notnull where TValue : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } } diff --git a/src/Tmds.DBus.Protocol/MessageWriter.Struct.cs b/src/Tmds.DBus.Protocol/MessageWriter.Struct.cs index 436fda17..d83eaa48 100644 --- a/src/Tmds.DBus.Protocol/MessageWriter.Struct.cs +++ b/src/Tmds.DBus.Protocol/MessageWriter.Struct.cs @@ -2,25 +2,14 @@ namespace Tmds.DBus.Protocol; public ref partial struct MessageWriter { - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct(ValueTuple value) + internal void WriteStruct(ValueTuple value) where T1 : notnull { WriteStructureStart(); Write(value.Item1); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2) value) + internal void WriteStruct((T1, T2) value) where T1 : notnull where T2 : notnull { @@ -29,17 +18,7 @@ public void WriteStruct((T1, T2) value) Write(value.Item2); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2, T3) value) + internal void WriteStruct((T1, T2, T3) value) where T1 : notnull where T2 : notnull where T3 : notnull @@ -50,18 +29,7 @@ public void WriteStruct((T1, T2, T3) value) Write(value.Item3); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - where T3 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2, T3, T4) value) + internal void WriteStruct((T1, T2, T3, T4) value) where T1 : notnull where T2 : notnull where T3 : notnull @@ -74,19 +42,7 @@ public void WriteStruct((T1, T2, T3, T4) value) Write(value.Item4); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2, T3, T4, T5) value) + internal void WriteStruct((T1, T2, T3, T4, T5) value) where T1 : notnull where T2 : notnull where T3 : notnull @@ -101,20 +57,7 @@ public void WriteStruct((T1, T2, T3, T4, T5) value) Write(value.Item5); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2, T3, T4, T5, T6) value) + internal void WriteStruct((T1, T2, T3, T4, T5, T6) value) where T1 : notnull where T2 : notnull where T3 : notnull @@ -131,21 +74,7 @@ public void WriteStruct((T1, T2, T3, T4, T5, T6) value) Write(value.Item6); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2, T3, T4, T5, T6, T7) value) + internal void WriteStruct((T1, T2, T3, T4, T5, T6, T7) value) where T1 : notnull where T2 : notnull where T3 : notnull @@ -164,22 +93,7 @@ public void WriteStruct((T1, T2, T3, T4, T5, T6, T7) Write(value.Item7); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2, T3, T4, T5, T6, T7, T8) value) + internal void WriteStruct((T1, T2, T3, T4, T5, T6, T7, T8) value) where T1 : notnull where T2 : notnull where T3 : notnull @@ -200,23 +114,7 @@ public void WriteStruct((T1, T2, T3, T4, T5, T6, Write(value.Rest.Item1); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2, T3, T4, T5, T6, T7, T8, T9) value) + internal void WriteStruct((T1, T2, T3, T4, T5, T6, T7, T8, T9) value) where T1 : notnull where T2 : notnull where T3 : notnull @@ -239,24 +137,7 @@ public void WriteStruct((T1, T2, T3, T4, T5, Write(value.Rest.Item2); } - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericWriteStruct)] - [Obsolete(Strings.UseNonGenericWriteStructObsolete)] - public void WriteStruct((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) value) + internal void WriteStruct((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) value) where T1 : notnull where T2 : notnull where T3 : notnull @@ -280,20 +161,4 @@ public void WriteStruct((T1, T2, T3, T4 Write(value.Rest.Item2); Write(value.Rest.Item3); } - - private static void WriteStructSignature(ref MessageWriter writer) - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { - Span buffer = stackalloc byte[ProtocolConstants.MaxSignatureLength]; - writer.WriteSignature(TypeModel.GetSignature>(buffer)); - } } diff --git a/src/Tmds.DBus.Protocol/MessageWriter.Variant.Dynamic.cs b/src/Tmds.DBus.Protocol/MessageWriter.Variant.Dynamic.cs deleted file mode 100644 index c7fa3ec6..00000000 --- a/src/Tmds.DBus.Protocol/MessageWriter.Variant.Dynamic.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace Tmds.DBus.Protocol; - -public ref partial struct MessageWriter -{ - [RequiresUnreferencedCode(Strings.UseNonObjectWriteVariant)] - [Obsolete(Strings.UseNonObjectWriteVariantObsolete)] - public void WriteVariant(object value) - { - Type type = value.GetType(); - - if (type == typeof(byte)) - { - WriteVariantByte((byte)value); - return; - } - else if (type == typeof(bool)) - { - WriteVariantBool((bool)value); - return; - } - else if (type == typeof(short)) - { - WriteVariantInt16((short)value); - return; - } - else if (type == typeof(ushort)) - { - WriteVariantUInt16((ushort)value); - return; - } - else if (type == typeof(int)) - { - WriteVariantInt32((int)value); - return; - } - else if (type == typeof(uint)) - { - WriteVariantUInt32((uint)value); - return; - } - else if (type == typeof(long)) - { - WriteVariantInt64((long)value); - return; - } - else if (type == typeof(ulong)) - { - WriteVariantUInt64((ulong)value); - return; - } - else if (type == typeof(double)) - { - WriteVariantDouble((double)value); - return; - } - else if (type == typeof(string)) - { - WriteVariantString((string)value); - return; - } - else if (type == typeof(ObjectPath)) - { - WriteVariantObjectPath(value.ToString()!); - return; - } - else if (type == typeof(Signature)) - { - WriteVariantSignature(value.ToString()!); - return; - } - else - { - var typeWriter = TypeWriters.GetTypeWriter(type); - typeWriter.WriteVariant(ref this, value); - } - } -} diff --git a/src/Tmds.DBus.Protocol/MessageWriter.WriteT.Dynamic.cs b/src/Tmds.DBus.Protocol/MessageWriter.WriteT.Dynamic.cs deleted file mode 100644 index d6c5113e..00000000 --- a/src/Tmds.DBus.Protocol/MessageWriter.WriteT.Dynamic.cs +++ /dev/null @@ -1,994 +0,0 @@ -namespace Tmds.DBus.Protocol; - -// Code in this file is not trimmer friendly. -#pragma warning disable IL3050 -#pragma warning disable IL2026 -// Using obsolete generic write members -#pragma warning disable CS0618 - -public ref partial struct MessageWriter -{ - interface ITypeWriter - { - void WriteVariant(ref MessageWriter writer, object value); - } - - interface ITypeWriter : ITypeWriter - { - void Write(ref MessageWriter writer, T value); - } - - private void WriteDynamic(T value) where T : notnull - { - if (typeof(T) == typeof(object)) - { - WriteVariant((object)value); - return; - } - - var typeWriter = (ITypeWriter)TypeWriters.GetTypeWriter(typeof(T)); - typeWriter.Write(ref this, value); - } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddArrayTypeWriter() - where T : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddDictionaryTypeWriter() - where TKey : notnull - where TValue : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddValueTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { } - - [Obsolete(Strings.AddTypeWriterMethodObsolete)] - public static void AddTupleTypeWriter() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { } - - static class TypeWriters - { - private static readonly Dictionary _typeWriters = new(); - - public static ITypeWriter GetTypeWriter(Type type) - { - lock (_typeWriters) - { - if (_typeWriters.TryGetValue(type, out ITypeWriter? writer)) - { - return writer; - } - writer = CreateWriterForType(type); - _typeWriters.Add(type, writer); - return writer; - } - } - - private static ITypeWriter CreateWriterForType(Type type) - { - // Struct (ValueTuple) - if (type.IsGenericType && type.FullName!.StartsWith("System.ValueTuple")) - { - switch (type.GenericTypeArguments.Length) - { - case 1: return CreateValueTupleTypeWriter(type.GenericTypeArguments[0]); - case 2: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1]); - case 3: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2]); - case 4: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3]); - case 5: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4]); - - case 6: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5]); - case 7: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6]); - case 8: - switch (type.GenericTypeArguments[7].GenericTypeArguments.Length) - { - case 1: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0]); - case 2: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0], - type.GenericTypeArguments[7].GenericTypeArguments[1]); - case 3: - return CreateValueTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0], - type.GenericTypeArguments[7].GenericTypeArguments[1], - type.GenericTypeArguments[7].GenericTypeArguments[2]); - } - break; - } - } - // Struct (ValueTuple) - if (type.IsGenericType && type.FullName!.StartsWith("System.Tuple")) - { - switch (type.GenericTypeArguments.Length) - { - case 1: return CreateTupleTypeWriter(type.GenericTypeArguments[0]); - case 2: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1]); - case 3: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2]); - case 4: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3]); - case 5: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4]); - case 6: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5]); - case 7: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6]); - case 8: - switch (type.GenericTypeArguments[7].GenericTypeArguments.Length) - { - case 1: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0]); - case 2: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0], - type.GenericTypeArguments[7].GenericTypeArguments[1]); - case 3: - return CreateTupleTypeWriter(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0], - type.GenericTypeArguments[7].GenericTypeArguments[1], - type.GenericTypeArguments[7].GenericTypeArguments[2]); - } - break; - } - } - - // Array/Dictionary type (IEnumerable<>/IEnumerable>) - Type? extractedType = TypeModel.ExtractGenericInterface(type, typeof(IEnumerable<>)); - if (extractedType != null) - { - if (_typeWriters.TryGetValue(extractedType, out ITypeWriter? writer)) - { - return writer; - } - - Type elementType = extractedType.GenericTypeArguments[0]; - if (elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(KeyValuePair<,>)) - { - Type keyType = elementType.GenericTypeArguments[0]; - Type valueType = elementType.GenericTypeArguments[1]; - writer = CreateDictionaryTypeWriter(keyType, valueType); - } - else - { - writer = CreateArrayTypeWriter(elementType); - } - - if (type != extractedType) - { - _typeWriters.Add(extractedType, writer); - } - - return writer; - } - - ThrowNotSupportedType(type); - return default!; - } - - sealed class ArrayTypeWriter : ITypeWriter> - where T : notnull - { - public void Write(ref MessageWriter writer, IEnumerable value) - { - writer.WriteArray(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteArraySignature(ref writer); - writer.WriteArray((IEnumerable)value); - } - } - - private static ITypeWriter CreateArrayTypeWriter(Type elementType) - { - Type writerType = typeof(ArrayTypeWriter<>).MakeGenericType(new[] { elementType }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class DictionaryTypeWriter : ITypeWriter>> - where TKey : notnull - where TValue : notnull - { - public void Write(ref MessageWriter writer, IEnumerable> value) - { - writer.WriteDictionary(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteDictionarySignature(ref writer); - writer.WriteDictionary((IEnumerable>)value); - } - } - - private static ITypeWriter CreateDictionaryTypeWriter(Type keyType, Type valueType) - { - Type writerType = typeof(DictionaryTypeWriter<,>).MakeGenericType(new[] { keyType, valueType }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter> - where T1 : notnull - { - public void Write(ref MessageWriter writer, ValueTuple value) - { - writer.WriteStruct(new ValueTuple(value.Item1)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter> - where T1 : notnull - { - public void Write(ref MessageWriter writer, Tuple value) - { - writer.WriteStruct(new ValueTuple(value.Item1)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1) - { - Type writerType = typeof(ValueTupleTypeWriter<>).MakeGenericType(new[] { type1 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1) - { - Type writerType = typeof(TupleTypeWriter<>).MakeGenericType(new[] { type1 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - { - public void Write(ref MessageWriter writer, ValueTuple value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - { - public void Write(ref MessageWriter writer, Tuple value) - { - writer.WriteStruct((value.Item1, value.Item2)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2) - { - Type writerType = typeof(ValueTupleTypeWriter<,>).MakeGenericType(new[] { type1, type2 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2) - { - Type writerType = typeof(TupleTypeWriter<,>).MakeGenericType(new[] { type1, type2 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - { - public void Write(ref MessageWriter writer, ValueTuple value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - { - public void Write(ref MessageWriter writer, Tuple value) - { - writer.WriteStruct((value.Item1, value.Item2, value.Item3)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2, Type type3) - { - Type writerType = typeof(ValueTupleTypeWriter<,,>).MakeGenericType(new[] { type1, type2, type3 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2, Type type3) - { - Type writerType = typeof(TupleTypeWriter<,,>).MakeGenericType(new[] { type1, type2, type3 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { - public void Write(ref MessageWriter writer, ValueTuple value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { - public void Write(ref MessageWriter writer, Tuple value) - { - writer.WriteStruct((value.Item1, value.Item2, value.Item3, value.Item4)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2, Type type3, Type type4) - { - Type writerType = typeof(ValueTupleTypeWriter<,,,>).MakeGenericType(new[] { type1, type2, type3, type4 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2, Type type3, Type type4) - { - Type writerType = typeof(TupleTypeWriter<,,,>).MakeGenericType(new[] { type1, type2, type3, type4 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { - public void Write(ref MessageWriter writer, ValueTuple value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { - public void Write(ref MessageWriter writer, Tuple value) - { - writer.WriteStruct((value.Item1, value.Item2, value.Item3, value.Item4, value.Item5)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5) - { - Type writerType = typeof(ValueTupleTypeWriter<,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5) - { - Type writerType = typeof(TupleTypeWriter<,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { - public void Write(ref MessageWriter writer, ValueTuple value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { - public void Write(ref MessageWriter writer, Tuple value) - { - writer.WriteStruct((value.Item1, value.Item2, value.Item3, value.Item4, value.Item5, value.Item6)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6) - { - Type writerType = typeof(ValueTupleTypeWriter<,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6) - { - Type writerType = typeof(TupleTypeWriter<,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { - public void Write(ref MessageWriter writer, ValueTuple value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { - public void Write(ref MessageWriter writer, Tuple value) - { - writer.WriteStruct((value.Item1, value.Item2, value.Item3, value.Item4, value.Item5, value.Item6, value.Item7)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7) - { - Type writerType = typeof(ValueTupleTypeWriter<,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7) - { - Type writerType = typeof(TupleTypeWriter<,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter>> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { - public void Write(ref MessageWriter writer, (T1, T2, T3, T4, T5, T6, T7, T8) value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple>)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter>> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { - public void Write(ref MessageWriter writer, Tuple> value) - { - writer.WriteStruct((value.Item1, value.Item2, value.Item3, value.Item4, value.Item5, value.Item6, value.Item7, value.Rest.Item1)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple>)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8) - { - Type writerType = typeof(ValueTupleTypeWriter<,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8) - { - Type writerType = typeof(TupleTypeWriter<,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter>> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { - public void Write(ref MessageWriter writer, (T1, T2, T3, T4, T5, T6, T7, T8, T9) value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple>)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter>> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { - public void Write(ref MessageWriter writer, Tuple> value) - { - writer.WriteStruct((value.Item1, value.Item2, value.Item3, value.Item4, value.Item5, value.Item6, value.Item7, value.Rest.Item1, value.Rest.Item2)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple>)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8, Type type9) - { - Type writerType = typeof(ValueTupleTypeWriter<,,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8, Type type9) - { - Type writerType = typeof(TupleTypeWriter<,,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8, type9 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - sealed class ValueTupleTypeWriter : ITypeWriter>> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { - public void Write(ref MessageWriter writer, (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) value) - { - writer.WriteStruct(value); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (ValueTuple>)value); - } - } - - sealed class TupleTypeWriter : ITypeWriter>> - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { - public void Write(ref MessageWriter writer, Tuple> value) - { - writer.WriteStruct((value.Item1, value.Item2, value.Item3, value.Item4, value.Item5, value.Item6, value.Item7, value.Rest.Item1, value.Rest.Item2, value.Rest.Item3)); - } - - public void WriteVariant(ref MessageWriter writer, object value) - { - WriteStructSignature(ref writer); - Write(ref writer, (Tuple>)value); - } - } - - private static ITypeWriter CreateValueTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8, Type type9, Type type10) - { - Type writerType = typeof(ValueTupleTypeWriter<,,,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8, type10 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - - private static ITypeWriter CreateTupleTypeWriter(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8, Type type9, Type type10) - { - Type writerType = typeof(TupleTypeWriter<,,,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8, type9, type10 }); - return (ITypeWriter)Activator.CreateInstance(writerType)!; - } - } -} diff --git a/src/Tmds.DBus.Protocol/MessageWriter.WriteT.cs b/src/Tmds.DBus.Protocol/MessageWriter.WriteT.cs index a7f2dee8..81cca915 100644 --- a/src/Tmds.DBus.Protocol/MessageWriter.WriteT.cs +++ b/src/Tmds.DBus.Protocol/MessageWriter.WriteT.cs @@ -65,10 +65,6 @@ internal void Write(T value) where T : notnull { (value as IDBusWritable)!.WriteTo(ref this); } - else if (Feature.IsDynamicCodeEnabled) - { - WriteDynamic(value); - } else { ThrowNotSupportedType(typeof(T)); diff --git a/src/Tmds.DBus.Protocol/Reader.Array.cs b/src/Tmds.DBus.Protocol/Reader.Array.cs index 263ba840..4ac4f498 100644 --- a/src/Tmds.DBus.Protocol/Reader.Array.cs +++ b/src/Tmds.DBus.Protocol/Reader.Array.cs @@ -44,48 +44,6 @@ public VariantValue[] ReadArrayOfVariantValue() public T[] ReadArrayOfHandle<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T>() where T : SafeHandle, new() => ReadArrayOfT(); - [RequiresUnreferencedCode(Strings.UseNonGenericReadArray)] - [Obsolete(Strings.UseNonGenericReadArrayObsolete)] - public T[] ReadArray<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T>() - { - if (typeof(T) == typeof(byte)) - { - return (T[])(object)ReadArrayOfNumeric(); - } - else if (typeof(T) == typeof(short)) - { - return (T[])(object)ReadArrayOfNumeric(); - } - else if (typeof(T) == typeof(ushort)) - { - return (T[])(object)ReadArrayOfNumeric(); - } - else if (typeof(T) == typeof(int)) - { - return (T[])(object)ReadArrayOfNumeric(); - } - else if (typeof(T) == typeof(uint)) - { - return (T[])(object)ReadArrayOfNumeric(); - } - else if (typeof(T) == typeof(long)) - { - return (T[])(object)ReadArrayOfNumeric(); - } - else if (typeof(T) == typeof(ulong)) - { - return (T[])(object)ReadArrayOfNumeric(); - } - else if (typeof(T) == typeof(double)) - { - return (T[])(object)ReadArrayOfNumeric(); - } - else - { - return ReadArrayOfT(); - } - } - private T[] ReadArrayOfT<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T>() { List items = new(); diff --git a/src/Tmds.DBus.Protocol/Reader.Dictionary.cs b/src/Tmds.DBus.Protocol/Reader.Dictionary.cs index c1f04d41..9b794a95 100644 --- a/src/Tmds.DBus.Protocol/Reader.Dictionary.cs +++ b/src/Tmds.DBus.Protocol/Reader.Dictionary.cs @@ -14,9 +14,7 @@ public ArrayEnd ReadDictionaryStart() public Dictionary ReadDictionaryOfStringToVariantValue() => ReadDictionary(); - [RequiresUnreferencedCode(Strings.UseNonGenericReadDictionary)] - [Obsolete(Strings.UseNonGenericReadDictionaryObsolete)] - public Dictionary ReadDictionary + private Dictionary ReadDictionary < [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]TKey, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]TValue diff --git a/src/Tmds.DBus.Protocol/Reader.ReadT.Dynamic.cs b/src/Tmds.DBus.Protocol/Reader.ReadT.Dynamic.cs deleted file mode 100644 index 16568e86..00000000 --- a/src/Tmds.DBus.Protocol/Reader.ReadT.Dynamic.cs +++ /dev/null @@ -1,1045 +0,0 @@ -namespace Tmds.DBus.Protocol; - -// Code in this file is not trimmer friendly. -#pragma warning disable IL3050 -#pragma warning disable IL2055 -#pragma warning disable IL2091 -#pragma warning disable IL2026 -// Using obsolete generic read members -#pragma warning disable CS0618 - -public ref partial struct Reader -{ - interface ITypeReader - { } - - interface ITypeReader : ITypeReader - { - T Read(ref Reader reader); - } - - private T ReadDynamic() - { - Type type = typeof(T); - - if (type == typeof(object)) - { - Utf8Span signature = ReadSignature(); - type = DetermineVariantType(signature); - - if (type == typeof(byte)) - { - return (T)(object)ReadByte(); - } - else if (type == typeof(bool)) - { - return (T)(object)ReadBool(); - } - else if (type == typeof(short)) - { - return (T)(object)ReadInt16(); - } - else if (type == typeof(ushort)) - { - return (T)(object)ReadUInt16(); - } - else if (type == typeof(int)) - { - return (T)(object)ReadInt32(); - } - else if (type == typeof(uint)) - { - return (T)(object)ReadUInt32(); - } - else if (type == typeof(long)) - { - return (T)(object)ReadInt64(); - } - else if (type == typeof(ulong)) - { - return (T)(object)ReadUInt64(); - } - else if (type == typeof(double)) - { - return (T)(object)ReadDouble(); - } - else if (type == typeof(string)) - { - return (T)(object)ReadString(); - } - else if (type == typeof(ObjectPath)) - { - return (T)(object)ReadObjectPath(); - } - else if (type == typeof(Signature)) - { - return (T)(object)ReadSignatureAsSignature(); - } - else if (type == typeof(SafeHandle)) - { - return (T)(object)ReadHandle()!; - } - else if (type == typeof(VariantValue)) - { - return (T)(object)ReadVariantValue(); - } - } - - var typeReader = (ITypeReader)TypeReaders.GetTypeReader(type); - return typeReader.Read(ref this); - } - - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL3050")] - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2055")] - private static Type DetermineVariantType(Utf8Span signature) - { - Func map = (dbusType, innerTypes) => - { - switch (dbusType) - { - case DBusType.Byte: return typeof(byte); - case DBusType.Bool: return typeof(bool); - case DBusType.Int16: return typeof(short); - case DBusType.UInt16: return typeof(ushort); - case DBusType.Int32: return typeof(int); - case DBusType.UInt32: return typeof(uint); - case DBusType.Int64: return typeof(long); - case DBusType.UInt64: return typeof(ulong); - case DBusType.Double: return typeof(double); - case DBusType.String: return typeof(string); - case DBusType.ObjectPath: return typeof(ObjectPath); - case DBusType.Signature: return typeof(Signature); - case DBusType.UnixFd: return typeof(SafeHandle); - case DBusType.Array: return innerTypes[0].MakeArrayType(); - case DBusType.DictEntry: return typeof(Dictionary<,>).MakeGenericType(innerTypes); - case DBusType.Struct: - switch (innerTypes.Length) - { - case 1: return typeof(ValueTuple<>).MakeGenericType(innerTypes); - case 2: return typeof(ValueTuple<,>).MakeGenericType(innerTypes); - case 3: return typeof(ValueTuple<,,>).MakeGenericType(innerTypes); - case 4: return typeof(ValueTuple<,,,>).MakeGenericType(innerTypes); - case 5: return typeof(ValueTuple<,,,,>).MakeGenericType(innerTypes); - case 6: return typeof(ValueTuple<,,,,,>).MakeGenericType(innerTypes); - case 7: return typeof(ValueTuple<,,,,,,>).MakeGenericType(innerTypes); - case 8: - case 9: - case 10: - var types = new Type[8]; - innerTypes.AsSpan(0, 7).CopyTo(types); - types[7] = innerTypes.Length switch - { - 8 => typeof(ValueTuple<>).MakeGenericType(new[] { innerTypes[7] }), - 9 => typeof(ValueTuple<,>).MakeGenericType(new[] { innerTypes[7], innerTypes[8] }), - 10 => typeof(ValueTuple<,,>).MakeGenericType(new[] { innerTypes[7], innerTypes[8], innerTypes[9] }), - _ => null! - }; - return typeof(ValueTuple<,,,,,,,>).MakeGenericType(types); - } - break; - } - return typeof(object); - }; - - // TODO (perf): add caching. - return SignatureReader.Transform(signature, map); - } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddArrayTypeReader() - where T : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddKeyValueArrayTypeReader() - where TKey : notnull - where TValue : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddDictionaryTypeReader() - where TKey : notnull - where TValue : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddValueTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { } - - [Obsolete(Strings.AddTypeReaderMethodObsolete)] - public static void AddTupleTypeReader() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { } - - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL3050")] - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2091")] - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026")] - static class TypeReaders - { - private static readonly Dictionary _typeReaders = new(); - - public static ITypeReader GetTypeReader(Type type) - { - lock (_typeReaders) - { - if (_typeReaders.TryGetValue(type, out ITypeReader? reader)) - { - return reader; - } - reader = CreateReaderForType(type); - _typeReaders.Add(type, reader); - return reader; - } - } - - private static ITypeReader CreateReaderForType(Type type) - { - // Array - if (type.IsArray) - { - return CreateArrayTypeReader(type.GetElementType()!); - } - - // Dictionary<.> - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>)) - { - Type keyType = type.GenericTypeArguments[0]; - Type valueType = type.GenericTypeArguments[1]; - return CreateDictionaryTypeReader(keyType, valueType); - } - - // Struct (ValueTuple) - if (type.IsGenericType && type.FullName!.StartsWith("System.ValueTuple")) - { - switch (type.GenericTypeArguments.Length) - { - case 1: return CreateValueTupleTypeReader(type.GenericTypeArguments[0]); - case 2: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1]); - case 3: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2]); - case 4: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3]); - case 5: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4]); - - case 6: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5]); - case 7: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6]); - case 8: - switch (type.GenericTypeArguments[7].GenericTypeArguments.Length) - { - case 1: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0]); - case 2: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0], - type.GenericTypeArguments[7].GenericTypeArguments[1]); - case 3: - return CreateValueTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0], - type.GenericTypeArguments[7].GenericTypeArguments[1], - type.GenericTypeArguments[7].GenericTypeArguments[2]); - } - break; - } - } - // Struct (ValueTuple) - if (type.IsGenericType && type.FullName!.StartsWith("System.Tuple")) - { - switch (type.GenericTypeArguments.Length) - { - case 1: return CreateTupleTypeReader(type.GenericTypeArguments[0]); - case 2: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1]); - case 3: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2]); - case 4: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3]); - case 5: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4]); - case 6: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5]); - case 7: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6]); - case 8: - switch (type.GenericTypeArguments[7].GenericTypeArguments.Length) - { - case 1: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0]); - case 2: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0], - type.GenericTypeArguments[7].GenericTypeArguments[1]); - case 3: - return CreateTupleTypeReader(type.GenericTypeArguments[0], - type.GenericTypeArguments[1], - type.GenericTypeArguments[2], - type.GenericTypeArguments[3], - type.GenericTypeArguments[4], - type.GenericTypeArguments[5], - type.GenericTypeArguments[6], - type.GenericTypeArguments[7].GenericTypeArguments[0], - type.GenericTypeArguments[7].GenericTypeArguments[1], - type.GenericTypeArguments[7].GenericTypeArguments[2]); - } - break; - } - } - - ThrowNotSupportedType(type); - return default!; - } - - sealed class KeyValueArrayTypeReader : ITypeReader[]>, ITypeReader - where TKey : notnull - where TValue : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public KeyValuePair[] Read(ref Reader reader) - { - List> items = new(); - ArrayEnd arrayEnd = reader.ReadArrayStart(DBusType.Struct); - while (reader.HasNext(arrayEnd)) - { - TKey key = reader.Read(); - TValue value = reader.Read(); - items.Add(new KeyValuePair(key, value)); - } - return items.ToArray(); - } - } - - sealed class ArrayTypeReader : ITypeReader, ITypeReader - where T : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public T[] Read(ref Reader reader) - { - return reader.ReadArray(); - } - } - - private static ITypeReader CreateArrayTypeReader(Type elementType) - { - Type readerType; - if (elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(KeyValuePair<,>)) - { - Type keyType = elementType.GenericTypeArguments[0]; - Type valueType = elementType.GenericTypeArguments[1]; - readerType = typeof(KeyValueArrayTypeReader<,>).MakeGenericType(new[] { keyType, valueType }); - } - else - { - readerType = typeof(ArrayTypeReader<>).MakeGenericType(new[] { elementType }); - } - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class DictionaryTypeReader : ITypeReader>, ITypeReader - where TKey : notnull - where TValue : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Dictionary Read(ref Reader reader) - { - return reader.ReadDictionary(); - } - } - - private static ITypeReader CreateDictionaryTypeReader(Type keyType, Type valueType) - { - Type readerType = typeof(DictionaryTypeReader<,>).MakeGenericType(new[] { keyType, valueType }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1) - { - Type readerType = typeof(ValueTupleTypeReader<>).MakeGenericType(new[] { type1 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1) - { - Type readerType = typeof(TupleTypeReader<>).MakeGenericType(new[] { type1 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2) - { - Type readerType = typeof(ValueTupleTypeReader<,>).MakeGenericType(new[] { type1, type2 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2) - { - Type readerType = typeof(TupleTypeReader<,>).MakeGenericType(new[] { type1, type2 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2, Type type3) - { - Type readerType = typeof(ValueTupleTypeReader<,,>).MakeGenericType(new[] { type1, type2, type3 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2, Type type3) - { - Type readerType = typeof(TupleTypeReader<,,>).MakeGenericType(new[] { type1, type2, type3 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2, Type type3, Type type4) - { - Type readerType = typeof(ValueTupleTypeReader<,,,>).MakeGenericType(new[] { type1, type2, type3, type4 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2, Type type3, Type type4) - { - Type readerType = typeof(TupleTypeReader<,,,>).MakeGenericType(new[] { type1, type2, type3, type4 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5) - { - Type readerType = typeof(ValueTupleTypeReader<,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5) - { - Type readerType = typeof(TupleTypeReader<,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type5 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6) - { - Type readerType = typeof(ValueTupleTypeReader<,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6) - { - Type readerType = typeof(TupleTypeReader<,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7) - { - Type readerType = typeof(ValueTupleTypeReader<,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7) - { - Type readerType = typeof(TupleTypeReader<,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple> Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple> Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8) - { - Type readerType = typeof(ValueTupleTypeReader<,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8) - { - Type readerType = typeof(TupleTypeReader<,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple> Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple> Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8, Type type9) - { - Type readerType = typeof(ValueTupleTypeReader<,,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8, type9 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8, Type type9) - { - Type readerType = typeof(TupleTypeReader<,,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8, type9 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - sealed class ValueTupleTypeReader : ITypeReader>>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public ValueTuple> Read(ref Reader reader) - { - return reader.ReadStruct(); - } - } - - sealed class TupleTypeReader : ITypeReader>>, ITypeReader - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - where T5 : notnull - where T6 : notnull - where T7 : notnull - where T8 : notnull - where T9 : notnull - where T10 : notnull - { - object ITypeReader.Read(ref Reader reader) => Read(ref reader); - - public Tuple> Read(ref Reader reader) - { - return reader.ReadStructAsTuple(); - } - } - - private static ITypeReader CreateValueTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8, Type type9, Type type10) - { - Type readerType = typeof(ValueTupleTypeReader<,,,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8, type9, type10 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - - private static ITypeReader CreateTupleTypeReader(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7, Type type8, Type type9, Type type10) - { - Type readerType = typeof(TupleTypeReader<,,,,,,,,,>).MakeGenericType(new[] { type1, type2, type3, type4, type5, type6, type7, type8, type9, type10 }); - return (ITypeReader)Activator.CreateInstance(readerType)!; - } - } -} diff --git a/src/Tmds.DBus.Protocol/Reader.ReadT.cs b/src/Tmds.DBus.Protocol/Reader.ReadT.cs index 0ca8de4f..fe937a58 100644 --- a/src/Tmds.DBus.Protocol/Reader.ReadT.cs +++ b/src/Tmds.DBus.Protocol/Reader.ReadT.cs @@ -61,10 +61,6 @@ public ref partial struct Reader { return (T)(object)ReadVariantValue(); } - else if (Feature.IsDynamicCodeEnabled) - { - return ReadDynamic(); - } ThrowNotSupportedType(typeof(T)); return default!; diff --git a/src/Tmds.DBus.Protocol/Reader.Struct.cs b/src/Tmds.DBus.Protocol/Reader.Struct.cs deleted file mode 100644 index 412bc00e..00000000 --- a/src/Tmds.DBus.Protocol/Reader.Struct.cs +++ /dev/null @@ -1,309 +0,0 @@ -namespace Tmds.DBus.Protocol; - -public ref partial struct Reader -{ - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1 - >() - { - AlignStruct(); - return ValueTuple.Create(Read()); - } - - private Tuple ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1 - >() - { - AlignStruct(); - return Tuple.Create(Read()); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2 - >() - where T1 : notnull - where T2 : notnull - { - AlignStruct(); - return ValueTuple.Create(Read(), Read()); - } - - private Tuple ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2 - >() - where T1 : notnull - where T2 : notnull - { - AlignStruct(); - return Tuple.Create(Read(), Read()); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3 - >() - where T1 : notnull - where T2 : notnull - where T3 : notnull - { - AlignStruct(); - return ValueTuple.Create(Read(), Read(), Read()); - } - - private Tuple ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3 - >() - { - AlignStruct(); - return Tuple.Create(Read(), Read(), Read()); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4 - >() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { - AlignStruct(); - return ValueTuple.Create(Read(), Read(), Read(), Read()); - } - - private Tuple ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4 - >() - where T1 : notnull - where T2 : notnull - where T3 : notnull - where T4 : notnull - { - AlignStruct(); - return Tuple.Create(Read(), Read(), Read(), Read()); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5 - >() - { - AlignStruct(); - return ValueTuple.Create(Read(), Read(), Read(), Read(), Read()); - } - - private Tuple ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5 - >() - { - AlignStruct(); - return Tuple.Create(Read(), Read(), Read(), Read(), Read()); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6 - >() - { - AlignStruct(); - return ValueTuple.Create(Read(), Read(), Read(), Read(), Read(), Read()); - } - - private Tuple ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6 - >() - { - AlignStruct(); - return Tuple.Create(Read(), Read(), Read(), Read(), Read(), Read()); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T7 - >() - { - AlignStruct(); - return ValueTuple.Create(Read(), Read(), Read(), Read(), Read(), Read(), Read()); - } - - private Tuple ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T7 - >() - { - AlignStruct(); - return Tuple.Create(Read(), Read(), Read(), Read(), Read(), Read(), Read()); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple> ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T7, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T8 - >() - { - AlignStruct(); - return ValueTuple.Create(Read(), Read(), Read(), Read(), Read(), Read(), Read(), Read()); - } - - private Tuple> ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T7, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T8 - >() - { - AlignStruct(); - return Tuple.Create(Read(), Read(), Read(), Read(), Read(), Read(), Read(), Read()); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple> ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T7, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T8, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T9 - >() - { - AlignStruct(); - return (Read(), Read(), Read(), Read(), Read(), Read(), Read(), Read(), Read()); - } - - private Tuple> ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T7, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T8, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T9 - >() - { - AlignStruct(); - return new Tuple>(Read(), Read(), Read(), Read(), Read(), Read(), Read(), Tuple.Create(Read(), Read())); - } - - [RequiresUnreferencedCode(Strings.UseNonGenericReadStruct)] - [Obsolete(Strings.UseNonGenericReadStructObsolete)] - public ValueTuple> ReadStruct - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T7, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T8, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T9, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T10 - >() - { - AlignStruct(); - return (Read(), Read(), Read(), Read(), Read(), Read(), Read(), Read(), Read(), Read()); - } - - private Tuple> ReadStructAsTuple - < - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T1, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T2, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T3, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T4, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T5, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T6, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T7, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T8, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T9, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]T10 - >() - { - AlignStruct(); - return new Tuple>(Read(), Read(), Read(), Read(), Read(), Read(), Read(), Tuple.Create(Read(), Read(), Read())); - } -} diff --git a/src/Tmds.DBus.Protocol/Reader.Variant.Dynamic.cs b/src/Tmds.DBus.Protocol/Reader.Variant.Dynamic.cs deleted file mode 100644 index c7be7ff0..00000000 --- a/src/Tmds.DBus.Protocol/Reader.Variant.Dynamic.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Tmds.DBus.Protocol; - -public ref partial struct Reader -{ - [RequiresUnreferencedCode(Strings.UseNonObjectReadVariantValue)] - [Obsolete(Strings.UseNonObjectReadVariantValueObsolete)] - public object ReadVariant() => Read(); -} diff --git a/src/Tmds.DBus.Protocol/Reader.cs b/src/Tmds.DBus.Protocol/Reader.cs index 622f481b..2289dbcc 100644 --- a/src/Tmds.DBus.Protocol/Reader.cs +++ b/src/Tmds.DBus.Protocol/Reader.cs @@ -4,8 +4,6 @@ namespace Tmds.DBus.Protocol; public ref partial struct Reader { - private delegate object ValueReader(ref Reader reader); - private readonly bool _isBigEndian; private readonly UnixFdCollection? _handles; private readonly int _handleCount; diff --git a/src/Tmds.DBus.Protocol/Strings.cs b/src/Tmds.DBus.Protocol/Strings.cs deleted file mode 100644 index 94a1d519..00000000 --- a/src/Tmds.DBus.Protocol/Strings.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Tmds.DBus.Protocol; - -static class Strings -{ - public const string AddTypeReaderMethodObsolete = "AddTypeReader methods are obsolete. Remove the call to this method."; - public const string AddTypeWriterMethodObsolete = "AddTypeWriter methods are obsolete. Remove the call to this method."; - - public const string UseNonGenericWriteArray = $"Use a non-generic overload of '{nameof(MessageWriter.WriteArray)}' if it exists for the item type, and otherwise write out the elements separately surrounded by a call to '{nameof(MessageWriter.WriteArrayStart)}' and '{nameof(MessageWriter.WriteArrayEnd)}'."; - public const string UseNonGenericReadArray = $"Use a '{nameof(Reader.ReadArray)}Of*' method if it exists for the item type, and otherwise read out the elements in a while loop using '{nameof(Reader.ReadArrayStart)}' and '{nameof(Reader.HasNext)}'."; - public const string UseNonGenericReadDictionary = $"Read the dictionary by calling '{nameof(Reader.ReadDictionaryStart)} and reading the key-value pairs in a while loop using '{nameof(Reader.HasNext)}'."; - public const string UseNonGenericWriteDictionary = $"Write the dictionary by calling '{nameof(MessageWriter.WriteDictionaryStart)}', for each element call '{nameof(MessageWriter.WriteDictionaryEntryStart)}', write the key and value. Complete the dictionary writing by calling '{nameof(MessageWriter.WriteDictionaryEnd)}'."; - public const string UseNonGenericWriteVariantDictionary = $"Write the signature using '{nameof(MessageWriter.WriteSignature)}', then write the dictionary by calling '{nameof(MessageWriter.WriteDictionaryStart)}', for each element call '{nameof(MessageWriter.WriteDictionaryEntryStart)}', write the key and value. Complete the dictionary writing by calling '{nameof(MessageWriter.WriteDictionaryEnd)}'."; - public const string UseNonGenericReadStruct = $"Read the struct by calling '{nameof(Reader.AlignStruct)}' and then reading all the struct fields."; - public const string UseNonGenericWriteStruct = $"Write the struct by calling '{nameof(MessageWriter.WriteStructureStart)}' and then writing all the struct fields."; - public const string UseNonObjectWriteVariant = $"Use the overload of '{nameof(MessageWriter.WriteVariant)}' that accepts a '{nameof(Variant)}' instead."; - public const string UseNonObjectReadVariantValue = $"Use '{nameof(Reader.ReadVariantValue)}' instead."; - - private const string MethodIsNotCompatibleWithTrimmingNativeAot = "Method is not compatible with trimming/NativeAOT."; - - public const string UseNonGenericWriteArrayObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonGenericWriteArray}"; - public const string UseNonGenericReadArrayObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonGenericReadArray}"; - public const string UseNonGenericReadDictionaryObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonGenericReadDictionary}"; - public const string UseNonGenericWriteDictionaryObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonGenericWriteDictionary}"; - public const string UseNonGenericWriteVariantDictionaryObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonGenericWriteVariantDictionary}"; - public const string UseNonGenericReadStructObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonGenericReadStruct}"; - public const string UseNonGenericWriteStructObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonGenericWriteStruct}"; - public const string UseNonObjectWriteVariantObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonObjectWriteVariant}"; - public const string UseNonObjectReadVariantValueObsolete = $"{MethodIsNotCompatibleWithTrimmingNativeAot} {UseNonObjectReadVariantValue}"; -} \ No newline at end of file diff --git a/src/Tmds.DBus.Protocol/TypeModel.Dynamic.cs b/src/Tmds.DBus.Protocol/TypeModel.Dynamic.cs deleted file mode 100644 index 5aeb2e09..00000000 --- a/src/Tmds.DBus.Protocol/TypeModel.Dynamic.cs +++ /dev/null @@ -1,134 +0,0 @@ -namespace Tmds.DBus.Protocol; - -// Code in this file is not trimmer friendly. -#pragma warning disable IL3050 -#pragma warning disable IL2070 - -static partial class TypeModel -{ - private static DBusType GetTypeAlignmentDynamic() - { - if (typeof(T).IsArray) - { - return DBusType.Array; - } - else if (ExtractGenericInterface(typeof(T), typeof(System.Collections.Generic.IEnumerable<>)) != null) - { - return DBusType.Array; - } - else - { - return DBusType.Struct; - } - } - - private static int AppendTypeSignatureDynamic(Type type, Span signature) - { - Type? extractedType; - if (type == typeof(object)) - { - signature[0] = (byte)DBusType.Variant; - return 1; - } - else if (type.IsArray) - { - int bytesWritten = 0; - signature[bytesWritten++] = (byte)DBusType.Array; - bytesWritten += AppendTypeSignature(type.GetElementType()!, signature.Slice(bytesWritten)); - return bytesWritten; - } - else if (type.FullName!.StartsWith("System.ValueTuple")) - { - int bytesWritten = 0; - signature[bytesWritten++] = (byte)'('; - Type[] typeArguments = type.GenericTypeArguments; - do - { - for (int i = 0; i < typeArguments.Length; i++) - { - if (i == 7) - { - break; - } - bytesWritten += AppendTypeSignature(typeArguments[i], signature.Slice(bytesWritten)); - } - if (typeArguments.Length == 8) - { - typeArguments = typeArguments[7].GenericTypeArguments; - } - else - { - break; - } - } while (true); - signature[bytesWritten++] = (byte)')'; - return bytesWritten; - } - else if ((extractedType = TypeModel.ExtractGenericInterface(type, typeof(IDictionary<,>))) != null) - { - int bytesWritten = 0; - signature[bytesWritten++] = (byte)'a'; - signature[bytesWritten++] = (byte)'{'; - bytesWritten += AppendTypeSignature(extractedType.GenericTypeArguments[0], signature.Slice(bytesWritten)); - bytesWritten += AppendTypeSignature(extractedType.GenericTypeArguments[1], signature.Slice(bytesWritten)); - signature[bytesWritten++] = (byte)'}'; - return bytesWritten; - } - - ThrowNotSupportedType(type); - return 0; - } - - public static Type? ExtractGenericInterface(Type queryType, Type interfaceType) - { - if (IsGenericInstantiation(queryType, interfaceType)) - { - return queryType; - } - - return GetGenericInstantiation(queryType, interfaceType); - } - - private static bool IsGenericInstantiation(Type candidate, Type interfaceType) - { - return - candidate.IsGenericType && - candidate.GetGenericTypeDefinition() == interfaceType; - } - - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070")] - private static Type? GetGenericInstantiation(Type queryType, Type interfaceType) - { - Type? bestMatch = null; - var interfaces = queryType.GetInterfaces(); - foreach (var @interface in interfaces) - { - if (IsGenericInstantiation(@interface, interfaceType)) - { - if (bestMatch == null) - { - bestMatch = @interface; - } - else if (StringComparer.Ordinal.Compare(@interface.FullName, bestMatch.FullName) < 0) - { - bestMatch = @interface; - } - } - } - - if (bestMatch != null) - { - return bestMatch; - } - - var baseType = queryType?.BaseType; - if (baseType == null) - { - return null; - } - else - { - return GetGenericInstantiation(baseType, interfaceType); - } - } -} \ No newline at end of file diff --git a/src/Tmds.DBus.Protocol/TypeModel.cs b/src/Tmds.DBus.Protocol/TypeModel.cs index 6b842fb3..6b110888 100644 --- a/src/Tmds.DBus.Protocol/TypeModel.cs +++ b/src/Tmds.DBus.Protocol/TypeModel.cs @@ -87,10 +87,6 @@ public static DBusType GetTypeAlignment() { return DBusType.UnixFd; } - else if (Feature.IsDynamicCodeEnabled) - { - return GetTypeAlignmentDynamic(); - } ThrowNotSupportedType(typeof(T)); return default; @@ -343,10 +339,6 @@ private static int AppendTypeSignature(Type type, Span signature) signature[0] = (byte)DBusType.UnixFd; return 1; } - else if (Feature.IsDynamicCodeEnabled) - { - return AppendTypeSignatureDynamic(type, signature); - } ThrowNotSupportedType(type); return 0; diff --git a/src/Tmds.DBus/DBusConnection.cs b/src/Tmds.DBus/DBusConnection.cs index 3f2c15ab..30edbf7e 100644 --- a/src/Tmds.DBus/DBusConnection.cs +++ b/src/Tmds.DBus/DBusConnection.cs @@ -3,17 +3,15 @@ // See COPYING for details using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; -using System.Net; -using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using Tmds.DBus.Protocol; using Tmds.DBus.Transports; using System.Threading.Tasks.Sources; + namespace Tmds.DBus { class DBusConnection @@ -121,14 +119,12 @@ public static async Task ConnectAsync(ClientSetupResult connecti throw new ArgumentException("No addresses were found", nameof(connectionContext.ConnectionAddress)); } - Guid _serverId = Guid.Empty; IMessageStream stream = null; var index = 0; while (index < _entries.Length) { AddressEntry entry = _entries[index++]; - _serverId = entry.Guid; try { stream = await Transport.ConnectAsync(entry, connectionContext, cancellationToken).ConfigureAwait(false); diff --git a/test/Tmds.DBus.Protocol.Tests/ReaderTests.cs b/test/Tmds.DBus.Protocol.Tests/ReaderTests.cs index ac49bba5..45f85b41 100644 --- a/test/Tmds.DBus.Protocol.Tests/ReaderTests.cs +++ b/test/Tmds.DBus.Protocol.Tests/ReaderTests.cs @@ -25,7 +25,7 @@ public void ReadBool(bool expected, int alignment, byte[] bigEndianData, byte[] new byte[] { 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 })] public void ReadArray(long[] expected, int alignment, byte[] bigEndianData, byte[] littleEndianData) { - TestRead(expected, (ref Reader reader) => reader.ReadArray(), alignment, bigEndianData, littleEndianData); + TestRead(expected, (ref Reader reader) => reader.ReadArrayOfInt64(), alignment, bigEndianData, littleEndianData); } [Theory] @@ -116,28 +116,6 @@ public void ReadString(string expected, int alignment, byte[] bigEndianData, byt TestRead(expected, (ref Reader reader) => reader.ReadString(), alignment, bigEndianData, littleEndianData); } - [Theory] - [InlineData(8, new byte[] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 104, 119, 0 }, - new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 104, 119, 0 })] - public void ReadStructOf2(int alignment, byte[] bigEndianData, byte[] littleEndianData) - { - var expected = new ValueTuple { Item1 = 1, Item2 = "hw" }; - TestRead(expected, (ref Reader reader) => reader.ReadStruct(), alignment, bigEndianData, littleEndianData); - } - - [Theory] - [InlineData(4, new byte[] { 0, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 3, 111, 110, 101, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 116, 119, 111, 0 }, - new byte[] { 28, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 111, 110, 101, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 116, 119, 111, 0 })] - public void ReadDictionary(int alignment, byte[] bigEndianData, byte[] littleEndianData) - { - Dictionary expected = new() - { - { 1, "one" }, - { 2, "two" } - }; - TestRead(expected, (ref Reader reader) => reader.ReadDictionary(), alignment, bigEndianData, littleEndianData); - } - [Fact] public void ReadHandle() { @@ -170,59 +148,6 @@ public void ReadHandleRaw() Assert.Equal(expected, handle); } - [Theory, MemberData(nameof(ReadVariantTestData))] - private void ReadVariant(object expected, byte[] bigEndianData, byte[] littleEndianData) - { - TestRead(expected, (ref Reader reader) => reader.ReadVariant(), alignment: 0, bigEndianData, littleEndianData); - } - - public static IEnumerable ReadVariantTestData - { - get - { - var myDictionary = new Dictionary - { - { 1, "one" }, - { 2, "two" } - }; - return new[] - { - new object[] {true, new byte[] {1, 98, 0, 0, 0, 0, 0, 1}, - new byte[] {1, 98, 0, 0, 1, 0, 0, 0}}, - new object[] {(byte)5, new byte[] {1, 121, 0, 5}, - new byte[] {1, 121, 0, 5}}, - new object[] {(short)0x0102, new byte[] {1, 110, 0, 0, 1, 2}, - new byte[] {1, 110, 0, 0, 2, 1}}, - new object[] {0x01020304, new byte[] {1, 105, 0, 0, 1, 2, 3, 4}, - new byte[] {1, 105, 0, 0, 4, 3, 2, 1}}, - new object[] {0x0102030405060708, new byte[] {1, 120, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}, - new byte[] {1, 120, 0, 0, 0, 0, 0, 0, 8, 7, 6, 5, 4, 3, 2, 1}}, - new object[] {1.0, new byte[] {1, 100, 0, 0, 0, 0, 0, 0, 63, 240, 0, 0, 0, 0, 0, 0}, - new byte[] {1, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 63}}, - new object[] {(ushort)0x0102, new byte[] {1, 113, 0, 0, 1, 2}, - new byte[] {1, 113, 0, 0, 2, 1}}, - new object[] {(uint)0x01020304, new byte[] {1, 117, 0, 0, 1, 2, 3, 4}, - new byte[] {1, 117, 0, 0, 4, 3, 2, 1}}, - new object[] {(ulong)0x0102030405060708, new byte[] {1, 116, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}, - new byte[] {1, 116, 0, 0, 0, 0, 0, 0, 8, 7, 6, 5, 4, 3, 2, 1}}, - new object[] {"hw", new byte[] {1, 115, 0, 0, 0, 0, 0, 2, 104, 119, 0}, - new byte[] {1, 115, 0, 0, 2, 0, 0, 0, 104, 119, 0}}, - new object[] {new ObjectPath("/a/b"), new byte[] {1, 111, 0, 0, 0, 0, 0, 4, 47, 97, 47, 98, 0}, - new byte[] {1, 111, 0, 0, 4, 0, 0, 0, 47, 97, 47, 98, 0}}, - new object[] {new Signature("sis"), new byte[] {1, 103, 0, 3, 115, 105, 115, 0}, - new byte[] {1, 103, 0, 3, 115, 105, 115, 0}}, - new object[] {new long[] { 1, 2}, new byte[] {2, 97, 120, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2}, - new byte[] {2, 97, 120, 0, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}}, - new object[] {new ValueTuple { Item1 = 1, Item2 = "hw" }, new byte[] {4, 40, 120, 115, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 104, 119, 0}, - new byte[] {4, 40, 120, 115, 41, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 104, 119, 0}}, - new object[] {myDictionary, new byte[] {5, 97, 123, 121, 115, 125, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 111, 110, 101, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 116, 119, 111, 0}, - new byte[] {5, 97, 123, 121, 115, 125, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 111, 110, 101, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 116, 119, 111, 0}}, - new object[] {((byte)1, (byte)2, (byte)3, (byte)4, (byte)5, (byte)6, (byte)7, (byte)8), new byte[] {10, 40, 121, 121, 121, 121, 121, 121, 121, 121, 41, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}, - new byte[] {10, 40, 121, 121, 121, 121, 121, 121, 121, 121, 41, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}}, - }; - } - } - public bool Equals(VariantValue lhs, VariantValue other) { if (lhs.Equals(other)) diff --git a/test/Tmds.DBus.Protocol.Tests/WriterTests.cs b/test/Tmds.DBus.Protocol.Tests/WriterTests.cs index 25b67023..9b90167d 100644 --- a/test/Tmds.DBus.Protocol.Tests/WriterTests.cs +++ b/test/Tmds.DBus.Protocol.Tests/WriterTests.cs @@ -127,21 +127,6 @@ public void WriteStructOf2(int alignment, byte[] bigEndianData, byte[] littleEnd TestWrite(value, (ref MessageWriter writer, (long, string) value) => writer.WriteStruct(value), alignment, bigEndianData, littleEndianData); } - [Theory] - [InlineData(4, new byte[] { 0, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 3, 111, 110, 101, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 116, 119, 111, 0 }, - new byte[] { 28, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 111, 110, 101, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 116, 119, 111, 0 })] - public void WriteDictionary(int alignment, byte[] bigEndianData, byte[] littleEndianData) - { - var value = new Dictionary - { - { 1, "one" }, - { 2, "two" } - }; - TestWrite>>(value, (ref MessageWriter writer, IEnumerable> value) => writer.WriteDictionary(value), alignment, bigEndianData, littleEndianData); - TestWrite[]>(value.AsEnumerable().ToArray(), (ref MessageWriter writer, KeyValuePair[] value) => writer.WriteDictionary(value), alignment, bigEndianData, littleEndianData); - TestWrite>(value, (ref MessageWriter writer, Dictionary value) => writer.WriteDictionary(value), alignment, bigEndianData, littleEndianData); - } - [Theory] [InlineData(4, new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 })] @@ -174,12 +159,6 @@ public void WriteHandle(int alignment, byte[] bigEndianData, byte[] littleEndian } } - [Theory, MemberData(nameof(WriteVariantAsObjectTestData))] - public void WriteVariantAsObject(object value, byte[] bigEndianData, byte[] littleEndianData) - { - TestWrite(value, (ref MessageWriter writer, object value) => writer.WriteVariant(value), alignment: 0, bigEndianData, littleEndianData); - } - [Theory, MemberData(nameof(WriteVariantAsVariantTestData))] public void WriteVariantAsVariant(Variant value, byte[] bigEndianData, byte[] littleEndianData) { From b90d6dcc102ae590f2f314badc8eb2daf69c533d Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Wed, 24 Jul 2024 14:10:28 +0200 Subject: [PATCH 2/4] Fix netstandard compilation. --- src/Tmds.DBus.Protocol/MessageWriter.Array.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Tmds.DBus.Protocol/MessageWriter.Array.cs b/src/Tmds.DBus.Protocol/MessageWriter.Array.cs index d24f92e6..0d71a31b 100644 --- a/src/Tmds.DBus.Protocol/MessageWriter.Array.cs +++ b/src/Tmds.DBus.Protocol/MessageWriter.Array.cs @@ -119,6 +119,19 @@ public void WriteArray(ReadOnlySpan value) public void WriteArray(IEnumerable value) => WriteArrayOfT(value); +#if !NET5_0_OR_GREATER + internal void WriteArray(IEnumerable value) + where T : notnull + { + ArrayStart arrayStart = WriteArrayStart(TypeModel.GetTypeAlignment()); + foreach (var item in value) + { + Write(item); + } + WriteArrayEnd(arrayStart); + } +#endif + internal void WriteArray(ReadOnlySpan value) where T : notnull { From 8b1c02099a9c283a110cfb75d0095d92ec144361 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Wed, 24 Jul 2024 14:11:08 +0200 Subject: [PATCH 3/4] Bump version to 0.20.0. --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 01b021f3..3a9851c1 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,7 @@ true - 0.19.1 + 0.20.0 true From f7f0ac88b224f00067008b68425367b5ff53aa14 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Wed, 24 Jul 2024 17:35:37 +0200 Subject: [PATCH 4/4] Remove Feature class. --- src/Tmds.DBus.Protocol/Feature.cs | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 src/Tmds.DBus.Protocol/Feature.cs diff --git a/src/Tmds.DBus.Protocol/Feature.cs b/src/Tmds.DBus.Protocol/Feature.cs deleted file mode 100644 index 00597dc6..00000000 --- a/src/Tmds.DBus.Protocol/Feature.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Tmds.DBus.Protocol; - -static class Feature -{ - public static bool IsDynamicCodeEnabled => -#if NETSTANDARD2_0 - true -#else - System.Runtime.CompilerServices.RuntimeFeature.IsDynamicCodeSupported -#endif - && EnableDynamicCode; - - private static readonly bool EnableDynamicCode = Environment.GetEnvironmentVariable("TMDS_DBUS_PROTOCOL_DYNAMIC_CODE") != "0"; -} \ No newline at end of file