diff --git a/codegen/generator/src/OpenAILibraryGenerator.cs b/codegen/generator/src/OpenAILibraryGenerator.cs index adf0a2e82..3942de6ee 100644 --- a/codegen/generator/src/OpenAILibraryGenerator.cs +++ b/codegen/generator/src/OpenAILibraryGenerator.cs @@ -1,4 +1,3 @@ -using System; using System.ComponentModel.Composition; using Microsoft.TypeSpec.Generator; using Microsoft.TypeSpec.Generator.ClientModel; @@ -16,11 +15,12 @@ public OpenAILibraryGenerator(GeneratorContext context) : base(context) { } protected override void Configure() { base.Configure(); + // This should be first, as it recomputes the type + AddVisitor(new NonAbstractPublicTypesVisitor()); AddVisitor(new ConstructorFixupVisitor()); AddVisitor(new KindRenameVisitor()); AddVisitor(new VisibilityVisitor()); AddVisitor(new ContentInnerCollectionDefinedVisitor()); - AddVisitor(new NonAbstractPublicTypesVisitor()); AddVisitor(new PageOrderRemovalVisitor(this)); AddVisitor(new OmittedTypesVisitor()); AddVisitor(new InvariantFormatAdditionalPropertiesVisitor()); diff --git a/codegen/generator/src/Visitors/NonAbstractPublicTypesVisitor.cs b/codegen/generator/src/Visitors/NonAbstractPublicTypesVisitor.cs index b420670ba..5bc15c994 100644 --- a/codegen/generator/src/Visitors/NonAbstractPublicTypesVisitor.cs +++ b/codegen/generator/src/Visitors/NonAbstractPublicTypesVisitor.cs @@ -1,7 +1,6 @@ using Microsoft.TypeSpec.Generator.ClientModel; using Microsoft.TypeSpec.Generator.Primitives; using Microsoft.TypeSpec.Generator.Providers; -using System.Reflection; namespace OpenAILibraryPlugin.Visitors; @@ -17,16 +16,22 @@ protected override TypeProvider VisitType(TypeProvider type) && type.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Abstract) && type.CustomCodeView?.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Abstract) == false) { + var serializationProviders = type.SerializationProviders; + + // ensure we build the serialization attributes before we change the modifiers + foreach (var serialization in serializationProviders) + { + _ = serialization.Attributes; + } + // Keep types defined in custom code without 'abstract' non-abstract + type.Update(modifiers: type.DeclarationModifiers & ~TypeSignatureModifiers.Abstract); - // To do: replace with this line when dependencies updated to include modifier support - // type.Update(modifiers: type.DeclarationModifiers & ~TypeSignatureModifiers.Abstract); - // To do: remove this reflection-based workaround for the above: - FieldInfo privateModifiersInfo = typeof(TypeProvider) - .GetField("_declarationModifiers", BindingFlags.Instance | BindingFlags.NonPublic)!; - TypeSignatureModifiers privateValue = (TypeSignatureModifiers)privateModifiersInfo.GetValue(type)!; - privateValue &= ~TypeSignatureModifiers.Abstract; - privateModifiersInfo.SetValue(type, privateValue); + // reset the serialization to pick up the new modifiers while keeping any serialization attributes + foreach (var serialization in serializationProviders) + { + serialization.Update(attributes: serialization.Attributes, reset: true); + } } return type; }