diff --git a/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.InterpolatedStringSplitter.cs b/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.InterpolatedStringSplitter.cs index 820ea46c129f4208c90e35a327a5bccb74642abc..176ea53f58765d9ca11469d490f78bba68d16625 100644 --- a/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.InterpolatedStringSplitter.cs +++ b/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.InterpolatedStringSplitter.cs @@ -25,16 +25,9 @@ private class InterpolatedStringSplitter : StringSplitter protected override SyntaxNode GetNodeToReplace() => _interpolatedStringExpression; + // Don't offer on $@"" strings. They support newlines directly in their content. protected override bool CheckToken() - { - if (_interpolatedStringExpression.StringStartToken.Kind() == SyntaxKind.InterpolatedVerbatimStringStartToken) - { - // Don't offer on $@"" strings. They support newlines directly in their content. - return false; - } - - return true; - } + => _interpolatedStringExpression.StringStartToken.Kind() != SyntaxKind.InterpolatedVerbatimStringStartToken; protected override BinaryExpressionSyntax CreateSplitString() { diff --git a/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.SimpleStringSplitter.cs b/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.SimpleStringSplitter.cs index 59cec25db631e3f478512aa129ca0c788477c0bc..61706d45bd2ea6bdcf6850cea95018dd8021994c 100644 --- a/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.SimpleStringSplitter.cs +++ b/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.SimpleStringSplitter.cs @@ -18,21 +18,9 @@ public SimpleStringSplitter(Document document, int position, SyntaxNode root, So _token = token; } + // Don't split @"" strings. They already support directly embedding newlines. protected override bool CheckToken() - { - if (CursorPosition <= _token.SpanStart || CursorPosition >= _token.Span.End) - { - return false; - } - - if (_token.IsVerbatimStringLiteral()) - { - // Don't split @"" strings. They already support directly embedding newlines. - return false; - } - - return true; - } + => !_token.IsVerbatimStringLiteral(); protected override SyntaxNode GetNodeToReplace() => _token.Parent; diff --git a/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.StringSplitter.cs b/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.StringSplitter.cs index 9ae4fb36a472618dd1d5ce8b29173b2c862751d4..8303dd7a41748c6d69b01c3ec8d70f2d55626229 100644 --- a/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.StringSplitter.cs +++ b/src/EditorFeatures/CSharp/SplitStringLiteral/SplitStringLiteralCommandHandler.StringSplitter.cs @@ -91,6 +91,13 @@ private static bool IsInterpolationOpenBrace(SyntaxToken token, int position) public int? TrySplit() { + var nodeToReplace = GetNodeToReplace(); + + if (CursorPosition <= nodeToReplace.SpanStart || CursorPosition >= nodeToReplace.Span.End) + { + return null; + } + if (!CheckToken()) { return null; diff --git a/src/EditorFeatures/CSharpTest/SplitStringLiteral/SplitStringLiteralCommandHandlerTests.cs b/src/EditorFeatures/CSharpTest/SplitStringLiteral/SplitStringLiteralCommandHandlerTests.cs index a20a265f0fdb0baf4d8175aa05e7f1c7d92a39e4..9d330fa5530aa75259d1da490b2a06590a31d77b 100644 --- a/src/EditorFeatures/CSharpTest/SplitStringLiteral/SplitStringLiteralCommandHandlerTests.cs +++ b/src/EditorFeatures/CSharpTest/SplitStringLiteral/SplitStringLiteralCommandHandlerTests.cs @@ -91,7 +91,7 @@ void M() } [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] - public async Task TestMissingAfterString() + public async Task TestMissingAfterString_1() { await TestNotHandledAsync( @"class C @@ -104,7 +104,46 @@ void M() } [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] - public async Task TestMissingAfterInterpolatedString() + public async Task TestMissingAfterString_2() + { + await TestNotHandledAsync( +@"class C +{ + void M() + { + var v = """" [||]; + } +}"); + } + + [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] + public async Task TestMissingAfterString_3() + { + await TestNotHandledAsync( +@"class C +{ + void M() + { + var v = """"[||] + } +}"); + } + + [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] + public async Task TestMissingAfterString_4() + { + await TestNotHandledAsync( +@"class C +{ + void M() + { + var v = """" [||] + } +}"); + } + + [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] + public async Task TestMissingAfterInterpolatedString_1() { await TestNotHandledAsync( @"class C @@ -116,6 +155,45 @@ void M() }"); } + [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] + public async Task TestMissingAfterInterpolatedString_2() + { + await TestNotHandledAsync( +@"class C +{ + void M() + { + var v = $"""" [||]; + } +}"); + } + + [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] + public async Task TestMissingAfterInterpolatedString_3() + { + await TestNotHandledAsync( +@"class C +{ + void M() + { + var v = $""""[||] + } +}"); + } + + [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] + public async Task TestMissingAfterInterpolatedString_4() + { + await TestNotHandledAsync( +@"class C +{ + void M() + { + var v = $"""" [||] + } +}"); + } + [WpfFact, Trait(Traits.Feature, Traits.Features.SplitStringLiteral)] public async Task TestMissingInVerbatimString() {