diff --git a/packages/http-client-csharp/eng/scripts/Generate.ps1 b/packages/http-client-csharp/eng/scripts/Generate.ps1 index da645778fd5..1e9579a0196 100644 --- a/packages/http-client-csharp/eng/scripts/Generate.ps1 +++ b/packages/http-client-csharp/eng/scripts/Generate.ps1 @@ -23,7 +23,7 @@ if (-not $LaunchOnly) { Write-Host "Installing SampleTypeSpec plugins" -ForegroundColor Cyan - Invoke "npm install" $sampleDir + Invoke "npm install --force" $sampleDir Write-Host "Generating SampleTypeSpec using plugins" -ForegroundColor Cyan diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Properties/AssemblyInfo.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Properties/AssemblyInfo.cs index 616e6935891..577f6639db2 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Properties/AssemblyInfo.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Properties/AssemblyInfo.cs @@ -1,6 +1,7 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.TypeSpec.Generator.ClientModel.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010041df4fe80c5af6ff9a410db5a173b0ce24ad68764c623e308b1584a88b1d1d82277f746c1cccba48997e13db3366d5ed676576ffd293293baf42c643f008ba2e8a556e25e529c0407a38506555340749559f5100e6fd78cc935bb6c82d2af303beb0d3c6563400659610759b4ed5cb2e0faf36b17e6842f04cdc544c74e051ba")] +[assembly: InternalsVisibleTo("Microsoft.TypeSpec.Generator.Tests.Perf, PublicKey=002400000480000094000000060200000024000052534131000400000100010041df4fe80c5af6ff9a410db5a173b0ce24ad68764c623e308b1584a88b1d1d82277f746c1cccba48997e13db3366d5ed676576ffd293293baf42c643f008ba2e8a556e25e529c0407a38506555340749559f5100e6fd78cc935bb6c82d2af303beb0d3c6563400659610759b4ed5cb2e0faf36b17e6842f04cdc544c74e051ba")] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ModelReaderWriterContextDefinition.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ModelReaderWriterContextDefinition.cs index 719f6aa5a0b..9791f8f8e57 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ModelReaderWriterContextDefinition.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ModelReaderWriterContextDefinition.cs @@ -3,9 +3,13 @@ using System; using System.ClientModel.Primitives; +using System.Collections.Generic; using System.IO; +using System.Linq; using Microsoft.TypeSpec.Generator.Primitives; using Microsoft.TypeSpec.Generator.Providers; +using Microsoft.TypeSpec.Generator.Statements; +using static Microsoft.TypeSpec.Generator.Snippets.Snippet; namespace Microsoft.TypeSpec.Generator.ClientModel.Providers { @@ -22,6 +26,101 @@ protected override TypeSignatureModifiers BuildDeclarationModifiers() protected override CSharpType[] BuildImplements() => [typeof(ModelReaderWriterContext)]; + protected override IReadOnlyList BuildAttributes() + { + var attributes = new List(); + + // Add ModelReaderWriterBuildableAttribute for all IPersistableModel types + var buildableTypes = CollectBuildableTypes(); + foreach (var type in buildableTypes) + { + // Use the full attribute type name to ensure proper compilation + var attributeType = new CSharpType(typeof(ModelReaderWriterBuildableAttribute)); + attributes.Add(new AttributeStatement(attributeType, TypeOf(type))); + } + + return attributes; + } + + /// + /// Collects all types that implement IPersistableModel, including all models and their properties + /// that are also IPersistableModel types, recursively without duplicates. + /// + private HashSet CollectBuildableTypes() + { + var buildableTypes = new HashSet(new CSharpTypeNameComparer()); + var visitedTypes = new HashSet(new CSharpTypeNameComparer()); + + // Get all model providers from the output library + var modelProviders = ScmCodeModelGenerator.Instance.OutputLibrary.TypeProviders + .OfType() + .ToDictionary(mp => mp.Type, mp => mp, new CSharpTypeNameComparer()); + + // Process each model recursively + foreach (var modelProvider in modelProviders.Values) + { + CollectBuildableTypesRecursive(modelProvider.Type, buildableTypes, visitedTypes, modelProviders); + } + + return buildableTypes; + } + + /// + /// Recursively collects all types that implement IPersistableModel. + /// + private void CollectBuildableTypesRecursive(CSharpType currentType, HashSet buildableTypes, HashSet visitedTypes, Dictionary modelProviders) + { + // Avoid infinite recursion by checking if we've already visited this type + if (visitedTypes.Contains(currentType)) + { + return; + } + + visitedTypes.Add(currentType); + + // Check if this type implements IPersistableModel + if (ImplementsIPersistableModel(currentType, modelProviders, out ModelProvider? model)) + { + buildableTypes.Add(currentType); + + if (model is not null) + { + // Check all properties of this model + foreach (var property in model.Properties) + { + var propertyType = property.Type.IsCollection ? GetInnerMostElement(property.Type) : property.Type; + CollectBuildableTypesRecursive(propertyType, buildableTypes, visitedTypes, modelProviders); + } + } + } + } + + private CSharpType GetInnerMostElement(CSharpType type) + { + var result = type.ElementType; + while (result.IsCollection) + { + result = result.ElementType; + } + return result; + } + + /// + /// Checks if a type implements IPersistableModel interface. + /// + private bool ImplementsIPersistableModel(CSharpType type, Dictionary modelProviders, out ModelProvider? model) + { + if (modelProviders.TryGetValue(type, out model)) + { + return model.SerializationProviders.OfType().Any(); + } + + if (!type.IsFrameworkType || type.IsEnum || type.IsLiteral) + return false; + + return type.FrameworkType.GetInterfaces().Any(i => i.Name == "IPersistableModel`1" || i.Name == "IJsonModel`1"); + } + protected override XmlDocProvider BuildXmlDocs() { var summary = new Statements.XmlDocSummaryStatement( @@ -49,5 +148,29 @@ private static string RemovePeriods(string input) return buffer.Slice(0, index).ToString(); } + + private class CSharpTypeNameComparer : IEqualityComparer + { + public bool Equals(CSharpType? x, CSharpType? y) + { + if (x is null && y is null) + { + return true; + } + if (x is null || y is null) + { + return false; + } + return x.Namespace == y.Namespace && x.Name == y.Name; + } + + public int GetHashCode(CSharpType obj) + { + HashCode hashCode = new HashCode(); + hashCode.Add(obj.Namespace); + hashCode.Add(obj.Name); + return hashCode.ToHashCode(); + } + } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Properties/AssemblyInfo.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..403c4390844 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Microsoft.TypeSpec.Generator.Tests.Perf, PublicKey=002400000480000094000000060200000024000052534131000400000100010041df4fe80c5af6ff9a410db5a173b0ce24ad68764c623e308b1584a88b1d1d82277f746c1cccba48997e13db3366d5ed676576ffd293293baf42c643f008ba2e8a556e25e529c0407a38506555340749559f5100e6fd78cc935bb6c82d2af303beb0d3c6563400659610759b4ed5cb2e0faf36b17e6842f04cdc544c74e051ba")] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/Definitions/ModelReaderWriterContextDefinitionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/Definitions/ModelReaderWriterContextDefinitionTests.cs new file mode 100644 index 00000000000..2a66c20dcf1 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/Definitions/ModelReaderWriterContextDefinitionTests.cs @@ -0,0 +1,219 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using Microsoft.TypeSpec.Generator.ClientModel.Providers; +using Microsoft.TypeSpec.Generator.Input; +using Microsoft.TypeSpec.Generator.Primitives; +using Microsoft.TypeSpec.Generator.Tests.Common; +using NUnit.Framework; + +namespace Microsoft.TypeSpec.Generator.ClientModel.Tests.Providers.Definitions +{ + public class ModelReaderWriterContextDefinitionTests + { + [Test] + public void ValidateModelReaderWriterContextIsGenerated() + { + MockHelpers.LoadMockGenerator(); + + var contextDefinition = new ModelReaderWriterContextDefinition(); + + Assert.IsNotNull(contextDefinition); + Assert.IsNotNull(contextDefinition.Name); + Assert.IsTrue(contextDefinition.Name.EndsWith("Context")); + Assert.IsNotNull(contextDefinition.DeclarationModifiers); + Assert.IsTrue(contextDefinition.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Public)); + Assert.IsTrue(contextDefinition.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Partial)); + Assert.IsTrue(contextDefinition.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Class)); + Assert.IsNotNull(contextDefinition.Implements); + Assert.IsTrue(contextDefinition.Implements.Contains(typeof(ModelReaderWriterContext))); + } + + [Test] + public void ValidateModelReaderWriterBuildableAttributesAreGenerated() + { + var mockGenerator = MockHelpers.LoadMockGenerator( + inputModels: () => new List + { + InputFactory.Model("TestModel", properties: + [ + InputFactory.Property("StringProperty", InputPrimitiveType.String), + InputFactory.Property("IntProperty", InputPrimitiveType.Int32) + ]) + }); + + var contextDefinition = new ModelReaderWriterContextDefinition(); + var attributes = contextDefinition.Attributes; + + Assert.IsNotNull(attributes); + Assert.IsTrue(attributes.Count > 0); + + // Check that exactly one ModelReaderWriterBuildableAttribute exists since TestModel has only primitive properties + var buildableAttributes = attributes.Where(a => a.Type.IsFrameworkType && a.Type.FrameworkType == typeof(ModelReaderWriterBuildableAttribute)); + Assert.AreEqual(1, buildableAttributes.Count(), "Exactly one ModelReaderWriterBuildableAttribute should be generated for TestModel"); + } + + [Test] + public void ValidateModelReaderWriterBuildableAttributesIncludeNestedModels() + { + // Create a model with a property that references another model + var nestedModel = InputFactory.Model("NestedModel", properties: + [ + InputFactory.Property("NestedValue", InputPrimitiveType.String) + ]); + + var parentModel = InputFactory.Model("ParentModel", properties: + [ + InputFactory.Property("NestedProperty", nestedModel), + InputFactory.Property("SimpleProperty", InputPrimitiveType.String) + ]); + + var mockGenerator = MockHelpers.LoadMockGenerator( + inputModels: () => [parentModel, nestedModel]); + + var contextDefinition = new ModelReaderWriterContextDefinition(); + var attributes = contextDefinition.Attributes; + + Assert.IsNotNull(attributes); + Assert.IsTrue(attributes.Count > 0); + + // Check that exactly two ModelReaderWriterBuildableAttribute exist for both models + var buildableAttributes = attributes.Where(a => a.Type.IsFrameworkType && a.Type.FrameworkType == typeof(ModelReaderWriterBuildableAttribute)); + Assert.AreEqual(2, buildableAttributes.Count(), "Exactly two ModelReaderWriterBuildableAttributes should be generated for nested models"); + } + + [Test] + public void ValidateModelReaderWriterBuildableAttributesHandleCollectionProperties() + { + // Create a model with a collection property containing another model + var itemModel = InputFactory.Model("ItemModel", properties: + [ + InputFactory.Property("ItemValue", InputPrimitiveType.String) + ]); + + var collectionModel = InputFactory.Model("CollectionModel", properties: + [ + InputFactory.Property("Items", InputFactory.Array(itemModel)) + ]); + + var mockGenerator = MockHelpers.LoadMockGenerator( + inputModels: () => [collectionModel, itemModel]); + + var contextDefinition = new ModelReaderWriterContextDefinition(); + var attributes = contextDefinition.Attributes; + + Assert.IsNotNull(attributes); + Assert.IsTrue(attributes.Count > 0); + + // Check that exactly two ModelReaderWriterBuildableAttribute exist for both models + var buildableAttributes = attributes.Where(a => a.Type.IsFrameworkType && a.Type.FrameworkType == typeof(ModelReaderWriterBuildableAttribute)); + Assert.AreEqual(2, buildableAttributes.Count(), "Exactly two ModelReaderWriterBuildableAttributes should be generated for collection item models"); + } + + [Test] + public void ValidateModelReaderWriterBuildableAttributesAvoidDuplicates() + { + // Create models with circular references to test duplicate handling + var modelA = InputFactory.Model("ModelA", properties: + [ + InputFactory.Property("PropertyA", InputPrimitiveType.String) + ]); + + var modelB = InputFactory.Model("ModelB", properties: + [ + InputFactory.Property("PropertyB", InputPrimitiveType.String), + InputFactory.Property("ModelARef", modelA) + ]); + + // Add a property to ModelA that references ModelB to create a circular reference + var modelAWithCircularRef = InputFactory.Model("ModelA", properties: + [ + InputFactory.Property("PropertyA", InputPrimitiveType.String), + InputFactory.Property("ModelBRef", modelB) + ]); + + var mockGenerator = MockHelpers.LoadMockGenerator( + inputModels: () => [modelAWithCircularRef, modelB]); + + var contextDefinition = new ModelReaderWriterContextDefinition(); + var attributes = contextDefinition.Attributes; + + Assert.IsNotNull(attributes); + + // Check that no duplicate attributes exist + var buildableAttributes = attributes.Where(a => a.Type.IsFrameworkType && a.Type.FrameworkType == typeof(ModelReaderWriterBuildableAttribute)); + var uniqueTypes = buildableAttributes.Select(a => a.Arguments.First().ToString()).Distinct().ToList(); + + Assert.AreEqual(buildableAttributes.Count(), uniqueTypes.Count, + "No duplicate ModelReaderWriterBuildableAttributes should be generated"); + } + + [Test] + public void ValidateModelReaderWriterBuildableAttributesIncludeDependencyModels() + { + // Create a model with a property that references a model from a dependency library + // The dependency model won't have a model provider in the current library + var dependencyModel = InputFactory.Model("DependencyModel"); + + var parentModel = InputFactory.Model("ParentModel", properties: + [ + InputFactory.Property("DependencyProperty", dependencyModel), + InputFactory.Property("SimpleProperty", InputPrimitiveType.String) + ]); + + // Only include the parentModel in the mock generator, simulating that + // dependencyModel is from a dependency library + var mockGenerator = MockHelpers.LoadMockGenerator( + inputModels: () => [parentModel], + createCSharpTypeCore: input => + { + return new CSharpType(typeof(DependencyModel)); + }, + createCSharpTypeCoreFallback: input => input.Name == "DependencyModel"); + + var contextDefinition = new ModelReaderWriterContextDefinition(); + var attributes = contextDefinition.Attributes; + + Assert.IsNotNull(attributes); + Assert.IsTrue(attributes.Count > 0); + + // Check that exactly two ModelReaderWriterBuildableAttribute exist: + // one for ParentModel and one for the dependency model + var buildableAttributes = attributes.Where(a => a.Type.IsFrameworkType && a.Type.FrameworkType == typeof(ModelReaderWriterBuildableAttribute)); + Assert.AreEqual(2, buildableAttributes.Count(), "Exactly two ModelReaderWriterBuildableAttributes should be generated for models with dependency references"); + } + + private class DependencyModel : IJsonModel + { + DependencyModel? IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + { + throw new NotImplementedException(); + } + + DependencyModel? IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + { + throw new NotImplementedException(); + } + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) + { + throw new NotImplementedException(); + } + + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + throw new NotImplementedException(); + } + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/TestHelpers/MockHelpers.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/TestHelpers/MockHelpers.cs index 687ec6ab9eb..f68f688d513 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/TestHelpers/MockHelpers.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/TestHelpers/MockHelpers.cs @@ -68,7 +68,8 @@ public static Mock LoadMockGenerator( HttpMessageApi? httpMessageApi = null, RequestContentApi? requestContentApi = null, Func? auth = null, - bool includeXmlDocs = false) + bool includeXmlDocs = false, + Func? createCSharpTypeCoreFallback = null) { IReadOnlyList inputNsApiVersions = apiVersions?.Invoke() ?? []; IReadOnlyList inputNsLiterals = inputLiterals?.Invoke() ?? []; @@ -110,7 +111,19 @@ public static Mock LoadMockGenerator( if (createCSharpTypeCore is not null) { - mockTypeFactory.Protected().Setup("CreateCSharpTypeCore", ItExpr.IsAny()).Returns(createCSharpTypeCore); + if (createCSharpTypeCoreFallback is not null) + { + mockTypeFactory.Protected() + .Setup("CreateCSharpTypeCore", ItExpr.IsAny()) + .Returns((InputType input) => + createCSharpTypeCoreFallback(input) + ? createCSharpTypeCore(input) + : null!); + } + else + { + mockTypeFactory.Protected().Setup("CreateCSharpTypeCore", ItExpr.IsAny()).Returns(createCSharpTypeCore); + } } if (createClientCore is not null) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/perf/Microsoft.TypeSpec.Generator.Tests.Perf.csproj b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/perf/Microsoft.TypeSpec.Generator.Tests.Perf.csproj index 44f0f8602d8..2923ecb6971 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/perf/Microsoft.TypeSpec.Generator.Tests.Perf.csproj +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/perf/Microsoft.TypeSpec.Generator.Tests.Perf.csproj @@ -2,7 +2,9 @@ + + diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/perf/ModelReaderWriterContextDefinitionBenchmark.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/perf/ModelReaderWriterContextDefinitionBenchmark.cs new file mode 100644 index 00000000000..45fa669af3d --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/perf/ModelReaderWriterContextDefinitionBenchmark.cs @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using BenchmarkDotNet.Attributes; +using Microsoft.TypeSpec.Generator.ClientModel.Providers; +using Microsoft.TypeSpec.Generator.ClientModel.Tests; +using Microsoft.TypeSpec.Generator.Input; +using Microsoft.TypeSpec.Generator.Statements; +using Microsoft.TypeSpec.Generator.Tests.Common; + +namespace Microsoft.TypeSpec.Generator.ClientModel.Perf +{ + [MemoryDiagnoser] + public class ModelReaderWriterContextDefinitionBenchmark + { + private ModelReaderWriterContextDefinition? _contextDefinition; + private Func>? _privateDelegate; + + [Params(1, 10, 100)] + public int ModelCount; + + [Params(1, 10, 100)] + public int SimplePropertyCount; + + [Params(0, 1, 2, 5)] + public int NestingLevel; + + [GlobalSetup] + public void Setup() + { + var generator = MockHelpers.LoadMockGenerator(inputModels: () => GetMockModels(ModelCount, SimplePropertyCount, NestingLevel)); + + _contextDefinition = generator.Object.OutputLibrary.TypeProviders.OfType().FirstOrDefault(); + + var methodInfo = typeof(ModelReaderWriterContextDefinition).GetMethod("BuildAttributes", BindingFlags.Instance | BindingFlags.NonPublic); + _privateDelegate = CreateDelegate>>(methodInfo!); + } + + [GlobalCleanup] + public void Cleanup() + { + _contextDefinition = null; + } + + [Benchmark] + public IReadOnlyList CollectBuildableTypes() + { + return _privateDelegate!(_contextDefinition!); + } + + private IReadOnlyList GetMockModels(int modelCount, int simplePropertyCount, int nestingLevel) + { + return + [ + .. GetSimpleModels(modelCount, simplePropertyCount, nestingLevel), + ]; + } + + private static IEnumerable GetSimpleModels(int modelCount, int simplePropertyCount, int nestingLevel) + { + for (int i = 0; i < modelCount; i++) + { + yield return GetNestedModel(i, simplePropertyCount, nestingLevel); + } + } + + private static IEnumerable GetSimpleProperties(int simplePropertyCount) + { + for (int i = 0; i < simplePropertyCount; i++) + { + yield return InputFactory.Property($"Property{i}", InputPrimitiveType.String, isRequired: true); + } + } + + private static InputModelType GetNestedModel(int modelNumber, int simplePropertyCount, int nestingLevel) + { + var nestedModel = GetRecursiveNestedModel(modelNumber, simplePropertyCount, nestingLevel); + return InputFactory.Model( + $"Model{modelNumber}", + properties: nestedModel is null + ? [.. GetSimpleProperties(simplePropertyCount)] + : [.. GetSimpleProperties(simplePropertyCount), InputFactory.Property($"Property{simplePropertyCount}", nestedModel)]); + } + + private static InputModelType? GetRecursiveNestedModel(int modelNumber, int simplePropertyCount, int nestingLevel) + { + if (nestingLevel <= 0) + return null; + + var nestedModel = GetRecursiveNestedModel(modelNumber, simplePropertyCount, nestingLevel - 1); + return InputFactory.Model( + $"NestedModel{modelNumber}_{nestingLevel}", + properties: nestedModel is null + ? [.. GetSimpleProperties(simplePropertyCount)] + : [.. GetSimpleProperties(simplePropertyCount), InputFactory.Property($"Property{simplePropertyCount}", nestedModel)]); + } + + private static T CreateDelegate(MethodInfo methodInfo) + { + var instanceParam = Expression.Parameter(typeof(object), "target"); + var parameters = methodInfo.GetParameters() + .Select(p => Expression.Parameter(p.ParameterType, p.Name)) + .ToArray(); + + var instanceCast = Expression.Convert(instanceParam, methodInfo.DeclaringType!); + var methodCall = Expression.Call(instanceCast, methodInfo, parameters); + + var lambdaParams = new ParameterExpression[] { instanceParam }.Concat(parameters); + var lambda = Expression.Lambda(methodCall, lambdaParams); + + return lambda.Compile(); + } + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/PostProcessing/PostProcessor.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/PostProcessing/PostProcessor.cs index 5af938ece5c..f6fb6feefe8 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/PostProcessing/PostProcessor.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/PostProcessing/PostProcessor.cs @@ -341,6 +341,7 @@ private async Task RemoveModelsAsync(Project project, { // accumulate the definitions from the same document together var documents = new Dictionary>(); + foreach (var model in unusedModels) { var document = project.GetDocument(model.SyntaxTree); @@ -356,8 +357,8 @@ private async Task RemoveModelsAsync(Project project, project = await RemoveModelsFromDocumentAsync(project, models); } - // remove what are now invalid usings due to the models being removed - project = await RemoveInvalidUsings(project); + // remove what are now invalid references due to the models being removed + project = await RemoveInvalidRefs(project); return project; } @@ -403,39 +404,76 @@ private async Task RemoveModelsFromDocumentAsync(Project project, return document.Project; } - private async Task RemoveInvalidUsings(Project project) + private async Task RemoveInvalidRefs(Project project) { var solution = project.Solution; + + // Process each document for invalid usings foreach (var documentId in project.DocumentIds) { - var document = solution.GetDocument(documentId)!; - var root = await document.GetSyntaxRootAsync(); - var model = await document.GetSemanticModelAsync(); + solution = await RemoveInvalidUsings(solution, documentId); + } - if (root is not CompilationUnitSyntax cu || model == null) - { - continue; - } + // Process each document for invalid attributes (with fresh semantic models) + foreach (var documentId in project.DocumentIds) + { + solution = await RemoveInvalidAttributes(solution, documentId); + } - var invalidUsings = cu.Usings - .Where(u => - { - var info = model.GetSymbolInfo(u.Name!); - var sym = info.Symbol; - return sym is null || sym.Kind != SymbolKind.Namespace; - }) - .ToList(); + return solution.GetProject(project.Id)!; + } + + private async Task RemoveInvalidUsings(Solution solution, DocumentId documentId) + { + var document = solution.GetDocument(documentId)!; + var root = await document.GetSyntaxRootAsync(); + var model = await document.GetSemanticModelAsync(); + + if (root is not CompilationUnitSyntax cu || model == null) + return solution; - if (invalidUsings.Count == 0) + var invalidUsings = cu.Usings + .Where(u => { - continue; - } + var info = model.GetSymbolInfo(u.Name!); + var sym = info.Symbol; + return sym is null || sym.Kind != SymbolKind.Namespace; + }) + .ToList(); - var cleaned = cu.RemoveNodes(invalidUsings, SyntaxRemoveOptions.KeepNoTrivia); - solution = solution.WithDocumentSyntaxRoot(documentId, cleaned!); + if (invalidUsings.Count > 0) + { + cu = cu.RemoveNodes(invalidUsings, SyntaxRemoveOptions.KeepNoTrivia)!; + solution = solution.WithDocumentSyntaxRoot(documentId, cu); } - return solution.GetProject(project.Id)!; + return solution; + } + + private async Task RemoveInvalidAttributes(Solution solution, DocumentId documentId) + { + var document = solution.GetDocument(documentId)!; + var root = await document.GetSyntaxRootAsync(); + var model = await document.GetSemanticModelAsync(); + + if (root is not CompilationUnitSyntax cu || model == null) + return solution; + + var invalidAttributes = cu.DescendantNodes() + .OfType() + .Where(attr => attr.Attributes.Any(attribute => + attribute.ArgumentList?.Arguments.Any(arg => + arg.Expression is TypeOfExpressionSyntax typeOfExpr && + model.GetTypeInfo(typeOfExpr.Type).Type?.TypeKind == TypeKind.Error) == true)) + .ToList(); + + if (invalidAttributes.Count > 0) + { + cu = cu.RemoveNodes(invalidAttributes, SyntaxRemoveOptions.KeepNoTrivia)!; + solution = solution.WithDocumentSyntaxRoot(documentId, cu); + } + + return solution; } private async Task> GetRootSymbolsAsync(Project project, TypeSymbols modelSymbols) diff --git a/packages/http-client-csharp/generator/Packages.Data.props b/packages/http-client-csharp/generator/Packages.Data.props index 9ac6633d904..b55ea514ea6 100644 --- a/packages/http-client-csharp/generator/Packages.Data.props +++ b/packages/http-client-csharp/generator/Packages.Data.props @@ -14,7 +14,7 @@ - + diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/SampleTypeSpecContext.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/SampleTypeSpecContext.cs index 588aff0bc8e..22a54ca30ba 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/SampleTypeSpecContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/SampleTypeSpecContext.cs @@ -6,6 +6,7 @@ #nullable disable using System.ClientModel.Primitives; +using SampleTypeSpec.Models.Custom; namespace SampleTypeSpec { @@ -13,6 +14,17 @@ namespace SampleTypeSpec /// Context class which will be filled in by the System.ClientModel.SourceGeneration. /// For more information /// + [ModelReaderWriterBuildable(typeof(Thing))] + [ModelReaderWriterBuildable(typeof(RoundTripModel))] + [ModelReaderWriterBuildable(typeof(ModelWithRequiredNullableProperties))] + [ModelReaderWriterBuildable(typeof(Friend))] + [ModelReaderWriterBuildable(typeof(RenamedModelCustom))] + [ModelReaderWriterBuildable(typeof(ReturnsAnonymousModelResponse))] + [ModelReaderWriterBuildable(typeof(ListWithNextLinkResponse))] + [ModelReaderWriterBuildable(typeof(ListWithContinuationTokenResponse))] + [ModelReaderWriterBuildable(typeof(ListWithContinuationTokenHeaderResponseResponse))] + [ModelReaderWriterBuildable(typeof(PageThing))] + [ModelReaderWriterBuildable(typeof(ModelWithEmbeddedNonBodyParameters))] public partial class SampleTypeSpecContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/bytes/src/Generated/Models/EncodeBytesContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/bytes/src/Generated/Models/EncodeBytesContext.cs index 80a42ebc50d..5c0cbde8e8f 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/bytes/src/Generated/Models/EncodeBytesContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/bytes/src/Generated/Models/EncodeBytesContext.cs @@ -6,6 +6,10 @@ namespace Encode.Bytes { + [ModelReaderWriterBuildable(typeof(DefaultBytesProperty))] + [ModelReaderWriterBuildable(typeof(Base64BytesProperty))] + [ModelReaderWriterBuildable(typeof(Base64urlBytesProperty))] + [ModelReaderWriterBuildable(typeof(Base64urlArrayBytesProperty))] public partial class EncodeBytesContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/datetime/src/Generated/Models/EncodeDatetimeContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/datetime/src/Generated/Models/EncodeDatetimeContext.cs index bfeadd55559..07b40150f83 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/datetime/src/Generated/Models/EncodeDatetimeContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/datetime/src/Generated/Models/EncodeDatetimeContext.cs @@ -6,6 +6,11 @@ namespace Encode.Datetime { + [ModelReaderWriterBuildable(typeof(DefaultDatetimeProperty))] + [ModelReaderWriterBuildable(typeof(Rfc3339DatetimeProperty))] + [ModelReaderWriterBuildable(typeof(Rfc7231DatetimeProperty))] + [ModelReaderWriterBuildable(typeof(UnixTimestampDatetimeProperty))] + [ModelReaderWriterBuildable(typeof(UnixTimestampArrayDatetimeProperty))] public partial class EncodeDatetimeContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/duration/src/Generated/Models/EncodeDurationContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/duration/src/Generated/Models/EncodeDurationContext.cs index 1064af3f756..0c46dd17e91 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/duration/src/Generated/Models/EncodeDurationContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/duration/src/Generated/Models/EncodeDurationContext.cs @@ -3,9 +3,16 @@ #nullable disable using System.ClientModel.Primitives; +using Encode.Duration._Property; namespace Encode.Duration { + [ModelReaderWriterBuildable(typeof(DefaultDurationProperty))] + [ModelReaderWriterBuildable(typeof(ISO8601DurationProperty))] + [ModelReaderWriterBuildable(typeof(Int32SecondsDurationProperty))] + [ModelReaderWriterBuildable(typeof(FloatSecondsDurationProperty))] + [ModelReaderWriterBuildable(typeof(Float64SecondsDurationProperty))] + [ModelReaderWriterBuildable(typeof(FloatSecondsDurationArrayProperty))] public partial class EncodeDurationContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/numeric/src/Generated/Models/EncodeNumericContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/numeric/src/Generated/Models/EncodeNumericContext.cs index 52b86801187..bc0cafbf1a3 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/numeric/src/Generated/Models/EncodeNumericContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/encode/numeric/src/Generated/Models/EncodeNumericContext.cs @@ -3,9 +3,13 @@ #nullable disable using System.ClientModel.Primitives; +using Encode.Numeric._Property; namespace Encode.Numeric { + [ModelReaderWriterBuildable(typeof(SafeintAsStringProperty))] + [ModelReaderWriterBuildable(typeof(Uint32AsStringProperty))] + [ModelReaderWriterBuildable(typeof(Uint8AsStringProperty))] public partial class EncodeNumericContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/basic/src/Generated/Models/ParametersBasicContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/basic/src/Generated/Models/ParametersBasicContext.cs index 527011575a7..d21f56d38b7 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/basic/src/Generated/Models/ParametersBasicContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/basic/src/Generated/Models/ParametersBasicContext.cs @@ -3,9 +3,12 @@ #nullable disable using System.ClientModel.Primitives; +using Parameters.Basic._ExplicitBody; +using Parameters.Basic._ImplicitBody; namespace Parameters.Basic { + [ModelReaderWriterBuildable(typeof(User))] public partial class ParametersBasicContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/body-optionality/src/Generated/Models/ParametersBodyOptionalityContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/body-optionality/src/Generated/Models/ParametersBodyOptionalityContext.cs index 072b422217b..cf75f43d92f 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/body-optionality/src/Generated/Models/ParametersBodyOptionalityContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/body-optionality/src/Generated/Models/ParametersBodyOptionalityContext.cs @@ -6,6 +6,7 @@ namespace Parameters.BodyOptionality { + [ModelReaderWriterBuildable(typeof(BodyModel))] public partial class ParametersBodyOptionalityContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/spread/src/Generated/Models/ParametersSpreadContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/spread/src/Generated/Models/ParametersSpreadContext.cs index 9730bb9899e..fca7b7b5ee9 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/spread/src/Generated/Models/ParametersSpreadContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/spread/src/Generated/Models/ParametersSpreadContext.cs @@ -3,9 +3,12 @@ #nullable disable using System.ClientModel.Primitives; +using Parameters.Spread._Alias; +using Parameters.Spread._Model; namespace Parameters.Spread { + [ModelReaderWriterBuildable(typeof(BodyParameter))] public partial class ParametersSpreadContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/content-negotiation/src/Generated/Models/PayloadContentNegotiationContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/content-negotiation/src/Generated/Models/PayloadContentNegotiationContext.cs index 9f5c2258980..adc8d9a36c0 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/content-negotiation/src/Generated/Models/PayloadContentNegotiationContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/content-negotiation/src/Generated/Models/PayloadContentNegotiationContext.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Payload.ContentNegotiation._DifferentBody; namespace Payload.ContentNegotiation { + [ModelReaderWriterBuildable(typeof(PngImageAsJson))] public partial class PayloadContentNegotiationContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/json-merge-patch/src/Generated/Models/PayloadJsonMergePatchContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/json-merge-patch/src/Generated/Models/PayloadJsonMergePatchContext.cs index 0f0894f4373..65f36a74d66 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/json-merge-patch/src/Generated/Models/PayloadJsonMergePatchContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/json-merge-patch/src/Generated/Models/PayloadJsonMergePatchContext.cs @@ -6,6 +6,8 @@ namespace Payload.JsonMergePatch { + [ModelReaderWriterBuildable(typeof(Resource))] + [ModelReaderWriterBuildable(typeof(InnerModel))] public partial class PayloadJsonMergePatchContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/pageable/src/Generated/Models/PayloadPageableContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/pageable/src/Generated/Models/PayloadPageableContext.cs index d8287a37a8f..32cea242338 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/pageable/src/Generated/Models/PayloadPageableContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/payload/pageable/src/Generated/Models/PayloadPageableContext.cs @@ -3,9 +3,12 @@ #nullable disable using System.ClientModel.Primitives; +using Payload.Pageable._ServerDrivenPagination; +using Payload.Pageable._ServerDrivenPagination.ContinuationToken; namespace Payload.Pageable { + [ModelReaderWriterBuildable(typeof(Pet))] public partial class PayloadPageableContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/response/status-code-range/src/Generated/Models/ResponseStatusCodeRangeContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/response/status-code-range/src/Generated/Models/ResponseStatusCodeRangeContext.cs index 1b96d6be611..246085379b8 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/response/status-code-range/src/Generated/Models/ResponseStatusCodeRangeContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/response/status-code-range/src/Generated/Models/ResponseStatusCodeRangeContext.cs @@ -6,6 +6,8 @@ namespace Response.StatusCodeRange { + [ModelReaderWriterBuildable(typeof(ErrorInRange))] + [ModelReaderWriterBuildable(typeof(NotFoundError))] public partial class ResponseStatusCodeRangeContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/serialization/encoded-name/json/src/Generated/Models/SerializationEncodedNameJsonContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/serialization/encoded-name/json/src/Generated/Models/SerializationEncodedNameJsonContext.cs index 5a3fdea8f4c..90ff61856f4 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/serialization/encoded-name/json/src/Generated/Models/SerializationEncodedNameJsonContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/serialization/encoded-name/json/src/Generated/Models/SerializationEncodedNameJsonContext.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Serialization.EncodedName.Json._Property; namespace Serialization.EncodedName.Json { + [ModelReaderWriterBuildable(typeof(JsonEncodedNameModel))] public partial class SerializationEncodedNameJsonContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/special-words/src/Generated/Models/SpecialWordsContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/special-words/src/Generated/Models/SpecialWordsContext.cs index 27b77157b7f..62b7b62a1d5 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/special-words/src/Generated/Models/SpecialWordsContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/special-words/src/Generated/Models/SpecialWordsContext.cs @@ -3,9 +3,45 @@ #nullable disable using System.ClientModel.Primitives; +using SpecialWords._ModelProperties; +using SpecialWords._Models; namespace SpecialWords { + [ModelReaderWriterBuildable(typeof(And))] + [ModelReaderWriterBuildable(typeof(As))] + [ModelReaderWriterBuildable(typeof(Assert))] + [ModelReaderWriterBuildable(typeof(Async))] + [ModelReaderWriterBuildable(typeof(Await))] + [ModelReaderWriterBuildable(typeof(Break))] + [ModelReaderWriterBuildable(typeof(Class))] + [ModelReaderWriterBuildable(typeof(Constructor))] + [ModelReaderWriterBuildable(typeof(Continue))] + [ModelReaderWriterBuildable(typeof(Def))] + [ModelReaderWriterBuildable(typeof(Del))] + [ModelReaderWriterBuildable(typeof(Elif))] + [ModelReaderWriterBuildable(typeof(Else))] + [ModelReaderWriterBuildable(typeof(Except))] + [ModelReaderWriterBuildable(typeof(Exec))] + [ModelReaderWriterBuildable(typeof(Finally))] + [ModelReaderWriterBuildable(typeof(For))] + [ModelReaderWriterBuildable(typeof(From))] + [ModelReaderWriterBuildable(typeof(Global))] + [ModelReaderWriterBuildable(typeof(If))] + [ModelReaderWriterBuildable(typeof(Import))] + [ModelReaderWriterBuildable(typeof(In))] + [ModelReaderWriterBuildable(typeof(Is))] + [ModelReaderWriterBuildable(typeof(Lambda))] + [ModelReaderWriterBuildable(typeof(Not))] + [ModelReaderWriterBuildable(typeof(Or))] + [ModelReaderWriterBuildable(typeof(Pass))] + [ModelReaderWriterBuildable(typeof(Raise))] + [ModelReaderWriterBuildable(typeof(Return))] + [ModelReaderWriterBuildable(typeof(Try))] + [ModelReaderWriterBuildable(typeof(While))] + [ModelReaderWriterBuildable(typeof(With))] + [ModelReaderWriterBuildable(typeof(Yield))] + [ModelReaderWriterBuildable(typeof(SameAsModel))] public partial class SpecialWordsContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/array/src/Generated/Models/_Type_ArrayContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/array/src/Generated/Models/_Type_ArrayContext.cs index 0407f0c9b77..a06d0a8ec92 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/array/src/Generated/Models/_Type_ArrayContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/array/src/Generated/Models/_Type_ArrayContext.cs @@ -6,6 +6,7 @@ namespace _Type._Array { + [ModelReaderWriterBuildable(typeof(InnerModel))] public partial class _Type_ArrayContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/dictionary/src/Generated/Models/_TypeDictionaryContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/dictionary/src/Generated/Models/_TypeDictionaryContext.cs index 31078a18622..457fcc40c76 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/dictionary/src/Generated/Models/_TypeDictionaryContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/dictionary/src/Generated/Models/_TypeDictionaryContext.cs @@ -6,6 +6,7 @@ namespace _Type.Dictionary { + [ModelReaderWriterBuildable(typeof(InnerModel))] public partial class _TypeDictionaryContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/empty/src/Generated/Models/_TypeModelEmptyContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/empty/src/Generated/Models/_TypeModelEmptyContext.cs index 7e49f29aa4d..4f8a7686465 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/empty/src/Generated/Models/_TypeModelEmptyContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/empty/src/Generated/Models/_TypeModelEmptyContext.cs @@ -6,6 +6,9 @@ namespace _Type.Model.Empty { + [ModelReaderWriterBuildable(typeof(EmptyInput))] + [ModelReaderWriterBuildable(typeof(EmptyOutput))] + [ModelReaderWriterBuildable(typeof(EmptyInputOutput))] public partial class _TypeModelEmptyContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/enum-discriminator/src/Generated/Models/_TypeModelInheritanceEnumDiscriminatorContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/enum-discriminator/src/Generated/Models/_TypeModelInheritanceEnumDiscriminatorContext.cs index 62306feb229..70183b996f9 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/enum-discriminator/src/Generated/Models/_TypeModelInheritanceEnumDiscriminatorContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/enum-discriminator/src/Generated/Models/_TypeModelInheritanceEnumDiscriminatorContext.cs @@ -6,6 +6,12 @@ namespace _Type.Model.Inheritance.EnumDiscriminator { + [ModelReaderWriterBuildable(typeof(Dog))] + [ModelReaderWriterBuildable(typeof(UnknownDog))] + [ModelReaderWriterBuildable(typeof(Golden))] + [ModelReaderWriterBuildable(typeof(Snake))] + [ModelReaderWriterBuildable(typeof(UnknownSnake))] + [ModelReaderWriterBuildable(typeof(Cobra))] public partial class _TypeModelInheritanceEnumDiscriminatorContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/nested-discriminator/src/Generated/Models/_TypeModelInheritanceNestedDiscriminatorContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/nested-discriminator/src/Generated/Models/_TypeModelInheritanceNestedDiscriminatorContext.cs index b1c52368505..dab6063817c 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/nested-discriminator/src/Generated/Models/_TypeModelInheritanceNestedDiscriminatorContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/nested-discriminator/src/Generated/Models/_TypeModelInheritanceNestedDiscriminatorContext.cs @@ -6,6 +6,13 @@ namespace _Type.Model.Inheritance.NestedDiscriminator { + [ModelReaderWriterBuildable(typeof(Fish))] + [ModelReaderWriterBuildable(typeof(UnknownFish))] + [ModelReaderWriterBuildable(typeof(Shark))] + [ModelReaderWriterBuildable(typeof(UnknownShark))] + [ModelReaderWriterBuildable(typeof(SawShark))] + [ModelReaderWriterBuildable(typeof(GoblinShark))] + [ModelReaderWriterBuildable(typeof(Salmon))] public partial class _TypeModelInheritanceNestedDiscriminatorContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/not-discriminated/src/Generated/Models/_TypeModelInheritanceNotDiscriminatedContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/not-discriminated/src/Generated/Models/_TypeModelInheritanceNotDiscriminatedContext.cs index 781ce1d9785..8455d012863 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/not-discriminated/src/Generated/Models/_TypeModelInheritanceNotDiscriminatedContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/not-discriminated/src/Generated/Models/_TypeModelInheritanceNotDiscriminatedContext.cs @@ -6,6 +6,9 @@ namespace _Type.Model.Inheritance.NotDiscriminated { + [ModelReaderWriterBuildable(typeof(Siamese))] + [ModelReaderWriterBuildable(typeof(Cat))] + [ModelReaderWriterBuildable(typeof(Pet))] public partial class _TypeModelInheritanceNotDiscriminatedContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/recursive/src/Generated/Models/_TypeModelInheritanceRecursiveContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/recursive/src/Generated/Models/_TypeModelInheritanceRecursiveContext.cs index 48e5d54327e..b4037978d29 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/recursive/src/Generated/Models/_TypeModelInheritanceRecursiveContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/recursive/src/Generated/Models/_TypeModelInheritanceRecursiveContext.cs @@ -6,6 +6,8 @@ namespace _Type.Model.Inheritance.Recursive { + [ModelReaderWriterBuildable(typeof(Extension))] + [ModelReaderWriterBuildable(typeof(Element))] public partial class _TypeModelInheritanceRecursiveContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/single-discriminator/src/Generated/Models/_TypeModelInheritanceSingleDiscriminatorContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/single-discriminator/src/Generated/Models/_TypeModelInheritanceSingleDiscriminatorContext.cs index 2882d3c312e..78cec6dd88f 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/single-discriminator/src/Generated/Models/_TypeModelInheritanceSingleDiscriminatorContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/single-discriminator/src/Generated/Models/_TypeModelInheritanceSingleDiscriminatorContext.cs @@ -6,6 +6,15 @@ namespace _Type.Model.Inheritance.SingleDiscriminator { + [ModelReaderWriterBuildable(typeof(Bird))] + [ModelReaderWriterBuildable(typeof(UnknownBird))] + [ModelReaderWriterBuildable(typeof(SeaGull))] + [ModelReaderWriterBuildable(typeof(Sparrow))] + [ModelReaderWriterBuildable(typeof(Goose))] + [ModelReaderWriterBuildable(typeof(Eagle))] + [ModelReaderWriterBuildable(typeof(Dinosaur))] + [ModelReaderWriterBuildable(typeof(UnknownDinosaur))] + [ModelReaderWriterBuildable(typeof(TRex))] public partial class _TypeModelInheritanceSingleDiscriminatorContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/usage/src/Generated/Models/_TypeModelUsageContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/usage/src/Generated/Models/_TypeModelUsageContext.cs index ad94d528135..9feac771bce 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/usage/src/Generated/Models/_TypeModelUsageContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/usage/src/Generated/Models/_TypeModelUsageContext.cs @@ -6,6 +6,9 @@ namespace _Type.Model.Usage { + [ModelReaderWriterBuildable(typeof(InputRecord))] + [ModelReaderWriterBuildable(typeof(OutputRecord))] + [ModelReaderWriterBuildable(typeof(InputOutputRecord))] public partial class _TypeModelUsageContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/visibility/src/Generated/Models/_TypeModelVisibilityContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/visibility/src/Generated/Models/_TypeModelVisibilityContext.cs index 0b2f24af5ab..3b0d205d0f4 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/visibility/src/Generated/Models/_TypeModelVisibilityContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/visibility/src/Generated/Models/_TypeModelVisibilityContext.cs @@ -6,6 +6,8 @@ namespace _Type.Model.Visibility { + [ModelReaderWriterBuildable(typeof(VisibilityModel))] + [ModelReaderWriterBuildable(typeof(ReadOnlyModel))] public partial class _TypeModelVisibilityContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/additional-properties/src/Generated/Models/_TypePropertyAdditionalPropertiesContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/additional-properties/src/Generated/Models/_TypePropertyAdditionalPropertiesContext.cs index d413cd43dd3..548dd4e256f 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/additional-properties/src/Generated/Models/_TypePropertyAdditionalPropertiesContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/additional-properties/src/Generated/Models/_TypePropertyAdditionalPropertiesContext.cs @@ -6,6 +6,45 @@ namespace _Type.Property.AdditionalProperties { + [ModelReaderWriterBuildable(typeof(ExtendsUnknownAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(ExtendsUnknownAdditionalPropertiesDerived))] + [ModelReaderWriterBuildable(typeof(ExtendsUnknownAdditionalPropertiesDiscriminated))] + [ModelReaderWriterBuildable(typeof(UnknownExtendsUnknownAdditionalPropertiesDiscriminated))] + [ModelReaderWriterBuildable(typeof(ExtendsUnknownAdditionalPropertiesDiscriminatedDerived))] + [ModelReaderWriterBuildable(typeof(IsUnknownAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(IsUnknownAdditionalPropertiesDerived))] + [ModelReaderWriterBuildable(typeof(IsUnknownAdditionalPropertiesDiscriminated))] + [ModelReaderWriterBuildable(typeof(UnknownIsUnknownAdditionalPropertiesDiscriminated))] + [ModelReaderWriterBuildable(typeof(IsUnknownAdditionalPropertiesDiscriminatedDerived))] + [ModelReaderWriterBuildable(typeof(ExtendsStringAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(IsStringAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(SpreadStringRecord))] + [ModelReaderWriterBuildable(typeof(ExtendsFloatAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(IsFloatAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(SpreadFloatRecord))] + [ModelReaderWriterBuildable(typeof(ExtendsModelAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(ModelForRecord))] + [ModelReaderWriterBuildable(typeof(IsModelAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(SpreadModelRecord))] + [ModelReaderWriterBuildable(typeof(ExtendsModelArrayAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(IsModelArrayAdditionalProperties))] + [ModelReaderWriterBuildable(typeof(SpreadModelArrayRecord))] + [ModelReaderWriterBuildable(typeof(DifferentSpreadStringRecord))] + [ModelReaderWriterBuildable(typeof(DifferentSpreadFloatRecord))] + [ModelReaderWriterBuildable(typeof(DifferentSpreadModelRecord))] + [ModelReaderWriterBuildable(typeof(DifferentSpreadModelArrayRecord))] + [ModelReaderWriterBuildable(typeof(DifferentSpreadStringDerived))] + [ModelReaderWriterBuildable(typeof(DifferentSpreadFloatDerived))] + [ModelReaderWriterBuildable(typeof(DifferentSpreadModelDerived))] + [ModelReaderWriterBuildable(typeof(DifferentSpreadModelArrayDerived))] + [ModelReaderWriterBuildable(typeof(MultipleSpreadRecord))] + [ModelReaderWriterBuildable(typeof(SpreadRecordForUnion))] + [ModelReaderWriterBuildable(typeof(SpreadRecordForNonDiscriminatedUnion))] + [ModelReaderWriterBuildable(typeof(WidgetData0))] + [ModelReaderWriterBuildable(typeof(WidgetData1))] + [ModelReaderWriterBuildable(typeof(SpreadRecordForNonDiscriminatedUnion2))] + [ModelReaderWriterBuildable(typeof(WidgetData2))] + [ModelReaderWriterBuildable(typeof(SpreadRecordForNonDiscriminatedUnion3))] public partial class _TypePropertyAdditionalPropertiesContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/nullable/src/Generated/Models/_TypePropertyNullableContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/nullable/src/Generated/Models/_TypePropertyNullableContext.cs index 0ee24e1e978..9b3eeccc8fb 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/nullable/src/Generated/Models/_TypePropertyNullableContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/nullable/src/Generated/Models/_TypePropertyNullableContext.cs @@ -6,6 +6,14 @@ namespace _Type.Property.Nullable { + [ModelReaderWriterBuildable(typeof(StringProperty))] + [ModelReaderWriterBuildable(typeof(BytesProperty))] + [ModelReaderWriterBuildable(typeof(DatetimeProperty))] + [ModelReaderWriterBuildable(typeof(DurationProperty))] + [ModelReaderWriterBuildable(typeof(CollectionsByteProperty))] + [ModelReaderWriterBuildable(typeof(CollectionsModelProperty))] + [ModelReaderWriterBuildable(typeof(InnerModel))] + [ModelReaderWriterBuildable(typeof(CollectionsStringProperty))] public partial class _TypePropertyNullableContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/optionality/src/Generated/Models/_TypePropertyOptionalContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/optionality/src/Generated/Models/_TypePropertyOptionalContext.cs index 279aaa195b8..799454988a8 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/optionality/src/Generated/Models/_TypePropertyOptionalContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/optionality/src/Generated/Models/_TypePropertyOptionalContext.cs @@ -6,6 +6,22 @@ namespace _Type.Property.Optional { + [ModelReaderWriterBuildable(typeof(StringProperty))] + [ModelReaderWriterBuildable(typeof(BytesProperty))] + [ModelReaderWriterBuildable(typeof(DatetimeProperty))] + [ModelReaderWriterBuildable(typeof(DurationProperty))] + [ModelReaderWriterBuildable(typeof(PlainDateProperty))] + [ModelReaderWriterBuildable(typeof(PlainTimeProperty))] + [ModelReaderWriterBuildable(typeof(CollectionsByteProperty))] + [ModelReaderWriterBuildable(typeof(CollectionsModelProperty))] + [ModelReaderWriterBuildable(typeof(StringLiteralProperty))] + [ModelReaderWriterBuildable(typeof(IntLiteralProperty))] + [ModelReaderWriterBuildable(typeof(FloatLiteralProperty))] + [ModelReaderWriterBuildable(typeof(BooleanLiteralProperty))] + [ModelReaderWriterBuildable(typeof(UnionStringLiteralProperty))] + [ModelReaderWriterBuildable(typeof(UnionIntLiteralProperty))] + [ModelReaderWriterBuildable(typeof(UnionFloatLiteralProperty))] + [ModelReaderWriterBuildable(typeof(RequiredAndOptionalProperty))] public partial class _TypePropertyOptionalContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/value-types/src/Generated/Models/_TypePropertyValueTypesContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/value-types/src/Generated/Models/_TypePropertyValueTypesContext.cs index 7c6e1db5919..fe554756e28 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/value-types/src/Generated/Models/_TypePropertyValueTypesContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/value-types/src/Generated/Models/_TypePropertyValueTypesContext.cs @@ -6,6 +6,36 @@ namespace _Type.Property.ValueTypes { + [ModelReaderWriterBuildable(typeof(BooleanProperty))] + [ModelReaderWriterBuildable(typeof(StringProperty))] + [ModelReaderWriterBuildable(typeof(BytesProperty))] + [ModelReaderWriterBuildable(typeof(IntProperty))] + [ModelReaderWriterBuildable(typeof(FloatProperty))] + [ModelReaderWriterBuildable(typeof(DecimalProperty))] + [ModelReaderWriterBuildable(typeof(Decimal128Property))] + [ModelReaderWriterBuildable(typeof(DatetimeProperty))] + [ModelReaderWriterBuildable(typeof(DurationProperty))] + [ModelReaderWriterBuildable(typeof(EnumProperty))] + [ModelReaderWriterBuildable(typeof(ExtensibleEnumProperty))] + [ModelReaderWriterBuildable(typeof(ModelProperty))] + [ModelReaderWriterBuildable(typeof(InnerModel))] + [ModelReaderWriterBuildable(typeof(CollectionsStringProperty))] + [ModelReaderWriterBuildable(typeof(CollectionsIntProperty))] + [ModelReaderWriterBuildable(typeof(CollectionsModelProperty))] + [ModelReaderWriterBuildable(typeof(DictionaryStringProperty))] + [ModelReaderWriterBuildable(typeof(NeverProperty))] + [ModelReaderWriterBuildable(typeof(UnknownStringProperty))] + [ModelReaderWriterBuildable(typeof(UnknownIntProperty))] + [ModelReaderWriterBuildable(typeof(UnknownDictProperty))] + [ModelReaderWriterBuildable(typeof(UnknownArrayProperty))] + [ModelReaderWriterBuildable(typeof(StringLiteralProperty))] + [ModelReaderWriterBuildable(typeof(IntLiteralProperty))] + [ModelReaderWriterBuildable(typeof(FloatLiteralProperty))] + [ModelReaderWriterBuildable(typeof(BooleanLiteralProperty))] + [ModelReaderWriterBuildable(typeof(UnionStringLiteralProperty))] + [ModelReaderWriterBuildable(typeof(UnionIntLiteralProperty))] + [ModelReaderWriterBuildable(typeof(UnionFloatLiteralProperty))] + [ModelReaderWriterBuildable(typeof(UnionEnumValueProperty))] public partial class _TypePropertyValueTypesContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/_TypeUnionContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/_TypeUnionContext.cs index 452172e5c44..a2927b4b5e3 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/_TypeUnionContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/_TypeUnionContext.cs @@ -6,6 +6,22 @@ namespace _Type.Union { + [ModelReaderWriterBuildable(typeof(GetResponse))] + [ModelReaderWriterBuildable(typeof(GetResponse1))] + [ModelReaderWriterBuildable(typeof(GetResponse2))] + [ModelReaderWriterBuildable(typeof(GetResponse3))] + [ModelReaderWriterBuildable(typeof(GetResponse4))] + [ModelReaderWriterBuildable(typeof(GetResponse5))] + [ModelReaderWriterBuildable(typeof(Cat))] + [ModelReaderWriterBuildable(typeof(Dog))] + [ModelReaderWriterBuildable(typeof(GetResponse6))] + [ModelReaderWriterBuildable(typeof(EnumsOnlyCases))] + [ModelReaderWriterBuildable(typeof(GetResponse7))] + [ModelReaderWriterBuildable(typeof(StringAndArrayCases))] + [ModelReaderWriterBuildable(typeof(GetResponse8))] + [ModelReaderWriterBuildable(typeof(MixedLiteralsCases))] + [ModelReaderWriterBuildable(typeof(GetResponse9))] + [ModelReaderWriterBuildable(typeof(MixedTypesCases))] public partial class _TypeUnionContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v1/src/Generated/Models/VersioningAddedV1Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v1/src/Generated/Models/VersioningAddedV1Context.cs index 4a1b81b5bd3..3d27ee7498d 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v1/src/Generated/Models/VersioningAddedV1Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v1/src/Generated/Models/VersioningAddedV1Context.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.Added; namespace Versioning.Added.V1 { + [ModelReaderWriterBuildable(typeof(ModelV1))] public partial class VersioningAddedV1Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v2/src/Generated/Models/VersioningAddedV2Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v2/src/Generated/Models/VersioningAddedV2Context.cs index a79be6548c2..07f6e8b216f 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v2/src/Generated/Models/VersioningAddedV2Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v2/src/Generated/Models/VersioningAddedV2Context.cs @@ -3,9 +3,12 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.Added; namespace Versioning.Added.V2 { + [ModelReaderWriterBuildable(typeof(ModelV1))] + [ModelReaderWriterBuildable(typeof(ModelV2))] public partial class VersioningAddedV2Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v1/src/Generated/Models/VersioningMadeOptionalV1Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v1/src/Generated/Models/VersioningMadeOptionalV1Context.cs index d4555e7f213..7c7a9e4744b 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v1/src/Generated/Models/VersioningMadeOptionalV1Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v1/src/Generated/Models/VersioningMadeOptionalV1Context.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.MadeOptional; namespace Versioning.MadeOptional.V1 { + [ModelReaderWriterBuildable(typeof(TestModel))] public partial class VersioningMadeOptionalV1Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v2/src/Generated/Models/VersioningMadeOptionalV2Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v2/src/Generated/Models/VersioningMadeOptionalV2Context.cs index ed8ef46d942..18b7e4fd8ca 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v2/src/Generated/Models/VersioningMadeOptionalV2Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v2/src/Generated/Models/VersioningMadeOptionalV2Context.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.MadeOptional; namespace Versioning.MadeOptional.V2 { + [ModelReaderWriterBuildable(typeof(TestModel))] public partial class VersioningMadeOptionalV2Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v1/src/Generated/Models/VersioningRemovedV1Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v1/src/Generated/Models/VersioningRemovedV1Context.cs index 90772a416d5..df15da84a05 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v1/src/Generated/Models/VersioningRemovedV1Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v1/src/Generated/Models/VersioningRemovedV1Context.cs @@ -3,9 +3,13 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.Removed; namespace Versioning.Removed.V1 { + [ModelReaderWriterBuildable(typeof(ModelV1))] + [ModelReaderWriterBuildable(typeof(ModelV2))] + [ModelReaderWriterBuildable(typeof(ModelV3))] public partial class VersioningRemovedV1Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2/src/Generated/Models/VersioningRemovedV2Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2/src/Generated/Models/VersioningRemovedV2Context.cs index 734e678fd54..493f68110f7 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2/src/Generated/Models/VersioningRemovedV2Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2/src/Generated/Models/VersioningRemovedV2Context.cs @@ -3,9 +3,12 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.Removed; namespace Versioning.Removed.V2 { + [ModelReaderWriterBuildable(typeof(ModelV2))] + [ModelReaderWriterBuildable(typeof(ModelV3))] public partial class VersioningRemovedV2Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2Preview/src/Generated/Models/VersioningRemovedV2PreviewContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2Preview/src/Generated/Models/VersioningRemovedV2PreviewContext.cs index b8f933b2e93..45d1c54726a 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2Preview/src/Generated/Models/VersioningRemovedV2PreviewContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2Preview/src/Generated/Models/VersioningRemovedV2PreviewContext.cs @@ -3,9 +3,13 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.Removed; namespace Versioning.Removed.V2Preview { + [ModelReaderWriterBuildable(typeof(ModelV1))] + [ModelReaderWriterBuildable(typeof(ModelV2))] + [ModelReaderWriterBuildable(typeof(ModelV3))] public partial class VersioningRemovedV2PreviewContext : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v1/src/Generated/Models/VersioningRenamedFromV1Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v1/src/Generated/Models/VersioningRenamedFromV1Context.cs index ccd1eab5a5d..f4d70bd68ae 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v1/src/Generated/Models/VersioningRenamedFromV1Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v1/src/Generated/Models/VersioningRenamedFromV1Context.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.RenamedFrom; namespace Versioning.RenamedFrom.V1 { + [ModelReaderWriterBuildable(typeof(OldModel))] public partial class VersioningRenamedFromV1Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v2/src/Generated/Models/VersioningRenamedFromV2Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v2/src/Generated/Models/VersioningRenamedFromV2Context.cs index a6bf39e858b..89ad6f39624 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v2/src/Generated/Models/VersioningRenamedFromV2Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v2/src/Generated/Models/VersioningRenamedFromV2Context.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.RenamedFrom; namespace Versioning.RenamedFrom.V2 { + [ModelReaderWriterBuildable(typeof(NewModel))] public partial class VersioningRenamedFromV2Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v1/src/Generated/Models/VersioningTypeChangedFromV1Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v1/src/Generated/Models/VersioningTypeChangedFromV1Context.cs index d476fba3977..e93835d3a7d 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v1/src/Generated/Models/VersioningTypeChangedFromV1Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v1/src/Generated/Models/VersioningTypeChangedFromV1Context.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.TypeChangedFrom; namespace Versioning.TypeChangedFrom.V1 { + [ModelReaderWriterBuildable(typeof(TestModel))] public partial class VersioningTypeChangedFromV1Context : ModelReaderWriterContext { } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v2/src/Generated/Models/VersioningTypeChangedFromV2Context.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v2/src/Generated/Models/VersioningTypeChangedFromV2Context.cs index 0c560e183a6..a5e364edd47 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v2/src/Generated/Models/VersioningTypeChangedFromV2Context.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v2/src/Generated/Models/VersioningTypeChangedFromV2Context.cs @@ -3,9 +3,11 @@ #nullable disable using System.ClientModel.Primitives; +using Versioning.TypeChangedFrom; namespace Versioning.TypeChangedFrom.V2 { + [ModelReaderWriterBuildable(typeof(TestModel))] public partial class VersioningTypeChangedFromV2Context : ModelReaderWriterContext { }