public static void WriteProperty()

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));
            }
        }