diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/EnumAndCompletionListTagCompletionProvider.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/EnumAndCompletionListTagCompletionProvider.cs index e40458a90feeb..521e7e94149fc 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/EnumAndCompletionListTagCompletionProvider.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/EnumAndCompletionListTagCompletionProvider.cs @@ -72,7 +72,7 @@ public override async Task ProvideCompletionsAsync(CompletionContext context) var syntaxContext = await context.GetSyntaxContextWithExistingSpeculativeModelAsync(document, cancellationToken).ConfigureAwait(false); var semanticModel = syntaxContext.SemanticModel; - if (syntaxContext.IsInTaskLikeTypeContext) + if (syntaxContext.IsTaskLikeTypeContext) return; var token = syntaxContext.TargetToken; diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/SnippetCompletionProvider.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/SnippetCompletionProvider.cs index 079196bfe4ba4..771250f152f69 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/SnippetCompletionProvider.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/SnippetCompletionProvider.cs @@ -97,11 +97,6 @@ private static async Task> GetSnippetsForDocument var context = await completionContext.GetSyntaxContextWithExistingSpeculativeModelAsync(document, cancellationToken).ConfigureAwait(false); var semanticModel = context.SemanticModel; - if (context.IsInTaskLikeTypeContext) - { - return ImmutableArray.Empty; - } - if (syntaxFacts.IsPreProcessorDirectiveContext(syntaxTree, position, cancellationToken)) { var directive = leftToken.GetAncestor(); diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/SpeculativeTCompletionProvider.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/SpeculativeTCompletionProvider.cs index 3a4c0bccc7421..ba3ab404158a1 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/SpeculativeTCompletionProvider.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/SpeculativeTCompletionProvider.cs @@ -78,7 +78,7 @@ private static async Task ShouldShowSpeculativeTCompletionItemAsync(Docume var context = await completionContext.GetSyntaxContextWithExistingSpeculativeModelAsync(document, cancellationToken).ConfigureAwait(false); - if (context.IsInTaskLikeTypeContext) + if (context.IsTaskLikeTypeContext) return false; var spanStart = position; diff --git a/src/Features/CSharp/Portable/Completion/KeywordRecommenders/AbstractNativeIntegerKeywordRecommender.cs b/src/Features/CSharp/Portable/Completion/KeywordRecommenders/AbstractNativeIntegerKeywordRecommender.cs index 5836238b504a0..711ab8e938644 100644 --- a/src/Features/CSharp/Portable/Completion/KeywordRecommenders/AbstractNativeIntegerKeywordRecommender.cs +++ b/src/Features/CSharp/Portable/Completion/KeywordRecommenders/AbstractNativeIntegerKeywordRecommender.cs @@ -15,7 +15,7 @@ internal abstract class AbstractNativeIntegerKeywordRecommender : IKeywordRecomm private static bool IsValidContext(CSharpSyntaxContext context) { - if (context.IsInTaskLikeTypeContext || + if (context.IsTaskLikeTypeContext || context.IsGenericConstraintContext) { return false; diff --git a/src/Features/CSharp/Portable/Completion/KeywordRecommenders/AbstractSpecialTypePreselectingKeywordRecommender.cs b/src/Features/CSharp/Portable/Completion/KeywordRecommenders/AbstractSpecialTypePreselectingKeywordRecommender.cs index 5318188573326..126e2ba18f56a 100644 --- a/src/Features/CSharp/Portable/Completion/KeywordRecommenders/AbstractSpecialTypePreselectingKeywordRecommender.cs +++ b/src/Features/CSharp/Portable/Completion/KeywordRecommenders/AbstractSpecialTypePreselectingKeywordRecommender.cs @@ -27,7 +27,7 @@ protected override bool ShouldPreselect(CSharpSyntaxContext context, Cancellatio protected sealed override bool IsValidContext(int position, CSharpSyntaxContext context, CancellationToken cancellationToken) { // Filter out all special-types from locations where we think we only want something task-like. - if (context.IsInTaskLikeTypeContext) + if (context.IsTaskLikeTypeContext) return false; return IsValidContextWorker(position, context, cancellationToken); diff --git a/src/Features/CSharp/Portable/Completion/KeywordRecommenders/DynamicKeywordRecommender.cs b/src/Features/CSharp/Portable/Completion/KeywordRecommenders/DynamicKeywordRecommender.cs index 8094431002ca7..922c50cf349ec 100644 --- a/src/Features/CSharp/Portable/Completion/KeywordRecommenders/DynamicKeywordRecommender.cs +++ b/src/Features/CSharp/Portable/Completion/KeywordRecommenders/DynamicKeywordRecommender.cs @@ -19,7 +19,7 @@ internal class DynamicKeywordRecommender : IKeywordRecommender(); var recommendedSymbols = recommender.GetRecommendedSymbolsInContext(context, recommendationOptions, cancellationToken); - if (context.IsInTaskLikeTypeContext) + if (context.IsTaskLikeTypeContext) { // If we get 'Task' back, attempt to preselect that as the most likely result. var taskType = context.SemanticModel.Compilation.TaskType(); @@ -92,7 +92,8 @@ private static bool IsValidForTaskLikeTypeOnlyContext(ISymbol symbol, TSyntaxCon namedType.Equals(compilation.IAsyncEnumeratorOfTType()); } - return symbol.IsAwaitableNonDynamic(context.SemanticModel, context.Position); + return namedType.IsAwaitableNonDynamic(context.SemanticModel, context.Position) || + namedType.GetTypeMembers().Any(static (m, context) => IsValidForTaskLikeTypeOnlyContext(m, context), context); } private static bool IsValidForGenericConstraintContext(ISymbol symbol) diff --git a/src/Features/VisualBasic/Portable/Completion/KeywordRecommenders/Types/BuiltInTypesKeywordRecommender.vb b/src/Features/VisualBasic/Portable/Completion/KeywordRecommenders/Types/BuiltInTypesKeywordRecommender.vb index ed1fdc7e708d6..2d57f12cfd367 100644 --- a/src/Features/VisualBasic/Portable/Completion/KeywordRecommenders/Types/BuiltInTypesKeywordRecommender.vb +++ b/src/Features/VisualBasic/Portable/Completion/KeywordRecommenders/Types/BuiltInTypesKeywordRecommender.vb @@ -17,7 +17,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.KeywordRecommenders.Type Inherits AbstractKeywordRecommender Protected Overrides Function RecommendKeywords(context As VisualBasicSyntaxContext, cancellationToken As CancellationToken) As ImmutableArray(Of RecommendedKeyword) - If context.IsInTaskLikeTypeContext Then + If context.IsTaskLikeTypeContext Then Return ImmutableArray(Of RecommendedKeyword).Empty End If diff --git a/src/VisualStudio/VisualBasic/Impl/Snippets/SnippetCompletionProvider.vb b/src/VisualStudio/VisualBasic/Impl/Snippets/SnippetCompletionProvider.vb index 53916c54a9c40..3e5aa39daf701 100644 --- a/src/VisualStudio/VisualBasic/Impl/Snippets/SnippetCompletionProvider.vb +++ b/src/VisualStudio/VisualBasic/Impl/Snippets/SnippetCompletionProvider.vb @@ -89,11 +89,6 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Snippets Return End If - Dim syntaxContext = Await context.GetSyntaxContextWithExistingSpeculativeModelAsync(document, cancellationToken).ConfigureAwait(False) - If syntaxContext.IsInTaskLikeTypeContext Then - Return - End If - Dim syntaxFacts = document.GetLanguageService(Of ISyntaxFactsService)() If IsInNonUserCode(syntaxTree, position, cancellationToken) Then Return diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/Extensions/ContextQuery/CSharpSyntaxContext.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/Extensions/ContextQuery/CSharpSyntaxContext.cs index dfe71b09db076..2459ec45b2b98 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/Extensions/ContextQuery/CSharpSyntaxContext.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/Extensions/ContextQuery/CSharpSyntaxContext.cs @@ -80,7 +80,7 @@ private CSharpSyntaxContext( bool isInNonUserCode, bool isInQuery, bool isInstanceContext, - bool isInTaskLikeTypeContext, + bool isTaskLikeTypeContext, bool isIsOrAsOrSwitchOrWithExpressionContext, bool isIsOrAsTypeContext, bool isLabelContext, @@ -125,7 +125,7 @@ private CSharpSyntaxContext( isGlobalStatementContext: isGlobalStatementContext, isInImportsDirective: isInImportsDirective, isInQuery: isInQuery, - isInTaskLikeTypeContext: isInTaskLikeTypeContext, + isTaskLikeTypeContext: isTaskLikeTypeContext, isNameOfContext: isNameOfContext, isNamespaceContext: isNamespaceContext, isNamespaceDeclarationNameContext: isNamespaceDeclarationNameContext, @@ -274,7 +274,7 @@ private static CSharpSyntaxContext CreateContextWorker(Document document, Semant isInNonUserCode: isInNonUserCode, isInQuery: leftToken.GetAncestor() != null, isInstanceContext: syntaxTree.IsInstanceContext(targetToken, semanticModel, cancellationToken), - isInTaskLikeTypeContext: precedingModifiers.Contains(SyntaxKind.AsyncKeyword), + isTaskLikeTypeContext: precedingModifiers.Contains(SyntaxKind.AsyncKeyword), isIsOrAsOrSwitchOrWithExpressionContext: syntaxTree.IsIsOrAsOrSwitchOrWithExpressionContext(semanticModel, position, leftToken, cancellationToken), isIsOrAsTypeContext: syntaxTree.IsIsOrAsTypeContext(position, leftToken), isLabelContext: syntaxTree.IsLabelContext(position, cancellationToken), diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Extensions/ContextQuery/SyntaxContext.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Extensions/ContextQuery/SyntaxContext.cs index 619eb5c3ac384..7d0d46ff08275 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Extensions/ContextQuery/SyntaxContext.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Extensions/ContextQuery/SyntaxContext.cs @@ -37,7 +37,7 @@ internal abstract class SyntaxContext public bool IsGlobalStatementContext { get; } public bool IsInImportsDirective { get; } public bool IsInQuery { get; } - public bool IsInTaskLikeTypeContext { get; } + public bool IsTaskLikeTypeContext { get; } public bool IsNameOfContext { get; } public bool IsNamespaceContext { get; } public bool IsNamespaceDeclarationNameContext { get; } @@ -69,7 +69,7 @@ protected SyntaxContext( bool isGlobalStatementContext, bool isInImportsDirective, bool isInQuery, - bool isInTaskLikeTypeContext, + bool isTaskLikeTypeContext, bool isNameOfContext, bool isNamespaceContext, bool isNamespaceDeclarationNameContext, @@ -101,7 +101,7 @@ protected SyntaxContext( this.IsGlobalStatementContext = isGlobalStatementContext; this.IsInImportsDirective = isInImportsDirective; this.IsInQuery = isInQuery; - this.IsInTaskLikeTypeContext = isInTaskLikeTypeContext; + this.IsTaskLikeTypeContext = isTaskLikeTypeContext; this.IsNameOfContext = isNameOfContext; this.IsNamespaceContext = isNamespaceContext; this.IsNamespaceDeclarationNameContext = isNamespaceDeclarationNameContext; diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/Extensions/ContextQuery/VisualBasicSyntaxContext.vb b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/Extensions/ContextQuery/VisualBasicSyntaxContext.vb index 5ba7f5aef5e78..cded8db9d1d81 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/Extensions/ContextQuery/VisualBasicSyntaxContext.vb +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/Extensions/ContextQuery/VisualBasicSyntaxContext.vb @@ -66,7 +66,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery isInImportsDirective As Boolean, isInLambda As Boolean, isInQuery As Boolean, - isInTaskLikeTypeContext As Boolean, + isTaskLikeTypeContext As Boolean, isNameOfContext As Boolean, isNamespaceContext As Boolean, isNamespaceDeclarationNameContext As Boolean, @@ -96,7 +96,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery isGlobalStatementContext:=isGlobalStatementContext, isInImportsDirective:=isInImportsDirective, isInQuery:=isInQuery, - isInTaskLikeTypeContext:=isInTaskLikeTypeContext, + isTaskLikeTypeContext:=isTaskLikeTypeContext, isNameOfContext:=isNameOfContext, isNamespaceContext, isNamespaceDeclarationNameContext, @@ -134,7 +134,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery Me.IsPreprocessorEndDirectiveKeywordContext = targetToken.FollowsBadEndDirective() End Sub - Private Shared Function ComputeIsInTaskLikeTypeContext(targetToken As SyntaxToken) As Boolean + Private Shared Function ComputeIsTaskLikeTypeContext(targetToken As SyntaxToken) As Boolean ' If we're after the 'as' in an async method declaration, then filter down to task-like types only. If targetToken.Kind() = SyntaxKind.AsKeyword Then Dim asClause = TryCast(targetToken.Parent, AsClauseSyntax) @@ -177,7 +177,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery isInImportsDirective:=leftToken.GetAncestor(Of ImportsStatementSyntax)() IsNot Nothing, isInLambda:=leftToken.GetAncestor(Of LambdaExpressionSyntax)() IsNot Nothing, isInQuery:=isInQuery, - isInTaskLikeTypeContext:=ComputeIsInTaskLikeTypeContext(targetToken), + isTaskLikeTypeContext:=ComputeIsTaskLikeTypeContext(targetToken), isNameOfContext:=syntaxTree.IsNameOfContext(position, cancellationToken), isNamespaceContext:=syntaxTree.IsNamespaceContext(position, targetToken, cancellationToken, semanticModel), isNamespaceDeclarationNameContext:=syntaxTree.IsNamespaceDeclarationNameContext(position, cancellationToken),