From 5a9639f87b312ed494c1f1de05637890f5b3d943 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Mon, 23 Dec 2024 17:37:14 +0800 Subject: [PATCH 01/10] update modifiers for TypeProvider --- .../src/Providers/TypeProvider.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs index 3190307a0f4..c55adb527ce 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs @@ -123,11 +123,7 @@ public string? Deprecated private TypeSignatureModifiers? _declarationModifiers; - public TypeSignatureModifiers DeclarationModifiers - { - get => _declarationModifiers ??= GetDeclarationModifiersInternal(); - private set => _declarationModifiers = value; - } + public TypeSignatureModifiers DeclarationModifiers => _declarationModifiers ??= GetDeclarationModifiersInternal(); protected virtual TypeSignatureModifiers GetDeclarationModifiers() => TypeSignatureModifiers.None; @@ -332,7 +328,8 @@ public void Update( IEnumerable? fields = null, IEnumerable? serializations = null, IEnumerable? nestedTypes = null, - XmlDocProvider? xmlDocs = null) + XmlDocProvider? xmlDocs = null, + TypeSignatureModifiers? modifiers = null) { if (methods != null) { @@ -362,6 +359,10 @@ public void Update( { XmlDocs = xmlDocs; } + if (modifiers != null) + { + _declarationModifiers = modifiers; + } } public IReadOnlyList EnumValues => _enumValues ??= BuildEnumValues(); From b9c9173d4aba7cd0e7710139932535d0c78f3bf6 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Tue, 24 Dec 2024 17:00:59 +0800 Subject: [PATCH 02/10] update relativeFilePath for TypeProvider --- .../src/Providers/TypeProvider.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs index c55adb527ce..00b447da2c4 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/TypeProvider.cs @@ -329,7 +329,8 @@ public void Update( IEnumerable? serializations = null, IEnumerable? nestedTypes = null, XmlDocProvider? xmlDocs = null, - TypeSignatureModifiers? modifiers = null) + TypeSignatureModifiers? modifiers = null, + string? relativeFilePath = null) { if (methods != null) { @@ -363,6 +364,10 @@ public void Update( { _declarationModifiers = modifiers; } + if (relativeFilePath != null) + { + _relativeFilePath = relativeFilePath; + } } public IReadOnlyList EnumValues => _enumValues ??= BuildEnumValues(); From 03767bb7e9ca5555079674dec59874fc7a505ea4 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Fri, 27 Dec 2024 11:33:42 +0800 Subject: [PATCH 03/10] make StringExtensions public --- .../Microsoft.Generator.CSharp/src/Shared/StringExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Shared/StringExtensions.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Shared/StringExtensions.cs index b9b17932ecf..86770d8854d 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Shared/StringExtensions.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Shared/StringExtensions.cs @@ -10,7 +10,7 @@ namespace Microsoft.Generator.CSharp { - internal static class StringExtensions + public static class StringExtensions { private static bool IsWordSeparator(char c) => !SyntaxFacts.IsIdentifierPartCharacter(c) || c == '_'; private static readonly Regex HumanizedCamelCaseRegex = new Regex(@"([A-Z])", RegexOptions.Compiled); From f45893ae15c18dd746a9f68a9131f1c44969b3d6 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Fri, 27 Dec 2024 11:53:44 +0800 Subject: [PATCH 04/10] Move StringExtensions.cs to Microsoft.Generator.CSharp.Input and remove the shared link of it. --- .../src/Microsoft.Generator.CSharp.Input.csproj | 4 ---- .../src/Utilities}/StringExtensions.cs | 2 +- .../src/Expressions/FormattableStringExpression.cs | 1 + .../Microsoft.Generator.CSharp/src/Providers/FieldProvider.cs | 1 + .../src/Utilities/FormattableStringHelpers.cs | 1 + .../Microsoft.Generator.CSharp/src/Writers/CodeWriter.cs | 1 + .../test/Utilities/StringExtensionsTests.cs | 1 + 7 files changed, 6 insertions(+), 5 deletions(-) rename packages/http-client-csharp/generator/{Microsoft.Generator.CSharp/src/Shared => Microsoft.Generator.CSharp.Input/src/Utilities}/StringExtensions.cs (99%) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.Input/src/Microsoft.Generator.CSharp.Input.csproj b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.Input/src/Microsoft.Generator.CSharp.Input.csproj index 664610c5821..4412ebd0f32 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.Input/src/Microsoft.Generator.CSharp.Input.csproj +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.Input/src/Microsoft.Generator.CSharp.Input.csproj @@ -10,8 +10,4 @@ - - - - diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Shared/StringExtensions.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.Input/src/Utilities/StringExtensions.cs similarity index 99% rename from packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Shared/StringExtensions.cs rename to packages/http-client-csharp/generator/Microsoft.Generator.CSharp.Input/src/Utilities/StringExtensions.cs index 86770d8854d..fef50195769 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Shared/StringExtensions.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp.Input/src/Utilities/StringExtensions.cs @@ -8,7 +8,7 @@ using System.Text.RegularExpressions; using Microsoft.CodeAnalysis.CSharp; -namespace Microsoft.Generator.CSharp +namespace Microsoft.Generator.CSharp.Input { public static class StringExtensions { diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/FormattableStringExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/FormattableStringExpression.cs index e0e1c9542ab..911ff4cc8c3 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/FormattableStringExpression.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/FormattableStringExpression.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Generator.CSharp.Input; namespace Microsoft.Generator.CSharp.Expressions { diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/FieldProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/FieldProvider.cs index 5f0e41ab2a6..497880f9f9c 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/FieldProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/FieldProvider.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics.CodeAnalysis; using Microsoft.Generator.CSharp.Expressions; +using Microsoft.Generator.CSharp.Input; using Microsoft.Generator.CSharp.Primitives; using Microsoft.Generator.CSharp.Statements; diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Utilities/FormattableStringHelpers.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Utilities/FormattableStringHelpers.cs index 6c9ca2626ba..c485f7f28ac 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Utilities/FormattableStringHelpers.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Utilities/FormattableStringHelpers.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Runtime.CompilerServices; using System.Text; +using Microsoft.Generator.CSharp.Input; using Microsoft.Generator.CSharp.Providers; namespace Microsoft.Generator.CSharp diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Writers/CodeWriter.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Writers/CodeWriter.cs index 48b21614f54..c729496e868 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Writers/CodeWriter.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Writers/CodeWriter.cs @@ -8,6 +8,7 @@ using System.Text; using Microsoft.CodeAnalysis; using Microsoft.Generator.CSharp.Expressions; +using Microsoft.Generator.CSharp.Input; using Microsoft.Generator.CSharp.Primitives; using Microsoft.Generator.CSharp.Providers; using Microsoft.Generator.CSharp.Snippets; diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Utilities/StringExtensionsTests.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Utilities/StringExtensionsTests.cs index 1f1a6d8b438..c134277d5d7 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Utilities/StringExtensionsTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Utilities/StringExtensionsTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Generator.CSharp.Input; using NUnit.Framework; namespace Microsoft.Generator.CSharp.Tests.Utilities From b2aebe9a1c1e0888b70be0654ac044bd7f5cb84f Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Fri, 27 Dec 2024 13:45:03 +0800 Subject: [PATCH 05/10] remove sealed from ModelProvider --- .../Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs index f86c2a547e0..0a61eb77657 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs @@ -15,7 +15,7 @@ namespace Microsoft.Generator.CSharp.Providers { - public sealed class ModelProvider : TypeProvider + public class ModelProvider : TypeProvider { private const string AdditionalBinaryDataPropsFieldDescription = "Keeps track of any properties unknown to the library."; private readonly InputModelType _inputModel; From 7933c928d82adba28605b58037d630b1e0c93ff6 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Mon, 6 Jan 2025 11:34:29 +0800 Subject: [PATCH 06/10] expose CrossLanguageDefinitionId --- .../Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs index 0a61eb77657..667ce0e9f81 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs @@ -43,6 +43,7 @@ public ModelProvider(InputModelType inputModel) : base(inputModel) } } + public string CrossLanguageDefinitionId => _inputModel.CrossLanguageDefinitionId; public bool IsUnknownDiscriminatorModel => _inputModel.IsUnknownDiscriminatorModel; public string? DiscriminatorValue => _inputModel.DiscriminatorValue; From dcb55af9fbb04067c0231325abcf86fc52fd5db4 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Mon, 6 Jan 2025 14:58:21 +0800 Subject: [PATCH 07/10] Implement SystemObjectType and type replacement --- .../src/OutputLibrary.cs | 2 +- .../src/Providers/ModelFactoryProvider.cs | 2 +- .../src/Providers/ModelProvider.cs | 25 ++++-- .../src/Providers/PropertyProvider.cs | 7 ++ .../src/Providers/SystemObjectProvider.cs | 87 +++++++++++++++++++ .../src/TypeFactory.cs | 20 ++++- 6 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/SystemObjectProvider.cs diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputLibrary.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputLibrary.cs index 492f8283108..ef35c3b6297 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputLibrary.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/OutputLibrary.cs @@ -48,7 +48,7 @@ private static TypeProvider[] BuildModels() foreach (var inputModel in input.Models) { var outputModel = CodeModelPlugin.Instance.TypeFactory.CreateModel(inputModel); - if (outputModel != null) + if (outputModel != null && outputModel is not SystemObjectProvider) { models.Add(outputModel); var unknownVariant = inputModel.DiscriminatedSubtypes.Values.FirstOrDefault(m => m.IsUnknownDiscriminatorModel); diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelFactoryProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelFactoryProvider.cs index 2b8fb2cacd9..b4d82a23e2d 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelFactoryProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelFactoryProvider.cs @@ -69,7 +69,7 @@ protected override MethodProvider[] BuildMethods() var methods = new List(_models.Count()); foreach (var model in _models) { - var modelProvider = CodeModelPlugin.Instance.TypeFactory.CreateModel(model); + var modelProvider = CodeModelPlugin.Instance.TypeFactory.CreateModel(model) as ModelProvider; if (modelProvider is null || modelProvider.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Internal)) continue; diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs index 667ce0e9f81..fa387362bf2 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/ModelProvider.cs @@ -43,7 +43,6 @@ public ModelProvider(InputModelType inputModel) : base(inputModel) } } - public string CrossLanguageDefinitionId => _inputModel.CrossLanguageDefinitionId; public bool IsUnknownDiscriminatorModel => _inputModel.IsUnknownDiscriminatorModel; public string? DiscriminatorValue => _inputModel.DiscriminatorValue; @@ -58,7 +57,7 @@ private IReadOnlyList BuildDerivedModels() // add discriminated subtypes foreach (var subtype in _inputModel.DiscriminatedSubtypes) { - var model = CodeModelPlugin.Instance.TypeFactory.CreateModel(subtype.Value); + var model = CodeModelPlugin.Instance.TypeFactory.CreateModel(subtype.Value) as ModelProvider; if (model != null) { derivedModels.Add(model); @@ -68,7 +67,7 @@ private IReadOnlyList BuildDerivedModels() // add derived models foreach (var derivedModel in _inputModel.DerivedModels) { - var model = CodeModelPlugin.Instance.TypeFactory.CreateModel(derivedModel); + var model = CodeModelPlugin.Instance.TypeFactory.CreateModel(derivedModel) as ModelProvider; if (model != null) { derivedModels.Add(model); @@ -77,7 +76,23 @@ private IReadOnlyList BuildDerivedModels() return [.. derivedModels]; } - internal override TypeProvider? BaseTypeProvider => BaseModelProvider; + + internal override TypeProvider? BaseTypeProvider + { + get + { + if (_baseTypeProvider?.Value is ModelProvider modelProvider) + { + return modelProvider; + } + else if (_baseTypeProvider?.Value is SystemObjectProvider systemObjectProvider) + { + return systemObjectProvider; + } + + return null; + } + } public ModelProvider? BaseModelProvider => _baseModelProvider ??= (_baseTypeProvider?.Value is ModelProvider baseModelProvider ? baseModelProvider : null); @@ -91,7 +106,7 @@ public ModelProvider? BaseModelProvider protected override CSharpType? GetBaseType() { - return BaseModelProvider?.Type; + return BaseTypeProvider?.Type; } protected override TypeProvider[] BuildSerializationProviders() diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/PropertyProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/PropertyProvider.cs index d940fcfb22b..69630e31c8a 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/PropertyProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/PropertyProvider.cs @@ -54,6 +54,13 @@ protected PropertyProvider() internal static bool TryCreate(InputModelProperty inputProperty, TypeProvider enclosingType, [NotNullWhen(true)] out PropertyProvider? property) { + var inputPropertyType = inputProperty.Type as InputModelType; + if (inputPropertyType != null && CodeModelPlugin.Instance.TypeFactory.TryGetPropertyTypeReplacement(inputPropertyType, out var replacement)) + { + property = new PropertyProvider(inputProperty, replacement.Type, enclosingType); + return true; + } + var type = CodeModelPlugin.Instance.TypeFactory.CreateCSharpType(inputProperty.Type); if (type == null) { diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/SystemObjectProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/SystemObjectProvider.cs new file mode 100644 index 00000000000..46875b39450 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/SystemObjectProvider.cs @@ -0,0 +1,87 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Reflection; +using Microsoft.Generator.CSharp.Input; +using Microsoft.Generator.CSharp.Primitives; +using Microsoft.Generator.CSharp.Statements; + +namespace Microsoft.Generator.CSharp.Providers +{ + public class SystemObjectProvider : TypeProvider + { + private readonly Type _type; + private const string InitializationCtorAttributeName = "InitializationConstructorAttribute"; + private const string SerializationCtorAttributeName = "SerializationConstructorAttribute"; + + public SystemObjectProvider(Type type) : base() + { + _type = type; + } + + protected override string BuildName() => _type.Name; + + protected override string BuildRelativeFilePath() => throw new InvalidOperationException("This type should not be writing in generation"); + + protected override ConstructorProvider[] BuildConstructors() + { + var initializationCtor = GetCtor(_type, InitializationCtorAttributeName); + var seiralizationCtor = GetCtor(_type, SerializationCtorAttributeName); + + return [BuildConstructor(initializationCtor), BuildConstructor(seiralizationCtor)]; + } + + private ConstructorProvider BuildConstructor(ConstructorInfo ctor) + { + var parameters = new List(); + foreach (var param in ctor.GetParameters()) + { + var parameter = new ParameterProvider(param.Name!, $"The {param.Name}", param.ParameterType); + parameters.Add(parameter); + } + + // we should only add initializers when there is a corresponding parameter + List arguments = new List(); + foreach (var property in Properties) + { + var parameter = parameters.FirstOrDefault(p => p.Name == property.Name.ToVariableName()); + if (parameter is not null) + { + arguments.Add(parameter); + } + } + + var modifiers = ctor.IsFamily ? MethodSignatureModifiers.Protected : MethodSignatureModifiers.Public; + var signature = new ConstructorSignature(Type, null, modifiers, parameters, Initializer: new ConstructorInitializer(false, arguments)); + + return new ConstructorProvider(signature, MethodBodyStatement.Empty, this); + } + + private static ConstructorInfo GetCtor(Type type, string attributeType) + { + if (TryGetCtor(type, attributeType, out var ctor)) + return ctor; + + throw new InvalidOperationException($"{attributeType} ctor was not found for {type.Name}"); + } + + private static bool TryGetCtor(Type type, string attributeType, [MaybeNullWhen(false)] out ConstructorInfo result) + { + foreach (var ctor in type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance)) + { + if (ctor.GetCustomAttributes().FirstOrDefault(a => a.GetType().Name == attributeType) != null) + { + result = ctor; + return true; + } + } + + result = null; + return false; + } + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/TypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/TypeFactory.cs index 5dbaecfa825..fb8d1406898 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/TypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/TypeFactory.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using Microsoft.Generator.CSharp.Input; using Microsoft.Generator.CSharp.Primitives; @@ -141,8 +142,13 @@ protected internal TypeFactory() /// /// The to convert. /// An instance of . - public ModelProvider? CreateModel(InputModelType model) + public TypeProvider? CreateModel(InputModelType model) { + if (TryGetTypeReplacement(model, out var replacement)) + { + return replacement; + } + if (CSharpToModelProvider.TryGetValue(model, out var modelProvider)) return modelProvider; @@ -151,6 +157,18 @@ protected internal TypeFactory() return modelProvider; } + public virtual bool TryGetTypeReplacement(InputModelType inputModelType, [NotNullWhen(true)] out SystemObjectProvider? replacement) + { + replacement = null; + return false; + } + + public virtual bool TryGetPropertyTypeReplacement(InputModelType inputModelType, [NotNullWhen(true)] out SystemObjectProvider? replacement) + { + replacement = null; + return false; + } + private ModelProvider? CreateModelCore(InputModelType model) { ModelProvider? type = new ModelProvider(model); From cde35e9e27daf28af19b02d6532b0f9ced385eec Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Mon, 6 Jan 2025 15:04:09 +0800 Subject: [PATCH 08/10] typo --- .../src/Providers/SystemObjectProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/SystemObjectProvider.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/SystemObjectProvider.cs index 46875b39450..19e2bc3fe17 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/SystemObjectProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Providers/SystemObjectProvider.cs @@ -30,9 +30,9 @@ public SystemObjectProvider(Type type) : base() protected override ConstructorProvider[] BuildConstructors() { var initializationCtor = GetCtor(_type, InitializationCtorAttributeName); - var seiralizationCtor = GetCtor(_type, SerializationCtorAttributeName); + var serializationCtor = GetCtor(_type, SerializationCtorAttributeName); - return [BuildConstructor(initializationCtor), BuildConstructor(seiralizationCtor)]; + return [BuildConstructor(initializationCtor), BuildConstructor(serializationCtor)]; } private ConstructorProvider BuildConstructor(ConstructorInfo ctor) From 2a704a7b875c889145203d538b47b13c4abdf565 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Mon, 6 Jan 2025 17:48:31 +0800 Subject: [PATCH 09/10] replace types --- .../Microsoft.Generator.CSharp/src/TypeFactory.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/TypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/TypeFactory.cs index fb8d1406898..36939adf42e 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/TypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/TypeFactory.cs @@ -44,6 +44,20 @@ protected internal TypeFactory() public CSharpType? CreateCSharpType(InputType inputType) { + var inputModelType = inputType as InputModelType; + + if (inputModelType is not null) + { + if (TryGetTypeReplacement(inputModelType, out var typeReplacement)) + { + return typeReplacement.Type; + } + else if (TryGetPropertyTypeReplacement(inputModelType, out var propertyReplacement)) + { + return propertyReplacement.Type; + } + } + if (TypeCache.TryGetValue(inputType, out var type)) { return type; From 0ff54b7c46977721a7236f2d51ce416ec0a5c095 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Tue, 7 Jan 2025 08:47:12 +0800 Subject: [PATCH 10/10] test wip --- .../test/TestHelpers/TestTypeFactory.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/TestHelpers/TestTypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/TestHelpers/TestTypeFactory.cs index 6175f627a54..c1ab4baa370 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/TestHelpers/TestTypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/TestHelpers/TestTypeFactory.cs @@ -1,9 +1,23 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System.Diagnostics.CodeAnalysis; +using Microsoft.Generator.CSharp.Input; +using Microsoft.Generator.CSharp.Providers; + namespace Microsoft.Generator.CSharp.Tests { public class TestTypeFactory : TypeFactory { + // TODO: create some custom types to replace the existing models + public override bool TryGetPropertyTypeReplacement(InputModelType inputModelType, [NotNullWhen(true)] out SystemObjectProvider? replacement) + { + return base.TryGetPropertyTypeReplacement(inputModelType, out replacement); + } + + public override bool TryGetTypeReplacement(InputModelType inputModelType, [NotNullWhen(true)] out SystemObjectProvider? replacement) + { + return base.TryGetTypeReplacement(inputModelType, out replacement); + } } }