internal static (DeserializableMember?Member, ImmutableArray <Diagnostic> Diagnostics) ForProperty( Compilation compilation, AttributedMembers attrMembers, DeserializerTypes types, INamedTypeSymbol deserializingType, IPropertySymbol prop, ImmutableArray <AttributeSyntax> attrs ) { var diags = ImmutableArray <Diagnostic> .Empty; var propLoc = prop.Locations.FirstOrDefault(); if (prop.SetMethod == null) { var diag = Diagnostics.NoSetterOnDeserializableProperty(propLoc); diags = diags.Add(diag); } if (prop.Parameters.Any()) { var diag = Diagnostics.DeserializablePropertyCannotHaveParameters(propLoc); diags = diags.Add(diag); } var attrName = Utils.GetNameFromAttributes(attrMembers, propLoc, attrs, ref diags); var name = attrName ?? prop.Name; var setter = new Setter(prop); int?order = Utils.GetOrderFromAttributes(attrMembers, propLoc, types.Framework, types.OurTypes.DeserializerMemberAttribute, attrs, ref diags); var isRequired = false; var attrIsRequiredValue = GetMemberRequiredFromAttributes(attrMembers, propLoc, attrs, ref diags); isRequired = attrIsRequiredValue ?? isRequired; var reset = GetReset(compilation, attrMembers, types, deserializingType, propLoc, attrs, ref diags); var parser = GetParser(compilation, attrMembers, types, setter.ValueType, propLoc, attrs, ref diags); // only do this for properties reset ??= InferDefaultReset(attrMembers, types, deserializingType, prop.Name, attrs, propLoc, ref diags); return(MakeMember(propLoc, types, name, setter, parser, reset, isRequired, order, diags)); }