internal AnalysisInvocationExpession(MethodDescriptor caller, 
                        AnalysisCallNode callNode, IList<PropGraphNodeDescriptor> arguments, VariableNode lhs)
		{
			Caller = caller;
			Arguments = arguments;
			LHS = lhs;
			IsStatic = true;
			CallNode = callNode;
            InstatiatedTypes = new HashSet<TypeDescriptor>();
		}
		internal DelegateCallInfo(MethodDescriptor caller, AnalysisCallNode callNode, 
                    DelegateVariableNode calleeDelegate, PropGraphNodeDescriptor receiver, 
                    IList<PropGraphNodeDescriptor> arguments, VariableNode lhs)
			: base(caller, callNode, arguments, lhs)
		{
			Caller = caller;
			CalleeDelegate = calleeDelegate;
			Receiver = receiver;
			Arguments = arguments;
			LHS = lhs;
		}
        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 CallInfo(MethodDescriptor caller, AnalysisCallNode callNode, 
                    MethodDescriptor callee, IList<PropGraphNodeDescriptor> arguments, 
                    VariableNode lhs, bool isConstructor)
			: base(caller, callNode, arguments, lhs)
		{
			Caller = caller;
			Callee = callee;
			Arguments = arguments;
			LHS = lhs;
			Receiver = default(VariableNode);
			IsStatic = true;
			IsConstructor = isConstructor;
		}