diff --git a/src/EditorFeatures/Core/Extensibility/Completion/CompletionHelper.cs b/src/EditorFeatures/Core/Extensibility/Completion/CompletionHelper.cs index d98cf01e18ec67a5c1bbe4c969a32b87df21d5e5..ac8dddde2dc5f7ab4019458dfd98f13f2a2328dc 100644 --- a/src/EditorFeatures/Core/Extensibility/Completion/CompletionHelper.cs +++ b/src/EditorFeatures/Core/Extensibility/Completion/CompletionHelper.cs @@ -108,9 +108,33 @@ protected static bool IsAllDigits(string filterText) } protected PatternMatch? GetMatch(CompletionItem item, string filterText, bool includeMatchSpans) + { + // If the item has a dot in it (i.e. for something like enum completion), then attempt + // to match what the user wrote against the last portion of the name. That way if they + // write "Bl" and we have "Blub" and "Color.Black", we'll consider hte latter to be a + // better match as they'll both be prefix matches, and the latter will have a higher + // priority. + + var lastDotIndex = item.FilterText.LastIndexOf('.'); + if (lastDotIndex >= 0) + { + var textAfterLastDot = item.FilterText.Substring(lastDotIndex + 1); + var match = GetMatchWorker(textAfterLastDot, filterText, includeMatchSpans); + if (match != null) + { + return match; + } + } + + // Didn't have a dot, or the user text didn't match the portion after the dot. + // Just do a normal check against the entire completion item. + return GetMatchWorker(item.FilterText, filterText, includeMatchSpans); + } + + private PatternMatch? GetMatchWorker(string completionItemText, string filterText, bool includeMatchSpans) { var patternMatcher = this.GetPatternMatcher(filterText, CultureInfo.CurrentCulture); - var match = patternMatcher.GetFirstMatch(item.FilterText, includeMatchSpans); + var match = patternMatcher.GetFirstMatch(completionItemText, includeMatchSpans); if (match != null) { @@ -121,7 +145,7 @@ protected static bool IsAllDigits(string filterText) if (!CultureInfo.CurrentCulture.Equals(EnUSCultureInfo)) { patternMatcher = this.GetEnUSPatternMatcher(filterText); - match = patternMatcher.GetFirstMatch(item.FilterText); + match = patternMatcher.GetFirstMatch(completionItemText); if (match != null) { return match; @@ -228,11 +252,6 @@ protected static bool IsKeywordItem(CompletionItem item) return item.Tags.Contains(CompletionTags.Keyword); } - protected static bool IsEnumMemberItem(CompletionItem item) - { - return item.Tags.Contains(CompletionTags.EnumMember); - } - protected int CompareMatches(PatternMatch match1, PatternMatch match2, CompletionItem item1, CompletionItem item2) { // First see how the two items compare in a case insensitive fashion. Matches that diff --git a/src/EditorFeatures/Test2/IntelliSense/VisualBasicCompletionCommandHandlerTests.vb b/src/EditorFeatures/Test2/IntelliSense/VisualBasicCompletionCommandHandlerTests.vb index f31e3c6f075576b9bb179de80a89471e5c0dd9fe..d658858ccf4d6109728bed7d62aff9412f2aad77 100644 --- a/src/EditorFeatures/Test2/IntelliSense/VisualBasicCompletionCommandHandlerTests.vb +++ b/src/EditorFeatures/Test2/IntelliSense/VisualBasicCompletionCommandHandlerTests.vb @@ -11,7 +11,6 @@ Imports Microsoft.VisualStudio.Text.Projection Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Public Class VisualBasicCompletionCommandHandlerTests - Public Async Function MultiWordKeywordCommitBehavior() As Task @@ -2293,4 +2292,4 @@ End Module]]>) End Using End Function End Class -End Namespace +End Namespace \ No newline at end of file diff --git a/src/EditorFeatures/VisualBasic/Completion/VisualBasicCompletionHelper.vb b/src/EditorFeatures/VisualBasic/Completion/VisualBasicCompletionHelper.vb index 4e13fc71089981929099ab3e84ae921989dc77e7..08bd5ab50f60172ea96b0555f494b7589b3f8e6c 100644 --- a/src/EditorFeatures/VisualBasic/Completion/VisualBasicCompletionHelper.vb +++ b/src/EditorFeatures/VisualBasic/Completion/VisualBasicCompletionHelper.vb @@ -1,9 +1,6 @@ -Imports System.Collections.Immutable -Imports System.Composition -Imports Microsoft.CodeAnalysis.Completion +Imports System.Composition Imports Microsoft.CodeAnalysis.Host Imports Microsoft.CodeAnalysis.Host.Mef -Imports Microsoft.CodeAnalysis.Shared.Utilities Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.Completion @@ -33,30 +30,5 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.Completion Public Sub New() MyBase.New(isCaseSensitive:=False) End Sub - - Public Overrides Function IsBetterFilterMatch( - item1 As CompletionItem, item2 As CompletionItem, - filterText As String, trigger As CompletionTrigger, - recentItems As ImmutableArray(Of String)) As Boolean - If IsEnumMemberItem(item2) Then - Dim match1 = GetMatch(item1, filterText) - Dim match2 = GetMatch(item2, filterText) - - If match1.HasValue AndAlso match2.HasValue Then - If match1.Value.Kind = PatternMatchKind.Prefix AndAlso match2.Value.Kind = PatternMatchKind.Substring Then - ' If an item from Enum completion Is an equally good match apart from - ' being a substring rather than prefix match, take it. - - If IsEnumMemberItem(item1) AndAlso - match1.Value.CamelCaseWeight.GetValueOrDefault() = match2.Value.CamelCaseWeight.GetValueOrDefault() AndAlso - match1.Value.IsCaseSensitive = match2.Value.IsCaseSensitive Then - Return False - End If - End If - End If - End If - - Return MyBase.IsBetterFilterMatch(item1, item2, filterText, trigger, recentItems) - End Function End Class End Namespace \ No newline at end of file