diff --git a/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs b/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs index 35d5d17ee..e6651fe48 100644 --- a/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs +++ b/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs @@ -11,6 +11,7 @@ internal class MemoryPackFormatterRegistrationGenerator : ISerializerFormatterGe EmitPreamble(generationContext, ctx, writer); EmitBody(generationContext, ctx, writer); + EmitTypeHints(generationContext, ctx, writer); EmitPostscript(generationContext, ctx, writer); return (".MemoryPack", writer.ToString()); @@ -59,6 +60,7 @@ partial class {{generationContext.InitializerPartialTypeName}} /// public static void RegisterMemoryPackFormatters() { + TypeHints.Register(); """); foreach (var (resolverInfo, index) in ctx.FormatterRegistrations.Select((x, i) => (x, i))) { @@ -72,6 +74,29 @@ public static void RegisterMemoryPackFormatters() """); } + static void EmitTypeHints(GenerationContext generationContext, SerializationFormatterCodeGenContext ctx, StringBuilder writer) + { + writer.AppendLineWithFormat($$""" + /// Type hints for Ahead-of-Time compilation. + static class TypeHints + { + #if NET8_0_OR_GREATER + """); + foreach (var typeHint in ctx.TypeHints.Where(x => !x.FullName.StartsWith("global::System."))) + { + writer.AppendLineWithFormat($$""" + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof({{typeHint.FullName}}))] + """); + } + writer.AppendLineWithFormat($$""" + #endif + internal static void Register() + { + } + } + """); + } + static void EmitPostscript(GenerationContext generationContext, SerializationFormatterCodeGenContext ctx, StringBuilder writer) { } diff --git a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs index 23e080576..729bf9d42 100644 --- a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs +++ b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs @@ -12,8 +12,20 @@ partial class MagicOnionInitializer /// public static void RegisterMemoryPackFormatters() { + TypeHints.Register(); global::MemoryPack.MemoryPackFormatterProvider.Register(new global::MagicOnion.Serialization.MemoryPack.DynamicArgumentTupleFormatter()); global::MemoryPack.MemoryPackFormatterProvider.Register(new global::MemoryPack.Formatters.ValueTupleFormatter()); } } } + /// Type hints for Ahead-of-Time compilation. + static class TypeHints + { +#if NET8_0_OR_GREATER + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof(global::MagicOnion.DynamicArgumentTuple))] + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof(global::MyApplication1.MyGenericObject>))] +#endif + internal static void Register() + { + } + } diff --git a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs index 66ae10bbe..565a89a4f 100644 --- a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs +++ b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs @@ -12,7 +12,18 @@ partial class MagicOnionInitializer /// public static void RegisterMemoryPackFormatters() { + TypeHints.Register(); global::MemoryPack.MemoryPackFormatterProvider.Register(new global::MagicOnion.Serialization.MemoryPack.DynamicArgumentTupleFormatter()); } } } + /// Type hints for Ahead-of-Time compilation. + static class TypeHints + { +#if NET8_0_OR_GREATER + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof(global::MagicOnion.DynamicArgumentTuple))] +#endif + internal static void Register() + { + } + }