public void RemoveFrameworkEntryPoints(HashSet <string> frameworkAssemblies) { var removing = new List <ICallGraphNode>(EntryNodes.Count); foreach (var entryNode in EntryNodes.Values) { if (!frameworkAssemblies.Contains(entryNode.AssemblyName)) { continue; } RemoveUnavailableNodesFrom(entryNode); removing.Add(entryNode); } foreach (var entryNode in removing) { EntryNodes.Remove(entryNode.MethodSignature); } }
private void RemoveUnavailableNodesTo(ICallGraphNode node) { Debug.Assert(node.OutNodes.Count == 0); Nodes.Remove(node.MethodSignature); if (node.InNodes.Count == 0) { EntryNodes.Remove(node.MethodSignature); } for (var i = 0; i < node.InNodes.Count; i++) { var inNode = node.InNodes[i]; inNode.OutNodes.Remove(node); if (inNode.OutNodes.Count == 0) { RemoveUnavailableNodesTo(inNode); } } }
public void RemoveNonPublicEntryNodes() { var processingNodes = new Queue <ICallGraphNode>(EntryNodes.Values); while (processingNodes.Count > 0) { var node = processingNodes.Dequeue(); if (node.IsPublic) { continue; } foreach (var outNode in node.OutNodes) { if (outNode == node) { continue; } outNode.InNodes.Remove(node); if ((outNode.InNodes.Count == 0) || (outNode.InNodes.Count == 1 && outNode.Equals(outNode.InNodes[0]))) // simple recursive calls { // TODO: Add detection of recursive calls like A() -> B() -> A() if (outNode.IsPublic) { EntryNodes.Add(outNode.MethodSignature, outNode); } else { processingNodes.Enqueue(outNode); } } } EntryNodes.Remove(node.MethodSignature); Nodes.Remove(node.MethodSignature); } }