internal async Task VerifyCustomCommitWorkerAsync(
            CompletionServiceWithProviders service,
            Document document,
            CompletionItem completionItem,
            string codeBeforeCommit,
            string expectedCodeAfterCommit,
            char?commitChar = null)
        {
            MarkupTestFile.GetPosition(expectedCodeAfterCommit, out var actualExpectedCode, out int expectedCaretPosition);

            if (commitChar.HasValue &&
                !Controller.IsCommitCharacter(service.GetRules(), completionItem, commitChar.Value, commitChar.Value.ToString()))
            {
                Assert.Equal(codeBeforeCommit, actualExpectedCode);
                return;
            }

            var commit = await service.GetChangeAsync(document, completionItem, commitChar, CancellationToken.None);

            var text = await document.GetTextAsync();

            var newText = text.WithChanges(commit.TextChange);
            var newDoc  = document.WithText(newText);

            document.Project.Solution.Workspace.TryApplyChanges(newDoc.Project.Solution);

            var textBuffer = (await WorkspaceFixture.GetWorkspaceAsync()).Documents.Single().TextBuffer;
            var textView   = (await WorkspaceFixture.GetWorkspaceAsync()).Documents.Single().GetTextView();

            string actualCodeAfterCommit = textBuffer.CurrentSnapshot.AsText().ToString();
            var    caretPosition         = commit.NewPosition != null ? commit.NewPosition.Value : textView.Caret.Position.BufferPosition.Position;

            Assert.Equal(actualExpectedCode, actualCodeAfterCommit);
            Assert.Equal(expectedCaretPosition, caretPosition);
        }
        private void InitializeServiceOnDocumentOpened(object sender, DocumentEventArgs e)
        {
            if (e.Document.Project.Language != _languageName)
            {
                return;
            }

            var token = _listener.BeginAsyncOperation(nameof(InitializeServiceForOpenedDocumentOnBackgroundAsync));

            InitializeServiceForOpenedDocumentOnBackgroundAsync(e.Document).CompletesAsyncOperation(token);

            async Task InitializeServiceForOpenedDocumentOnBackgroundAsync(Document document)
            {
                await TaskScheduler.Default;

                // Preload project completion providers on a background thread since loading extensions can be slow
                // https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1488945
                if (document.GetLanguageService <CompletionService>() is CompletionServiceWithProviders completionServiceWithProviders)
                {
                    _ = CompletionServiceWithProviders.GetProjectCompletionProviders(document.Project);
                }

                await InitializeServiceForOpenedDocumentAsync(document).ConfigureAwait(false);
            }
        }
Exemple #3
0
 public TestAccessor(CompletionServiceWithProviders completionServiceWithProviders)
 => _completionServiceWithProviders = completionServiceWithProviders;