public BaseMethodDeclarationSyntax FindMethodSyntax(MethodDescriptor method, out IMethodSymbol symbol)
		{
			var root = this.SyntaxTree.GetRoot();
			var visitor = new MethodFinder(method, this.SemanticModel);
			visitor.Visit(root);

			Contract.Assert(visitor.Result != null);
			symbol = (IMethodSymbol)this.SemanticModel.GetDeclaredSymbol(visitor.Result);

			return visitor.Result;
		}
		public async Task<Tuple<BaseMethodDeclarationSyntax, IMethodSymbol>> FindMethodSyntaxAsync(MethodDescriptor method)
		{
			var root = await this.SyntaxTree.GetRootAsync();
			var visitor = new MethodFinder(method, this.SemanticModel);
			visitor.Visit(root);

			if (visitor.Result != null)
			{
				return new Tuple<BaseMethodDeclarationSyntax, IMethodSymbol>(
					visitor.Result,
					(IMethodSymbol)this.SemanticModel.GetDeclaredSymbol(visitor.Result)
					);
			}
			else
			{
				return null;
			}
		}
		internal static async Task<Tuple<ProjectCodeProvider, IMethodSymbol, SyntaxTree>> GetProviderContainingEntryPointAsync(
            Project project, CancellationToken cancellationToken = default(CancellationToken))
		{
            var compilation = project.GetCompilationAsync().Result;
			var mainSymbol = compilation.GetEntryPoint(cancellationToken);
			if (mainSymbol == null)
			{
				return null;
			}
			else
			{
				try
				{
					foreach (var tree in compilation.SyntaxTrees)
					{
						var finder = new MethodFinder(mainSymbol, compilation.GetSemanticModel(tree));
						var root = await tree.GetRootAsync(cancellationToken);
						finder.Visit(root);
						if (finder.Result != null)
						{
							return new Tuple<ProjectCodeProvider, IMethodSymbol, SyntaxTree>
                                (
                                    new ProjectCodeProvider(project, compilation), mainSymbol, tree
                                );
						}
					}
				}
				catch (OperationCanceledException)
				{
					Console.Error.WriteLine("Cancelling...");
				}

				return null;
			}
		}
		internal static ProjectCodeProvider GetProviderContainingEntryPoint(Project project, out IMethodSymbol mainSymbol)
		{
            var compilation = project.GetCompilationAsync().Result;
			mainSymbol = compilation.GetEntryPoint(new System.Threading.CancellationToken());

			foreach (var tree in compilation.SyntaxTrees)
			{
				var finder = new MethodFinder(mainSymbol, compilation.GetSemanticModel(tree));
				finder.Visit(tree.GetRoot());
				if (finder.Result != null)
				{
					return new ProjectCodeProvider(project, compilation);
				}
			}

			return null;
		}