Skip to content

[http-client-csharp] MRW context pruning removes required ARM framework type builders #11396

Description

@live1206

Describe the bug

The C# generator removes required ModelReaderWriterBuildable attributes for ARM framework types represented by SystemObjectModelProvider, while generated serialization code still deserializes those types through the SDK's ModelReaderWriterContext.

This causes ModelReaderWriter.Read<T>(..., Context.Default) to throw at runtime because Context.GetTypeBuilder(typeof(T)) cannot find a builder.

This appears to be a regression from #11288 (89f388c405438d0f1785857da380c0817bffda17). That change introduced ProviderReferenceMapAnalyzer.IsResolvableBuildableType(), whose IsResolvableBuildableProvider() rejects every SystemObjectModelProvider:

private static bool IsResolvableBuildableProvider(TypeProvider provider) =>
    provider is not SystemObjectModelProvider &&
    provider is not ModelProvider { IsExternal: true } &&
    ShouldWriteProvider(provider);

ModelReaderWriterContextDefinition.CollectBuildableTypesFromFrameworkType() now applies this filter before adding the framework type to the context.

Reproduction

Azure SDK full regeneration PR: Azure/azure-sdk-for-net#61331

In sdk/mysql/Azure.ResourceManager.MySql/src/Generated/Models/AzureResourceManagerMySqlContext.cs, regeneration removes:

[ModelReaderWriterBuildable(typeof(ManagedServiceIdentity))]
[ModelReaderWriterBuildable(typeof(ResponseError))]
[ModelReaderWriterBuildable(typeof(SystemData))]

However, the regenerated serialization code still contains six reads using that context:

  • ResponseError: 3 calls
    • ArmOperationStatusResourceProvisioningState.Serialization.cs
    • ErrorResponse.Serialization.cs
    • MySqlFlexibleServerBackupAndExportResult.Serialization.cs
  • SystemData: 2 calls
    • MySqlFlexibleServerBackupAndExportResult.Serialization.cs
    • MySqlFlexibleServerLogFile.Serialization.cs
  • ManagedServiceIdentity: 1 call
    • MySqlFlexibleServerPatch.Serialization.cs

For example:

identity = ModelReaderWriter.Read<ManagedServiceIdentity>(
    data,
    options,
    AzureResourceManagerMySqlContext.Default);

ModelReaderWriter.Read calls context.GetTypeBuilder(returnType), so these paths fail with InvalidOperationException: No ModelReaderWriterTypeBuilder found ....

Expected behavior

Framework types represented by SystemObjectModelProvider should remain eligible for ModelReaderWriterBuildable when their wrapped SystemType implements IPersistableModel<T> or IJsonModel<T> and is referenced by retained serialization code.

Suggested fix

Update the resolvability check so a SystemObjectModelProvider is considered resolvable for MRW context generation when its wrapped SystemType supports MRW. Add regression coverage for a retained generated model whose serialization reads an external/system model through ModelReaderWriter.Read<T>(..., Context.Default).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

bugSomething isn't workingemitter:client:csharpIssue for the C# client emitter: @typespec/http-client-csharp

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions