Example #1
0
        /// <summary>
        /// Gets the members defined in this type.
        /// </summary>
        /// <returns>The list of <see cref="MemberMapper"/> representing the members.</returns>
        public IEnumerable <MemberMapper> GetMembers()
        {
            if (_members == null)
            {
                _members = new Dictionary <ISymbol, MemberMapper>(Settings.EqualityComparer);

                AddOrCreateMappers(Left, ElementSide.Left);

                if (Right.Length == 1)
                {
                    AddOrCreateMappers(Right[0], ElementSide.Right);
                }
                else
                {
                    for (int i = 0; i < Right.Length; i++)
                    {
                        AddOrCreateMappers(Right[i], ElementSide.Right, i);
                    }
                }

                void AddOrCreateMappers(ITypeSymbol symbol, ElementSide side, int setIndex = 0)
                {
                    if (symbol == null)
                    {
                        return;
                    }

                    foreach (ISymbol member in symbol.GetMembers())
                    {
                        // when running without references Roslyn doesn't filter out the special value__ field emitted
                        // for enums. The reason why we should filter it out, is because we could have a case
                        // where one side was loaded with references and one that was loaded without, if that is the case
                        // we would compare __value vs null and emit some warnings.
                        if (Settings.Filter.Include(member) && member is not ITypeSymbol && !IsSpecialEnumField(member))
                        {
                            if (!_members.TryGetValue(member, out MemberMapper mapper))
                            {
                                mapper = new MemberMapper(Settings, this, Right.Length);
                                _members.Add(member, mapper);
                            }
                            mapper.AddElement(member, side, setIndex);
                        }
                    }
                }
            }

            return(_members.Values);
        }
Example #2
0
        /// <summary>
        /// Gets the members defined in this type.
        /// </summary>
        /// <returns>The list of <see cref="MemberMapper"/> representing the members.</returns>
        public IEnumerable <MemberMapper> GetMembers()
        {
            if (_members == null)
            {
                _members = new Dictionary <ISymbol, MemberMapper>(Settings.EqualityComparer);

                AddOrCreateMappers(Left, ElementSide.Left);

                if (Right.Length == 1)
                {
                    AddOrCreateMappers(Right[0], ElementSide.Right);
                }
                else
                {
                    for (int i = 0; i < Right.Length; i++)
                    {
                        AddOrCreateMappers(Right[i], ElementSide.Right, i);
                    }
                }

                void AddOrCreateMappers(ITypeSymbol symbol, ElementSide side, int setIndex = 0)
                {
                    if (symbol == null)
                    {
                        return;
                    }

                    foreach (ISymbol member in symbol.GetMembers())
                    {
                        if (Settings.Filter.Include(member) && member is not ITypeSymbol)
                        {
                            if (!_members.TryGetValue(member, out MemberMapper mapper))
                            {
                                mapper = new MemberMapper(Settings, this, Right.Length);
                                _members.Add(member, mapper);
                            }
                            mapper.AddElement(member, side, setIndex);
                        }
                    }
                }
            }

            return(_members.Values);
        }
Example #3
0
 public virtual void Run(MemberMapper mapper, List <CompatDifference> differences)
 {
 }
 /// <summary>
 /// Visits the <see cref="MemberMapper"/>.
 /// </summary>
 /// <param name="mapper">The <see cref="MemberMapper"/> to visit.</param>
 public virtual void Visit(MemberMapper mapper)
 {
 }