diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractMemberInsertingCompletionProvider.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractMemberInsertingCompletionProvider.cs index 2ffb43d53b98e3c9958d6ed1f0e6d6ff2aa70a69..0366dc80dc322cd8b9a8f7c2497a51519b131a81 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractMemberInsertingCompletionProvider.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractMemberInsertingCompletionProvider.cs @@ -2,10 +2,8 @@ using System.Linq; using System.Threading; -using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeGeneration; using Microsoft.CodeAnalysis.Completion; -using Microsoft.CodeAnalysis.Completion.Providers; using Microsoft.CodeAnalysis.Editing; using Microsoft.CodeAnalysis.Editor.Host; using Microsoft.CodeAnalysis.Editor.Shared.Extensions; @@ -19,7 +17,7 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.Completion { - internal abstract class AbstractMemberInsertingCompletionProvider : AbstractCompletionProvider, ICustomCommitCompletionProvider + internal abstract class AbstractMemberInsertingCompletionProvider : CompletionListProvider, ICustomCommitCompletionProvider { private IWaitIndicator _waitIndicator; private readonly SyntaxAnnotation _annotation = new SyntaxAnnotation(); @@ -37,11 +35,6 @@ internal abstract class AbstractMemberInsertingCompletionProvider : AbstractComp _waitIndicator = waitIndicator; } - protected override Task IsExclusiveAsync(Document documentOpt, int caretPosition, CompletionTriggerInfo triggerInfo, CancellationToken cancellationToken) - { - return SpecializedTasks.True; - } - public void Commit(CompletionItem completionItem, ITextView textView, ITextBuffer subjectBuffer, ITextSnapshot triggerSnapshot, char? commitChar) { var currentSnapshot = subjectBuffer.CurrentSnapshot; diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractOverrideCompletionProvider.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractOverrideCompletionProvider.cs index 062b6d838f4bd8cd137104db7993bee3bcd2a7ce..a9d34155c1cc98044b09c2a9c6c79886cf3d79a0 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractOverrideCompletionProvider.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractOverrideCompletionProvider.cs @@ -1,13 +1,13 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeGeneration; using Microsoft.CodeAnalysis.Completion; using Microsoft.CodeAnalysis.Editing; using Microsoft.CodeAnalysis.Editor.Host; -using Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.Completion.CompletionProviders; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Text; using Roslyn.Utilities; @@ -29,10 +29,16 @@ internal abstract partial class AbstractOverrideCompletionProvider : AbstractMem public abstract bool TryDetermineModifiers(SyntaxToken startToken, SourceText text, int startLine, out Accessibility seenAccessibility, out DeclarationModifiers modifiers); protected abstract TextSpan GetTextChangeSpan(SourceText text, int position); - protected override Task> GetItemsWorkerAsync(Document document, int position, CompletionTriggerInfo triggerInfo, CancellationToken cancellationToken) + public override async Task ProduceCompletionListAsync(CompletionListContext context) { - var state = new ItemGetter(this, document, position, cancellationToken); - return state.GetItemsAsync(); + var state = new ItemGetter(this, context.Document, context.Position, context.CancellationToken); + var items = await state.GetItemsAsync().ConfigureAwait(false); + + if (items?.Any() == true) + { + context.MakeExclusive(true); + context.AddItems(items); + } } protected override ISymbol GenerateMember(ISymbol newOverriddenMember, INamedTypeSymbol newContainingType, Document newDocument, MemberInsertionCompletionItem completionItem, CancellationToken cancellationToken) diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractPartialCompletionProvider.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractPartialCompletionProvider.cs index c7ffe138fa7c09d772b2732d2188f07dbd940908..24a146992c4f09b17ceb54aeb2ddeba512d89914 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractPartialCompletionProvider.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/CompletionProviders/AbstractPartialCompletionProvider.cs @@ -39,18 +39,28 @@ public AbstractPartialCompletionProvider(IWaitIndicator waitIndicator) protected abstract Task GetTextChangeSpanAsync(Document document, int position, CancellationToken cancellationToken); protected abstract bool IsPartial(IMethodSymbol m); - protected override async Task> GetItemsWorkerAsync(Document document, int position, CompletionTriggerInfo triggerInfo, CancellationToken cancellationToken) + public override async Task ProduceCompletionListAsync(CompletionListContext context) { + var document = context.Document; + var position = context.Position; + var cancellationToken = context.CancellationToken; + var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); DeclarationModifiers modifiers; SyntaxToken token; if (!IsPartialCompletionContext(tree, position, cancellationToken, out modifiers, out token)) { - return null; + return; } - return await CreatePartialItemsAsync(document, position, modifiers, token, cancellationToken).ConfigureAwait(false); + var items = await CreatePartialItemsAsync(document, position, modifiers, token, cancellationToken).ConfigureAwait(false); + + if (items?.Any() == true) + { + context.MakeExclusive(true); + context.AddItems(items); + } } protected override ISymbol GenerateMember(ISymbol member, INamedTypeSymbol containingType, Document document, MemberInsertionCompletionItem item, CancellationToken cancellationToken)