Exemple #1
0
        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));
        }