protected override ObjectTypeConstructor BuildSerializationConstructor()

in src/AutoRest.CSharp/Common/Output/Models/Types/SchemaObjectType.cs [161:268]


        protected override ObjectTypeConstructor BuildSerializationConstructor()
        {
            bool ownsDiscriminatorProperty = false;

            List<Parameter> serializationConstructorParameters = new List<Parameter>();
            List<ObjectPropertyInitializer> serializationInitializers = new List<ObjectPropertyInitializer>();
            ObjectTypeConstructor? baseSerializationCtor = null;
            List<ValueExpression> baseParameterInitializers = new List<ValueExpression>();

            if (Inherits is { IsFrameworkType: false, Implementation: ObjectType objectType })
            {
                baseSerializationCtor = objectType.SerializationConstructor;
                foreach (var p in baseSerializationCtor.Signature.Parameters)
                {
                    if (p.IsRawData && AdditionalPropertiesProperty != null)
                    {
                        baseParameterInitializers.Add(Snippets.Null);
                        // do not add into the list
                    }
                    else
                    {
                        baseParameterInitializers.Add(p);
                        serializationConstructorParameters.Add(p);
                    }
                }
            }

            foreach (var property in Properties)
            {
                // skip the flattened properties, we should never include them in serialization
                if (property is FlattenedObjectTypeProperty)
                    continue;

                var type = property.Declaration.Type;

                var deserializationParameter = new Parameter(
                    property.Declaration.Name.ToVariableName(),
                    property.ParameterDescription,
                    type,
                    null,
                    ValidationType.None,
                    null
                );

                ownsDiscriminatorProperty |= property == Discriminator?.Property;

                serializationConstructorParameters.Add(deserializationParameter);

                serializationInitializers.Add(new ObjectPropertyInitializer(property, deserializationParameter, GetPropertyDefaultValue(property)));
            }

            // add the raw data to serialization ctor parameter list
            if (RawDataField != null)
            {
                var deserializationParameter = new Parameter(
                    RawDataField.Declaration.Name.ToVariableName(),
                    RawDataField.ParameterDescription,
                    RawDataField.Declaration.Type,
                    null,
                    ValidationType.None,
                    null
                )
                {
                    IsRawData = true
                };
                serializationConstructorParameters.Add(deserializationParameter);
                serializationInitializers.Add(new ObjectPropertyInitializer(RawDataField, deserializationParameter, null));
            }

            if (InitializationConstructor.Signature.Parameters
                .Select(p => p.Type)
                .SequenceEqual(serializationConstructorParameters.Select(p => p.Type)))
            {
                return InitializationConstructor;
            }

            if (Discriminator != null)
            {
                // Add discriminator initializer to constructor at every level of hierarchy
                if (!ownsDiscriminatorProperty &&
                    baseSerializationCtor != null)
                {
                    var discriminatorParameter = baseSerializationCtor.FindParameterByInitializedProperty(Discriminator.Property);
                    Debug.Assert(discriminatorParameter != null);
                    ReferenceOrConstant? defaultValue = null;
                    if (discriminatorParameter.Type.CanBeInitializedInline(Discriminator.Value))
                    {
                        defaultValue = Discriminator.Value;
                    }
                    serializationInitializers.Add(new ObjectPropertyInitializer(Discriminator.Property, discriminatorParameter, defaultValue));
                }
            }

            var initializer = new ConstructorInitializer(true, baseParameterInitializers);

            var signature = new ConstructorSignature(
                Type,
                $"Initializes a new instance of {Type:C}",
                null,
                IsInheritableCommonType ? Protected : Internal,
                serializationConstructorParameters,
                Initializer: initializer);

            return new ObjectTypeConstructor(
                signature,
                serializationInitializers,
                baseSerializationCtor);
        }