Skip to content

Commit 56a762a

Browse files
Add a TypeProvider to MrwContext so that we could use customized code to rename it (#5392)
1 parent 513ae5f commit 56a762a

36 files changed

+359
-52
lines changed

Directory.Build.targets

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,6 @@
271271
<ProjectReference Include="..\TestProjects\Customizations-TypeSpec\src\CustomizationsInTsp.csproj" />
272272
<ProjectReference Include="..\TestProjects\FirstTest-TypeSpec\src\FirstTestTypeSpec.csproj" />
273273
<ProjectReference Include="..\TestProjects\MediaTypes-TypeSpec\src\MultipleMediaTypes.csproj" />
274-
<ProjectReference Include="..\TestProjects\MgmtTypeSpec\samples\MgmtTypeSpec.Samples.csproj" />
275274
<ProjectReference Include="..\TestProjects\MgmtTypeSpec\src\MgmtTypeSpec.csproj" />
276275
<ProjectReference Include="..\TestProjects\ModelReaderWriterValidation-TypeSpec\src\ModelReaderWriterValidationTypeSpec.csproj" />
277276
<ProjectReference Include="..\TestProjects\NoDocs-TypeSpec\src\NoDocsTypeSpec.csproj" />

src/AutoRest.CSharp/Common/AutoRest/Plugins/CSharpGen.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
using AutoRest.CSharp.AutoRest.Communication;
99
using AutoRest.CSharp.Common.AutoRest.Plugins;
1010
using AutoRest.CSharp.Common.Input;
11+
using AutoRest.CSharp.Common.Output.Models;
1112
using AutoRest.CSharp.Common.Utilities;
13+
using AutoRest.CSharp.Generation.Types;
1214
using AutoRest.CSharp.Input;
1315
using AutoRest.CSharp.Input.Source;
1416
using AutoRest.CSharp.Mgmt.AutoRest;
@@ -23,13 +25,17 @@ namespace AutoRest.CSharp.AutoRest.Plugins
2325
[PluginName("csharpgen")]
2426
internal class CSharpGen : IPlugin
2527
{
28+
private static Lazy<ModelReaderWriterContextProvider> _modelReaderWriterContextProvider = null!; // we will ensure this is initialized before use it
29+
public static CSharpType ModelReaderWriterContextType => _modelReaderWriterContextProvider.Value.Type;
30+
2631
public async Task<GeneratedCodeWorkspace> ExecuteAsync(CodeModel codeModel)
2732
{
2833
ValidateConfiguration();
2934

3035
Directory.CreateDirectory(Configuration.OutputFolder);
3136
var project = await GeneratedCodeWorkspace.Create(Configuration.AbsoluteProjectFolder, Configuration.OutputFolder, Configuration.SharedSourceFolders);
3237
var sourceInputModel = new SourceInputModel(await project.GetCompilationAsync());
38+
_modelReaderWriterContextProvider = new Lazy<ModelReaderWriterContextProvider>(() => new ModelReaderWriterContextProvider(Configuration.Namespace, sourceInputModel));
3339

3440
var schemaUsageProvider = new SchemaUsageProvider(codeModel); // Create schema usage before transformation applied
3541
if (Configuration.Generation1ConvenienceClient)
@@ -86,6 +92,7 @@ public async Task<GeneratedCodeWorkspace> ExecuteAsync(InputNamespace rootNamesp
8692
Directory.CreateDirectory(Configuration.OutputFolder);
8793
var project = await GeneratedCodeWorkspace.Create(Configuration.AbsoluteProjectFolder, Configuration.OutputFolder, Configuration.SharedSourceFolders);
8894
var sourceInputModel = new SourceInputModel(await project.GetCompilationAsync(), await ProtocolCompilationInput.TryCreate());
95+
_modelReaderWriterContextProvider = new Lazy<ModelReaderWriterContextProvider>(() => new ModelReaderWriterContextProvider(Configuration.Namespace, sourceInputModel));
8996

9097
if (Configuration.AzureArm)
9198
{

src/AutoRest.CSharp/Common/AutoRest/Plugins/GeneratedCodeWorkspace.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ public async Task PostProcess(Func<Project, Task<Project>> processor)
310310
/// <returns></returns>
311311
public async Task PostProcessAsync(PostProcessor? postProcessor = null)
312312
{
313-
postProcessor ??= new PostProcessor(ImmutableHashSet<string>.Empty);
313+
postProcessor ??= new PostProcessor(ImmutableHashSet<string>.Empty, CSharpGen.ModelReaderWriterContextType.Name);
314314
switch (Configuration.UnreferencedTypesHandling)
315315
{
316316
case Configuration.UnreferencedTypesHandlingOption.KeepAll:

src/AutoRest.CSharp/Common/Generation/Writers/ModelReaderWriterContextWriter.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,12 @@
1212
using AutoRest.CSharp.Generation.Writers;
1313
using AutoRest.CSharp.Mgmt.Output;
1414
using AutoRest.CSharp.Output.Models.Types;
15-
using AutoRest.CSharp.Utilities;
1615

1716
namespace AutoRest.CSharp.Common.Generation.Writers
1817
{
1918
internal class ModelReaderWriterContextWriter
2019
{
21-
private static string Namespace = Configuration.Namespace;
22-
23-
public void Write(CodeWriter writer, IEnumerable<TypeProvider>? models = null)
20+
public void Write(CodeWriter writer, CSharpType provider, IEnumerable<TypeProvider>? models = null)
2421
{
2522
IEnumerable<CSharpType>? buildableTypes = null;
2623

@@ -30,7 +27,7 @@ public void Write(CodeWriter writer, IEnumerable<TypeProvider>? models = null)
3027
buildableTypes = CollectBuildableTypes(models);
3128
}
3229

33-
using (writer.Namespace($"{Namespace}"))
30+
using (writer.Namespace($"{provider.Namespace}"))
3431
{
3532
writer.Line($"/// <summary>");
3633
writer.Line($"/// Context class which will be filled in by the System.ClientModel.SourceGeneration.");
@@ -55,7 +52,7 @@ public void Write(CodeWriter writer, IEnumerable<TypeProvider>? models = null)
5552
}
5653
}
5754

58-
using (writer.Scope($"public partial class {Name} : {typeof(ModelReaderWriterContext)}"))
55+
using (writer.Scope($"public partial class {provider.Name} : {typeof(ModelReaderWriterContext)}"))
5956
{
6057
}
6158
}
@@ -171,8 +168,6 @@ private bool ImplementsIPersistableModel(CSharpType type, Dictionary<CSharpType,
171168
return type.FrameworkType.GetInterfaces().Any(i => i.Name == "IPersistableModel`1" || i.Name == "IJsonModel`1");
172169
}
173170

174-
public static string Name = $"{Configuration.Namespace.RemovePeriods()}Context";
175-
176171
private class CSharpTypeNameComparer : IEqualityComparer<CSharpType>
177172
{
178173
public bool Equals(CSharpType? x, CSharpType? y)

src/AutoRest.CSharp/Common/Output/Expressions/KnownValueExpressions/ModelReaderWriterContextExpression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
// Licensed under the MIT License.
33

44
using System.ClientModel.Primitives;
5-
using AutoRest.CSharp.Common.Generation.Writers;
5+
using AutoRest.CSharp.AutoRest.Plugins;
66
using AutoRest.CSharp.Common.Output.Expressions.ValueExpressions;
77

88
namespace AutoRest.CSharp.Common.Output.Expressions.KnownValueExpressions
99
{
1010
internal record ModelReaderWriterContextExpression(ValueExpression Untyped) : TypedValueExpression<ModelReaderWriterContext>(Untyped)
1111
{
12-
public static readonly ValueExpression Default = new MemberExpression(new MemberExpression(null, ModelReaderWriterContextWriter.Name), "Default");
12+
public static readonly ValueExpression Default = new TypeReference(CSharpGen.ModelReaderWriterContextType).Property("Default");
1313
}
1414
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using AutoRest.CSharp.Input.Source;
5+
using AutoRest.CSharp.Output.Models.Types;
6+
using AutoRest.CSharp.Utilities;
7+
8+
namespace AutoRest.CSharp.Common.Output.Models
9+
{
10+
internal class ModelReaderWriterContextProvider : TypeProvider
11+
{
12+
public ModelReaderWriterContextProvider(BuildContext context) : base(context)
13+
{
14+
DefaultName = $"{context.DefaultNamespace.RemovePeriods()}Context";
15+
DefaultAccessibility = "public";
16+
}
17+
18+
public ModelReaderWriterContextProvider(string defaultNamespace, SourceInputModel? sourceInputModel) : base(defaultNamespace, sourceInputModel)
19+
{
20+
DefaultName = $"{defaultNamespace.RemovePeriods()}Context";
21+
DefaultAccessibility = "public";
22+
}
23+
24+
protected override string DefaultName { get; }
25+
26+
protected override string DefaultAccessibility { get; }
27+
}
28+
}

src/AutoRest.CSharp/Common/Output/PostProcessing/PostProcessor.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
using System.Linq;
1010
using System.Threading.Tasks;
1111
using AutoRest.CSharp.AutoRest.Plugins;
12-
using AutoRest.CSharp.Common.Generation.Writers;
13-
using AutoRest.CSharp.Common.Input;
1412
using AutoRest.CSharp.Output.Models.Types;
1513
using AutoRest.CSharp.Utilities;
1614
using Microsoft.CodeAnalysis;
@@ -22,16 +20,16 @@ namespace AutoRest.CSharp.Common.Output.PostProcessing;
2220

2321
internal class PostProcessor
2422
{
25-
private const string AspDotNetExtensionNamespace = "Microsoft.Extensions.Azure";
23+
private readonly string _modelReaderWriterContextName;
2624
private readonly string? _modelFactoryFullName;
2725
private readonly string? _aspExtensionClassName;
2826
private readonly ImmutableHashSet<string> _modelsToKeep;
29-
private INamedTypeSymbol? _mrwContextTypeSymbol;
3027
private HashSet<Document>? _mrwContextDocuments;
3128

32-
public PostProcessor(ImmutableHashSet<string> modelsToKeep, string? modelFactoryFullName = null, string? aspExtensionClassName = null)
29+
public PostProcessor(ImmutableHashSet<string> modelsToKeep, string modelReaderWriterContextName, string? modelFactoryFullName = null, string? aspExtensionClassName = null)
3330
{
3431
_modelsToKeep = modelsToKeep;
32+
_modelReaderWriterContextName = modelReaderWriterContextName;
3533
_modelFactoryFullName = modelFactoryFullName;
3634
_aspExtensionClassName = aspExtensionClassName;
3735
}
@@ -51,8 +49,9 @@ protected async Task<TypeSymbols> GetTypeSymbolsAsync(Compilation compilation, P
5149
var result = new HashSet<INamedTypeSymbol>(SymbolEqualityComparer.Default);
5250
var declarationCache = new Dictionary<INamedTypeSymbol, HashSet<BaseTypeDeclarationSyntax>>(SymbolEqualityComparer.Default);
5351
var documentCache = new Dictionary<Document, HashSet<INamedTypeSymbol>>();
54-
_mrwContextTypeSymbol = compilation.GetTypeByMetadataName($"{Configuration.Namespace}.{ModelReaderWriterContextWriter.Name}");
55-
_mrwContextDocuments = project.Documents.Where(d => d.Name.Contains(ModelReaderWriterContextWriter.Name)).ToHashSet();
52+
// TODO -- potentially this could be problematic that we assert a document's name "contains" something to determine if it is a MRW context document,
53+
// but we leave this to the future to fix if it actually causes a trouble.
54+
_mrwContextDocuments = project.Documents.Where(d => d.Name.Contains(_modelReaderWriterContextName)).ToHashSet();
5655

5756
INamedTypeSymbol? modelFactorySymbol = null;
5857
if (_modelFactoryFullName != null)

src/AutoRest.CSharp/DataPlane/AutoRest/DataPlaneTarget.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ public static void Execute(GeneratedCodeWorkspace project, InputNamespace inputN
9292
{
9393
var contextWriter = new CodeWriter();
9494
var contextWriterInstance = new ModelReaderWriterContextWriter();
95-
contextWriterInstance.Write(contextWriter, library.Models);
96-
project.AddGeneratedFile($"Models/{ModelReaderWriterContextWriter.Name}.cs", contextWriter.ToString());
95+
contextWriterInstance.Write(contextWriter, CSharpGen.ModelReaderWriterContextType, library.Models);
96+
project.AddGeneratedFile($"Models/{CSharpGen.ModelReaderWriterContextType.Name}.cs", contextWriter.ToString());
9797
}
9898
}
9999
}

src/AutoRest.CSharp/LowLevel/AutoRest/LowLevelTarget.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,15 @@ public static async Task ExecuteAsync(GeneratedCodeWorkspace project, InputNames
110110
{
111111
var contextWriter = new CodeWriter();
112112
var contextWriterInstance = new ModelReaderWriterContextWriter();
113-
contextWriterInstance.Write(contextWriter, library.AllModels);
114-
project.AddGeneratedFile($"Models/{ModelReaderWriterContextWriter.Name}.cs", contextWriter.ToString());
113+
contextWriterInstance.Write(contextWriter, CSharpGen.ModelReaderWriterContextType, library.AllModels);
114+
project.AddGeneratedFile($"Models/{CSharpGen.ModelReaderWriterContextType.Name}.cs", contextWriter.ToString());
115115
}
116116

117117

118-
IEnumerable<string> modelsToKeep = [.. library.AccessOverriddenModels, ModelReaderWriterContextWriter.Name];
118+
IEnumerable<string> modelsToKeep = [.. library.AccessOverriddenModels, CSharpGen.ModelReaderWriterContextType.Name];
119119
await project.PostProcessAsync(new PostProcessor(
120120
modelsToKeep: modelsToKeep.ToImmutableHashSet(),
121+
modelReaderWriterContextName: CSharpGen.ModelReaderWriterContextType.Name,
121122
modelFactoryFullName: modelFactoryProvider?.FullName,
122123
aspExtensionClassName: library.AspDotNetExtension.FullName));
123124
}

src/AutoRest.CSharp/Mgmt/AutoRest/MgmtTarget.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,13 +241,13 @@ public static async Task ExecuteAsync(GeneratedCodeWorkspace project)
241241
var contextWriter = new CodeWriter();
242242
var contextWriterInstance = new ModelReaderWriterContextWriter();
243243
var allModels = MgmtContext.Library.Models.Concat(MgmtContext.Library.PropertyBagModels).Concat(MgmtContext.Library.ArmResources).Concat(MgmtContext.Library.ResourceData);
244-
contextWriterInstance.Write(contextWriter, allModels);
245-
project.AddGeneratedFile($"Models/{ModelReaderWriterContextWriter.Name}.cs", contextWriter.ToString());
244+
contextWriterInstance.Write(contextWriter, CSharpGen.ModelReaderWriterContextType, allModels);
245+
project.AddGeneratedFile($"Models/{CSharpGen.ModelReaderWriterContextType.Name}.cs", contextWriter.ToString());
246246
}
247247

248-
List<string> modelsToKeepList = [.. Configuration.MgmtConfiguration.KeepOrphanedModels, ModelReaderWriterContextWriter.Name];
248+
List<string> modelsToKeepList = [.. Configuration.MgmtConfiguration.KeepOrphanedModels, CSharpGen.ModelReaderWriterContextType.Name];
249249
var modelsToKeep = modelsToKeepList.ToImmutableHashSet();
250-
await project.PostProcessAsync(new MgmtPostProcessor(modelsToKeep, modelFactoryProvider?.FullName));
250+
await project.PostProcessAsync(new MgmtPostProcessor(modelsToKeep, CSharpGen.ModelReaderWriterContextType.Name, modelFactoryProvider?.FullName));
251251

252252
// write samples if enabled
253253
if (Configuration.MgmtTestConfiguration?.Sample ?? Configuration.GenerateSampleProject)

0 commit comments

Comments
 (0)