diff --git a/src/MemoryPack.Generator/DiagnosticDescriptors.cs b/src/MemoryPack.Generator/DiagnosticDescriptors.cs index c3fd0603..9faf9f8e 100644 --- a/src/MemoryPack.Generator/DiagnosticDescriptors.cs +++ b/src/MemoryPack.Generator/DiagnosticDescriptors.cs @@ -316,4 +316,12 @@ internal static class DiagnosticDescriptors category: Category, defaultSeverity: DiagnosticSeverity.Error, isEnabledByDefault: true); + + public static readonly DiagnosticDescriptor GenerateTypeCannotSpeciyToUnionBaseType = new( + id: "MEMPACK039", + title: "GenerateType cannot be specified for the Union base type itself", + messageFormat: "The MemoryPackable object '{0}' cannot specify '{1}'. Because it is Union base type.", + category: Category, + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); } diff --git a/src/MemoryPack.Generator/Extensions.cs b/src/MemoryPack.Generator/Extensions.cs index bb3cd574..7c64f7cb 100644 --- a/src/MemoryPack.Generator/Extensions.cs +++ b/src/MemoryPack.Generator/Extensions.cs @@ -86,13 +86,16 @@ public static bool TryGetMemoryPackableType(this ITypeSymbol symbol, ReferenceSy var packableCtorArgs = memPackAttr?.ConstructorArguments; generateType = GenerateType.Object; serializeLayout = SerializeLayout.Sequential; + if (memPackAttr == null || packableCtorArgs == null) { - generateType = GenerateType.NoGenerate; + var memPackUnionFormatterAttr = symbol.GetAttribute(references.MemoryPackUnionFormatterAttribute); + generateType = memPackUnionFormatterAttr != null ? GenerateType.Union : GenerateType.NoGenerate; serializeLayout = SerializeLayout.Sequential; return false; } - else if (packableCtorArgs.Value.Length != 0) + + if (packableCtorArgs.Value.Length != 0) { // MemoryPackable has three attribtues // [GenerateType generateType] diff --git a/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs b/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs index e7379fad..7514d236 100644 --- a/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs +++ b/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs @@ -534,6 +534,12 @@ public bool Validate(TypeDeclarationSyntax syntax, IGeneratorContext context, bo noError = false; } + if (GenerateType != GenerateType.Union) + { + context.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.GenerateTypeCannotSpeciyToUnionBaseType, syntax.Identifier.GetLocation(), Symbol.Name, GenerateType)); + noError = false; + } + if (UnionTags.Select(x => x.Tag).HasDuplicate()) { context.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.UnionTagDuplicate, syntax.Identifier.GetLocation(), Symbol.Name)); diff --git a/src/MemoryPack.Unity/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator/MemoryPack.Generator.Roslyn3.dll b/src/MemoryPack.Unity/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator/MemoryPack.Generator.Roslyn3.dll index 50a20fe2..8beee2b5 100644 Binary files a/src/MemoryPack.Unity/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator/MemoryPack.Generator.Roslyn3.dll and b/src/MemoryPack.Unity/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator/MemoryPack.Generator.Roslyn3.dll differ diff --git a/src/MemoryPack.Unity/Assets/Scripts/MemoryPackObjects/MemberKinds.cs b/src/MemoryPack.Unity/Assets/Scripts/MemoryPackObjects/MemberKinds.cs index 65e1d79e..c58f6fa8 100644 --- a/src/MemoryPack.Unity/Assets/Scripts/MemoryPackObjects/MemberKinds.cs +++ b/src/MemoryPack.Unity/Assets/Scripts/MemoryPackObjects/MemberKinds.cs @@ -38,6 +38,12 @@ public partial class MemberKindsAllUnmanaged int[] kArray = new int[1]; + public MemberKindsAllUnmanaged(int c, int d) + { + this.C = c; + this.D = d; + } + public ref int K { get { return ref kArray[0]; } diff --git a/tests/MemoryPack.Tests/Models/Union.cs b/tests/MemoryPack.Tests/Models/Union.cs index 83dea6a3..2bf8b3f7 100644 --- a/tests/MemoryPack.Tests/Models/Union.cs +++ b/tests/MemoryPack.Tests/Models/Union.cs @@ -144,6 +144,7 @@ public partial class ForExternalUnionFormatter3 public partial class NoraType { public IForExternalUnion? ExtUnion { get; set; } + public UnionAbstractClass? AbstractUnion { get; set; } } // Union for record