Exemple #1
0
        internal static (DeserializableMember?Member, ImmutableArray <Diagnostic> Diagnostics) ForConstructorParameter(
            Compilation compilation,
            AttributedMembers attrMembers,
            DeserializerTypes types,
            INamedTypeSymbol deserializingType,
            IParameterSymbol parameter,
            ImmutableArray <AttributeSyntax> attrs
            )
        {
            var diags = ImmutableArray <Diagnostic> .Empty;

            var parameterLoc = parameter.Locations.FirstOrDefault();

            var attrName = Utils.GetNameFromAttributes(attrMembers, parameterLoc, attrs, ref diags);
            var name     = attrName ?? parameter.Name;
            var setter   = new Setter(parameter);

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

            // note that this defaults to TRUE
            var isRequired          = true;
            var attrIsRequiredValue = GetMemberRequiredFromAttributes(attrMembers, parameterLoc, attrs, ref diags);

            isRequired = attrIsRequiredValue ?? isRequired;

            if (!isRequired)
            {
                var diag = Diagnostics.ParametersMustBeRequired(parameterLoc, deserializingType, parameter);

                diags = diags.Add(diag);

                return(null, diags);
            }

            var reset = GetReset(compilation, attrMembers, types, deserializingType, parameterLoc, attrs, ref diags);

            if (reset != null && !reset.IsStatic)
            {
                var diag = Diagnostics.BadReset_MustBeStaticForParameters(parameterLoc, deserializingType, parameter, reset.Method);
                diags = diags.Add(diag);
                return(null, diags);
            }

            var parser = GetParser(compilation, attrMembers, types, setter.ValueType, parameterLoc, attrs, ref diags);

            return(MakeMember(parameterLoc, types, name, setter, parser, reset, isRequired, order, diags));
        }