Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ await TestServices.SolutionExplorer.AddFileAsync(

var textView = await TestServices.Editor.GetActiveTextViewAsync(HangMitigatingCancellationToken);
await TestServices.Editor.WaitForComponentClassificationAsync(ControlledHangMitigatingCancellationToken);
await TestServices.Editor.DismissCompletionSessionsAsync(ControlledHangMitigatingCancellationToken);

await TestServices.Editor.PlaceCaretAsync("/// ", charsOffset: 1, ControlledHangMitigatingCancellationToken);
TestServices.Input.Send("add a function");
Expand All @@ -197,7 +198,7 @@ await TestServices.SolutionExplorer.AddFileAsync(
Assert.Contains("/// add a function", currentLineText);

// Make sure completion doesn't come up for 15 seconds
var completionSession = await TestServices.Editor.WaitForCompletionSessionAsync(s_snippetTimeout, HangMitigatingCancellationToken);
var completionSession = await TestServices.Editor.WaitForExistingCompletionSessionAsync(s_snippetTimeout, HangMitigatingCancellationToken);
var items = completionSession?.GetComputedItems(HangMitigatingCancellationToken);

if (items is null)
Expand Down Expand Up @@ -426,12 +427,13 @@ await TestServices.SolutionExplorer.AddFileAsync(
ControlledHangMitigatingCancellationToken);

await TestServices.Editor.WaitForComponentClassificationAsync(ControlledHangMitigatingCancellationToken);
await TestServices.Editor.DismissCompletionSessionsAsync(ControlledHangMitigatingCancellationToken);

await TestServices.Editor.PlaceCaretAsync("Hel", charsOffset: 1, ControlledHangMitigatingCancellationToken);
TestServices.Input.Send("{DELETE}");

// Make sure completion doesn't come up for 15 seconds
var completionSession = await TestServices.Editor.WaitForCompletionSessionAsync(s_snippetTimeout, HangMitigatingCancellationToken);
var completionSession = await TestServices.Editor.WaitForExistingCompletionSessionAsync(s_snippetTimeout, HangMitigatingCancellationToken);
Assert.Null(completionSession);
}

Expand Down Expand Up @@ -472,13 +474,14 @@ await TestServices.SolutionExplorer.AddFileAsync(

var textView = await TestServices.Editor.GetActiveTextViewAsync(HangMitigatingCancellationToken);
await TestServices.Editor.WaitForComponentClassificationAsync(ControlledHangMitigatingCancellationToken);
await TestServices.Editor.DismissCompletionSessionsAsync(ControlledHangMitigatingCancellationToken);

await TestServices.Editor.PlaceCaretAsync(tag, charsOffset: 1, ControlledHangMitigatingCancellationToken);
TestServices.Input.Send(" ");
TestServices.Input.Send("dd");

// Make sure completion doesn't come up for 15 seconds
var completionSession = await TestServices.Editor.WaitForCompletionSessionAsync(s_snippetTimeout, HangMitigatingCancellationToken);
var completionSession = await TestServices.Editor.WaitForExistingCompletionSessionAsync(s_snippetTimeout, HangMitigatingCancellationToken);
var items = completionSession?.GetComputedItems(HangMitigatingCancellationToken);

if (items is null)
Expand Down Expand Up @@ -674,6 +677,9 @@ private async Task CommitCompletionAndVerifyAsync(string expected, char? commitC

private async Task CommitCompletionAndVerifyAsync(string expected, string expectedSelectedItemLabel, char? commitChar = null)
{
// Let outstanding async Intellisense work settle before we interrogate the active completion session.
await TestServices.Shell.WaitForOperationProgressAsync(HangMitigatingCancellationToken);

// Actually open completion UI and wait for it have selected item we are interested in
var session = await TestServices.Editor.OpenCompletionSessionAndWaitForItemAsync(TimeSpan.FromSeconds(10), expectedSelectedItemLabel, HangMitigatingCancellationToken);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,35 @@ public async Task DismissCompletionSessionsAsync(CancellationToken cancellationT
}
}

public Task<IAsyncCompletionSession?> WaitForExistingCompletionSessionAsync(CancellationToken cancellationToken)
{
return WaitForExistingCompletionSessionAsync(TimeSpan.FromSeconds(10), cancellationToken);
}

public async Task<IAsyncCompletionSession?> WaitForExistingCompletionSessionAsync(TimeSpan timeOut, CancellationToken cancellationToken)
{
await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);

var textView = await GetActiveTextViewAsync(cancellationToken);

var stopWatch = Stopwatch.StartNew();
var asyncCompletion = await TestServices.Shell.GetComponentModelServiceAsync<IAsyncCompletionBroker>(cancellationToken);
var session = asyncCompletion.GetSession(textView);

while (session is null || session.IsDismissed)
{
if (stopWatch.ElapsedMilliseconds >= timeOut.TotalMilliseconds)
{
return null;
}

await Task.Delay(100, cancellationToken);
session = asyncCompletion.GetSession(textView);
}

return session;
}

/// <summary>
/// Open completion pop-up window UI and wait for the specified item to be present selected
/// </summary>
Expand All @@ -99,8 +128,14 @@ public async Task DismissCompletionSessionsAsync(CancellationToken cancellationT
var stopWatch = Stopwatch.StartNew();
var asyncCompletion = await TestServices.Shell.GetComponentModelServiceAsync<IAsyncCompletionBroker>(cancellationToken);
var lastOpenOrUpdateTime = 0L;
var lastSessionResetTime = stopWatch.ElapsedMilliseconds;

IAsyncCompletionSession? TriggerCompletion()
=> asyncCompletion.TriggerCompletion(textView, new CompletionTrigger(CompletionTriggerReason.Insertion, textView.TextSnapshot), textView.Caret.Position.BufferPosition, cancellationToken);
{
lastSessionResetTime = stopWatch.ElapsedMilliseconds;
return asyncCompletion.TriggerCompletion(textView, new CompletionTrigger(CompletionTriggerReason.Insertion, textView.TextSnapshot), textView.Caret.Position.BufferPosition, cancellationToken);
}

void OpenOrUpdate(IAsyncCompletionSession currentSession)
{
currentSession.OpenOrUpdate(new CompletionTrigger(CompletionTriggerReason.Insertion, textView.TextSnapshot), textView.Caret.Position.BufferPosition, cancellationToken);
Expand All @@ -117,10 +152,26 @@ void OpenOrUpdate(IAsyncCompletionSession currentSession)
}

var currentSession = session;
if (currentSession is not null && !currentSession.IsDismissed &&
currentSession.GetComputedItems(cancellationToken).SelectedItem?.DisplayText == selectedItemLabel)
if (currentSession is not null && !currentSession.IsDismissed)
{
return currentSession;
var computedItems = currentSession.GetComputedItems(cancellationToken);
if (computedItems.SelectedItem?.DisplayText == selectedItemLabel)
{
return currentSession;
}

if (computedItems.SelectedItem is not null &&
!computedItems.Items.Any(item => item.DisplayText == selectedItemLabel) &&
stopWatch.ElapsedMilliseconds - lastSessionResetTime >= 1000)
{
currentSession.Dismiss();
session = TriggerCompletion();
if (session is not null && !session.IsDismissed)
{
OpenOrUpdate(session);
continue;
}
}
}

await Task.Delay(100, cancellationToken);
Expand All @@ -141,7 +192,7 @@ void OpenOrUpdate(IAsyncCompletionSession currentSession)
continue;
}

if (stopWatch.ElapsedMilliseconds - lastOpenOrUpdateTime >= 1000)
if (stopWatch.ElapsedMilliseconds - lastOpenOrUpdateTime >= 250)
{
OpenOrUpdate(currentSession);
}
Expand Down