Ejemplo n.º 1
0
        internal static (SerializableMember?Member, ImmutableArray <Diagnostic> Diagnostics) ForProperty(
            Compilation compilation,
            AttributedMembers attrMembers,
            SerializerTypes types,
            INamedTypeSymbol serializingType,
            IPropertySymbol prop,
            ImmutableArray <AttributeSyntax> attrs
            )
        {
            var diags = ImmutableArray <Diagnostic> .Empty;

            var propLoc = prop.Locations.FirstOrDefault();

            if (prop.GetMethod == null)
            {
                var diag = Diagnostics.NoGetterOnSerializableProperty(propLoc);
                diags = diags.Add(diag);
            }

            if (prop.Parameters.Any())
            {
                var diag = Diagnostics.SerializablePropertyCannotHaveParameters(propLoc);
                diags = diags.Add(diag);
            }

            var name     = prop.Name;
            var attrName = Utils.GetNameFromAttributes(attrMembers, propLoc, attrs, ref diags);

            name = attrName ?? name;

            var getter = new Getter(prop);

            int?order = Utils.GetOrderFromAttributes(attrMembers, propLoc, types.Framework, types.OurTypes.SerializerMemberAttribute, attrs, ref diags);

            var emitDefaultValue     = true;
            var attrEmitDefaultValue = GetEmitDefaultValueFromAttributes(attrMembers, propLoc, attrs, ref diags);

            emitDefaultValue = attrEmitDefaultValue ?? emitDefaultValue;

            var formatter       = GetFormatter(compilation, attrMembers, types, prop.Type, propLoc, attrs, ref diags);
            var shouldSerialize = GetShouldSerialize(compilation, attrMembers, types, serializingType, propLoc, attrs, ref diags);

            // only do this for properties
            shouldSerialize ??= InferDefaultShouldSerialize(attrMembers, types, serializingType, prop.Name, attrs, propLoc, ref diags);

            return(MakeMember(propLoc, types, name, getter, formatter, shouldSerialize, emitDefaultValue, order, diags));
        }