src/AutoRest.CSharp/Common/Generation/Writers/AspDotNetExtensionWriter.cs (95 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
using System;
using System.Linq;
using AutoRest.CSharp.Common.Output.Models.Types;
using AutoRest.CSharp.Generation.Writers;
using AutoRest.CSharp.Output.Models;
using Azure.Core;
using Azure.Core.Extensions;
namespace AutoRest.CSharp.Common.Generation.Writers
{
internal class AspDotNetExtensionWriter
{
private CodeWriter _writer;
private AspDotNetExtensionTypeProvider This { get; }
public AspDotNetExtensionWriter(AspDotNetExtensionTypeProvider aspDotNetExtension)
{
_writer = new CodeWriter();
This = aspDotNetExtension;
}
public void Write()
{
using (_writer.Namespace(This.Declaration.Namespace))
{
WriteClassDeclaration();
using (_writer.Scope())
{
WriteImplementations();
}
}
}
private void WriteClassDeclaration()
{
_writer.WriteXmlDocumentationSummary(This.Description);
_writer.AppendRaw(This.Declaration.Accessibility)
.AppendRaw(" static")
.Append($" partial class {This.Type.Name}");
}
private void WriteImplementations()
{
foreach (var (signature, (declarations, values)) in This.ExtesnsionMethods)
{
using (_writer.WriteCommonMethodWithoutValidation(signature, null, false, false))
{
var builder = signature.Parameters.First();
var arguments = signature.ReturnType!.Arguments;
var clientType = arguments.First();
_writer.Append($"return {builder.Name:I}.RegisterClientFactory")
.AppendRaw("<");
foreach (var argument in arguments)
{
_writer.Append($"{argument},");
}
_writer.RemoveTrailingComma();
_writer.AppendRaw(">((");
foreach (var declaration in declarations)
{
_writer.Append($"{declaration},");
}
_writer.RemoveTrailingComma();
_writer.Append($") => new {clientType}(");
foreach (var value in values)
{
_writer.Append($"{value},");
}
_writer.RemoveTrailingComma();
_writer.LineRaw("));");
}
_writer.Line();
}
foreach (var signature in This.ExtensionMethodsWithoutCallback)
{
using (_writer.WriteCommonMethodWithoutValidation(signature, null, false, false))
{
var builder = signature.Parameters.First();
var otherParameters = signature.Parameters.Skip(1);
_writer.Append($"return {builder.Name:I}.RegisterClientFactory")
.AppendRaw("<");
foreach (var argument in signature.ReturnType!.Arguments)
{
_writer.Append($"{argument},");
}
_writer.RemoveTrailingComma();
_writer.AppendRaw(">(");
foreach (var parameter in otherParameters)
{
_writer.Append($"{parameter.Name:I},");
}
_writer.RemoveTrailingComma();
_writer.LineRaw(");");
}
}
}
public override string ToString() => _writer.ToString();
}
}