diff --git a/src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb b/src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb index b3feb05788b7a7dacc17066e5f61a8f7f8286efc..0e08f68b4c5b5575591aa486dfc1f78633ee2dbe 100644 --- a/src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb +++ b/src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb @@ -3018,6 +3018,176 @@ class C End Function + + + Public Async Function TestMatchWithTurkishIWorkaround3() As Task + Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateCSharpTestState( + , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) + state.SendTypeChars("tarif") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("TARIFE") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround4() As Task + Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateCSharpTestState( + , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) + state.SendTypeChars("if") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("if") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround5() As Task + Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateCSharpTestState( + , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) + state.SendTypeChars("if") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("if") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround6() As Task + Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateCSharpTestState( + , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) + state.SendTypeChars("tarif") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("TARİFE") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround7() As Task + Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateCSharpTestState( + , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) + state.SendTypeChars("ifad") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("İFADE") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround8() As Task + Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateCSharpTestState( + , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) + state.SendTypeChars("ifad") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("IFADE") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround9() As Task + Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateCSharpTestState( + , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) + state.SendTypeChars("IF") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("if") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround10() As Task + Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateCSharpTestState( + , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) + state.SendTypeChars("IF") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("if") + End Using + End Using + + End Function + Public Async Function TargetTypePreselection1() As Task Using state = TestStateFactory.CreateCSharpTestState( diff --git a/src/EditorFeatures/Test2/IntelliSense/VisualBasicCompletionCommandHandlerTests.vb b/src/EditorFeatures/Test2/IntelliSense/VisualBasicCompletionCommandHandlerTests.vb index 36fb43b5f0e7f36421eb2bbae090ac17b811db37..0e861f5c599220746b716f15702c993c506986ba 100644 --- a/src/EditorFeatures/Test2/IntelliSense/VisualBasicCompletionCommandHandlerTests.vb +++ b/src/EditorFeatures/Test2/IntelliSense/VisualBasicCompletionCommandHandlerTests.vb @@ -3008,6 +3008,235 @@ End Class End Using End Function + + + Public Async Function TestMatchWithTurkishIWorkaround1() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("is") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("IsInterned") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround2() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("ı") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem() + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround3() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("tarif") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("TARIFE") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround4() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("if") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("If") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround5() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("if") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("If") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround6() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("tarif") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("TARİFE") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround7() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("ifad") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("İFADE") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround8() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("ifad") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("IFADE") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround9() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("IF") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("If") + End Using + End Using + + End Function + + + + Public Async Function TestMatchWithTurkishIWorkaround10() As Task + Using New CultureContext(New Globalization.CultureInfo("tr-TR", useUserOverride:=False)) + Using state = TestStateFactory.CreateVisualBasicTestState( + ) + state.SendTypeChars("IF") + Await state.WaitForAsynchronousOperationsAsync() + Await state.AssertSelectedCompletionItem("If") + End Using + End Using + + End Function + Friend Class MockSnippetInfoService Implements ISnippetInfoService diff --git a/src/Features/Core/Portable/Completion/CompletionHelper.cs b/src/Features/Core/Portable/Completion/CompletionHelper.cs index d0d938327be18165d3b53791a205cf9c6ec86c1b..72087cb73202b24a71bca3cfba2d856d096e35b5 100644 --- a/src/Features/Core/Portable/Completion/CompletionHelper.cs +++ b/src/Features/Core/Portable/Completion/CompletionHelper.cs @@ -87,24 +87,32 @@ public bool MatchesPattern(string text, string pattern, CultureInfo culture) var patternMatcher = GetPatternMatcher(pattern, culture, includeMatchSpans); var match = patternMatcher.GetFirstMatch(completionItemText); - if (match != null) + // We still have making checks for language having different to English capitalization, + // for example, for Turkish with dotted and dotless i capitalization totally diferent from English. + // Now we escaping from the second check for English languages. + // Maybe we can escape as well for more similar languages in case if we meet performance issues. + if (culture.ThreeLetterWindowsLanguageName.Equals(EnUSCultureInfo.ThreeLetterWindowsLanguageName)) { return match; } - // Start with the culture-specific comparison, and fall back to en-US. - if (!culture.Equals(EnUSCultureInfo)) + // Keywords in .NET are always in En-US. + // Identifiers can be in user language. + // Try to get matches for both and return the best of them. + patternMatcher = GetPatternMatcher(pattern, EnUSCultureInfo, includeMatchSpans); + var enUSCultureMatch = patternMatcher.GetFirstMatch(completionItemText); + + if (match == null) { - patternMatcher = GetPatternMatcher(pattern, EnUSCultureInfo, includeMatchSpans); - match = patternMatcher.GetFirstMatch(completionItemText); + return enUSCultureMatch; + } - if (match != null) - { - return match; - } + if (enUSCultureMatch == null) + { + return match; } - return null; + return match.Value.CompareTo(enUSCultureMatch.Value) < 0 ? match.Value : enUSCultureMatch.Value; } private PatternMatcher GetPatternMatcher(