Skip to content

Commit 0e2c94f

Browse files
fix: properly reset serialization provider
1 parent 78b948c commit 0e2c94f

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

codegen/generator/src/OpenAILibraryGenerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.ComponentModel.Composition;
32
using Microsoft.TypeSpec.Generator;
43
using Microsoft.TypeSpec.Generator.ClientModel;
@@ -16,11 +15,12 @@ public OpenAILibraryGenerator(GeneratorContext context) : base(context) { }
1615
protected override void Configure()
1716
{
1817
base.Configure();
18+
// This should be first, as it recomputes the type
19+
AddVisitor(new NonAbstractPublicTypesVisitor());
1920
AddVisitor(new ConstructorFixupVisitor());
2021
AddVisitor(new KindRenameVisitor());
2122
AddVisitor(new VisibilityVisitor());
2223
AddVisitor(new ContentInnerCollectionDefinedVisitor());
23-
AddVisitor(new NonAbstractPublicTypesVisitor());
2424
AddVisitor(new PageOrderRemovalVisitor(this));
2525
AddVisitor(new OmittedTypesVisitor());
2626
AddVisitor(new InvariantFormatAdditionalPropertiesVisitor());

codegen/generator/src/Visitors/NonAbstractPublicTypesVisitor.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Microsoft.TypeSpec.Generator.ClientModel;
22
using Microsoft.TypeSpec.Generator.Primitives;
33
using Microsoft.TypeSpec.Generator.Providers;
4-
using System.Reflection;
54

65
namespace OpenAILibraryPlugin.Visitors;
76

@@ -17,16 +16,22 @@ protected override TypeProvider VisitType(TypeProvider type)
1716
&& type.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Abstract)
1817
&& type.CustomCodeView?.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Abstract) == false)
1918
{
19+
var serializationProviders = type.SerializationProviders;
20+
21+
// ensure we build the serialization attributes before we change the modifiers
22+
foreach (var serialization in serializationProviders)
23+
{
24+
_ = serialization.Attributes;
25+
}
26+
2027
// Keep types defined in custom code without 'abstract' non-abstract
28+
type.Update(modifiers: type.DeclarationModifiers & ~TypeSignatureModifiers.Abstract);
2129

22-
// To do: replace with this line when dependencies updated to include modifier support
23-
// type.Update(modifiers: type.DeclarationModifiers & ~TypeSignatureModifiers.Abstract);
24-
// To do: remove this reflection-based workaround for the above:
25-
FieldInfo privateModifiersInfo = typeof(TypeProvider)
26-
.GetField("_declarationModifiers", BindingFlags.Instance | BindingFlags.NonPublic)!;
27-
TypeSignatureModifiers privateValue = (TypeSignatureModifiers)privateModifiersInfo.GetValue(type)!;
28-
privateValue &= ~TypeSignatureModifiers.Abstract;
29-
privateModifiersInfo.SetValue(type, privateValue);
30+
// reset the serialization to pick up the new modifiers while keeping any serialization attributes
31+
foreach (var serialization in serializationProviders)
32+
{
33+
serialization.Update(attributes: serialization.Attributes, reset: true);
34+
}
3035
}
3136
return type;
3237
}

0 commit comments

Comments
 (0)