Ejemplo n.º 1
0
        internal static (DeserializableMember?Member, ImmutableArray <Diagnostic> Diagnostics) ForMethod(
            Compilation compilation,
            AttributedMembers attrMembers,
            DeserializerTypes types,
            INamedTypeSymbol deserializingType,
            IMethodSymbol mtd,
            ImmutableArray <AttributeSyntax> attrs
            )
        {
            var diags = ImmutableArray <Diagnostic> .Empty;

            var mtdLoc = mtd.Locations.FirstOrDefault();

            var attrName = Utils.GetNameFromAttributes(attrMembers, mtdLoc, attrs, ref diags);

            if (attrName == null)
            {
                var diag = Diagnostics.DeserializableMemberMustHaveNameSetForMethod(mtdLoc, mtd);
                diags = diags.Add(diag);

                attrName = "--UNKNOWN--";
            }

            var setter = GetSetterForMethod(compilation, types, deserializingType, mtd, mtdLoc, ref diags);

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

            var isRequired          = false;
            var attrIsRequiredValue = GetMemberRequiredFromAttributes(attrMembers, mtdLoc, attrs, ref diags);

            isRequired = attrIsRequiredValue ?? isRequired;

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

            // after this point, we need to know what we're working with
            if (setter == null)
            {
                return(null, diags);
            }

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

            return(MakeMember(mtdLoc, types, attrName, setter, parser, reset, isRequired, order, diags));
        }