in src/AutoRest.CSharp/Common/Generation/Writers/CodeWriterExtensions.cs [683:775]
public static void WriteProperty(this CodeWriter writer, PropertyDeclaration property)
{
if (property.Description is not null)
{
writer.Line().WriteXmlDocumentationSummary(property.Description);
}
if (property.Exceptions is not null)
{
foreach (var (exceptionType, description) in property.Exceptions)
{
writer.WriteXmlDocumentationException(exceptionType, description);
}
}
var modifiers = property.Modifiers;
writer.AppendRawIf("public ", modifiers.HasFlag(MethodSignatureModifiers.Public))
.AppendRawIf("protected ", modifiers.HasFlag(MethodSignatureModifiers.Protected))
.AppendRawIf("internal ", modifiers.HasFlag(MethodSignatureModifiers.Internal))
.AppendRawIf("private ", modifiers.HasFlag(MethodSignatureModifiers.Private))
.AppendRawIf("override ", modifiers.HasFlag(MethodSignatureModifiers.Override))
.AppendRawIf("static ", modifiers.HasFlag(MethodSignatureModifiers.Static))
.AppendRawIf("virtual ", modifiers.HasFlag(MethodSignatureModifiers.Virtual)); // property does not support other modifiers, here we just ignore them if any
writer.Append($"{property.PropertyType} ");
if (property is IndexerDeclaration indexer)
{
writer.Append($"this[{indexer.IndexerParameter.Type} {indexer.IndexerParameter.Name}]");
}
else
{
if (property.ExplicitInterface is not null)
{
writer.Append($"{property.ExplicitInterface}.");
}
writer.Append($"{property.Declaration:I}"); // the declaration order here is quite anonying - we might need to assign the values to those properties in other places before these are written
}
switch (property.PropertyBody)
{
case ExpressionPropertyBody(var expression):
expression.Write(writer.AppendRaw(" => "));
writer.AppendRaw(";");
break;
case AutoPropertyBody(var hasSetter, var setterModifiers, var initialization):
writer.AppendRaw("{ get; ");
if (hasSetter)
{
WritePropertyAccessorModifiers(writer, setterModifiers);
writer.AppendRaw(" set; ");
}
writer.AppendRaw("}");
if (initialization is not null)
{
initialization.Write(writer.AppendRaw(" = "));
}
break;
case MethodPropertyBody(var getter, var setter, var setterModifiers):
writer.LineRaw("{");
// write getter
WriteMethodPropertyAccessor(writer, "get", getter);
// write setter
if (setter is not null)
{
WriteMethodPropertyAccessor(writer, "set", setter, setterModifiers);
}
writer.AppendRaw("}");
break;
default:
throw new InvalidOperationException($"Unhandled property body type {property.PropertyBody}");
}
writer.Line();
static void WriteMethodPropertyAccessor(CodeWriter writer, string name, MethodBodyStatement body, MethodSignatureModifiers modifiers = MethodSignatureModifiers.None)
{
WritePropertyAccessorModifiers(writer, modifiers);
writer.LineRaw(name)
.LineRaw("{");
using (writer.AmbientScope())
{
body.Write(writer);
}
writer.LineRaw("}");
}
static void WritePropertyAccessorModifiers(CodeWriter writer, MethodSignatureModifiers modifiers)
{
writer.AppendRawIf("protected ", modifiers.HasFlag(MethodSignatureModifiers.Protected))
.AppendRawIf("internal ", modifiers.HasFlag(MethodSignatureModifiers.Internal))
.AppendRawIf("private ", modifiers.HasFlag(MethodSignatureModifiers.Private));
}
}