async internal static Task<MethodEntity> FindProviderAndCreateMethodEntityAsync(MethodDescriptor methodDescriptor)
        {
            MethodEntity methodEntity = null;

            var pair = await ProjectCodeProvider.GetProjectProviderAndSyntaxAsync(methodDescriptor);

            if (pair != null)
            {
                var provider = pair.Item1;
                var tree = pair.Item2;
                var model = provider.Compilation.GetSemanticModel(tree);
                var methodEntityGenerator = new MethodSyntaxProcessor(model, provider, tree, methodDescriptor);
                methodEntity = methodEntityGenerator.ParseMethod();
            }
            else
            {
                var libraryMethodVisitor = new LibraryMethodProcessor(methodDescriptor);
                methodEntity = libraryMethodVisitor.ParseLibraryMethod();
            }
            return methodEntity;
        }
        /// <summary>
        /// Try to get the roslyn methods on the fly
        /// Currently works with one project.
        /// </summary>
        public void AnalyzeOnDemand()
        {
			Contract.Assert(this.Dispatcher != null);
			var cancellationToken = new CancellationTokenSource();
			var projectIDs = this.Solution.GetProjectDependencyGraph().GetTopologicallySortedProjects(cancellationToken.Token);
			foreach (var projectId in projectIDs)
			{
				var project = this.Solution.GetProject(projectId);
				var compilation = project.GetCompilationAsync().Result;

                var triple = ProjectCodeProvider.GetProviderContainingEntryPointAsync(project, cancellationToken.Token).Result;
                var provider = triple.Item1;
                IMethodSymbol mainSymbol = triple.Item2;
                var tree = triple.Item3;
				if (provider != null)
				{
                    var model = provider.Compilation.GetSemanticModel(tree);
					cancellationToken.Cancel(); // cancel out outstanding processing tasks
                    var methodVisitor = new MethodSyntaxProcessor(model, tree, mainSymbol);

					var mainMethodEntity = methodVisitor.ParseMethod();
                    this.Dispatcher.RegisterEntity(mainMethodEntity.EntityDescriptor, mainMethodEntity);
                    var mainEntityProcessor = new MethodEntityProcessor((MethodEntity)mainMethodEntity, this.Dispatcher);
                    //var mainMethodDescriptor =  new MethodDescriptor(mainSymbol);
                    //var mainMethodEntityDescriptor = EntityFactory.Create(mainMethodDescriptor);
                    //var mainEntityProcessor = this.Dispatcher.GetEntityWithProcessorAsync(mainMethodEntityDescriptor).Result ;

					// Just a test
					//mainEntityProcessor.MethodEntity.CurrentContext = new CallConext<AMethod, ANode>(mainEntityProcessor.MethodEntity.Method, null, null);

					mainEntityProcessor.DoAnalysis();

					Logger.Instance.Log("SolutionAnalyzer", "AnalyzeOnDemand", "--- Done with propagation ---");
				}
			}

			if (this.Dispatcher is QueueingDispatcher)
            {
                var qd = (QueueingDispatcher)this.Dispatcher;
                while (!qd.IsDoneProcessing)
                {
                    Logger.Instance.Log("SolutionAnalyzer", "AnalyzeOnDemand", "Waiting for the queue to empty up...");
                    Thread.Sleep(1000);
                }
            }

        }
 async internal  Task<MethodEntity> CreateMethodEntityAsync(MethodDescriptor methodDescriptor)
 {
     MethodEntity methodEntity = null;
     var tree = await this.GetSyntaxAsync(methodDescriptor);
     if(tree==null)
     { }
     var model = this.Compilation.GetSemanticModel(tree);
     var methodEntityGenerator = new MethodSyntaxProcessor(model, this, tree, methodDescriptor);
     methodEntity = methodEntityGenerator.ParseMethod();
     return methodEntity;
 }