diff --git a/src/MemoryPack.Generator/MemoryPackGenerator.Emitter.cs b/src/MemoryPack.Generator/MemoryPackGenerator.Emitter.cs index d17735fa..98cbb0a1 100644 --- a/src/MemoryPack.Generator/MemoryPackGenerator.Emitter.cs +++ b/src/MemoryPack.Generator/MemoryPackGenerator.Emitter.cs @@ -193,7 +193,7 @@ string WithEscape(ISymbol symbol) if (!xmlDocument) { - if (type.IsUnmanagedType) + if (type.IsUnmanagedType && type.GenerateType is not GenerateType.VersionTolerant and not GenerateType.CircularReference) { sb.Append("GenerateType unmanaged "); } @@ -207,7 +207,7 @@ string WithEscape(ISymbol symbol) else { sb.AppendLine("/// "); - if (type.IsUnmanagedType) + if (type.IsUnmanagedType && type.GenerateType is not GenerateType.VersionTolerant and not GenerateType.CircularReference) { sb.AppendLine("/// MemoryPack GenerateType: unmanaged
"); } @@ -269,7 +269,7 @@ public void Emit(StringBuilder writer, IGeneratorContext context) var serializeBody = ""; var deserializeBody = ""; - if (IsUnmanagedType) + if (IsUnmanagedType && GenerateType is not GenerateType.VersionTolerant and not GenerateType.CircularReference) { serializeBody = $$""" writer.WriteUnmanaged(value); diff --git a/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs b/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs index 0806cd14..67848778 100644 --- a/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs +++ b/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs @@ -292,14 +292,8 @@ public bool Validate(TypeDeclarationSyntax syntax, IGeneratorContext context, bo noError = false; } - if (this.IsUnmanagedType) + if (this.IsUnmanagedType && GenerateType is not GenerateType.VersionTolerant and not GenerateType.CircularReference) { - if (GenerateType is GenerateType.VersionTolerant) - { - context.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.VersionTolerantOnUnmanagedStruct, syntax.Identifier.GetLocation(), Symbol.Name)); - noError = false; - } - var structLayoutFields = this.Symbol.GetAllMembers() .OfType() .Select(x => diff --git a/tests/MemoryPack.Tests/SourceGeneratorTests/GeneratorDiagnosticsTest.TypeScript.cs b/tests/MemoryPack.Tests/SourceGeneratorTests/GeneratorDiagnosticsTest.TypeScript.cs index 75226673..cd49313f 100644 --- a/tests/MemoryPack.Tests/SourceGeneratorTests/GeneratorDiagnosticsTest.TypeScript.cs +++ b/tests/MemoryPack.Tests/SourceGeneratorTests/GeneratorDiagnosticsTest.TypeScript.cs @@ -206,7 +206,7 @@ public partial record FullName """, "FullName.ts"); - generatedCode.Should().Contain( + generatedCode.Replace("\r\n", "\n").Should().Contain( """ export class FullName { firstName: string; diff --git a/tests/MemoryPack.Tests/SourceGeneratorTests/GeneratorDiagnosticsTest.cs b/tests/MemoryPack.Tests/SourceGeneratorTests/GeneratorDiagnosticsTest.cs index 9ba79cb2..d8dcbec4 100644 --- a/tests/MemoryPack.Tests/SourceGeneratorTests/GeneratorDiagnosticsTest.cs +++ b/tests/MemoryPack.Tests/SourceGeneratorTests/GeneratorDiagnosticsTest.cs @@ -674,9 +674,9 @@ public Tester(int i1) } [Fact] - public void MEMPACK041_UnmanagedStructCannotBeVersionTolerant() + public void MEMPACK041_UnmanagedStructCanBeVersionTolerant() { - Compile(41, """ + var code = """ using MemoryPack; [MemoryPackable(GenerateType.VersionTolerant)] @@ -685,7 +685,9 @@ public partial struct Tester [MemoryPackOrder(0)] public int I1 { get; init; } } -"""); +"""; + var (_, diagnostics) = CSharpGeneratorRunner.RunGenerator(code); + diagnostics.Length.Should().Be(0); } [Fact]