private async Task TestProximityExpressionGetterAsync(
            string markup,
            Func <CSharpProximityExpressionsService, Document, int, Task> continuation)
        {
            using var workspace = TestWorkspace.CreateCSharp(markup);
            var testDocument      = workspace.Documents.Single();
            var caretPosition     = testDocument.CursorPosition.Value;
            var snapshot          = testDocument.GetTextBuffer().CurrentSnapshot;
            var languageDebugInfo = new CSharpLanguageDebugInfoService();
            var document          = workspace.CurrentSolution.GetDocument(testDocument.Id);

            var proximityExpressionsGetter = new CSharpProximityExpressionsService();

            await continuation(proximityExpressionsGetter, document, caretPosition);
        }
        private void TestProximityExpressionGetter(
            string markup,
            Action <CSharpProximityExpressionsService, Document, int> continuation)
        {
            using (var workspace = CSharpWorkspaceFactory.CreateWorkspaceFromLines(markup))
            {
                var testDocument      = workspace.Documents.Single();
                var caretPosition     = testDocument.CursorPosition.Value;
                var snapshot          = testDocument.TextBuffer.CurrentSnapshot;
                var languageDebugInfo = new CSharpLanguageDebugInfoService();
                var document          = workspace.CurrentSolution.GetDocument(testDocument.Id);

                var proximityExpressionsGetter = new CSharpProximityExpressionsService();

                continuation(proximityExpressionsGetter, document, caretPosition);
            }
        }
        private async Task GenerateBaseline()
        {
            Console.WriteLine(typeof(FactAttribute));

            using var workspace = TestWorkspace.CreateCSharp(GetTestFileContent());
            var languageDebugInfo = new CSharpLanguageDebugInfoService();

            var hostdoc  = workspace.Documents.First();
            var snapshot = hostdoc.GetTextBuffer().CurrentSnapshot;
            var document = workspace.CurrentSolution.GetDocument(hostdoc.Id);

            var builder    = new StringBuilder();
            var statements = (await document.GetSyntaxRootAsync(CancellationToken.None)).DescendantTokens().Select(t => t.GetAncestor <StatementSyntax>()).Distinct().WhereNotNull();

            // Try to get proximity expressions at every token position and the start of every
            // line.
            var index = 0;

            foreach (var statement in statements)
            {
                builder.AppendLine("[WpfFact, Trait(Traits.Feature, Traits.Features.DebuggingProximityExpressions)]");
                builder.AppendLine("public void TestAtStartOfStatement_" + index + "()");
                builder.AppendLine("{");

                var token = statement.GetFirstToken();
                var line  = snapshot.GetLineFromPosition(token.SpanStart);

                builder.AppendLine("    //// Line " + (line.LineNumber + 1));
                builder.AppendLine();
                if (line.LineNumber > 0)
                {
                    builder.AppendLine("    //// " + snapshot.GetLineFromLineNumber(line.LineNumber - 1).GetText());
                }

                builder.AppendLine("    //// " + line.GetText());
                var charIndex = token.SpanStart - line.Start;
                builder.AppendLine("    //// " + new string(' ', charIndex) + "^");
                builder.AppendLine("    var tree = GetTree(\"ProximityExpressionsGetterTestFile.cs\");");
                builder.AppendLine("    var terms = CSharpProximityExpressionsService.Do(tree, " + token.SpanStart + ");");

                var proximityExpressionsGetter = new CSharpProximityExpressionsService();
                var terms = await proximityExpressionsGetter.GetProximityExpressionsAsync(document, token.SpanStart, CancellationToken.None);

                if (terms == null)
                {
                    builder.AppendLine("    Assert.Null(terms);");
                }
                else
                {
                    builder.AppendLine("    Assert.NotNull(terms);");

                    var termsString = terms.Select(t => "\"" + t + "\"").Join(", ");
                    builder.AppendLine("    AssertEx.Equal(new[] { " + termsString + " }, terms);");
                }

                builder.AppendLine("}");
                builder.AppendLine();
                index++;
            }

            var str = builder.ToString();

            Console.WriteLine(str);
        }