in src/AutoRest.CSharp/Common/Output/Models/Types/SchemaObjectType.cs [281:384]
protected override ObjectTypeConstructor BuildInitializationConstructor()
{
List<Parameter> defaultCtorParameters = new List<Parameter>();
List<ObjectPropertyInitializer> defaultCtorInitializers = new List<ObjectPropertyInitializer>();
ObjectTypeConstructor? baseCtor = GetBaseObjectType()?.InitializationConstructor;
if (baseCtor is not null)
defaultCtorParameters.AddRange(baseCtor.Signature.Parameters);
foreach (var property in Properties)
{
// we do not need to add intialization for raw data field
if (property == RawDataField)
{
continue;
}
// Only required properties that are not discriminators go into default ctor
// skip the flattened properties, we should never include them in the constructors
if (property == Discriminator?.Property || property is FlattenedObjectTypeProperty)
{
continue;
}
ReferenceOrConstant? initializationValue;
Constant? defaultInitializationValue = null;
var propertyType = property.Declaration.Type;
if (property.InputModelProperty?.ConstantValue is not null && property.IsRequired)
{
// Turn constants into initializers
initializationValue = BuilderHelpers.ParseConstant(property.InputModelProperty!.ConstantValue.Value, propertyType);
}
else if (IsStruct || property.InputModelProperty?.IsRequired == true)
{
// For structs all properties become required
Constant? defaultParameterValue = null;
var constantValue = property.InputModelProperty?.ConstantValue;
Constant? clientDefaultValue = constantValue != null ? BuilderHelpers.ParseConstant(constantValue.Value, _typeFactory.CreateType(constantValue.Type)) : null;
if (clientDefaultValue is object defaultValueObject)
{
defaultInitializationValue = BuilderHelpers.ParseConstant(defaultValueObject, propertyType);
}
var inputType = propertyType.InputType;
if (defaultParameterValue != null && !property.ValueType.CanBeInitializedInline(defaultParameterValue))
{
inputType = inputType.WithNullable(true);
defaultParameterValue = Constant.Default(inputType);
}
var validate = property.InputModelProperty?.Type is not InputNullableType && !inputType.IsValueType && property.InputModelProperty?.IsReadOnly != true ? ValidationType.AssertNotNull : ValidationType.None;
var defaultCtorParameter = new Parameter(
property.Declaration.Name.ToVariableName(),
property.ParameterDescription,
inputType,
defaultParameterValue,
validate,
null
);
defaultCtorParameters.Add(defaultCtorParameter);
initializationValue = defaultCtorParameter;
}
else
{
initializationValue = GetPropertyDefaultValue(property);
if (initializationValue == null && propertyType.IsCollection)
{
if (propertyType.IsReadOnlyMemory)
{
initializationValue = propertyType.IsNullable ? null : Constant.FromExpression($"{propertyType}.{nameof(ReadOnlyMemory<object>.Empty)}", propertyType);
}
else
{
initializationValue = Constant.NewInstanceOf(propertyType.PropertyInitializationType);
}
}
}
if (initializationValue != null)
{
defaultCtorInitializers.Add(new ObjectPropertyInitializer(property, initializationValue.Value, defaultInitializationValue));
}
}
if (Discriminator?.Value != null)
{
defaultCtorInitializers.Add(new ObjectPropertyInitializer(Discriminator.Property, Discriminator.Value.Value));
}
if (AdditionalPropertiesProperty != null &&
!defaultCtorInitializers.Any(i => i.Property == AdditionalPropertiesProperty))
{
defaultCtorInitializers.Add(new ObjectPropertyInitializer(AdditionalPropertiesProperty, Constant.NewInstanceOf(AdditionalPropertiesProperty.Declaration.Type.InitializationType)));
}
return new ObjectTypeConstructor(
Type,
IsAbstract ? Protected : _usage.HasFlag(InputModelTypeUsage.Input) ? Public : Internal,
defaultCtorParameters,
defaultCtorInitializers,
baseCtor);
}