/// <summary>
        /// A list of referencing members and members referenced by which members
        /// </summary>
        /// <param name="includeSelfRefs"></param>
        /// <returns></returns>
        public string Info(bool includeSelfRefs)
        {
            /*  Name [ArchMember]
             *  Referenced by types:
             *      ReferentClass_1 ...
             *  Referenced by members:
             *      ReferentMember_1 --> Member_1 ...
             */

            string headIndent = "\n";
            string itemIndent = "\n\t";

            string info = FullName;

            ArchList <ArchitectMember> refMembs = ReferencedMembers(includeSelfRefs);

            if (refMembs.Count > 0)
            {
                info += $"{headIndent}References members:";
            }
            refMembs.ForEach(M => info += $"{itemIndent}{M.SimpleName}");

            refMembs = ReferentMembers(includeSelfRefs);
            if (refMembs.Count > 0)
            {
                info += $"{headIndent}Referenced by members:";
            }
            refMembs.ForEach(M => info += $"{itemIndent}{M.SimpleName}");

            return(info);
        }
        /// <summary>
        /// Find all ArchitectTypes that reference this Type
        /// </summary>
        /// <param name="includingSelf"></param>
        /// <returns></returns>
        public ArchList <ArchitectType> ReferentTypes(bool includingSelf)
        {
            ArchList <ArchitectType> alist = new ArchList <ArchitectType>();

            Members.ForEach(M => alist.AddRange(M.ReferentTypes(includingSelf)));
            return(alist.Clean());
        }
        /// <summary>
        /// ArchitectMembers of this type that are referenced by other members
        /// </summary>
        /// <param name="includingSelf"></param>
        /// <returns></returns>
        public ArchList <ArchitectMember> ReferentMembers(bool includingSelf)
        {
            // found by reverse analyzing each type ReferencedMembers
            ArchList <ArchitectMember> alist = new ArchList <ArchitectMember>();

            Members.ForEach(M => alist.AddRange(M.ReferentMembers(includingSelf)));
            return(alist.Clean());
        }
Esempio n. 4
0
        /// <summary>
        /// Remove compiled-created types and re-order
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        internal static ArchList <ArchitectType> Clean(this ArchList <ArchitectType> list)
        {
            ArchList <ArchitectType> alist = new ArchList <ArchitectType>();

            list.FindAll(a => !a.FullName.Contains("<>c") && !a.FullName.Contains("b__"))
            .OrderBy(a => a.FullName).ToList().ForEach(a => alist.Add(a));
            return(alist);
        }
        /// <summary>
        /// Retrieve only call, calli, and callvirt instructions from the stream
        /// </summary>
        /// <returns></returns>
        public ArchList <Instruction> GetCallInstructions()
        {
            ArchList <Instruction> list = new ArchList <Instruction>();

            list.AddRange(InstructionStream.FindAll(I => I.Code.Name.Contains("call")));
            list.AddRange(StrayInstructions.FindAll(I => I.Code.Name.Contains("call")));
            return(list);
        }
        /// <summary>
        /// Post-initialization Architech Types Referenced
        /// </summary>
        /// <param name="includingSelf"></param>
        /// <returns></returns>
        public ArchList <ArchitectType> ReferencedTypes(bool includingSelf)
        {
            ArchList <ArchitectType> alist = new ArchList <ArchitectType>();

            if (referencedTypes == null)
            {
                DirectRefTypes.ForEach(a => alist.Add(DeclaringType.Architecture.Types.Find(A => A.Class == a)));
                referencedTypes = alist;
            }
            else
            {
                referencedTypes.ForEach(M => alist.Add(M));
            }

            if (!includingSelf)
            {
                alist.RemoveAll(A => A.FullName.Contains(DeclaringType.Name));
            }
            return(alist.Clean());
        }
        /// <summary>
        /// Post-initialization Architech Types Referenced
        /// </summary>
        /// <param name="includingSelf"></param>
        /// <returns></returns>
        public ArchList <ArchitectType> ReferentTypes(bool includingSelf)
        {
            ArchList <ArchitectType> alist = new ArchList <ArchitectType>();

            if (referentTypes == null)
            {
                DeclaringType.Architecture.Types.ForEach(A =>
                                                         { A.Members.FindAll(M => M.ReferencedTypes(includingSelf).Contains(DeclaringType)).ForEach(M => alist.Add(M.DeclaringType)); });
                referentTypes = alist;
            }
            else
            {
                referentTypes.ForEach(M => alist.Add(M));
            }

            if (!includingSelf)
            {
                alist.RemoveAll(A => A.FullName.Contains(DeclaringType.Name));
            }
            return(alist.Clean());
        }
        /// <summary>
        /// Post-initialization Architech Members Referenced
        /// </summary>
        /// <param name="includingSelf"></param>
        /// <returns></returns>
        public ArchList <ArchitectMember> ReferentMembers(bool includingSelf)
        {
            ArchList <ArchitectMember> alist = new ArchList <ArchitectMember>();

            if (referentMembers == null)
            {
                DeclaringType.Architecture.Types.ForEach(A =>
                                                         { alist.AddRange(A.Members.FindAll(M => M.ReferencedMembers(includingSelf).Contains(this))); });
                referentMembers = alist;
            }
            else
            {
                referentMembers.ForEach(M => alist.Add(M));
            }

            if (!includingSelf)
            {
                alist.RemoveAll(M => M.DeclaringType == DeclaringType);
            }
            return(alist.Clean());
        }
Esempio n. 9
0
 /// <summary>
 /// Add only non-duplicate items
 /// </summary>
 /// <param name="tLst"></param>
 public void AddRange(ArchList <T> tLst) => tLst.ForEach(t => { if (!Contains(t))
                                                                {
                                                                    base.Add(t);
                                                                }
                                                         });