Skip to content
Merged
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 @@ -1508,6 +1508,76 @@ public class C
}
}
}
", state.GetDocumentText())
End Using
End Function

<WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/78822")>
Public Async Function AwaitCompletionAddsAsync_AsyncEnumerableMethodDeclaration1() As Task
Using state = TestStateFactory.CreateCSharpTestState(
<Document><![CDATA[
using System.Collections.Generic;
using System.Threading.Tasks;

public class C
{
public static IAsyncEnumerable<string> Main()
{
$$
}
}
]]>
</Document>)
state.SendTypeChars("aw")
Await state.AssertSelectedCompletionItem(displayText:="await", isHardSelected:=True)

state.SendTab()
Assert.Equal("
using System.Collections.Generic;
using System.Threading.Tasks;

public class C
{
public static async IAsyncEnumerable<string> Main()
{
await
}
}
", state.GetDocumentText())
End Using
End Function

<WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/78822")>
Public Async Function AwaitCompletionAddsAsync_AsyncEnumerableMethodDeclaration2() As Task
Using state = TestStateFactory.CreateCSharpTestState(
<Document><![CDATA[
using System.Collections.Generic;
using System.Threading.Tasks;

public class C
{
public static async IAsyncEnumerable<string> Main()
{
$$
}
}
]]>
</Document>)
state.SendTypeChars("aw")
Await state.AssertSelectedCompletionItem(displayText:="await", isHardSelected:=True)

state.SendTab()
Assert.Equal("
using System.Collections.Generic;
using System.Threading.Tasks;

public class C
{
public static async IAsyncEnumerable<string> Main()
{
await
}
}
", state.GetDocumentText())
End Using
End Function
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Extensions.ContextQuery;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;

Expand All @@ -31,9 +30,6 @@ internal sealed class AwaitCompletionProvider() : AbstractAwaitCompletionProvide

public override ImmutableHashSet<char> TriggerCharacters => CompletionUtilities.CommonTriggerCharactersWithArgumentList;

protected override bool IsAwaitKeywordContext(SyntaxContext syntaxContext)
=> base.IsAwaitKeywordContext(syntaxContext);

/// <summary>
/// Gets the span start where async keyword should go.
/// </summary>
Expand Down Expand Up @@ -86,8 +82,13 @@ protected override int GetAsyncKeywordInsertionPosition(SyntaxNode declaration)
// Don't change the return type if we don't understand it, or it already seems task-like.
var taskLikeTypes = new KnownTaskTypes(semanticModel.Compilation);
var returnType = semanticModel.GetTypeInfo(existingReturnType, cancellationToken).Type;
if (returnType is null or IErrorTypeSymbol || taskLikeTypes.IsTaskLike(returnType))
if (returnType is null or IErrorTypeSymbol ||
taskLikeTypes.IsTaskLike(returnType) ||
returnType.OriginalDefinition.Equals(taskLikeTypes.IAsyncEnumerableOfTType) ||
returnType.OriginalDefinition.Equals(taskLikeTypes.IAsyncEnumeratorOfTType))
{
return null;
}

return $"{nameof(Task)}<{existingReturnType}>";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.LanguageService;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Collections;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Extensions.ContextQuery;
using Microsoft.CodeAnalysis.Text;
Expand Down Expand Up @@ -65,9 +64,6 @@ protected AbstractAwaitCompletionProvider(ISyntaxFacts syntaxFacts)
protected abstract SyntaxNode? GetExpressionToPlaceAwaitInFrontOf(SyntaxTree syntaxTree, int position, CancellationToken cancellationToken);
protected abstract SyntaxToken? GetDotTokenLeftOfPosition(SyntaxTree syntaxTree, int position, CancellationToken cancellationToken);

protected virtual bool IsAwaitKeywordContext(SyntaxContext syntaxContext)
=> syntaxContext.IsAwaitKeywordContext;

private static bool IsConfigureAwaitable(Compilation compilation, ITypeSymbol symbol)
{
var originalDefinition = symbol.OriginalDefinition;
Expand All @@ -90,7 +86,7 @@ public sealed override async Task ProvideCompletionsAsync(CompletionContext cont

var syntaxContext = await context.GetSyntaxContextWithExistingSpeculativeModelAsync(document, cancellationToken).ConfigureAwait(false);

var isAwaitKeywordContext = IsAwaitKeywordContext(syntaxContext);
var isAwaitKeywordContext = syntaxContext.IsAwaitKeywordContext;
var dotAwaitContext = GetDotAwaitKeywordContext(syntaxContext, cancellationToken);
if (!isAwaitKeywordContext && dotAwaitContext == DotAwaitContext.None)
return;
Expand Down
Loading