Skip to content

Commit 603fa40

Browse files
Generate Asp.Net extensions (#3109)
* first version of generating aspdotnet extensions * regenerate * add new methods * forgot the this keyword * move asp writer files to common directory for anyone to use * update xml docs * regen after update * only create for top level clients * regen after changes * refactor and fix test cases * a few refactor --------- Co-authored-by: m-nash <[email protected]>
1 parent c68fdee commit 603fa40

File tree

71 files changed

+2870
-13
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+2870
-13
lines changed

samples/AnomalyDetector/Generated/AnomalyDetectorClientBuilderExtensions.cs

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/Azure.AI.DocumentTranslation/Generated/AzureAIDocumentTranslationClientBuilderExtensions.cs

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/Azure.Analytics.Purview.Account/Generated/PurviewAccountClientBuilderExtensions.cs

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Linq;
6+
using AutoRest.CSharp.Common.Output.Models.Types;
7+
using AutoRest.CSharp.Generation.Writers;
8+
using AutoRest.CSharp.Output.Models;
9+
using Azure.Core;
10+
using Azure.Core.Extensions;
11+
12+
namespace AutoRest.CSharp.Common.Generation.Writers
13+
{
14+
internal class AspDotNetExtensionWriter
15+
{
16+
private CodeWriter _writer;
17+
18+
private AspDotNetExtensionTypeProvider This { get; }
19+
20+
public AspDotNetExtensionWriter(AspDotNetExtensionTypeProvider aspDotNetExtension)
21+
{
22+
_writer = new CodeWriter();
23+
This = aspDotNetExtension;
24+
}
25+
26+
public void Write()
27+
{
28+
using (_writer.Namespace(This.Declaration.Namespace))
29+
{
30+
WriteClassDeclaration();
31+
using (_writer.Scope())
32+
{
33+
WriteImplementations();
34+
}
35+
}
36+
}
37+
38+
private void WriteClassDeclaration()
39+
{
40+
_writer.WriteXmlDocumentationSummary(This.Description);
41+
_writer.AppendRaw(This.Declaration.Accessibility)
42+
.AppendRaw(" static")
43+
.Append($" partial class {This.Type.Name}");
44+
}
45+
46+
private void WriteImplementations()
47+
{
48+
foreach (var (signature, (declarations, values)) in This.ExtesnsionMethods)
49+
{
50+
using (_writer.WriteCommonMethodWithoutValidation(signature, null, false, false))
51+
{
52+
var builder = signature.Parameters.First();
53+
var arguments = signature.ReturnType!.Arguments;
54+
var clientType = arguments.First();
55+
_writer.Append($"return {builder.Name:I}.RegisterClientFactory")
56+
.AppendRaw("<");
57+
foreach (var argument in arguments)
58+
{
59+
_writer.Append($"{argument},");
60+
}
61+
_writer.RemoveTrailingComma();
62+
_writer.AppendRaw(">((");
63+
foreach (var declaration in declarations)
64+
{
65+
_writer.Append($"{declaration},");
66+
}
67+
_writer.RemoveTrailingComma();
68+
_writer.Append($") => new {clientType}(");
69+
foreach (var value in values)
70+
{
71+
_writer.Append($"{value},");
72+
}
73+
_writer.RemoveTrailingComma();
74+
_writer.LineRaw("));");
75+
}
76+
_writer.Line();
77+
}
78+
79+
foreach (var signature in This.ExtensionMethodsWithoutCallback)
80+
{
81+
using (_writer.WriteCommonMethodWithoutValidation(signature, null, false, false))
82+
{
83+
var builder = signature.Parameters.First();
84+
var otherParameters = signature.Parameters.Skip(1);
85+
_writer.Append($"return {builder.Name:I}.RegisterClientFactory")
86+
.AppendRaw("<");
87+
foreach (var argument in signature.ReturnType!.Arguments)
88+
{
89+
_writer.Append($"{argument},");
90+
}
91+
_writer.RemoveTrailingComma();
92+
_writer.AppendRaw(">(");
93+
foreach (var parameter in otherParameters)
94+
{
95+
_writer.Append($"{parameter.Name:I},");
96+
}
97+
_writer.RemoveTrailingComma();
98+
_writer.LineRaw(");");
99+
}
100+
}
101+
}
102+
103+
public override string ToString() => _writer.ToString();
104+
}
105+
}

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ public static IDisposable WriteMethodDeclaration(this CodeWriter writer, MethodS
176176

177177
writer.AppendRawIf("new ", methodBase.Modifiers.HasFlag(New));
178178

179-
180-
if (methodBase is MethodSignature method)
179+
var method = methodBase as MethodSignature;
180+
if (method != null)
181181
{
182182
writer
183183
.AppendRawIf("virtual ", methodBase.Modifiers.HasFlag(Virtual))
@@ -195,8 +195,21 @@ public static IDisposable WriteMethodDeclaration(this CodeWriter writer, MethodS
195195
}
196196
}
197197

198+
writer.Append($"{methodBase.Name}");
199+
200+
if (method?.GenericArguments != null)
201+
{
202+
writer.AppendRaw("<");
203+
foreach (var argument in method.GenericArguments)
204+
{
205+
writer.Append($"{argument:D},");
206+
}
207+
writer.RemoveTrailingComma();
208+
writer.AppendRaw(">");
209+
}
210+
198211
writer
199-
.Append($"{methodBase.Name}(")
212+
.AppendRaw("(")
200213
.AppendRawIf("this ", methodBase.Modifiers.HasFlag(Extension));
201214

202215
var outerScope = writer.AmbientScope();
@@ -209,6 +222,15 @@ public static IDisposable WriteMethodDeclaration(this CodeWriter writer, MethodS
209222
writer.RemoveTrailingComma();
210223
writer.Append($")");
211224

225+
if (method?.GenericParameterConstraints != null)
226+
{
227+
writer.Line();
228+
foreach (var (argument, constraint) in method.GenericParameterConstraints)
229+
{
230+
writer.Append($"where {argument:I}: {constraint}");
231+
}
232+
}
233+
212234
if (methodBase is ConstructorSignature { Initializer: { } } constructor)
213235
{
214236
var (isBase, arguments) = constructor.Initializer;

src/AutoRest.CSharp/Common/Output/Models/MethodSignature.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
namespace AutoRest.CSharp.Output.Models
1414
{
15-
internal record MethodSignature(string Name, string? Summary, string? Description, MethodSignatureModifiers Modifiers, CSharpType? ReturnType, FormattableString? ReturnDescription, IReadOnlyList<Parameter> Parameters, IReadOnlyList<CSharpAttribute>? Attributes = null)
15+
internal record MethodSignature(string Name, string? Summary, string? Description, MethodSignatureModifiers Modifiers, CSharpType? ReturnType, FormattableString? ReturnDescription, IReadOnlyList<Parameter> Parameters, IReadOnlyList<CSharpAttribute>? Attributes = null, IReadOnlyList<CSharpType>? GenericArguments = null, IReadOnlyDictionary<CSharpType, FormattableString>? GenericParameterConstraints = null)
1616
: MethodSignatureBase(Name, Summary, Description, Modifiers, Parameters, Attributes ?? Array.Empty<CSharpAttribute>())
1717
{
1818
public FormattableString? FormattableDescription => Description is null ? (FormattableString?)null : $"{Description}";

0 commit comments

Comments
 (0)