Skip to content

Commit 4346937

Browse files
authored
Merge pull request #1950 from 333fred/master
Correct regex completion
2 parents 608e77e + 94cc89e commit 4346937

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

src/OmniSharp.Roslyn.CSharp/Services/Completion/CompletionService.cs

+10
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,16 @@ public async Task<CompletionResponse> Handle(CompletionRequest request)
174174
string providerName = completion.GetProviderName();
175175
switch (providerName)
176176
{
177+
case CompletionItemExtensions.EmeddedLanguageCompletionProvider:
178+
// The Regex completion provider can change escapes based on whether
179+
// we're in a verbatim string or not
180+
{
181+
CompletionChange change = await completionService.GetChangeAsync(document, completion);
182+
Debug.Assert(typedSpan == change.TextChange.Span);
183+
insertText = change.TextChange.NewText!;
184+
}
185+
break;
186+
177187
case CompletionItemExtensions.InternalsVisibleToCompletionProvider:
178188
// The IVT completer doesn't add extra things before the completion
179189
// span, only assembly keys at the end if they exist.

src/OmniSharp.Roslyn.CSharp/Services/Intellisense/CompletionItemExtensions.cs

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ internal static class CompletionItemExtensions
2626
internal const string XmlDocCommentCompletionProvider = "Microsoft.CodeAnalysis.CSharp.Completion.Providers.XmlDocCommentCompletionProvider";
2727
internal const string TypeImportCompletionProvider = "Microsoft.CodeAnalysis.CSharp.Completion.Providers.TypeImportCompletionProvider";
2828
internal const string ExtensionMethodImportCompletionProvider = "Microsoft.CodeAnalysis.CSharp.Completion.Providers.ExtensionMethodImportCompletionProvider";
29+
internal const string EmeddedLanguageCompletionProvider = "Microsoft.CodeAnalysis.CSharp.Completion.Providers.EmbeddedLanguageCompletionProvider";
2930
private const string ProviderName = nameof(ProviderName);
3031
private const string SymbolCompletionItem = "Microsoft.CodeAnalysis.Completion.Providers.SymbolCompletionItem";
3132
private const string SymbolKind = nameof(SymbolKind);

tests/OmniSharp.Roslyn.CSharp.Tests/CompletionFacts.cs

+42
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,48 @@ public async Task InternalsVisibleToCompletionSkipsMiscProject()
13361336
Assert.Equal("AssemblyNameVal", completions.Items[0].InsertText);
13371337
}
13381338

1339+
[ConditionalTheory(typeof(WindowsOnly))]
1340+
[InlineData("dummy.cs")]
1341+
[InlineData("dummy.csx")]
1342+
public async Task RegexCompletionInNormalString(string filename)
1343+
{
1344+
const string input = @"
1345+
using System.Text.RegularExpressions;
1346+
class Foo
1347+
{
1348+
public void M()
1349+
{
1350+
_ = new Regex(""$$"");
1351+
}
1352+
}";
1353+
1354+
var completions = await FindCompletionsAsync(filename, input, SharedOmniSharpTestHost);
1355+
var aCompletion = completions.Items.First(c => c.Label == @"\A");
1356+
Assert.NotNull(aCompletion);
1357+
Assert.Equal(@"\\A", aCompletion.InsertText);
1358+
}
1359+
1360+
[ConditionalTheory(typeof(WindowsOnly))]
1361+
[InlineData("dummy.cs")]
1362+
[InlineData("dummy.csx")]
1363+
public async Task RegexCompletionInVerbatimString(string filename)
1364+
{
1365+
const string input = @"
1366+
using System.Text.RegularExpressions;
1367+
class Foo
1368+
{
1369+
public void M()
1370+
{
1371+
_ = new Regex(@""$$"");
1372+
}
1373+
}";
1374+
1375+
var completions = await FindCompletionsAsync(filename, input, SharedOmniSharpTestHost);
1376+
var aCompletion = completions.Items.First(c => c.Label == @"\A");
1377+
Assert.NotNull(aCompletion);
1378+
Assert.Equal(@"\A", aCompletion.InsertText);
1379+
}
1380+
13391381
private CompletionService GetCompletionService(OmniSharpTestHost host)
13401382
=> host.GetRequestHandler<CompletionService>(EndpointName);
13411383

0 commit comments

Comments
 (0)