public Task<FindReferenceResult> GoToDefinition(FindReferenceParameter findReferenceParameter)
        {
            return Task.Factory.StartNew<FindReferenceResult>(() =>
            {
                if (this.findProgressListener is IClientCallback)
                {
                    ((IClientCallback)this.findProgressListener).ProjectConnectionId = ControllerContext.Request.Cookie("ProjectConnectionId");
                }

                return this.editorService.GoToDefinition(findReferenceParameter, findProgressListener);
            });
        }
        public List<FindReferenceResult> FindRefernces(FindReferenceParameter parameter, IFindReferenceProgress findReferenceProgressListener)
        {
            var result = new List<FindReferenceResult>();
            var findReferenceSyntaxWalker = new FindReferenceSyntaxWalker();
            TraverseThroughAllTheProjectFiles(parameter, findReferenceProgressListener, (documentName, documentRelativePath, syntaxRoot) =>
            {
                findReferenceSyntaxWalker.DoVisit(syntaxRoot, parameter.Text, (foundlocation) =>
                {
                    result.Add(new FindReferenceResult { FileName = documentName, Path = documentRelativePath, Position = foundlocation });
                });
            });

            findReferenceProgressListener.OnFindReferenceCompleted(result.Count);
            return result;
        }
        public FindReferenceResult GoToDefinition(FindReferenceParameter parameter, IFindReferenceProgress findReferenceProgressListener)
        {
            FindReferenceResult result = null;
            var goToDefinitionSyntaxWalker = new GoToDefinitionSyntaxWalker();
            TokenKind searchedTokenKind = (TokenKind)Enum.Parse(typeof(TokenKind), parameter.Kind);
            TraverseThroughAllTheProjectFiles(parameter, findReferenceProgressListener, (documentName, documentRelativePath, syntaxRoot) =>
                {
                    goToDefinitionSyntaxWalker.DoVisit(syntaxRoot, parameter.Text, searchedTokenKind, (foundlocation) =>
                    {
                        result = new FindReferenceResult
                        {
                            FileName = documentName,
                            Path = documentRelativePath,
                            Position = foundlocation
                        };
                    });
                });

            findReferenceProgressListener.OnFindReferenceCompleted();

            return result;
        }
        private void TraverseThroughAllTheProjectFiles(FindReferenceParameter parameter, IFindReferenceProgress findReferenceProgressListener, Action<string, string, CommonSyntaxNode> visitorAction)
        {
            findReferenceProgressListener.OnFindReferenceStarted();

            var projectSourceCodeDirectory = this.applicationConfigurationProvider.GetProjectSourceCodePath(parameter.Username, parameter.Project);
            var projectCodeDirectory = new DirectoryInfo(projectSourceCodeDirectory).GetDirectories()[0];
            var solutionPath = FindSolutionPath(projectCodeDirectory, parameter.Project);
            if (solutionPath == null)
            {
                findReferenceProgressListener.OnFindReferenceCompleted(0);
                return;
            }

            findReferenceProgressListener.OnFindReferenceInProgress();

            var workspace = Roslyn.Services.Workspace.LoadSolution(solutionPath);
            var currentFilePath = Path.Combine(projectCodeDirectory.FullName, parameter.Path.Replace(@"/", @"\"));
            var solution = workspace.CurrentSolution;

            foreach (var project in solution.Projects)
            {

                try
                {
                    if (!project.HasDocuments)
                    {
                        continue;
                    }

                    foreach (var document in project.Documents)
                    {
                        var documentSemanticModel = document.GetSemanticModel();
                        var findReferenceSyntaxtWalker = new FindReferenceSyntaxWalker();
                        CommonSyntaxNode syntaxRoot = null;
                        if (documentSemanticModel.SyntaxTree.TryGetRoot(out syntaxRoot))
                        {
                            var documentRelativePath = new Uri(projectCodeDirectory.FullName + Path.DirectorySeparatorChar).MakeRelativeUri(new Uri(document.FilePath)).ToString();
                            visitorAction(document.Name, documentRelativePath, syntaxRoot);
                        }
                    }
                }
                catch (Exception ex)
                {
                    this.logger.Error(ex, "An error has occured while loading the project {0}", project.Name);
                }
            }
        }