private async Task<ISet<MethodDescriptor>> GetDelegateCalleesAsync(VariableNode delegateNode, PropagationGraph propGraph, ICodeProvider codeProvider) { var callees = new HashSet<MethodDescriptor>(); var typeDescriptors = propGraph.GetTypes(delegateNode); foreach (var delegateInstance in propGraph.GetDelegates(delegateNode)) { if (typeDescriptors.Count() > 0) { foreach (var typeDescriptor in typeDescriptors) { // TO-DO!!! // Ugly: I'll fix it //var aMethod = delegateInstance.FindMethodImplementation(type); var aMethod = await codeProvider.FindMethodImplementationAsync(delegateInstance, typeDescriptor); callees.Add(aMethod); } } else { // if Count is 0, it is a delegate that do not came form an instance variable callees.Add(delegateInstance); } } return callees; }
internal async override Task<ISet<MethodDescriptor>> ComputeCalleesForNodeAsync(PropagationGraph propGraph, ICodeProvider codeProvider) { var calleesForNode = new HashSet<MethodDescriptor>(); if (this.Receiver != null) { // I replaced the invocation for a local call to mark that functionality is missing //var callees = GetPotentialTypes(this.Receiver, propGraph) // .Select(t => this.Callee.FindMethodImplementation(t)); foreach(var type in GetPotentialTypes(this.Receiver, propGraph, codeProvider)) { var realCallee = await codeProvider.FindMethodImplementationAsync(this.Callee, type); calleesForNode.Add(realCallee); } } else { calleesForNode.Add(this.Callee); } return calleesForNode; }