diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs index 43d2559a48b..312d73602b9 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs @@ -405,6 +405,16 @@ private static bool IsDiscriminator(InputProperty property) return modelProvider; } + if (CustomCodeView?.BaseType is null && _inputModel.BaseModel is not null) + { + var inputBaseModelProvider = CodeModelGenerator.Instance.TypeFactory.CreateModel(_inputModel.BaseModel); + if (inputBaseModelProvider is not null && inputBaseModelProvider.Type.AreNamesEqual(baseType)) + { + CodeModelGenerator.Instance.TypeFactory.CSharpTypeMap[baseType] = inputBaseModelProvider; + return inputBaseModelProvider; + } + } + if (CustomCodeView?.BaseType != null && !string.IsNullOrEmpty(baseType.Namespace)) { foreach (var (mapKey, mapValue) in CodeModelGenerator.Instance.TypeFactory.CSharpTypeMap) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/SystemObjectModelProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/SystemObjectModelProviderTests.cs index ea3474a200e..62b4563815c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/SystemObjectModelProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/SystemObjectModelProviderTests.cs @@ -160,6 +160,34 @@ public void CanRepresentExternalBaseChainWithoutSeparateInheritedProperties() Assert.AreEqual("ResourceType", provider.Properties[0].Name); } + [Test] + public void BaseSystemProviderIsCreatedFromInputModelHierarchy() + { + var baseInputModel = InputFactory.Model( + "SystemException", + properties: [InputFactory.Property("message", InputPrimitiveType.String)]); + var derivedInputModel = InputFactory.Model( + "ArgumentException", + properties: [InputFactory.Property("paramName", InputPrimitiveType.String)], + baseModel: baseInputModel); + + var baseSystemType = new CSharpType(typeof(SystemException)); + var derivedSystemType = new CSharpType(typeof(ArgumentException)); + MockHelpers.LoadMockGenerator( + inputModelTypes: [baseInputModel, derivedInputModel], + createModelCore: model => model == baseInputModel + ? new SystemObjectModelProvider(baseSystemType, model) + : new SystemObjectModelProvider(derivedSystemType, model)); + + var provider = CodeModelGenerator.Instance.TypeFactory.CreateModel(derivedInputModel); + + Assert.IsNotNull(provider); + Assert.IsNotNull(provider!.BaseModelProvider); + Assert.IsInstanceOf(provider.BaseModelProvider); + Assert.AreEqual("SystemException", provider.BaseModelProvider!.Name); + Assert.AreEqual("Message", provider.BaseModelProvider.Properties.Single().Name); + } + // ------------------------------------------------------------------- // 3. Property deduplication: properties matching framework base are skipped // -------------------------------------------------------------------