/// <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> /// 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()); }
/// <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()); }