Skip to content

Commit 5bceeb7

Browse files
committed
strip dangling vbNewLine, vbCrLf, vbCr, and vbCrLf concatenations from last non-empty line
1 parent 9280122 commit 5bceeb7

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

Rubberduck.Core/AutoComplete/Service/SelfClosingPairCompletionService.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,10 +221,14 @@ private CodeString DeleteMatchingTokensMultiline(SelfClosingPair pair, CodeStrin
221221
// we're not concatenating anything anymore; remove concat operator too.
222222
var concatOffset = lastNonEmptyLine.EndsWith(" &") ? 2 : 1;
223223
nonEmptyLines[nonEmptyLines.Length - 1] = lastNonEmptyLine.Remove(lastNonEmptyLine.Length - concatOffset);
224-
lastNonEmptyLine = nonEmptyLines[nonEmptyLines.Length - 1];
224+
TrimLastNonEmptyLine(nonEmptyLines, "& vbNewLine");
225+
TrimLastNonEmptyLine(nonEmptyLines, "& vbCrLf");
226+
TrimLastNonEmptyLine(nonEmptyLines, "& vbCr");
227+
TrimLastNonEmptyLine(nonEmptyLines, "& vbLf");
225228
}
226229

227230
// we're keeping the closing quote, but let's put the caret inside:
231+
lastNonEmptyLine = nonEmptyLines[nonEmptyLines.Length - 1];
228232
var quoteOffset = lastNonEmptyLine.EndsWith("\"") ? 1 : 0;
229233
finalCaretPosition = new Selection(
230234
finalCaretPosition.StartLine,
@@ -243,6 +247,18 @@ private CodeString DeleteMatchingTokensMultiline(SelfClosingPair pair, CodeStrin
243247

244248
}
245249

250+
private static void TrimLastNonEmptyLine(string[] nonEmptyLines, string ending)
251+
{
252+
var lastNonEmptyLine = nonEmptyLines[nonEmptyLines.Length - 1];
253+
if (lastNonEmptyLine.EndsWith(ending, StringComparison.OrdinalIgnoreCase))
254+
{
255+
var offset = lastNonEmptyLine.EndsWith(" " + ending, StringComparison.OrdinalIgnoreCase)
256+
? ending.Length + 1
257+
: ending.Length;
258+
nonEmptyLines[nonEmptyLines.Length - 1] = lastNonEmptyLine.Remove(lastNonEmptyLine.Length - offset);
259+
}
260+
}
261+
246262
private Selection FindMatchingTokenPosition(SelfClosingPair pair, CodeString original)
247263
{
248264
var code = string.Join("\r\n", original.Lines) + "\r\n";

RubberduckTests/AutoComplete/SelfClosingPairCompletionTests.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,12 +234,48 @@ public void WhenBackspacingClearsLineContinuatedCaretLine_PlacesCaretInsideStrin
234234
}
235235

236236
[Test]
237-
public void WhenBackspacingClearsLineContinuatedCaretLine_WithConcatenatedVbNewLine_PlacesCaretRightOfVbNewLineOnPreviousLine()
237+
public void WhenBackspacingClearsLineContinuatedCaretLine_WithConcatenatedVbNewLine_PlacesCaretInsideStringOnPreviousLine()
238238
{
239239
var pair = new SelfClosingPair('"', '"');
240240
var input = Keys.Back;
241241
var original = "foo = \"test\" & vbNewLine & _\r\n \"|\"".ToCodeString();
242-
var expected = "foo = \"test\" & vbNewLine|".ToCodeString();
242+
var expected = "foo = \"test|\"".ToCodeString();
243+
244+
var result = Run(pair, original, input);
245+
Assert.AreEqual(expected, result);
246+
}
247+
248+
[Test]
249+
public void WhenBackspacingClearsLineContinuatedCaretLine_WithConcatenatedVbCrLf_PlacesCaretInsideStringOnPreviousLine()
250+
{
251+
var pair = new SelfClosingPair('"', '"');
252+
var input = Keys.Back;
253+
var original = "foo = \"test\" & vbCrLf & _\r\n \"|\"".ToCodeString();
254+
var expected = "foo = \"test|\"".ToCodeString();
255+
256+
var result = Run(pair, original, input);
257+
Assert.AreEqual(expected, result);
258+
}
259+
260+
[Test]
261+
public void WhenBackspacingClearsLineContinuatedCaretLine_WithConcatenatedVbCr_PlacesCaretInsideStringOnPreviousLine()
262+
{
263+
var pair = new SelfClosingPair('"', '"');
264+
var input = Keys.Back;
265+
var original = "foo = \"test\" & vbCr & _\r\n \"|\"".ToCodeString();
266+
var expected = "foo = \"test|\"".ToCodeString();
267+
268+
var result = Run(pair, original, input);
269+
Assert.AreEqual(expected, result);
270+
}
271+
272+
[Test]
273+
public void WhenBackspacingClearsLineContinuatedCaretLine_WithConcatenatedVbLf_PlacesCaretInsideStringOnPreviousLine()
274+
{
275+
var pair = new SelfClosingPair('"', '"');
276+
var input = Keys.Back;
277+
var original = "foo = \"test\" & vbLf & _\r\n \"|\"".ToCodeString();
278+
var expected = "foo = \"test|\"".ToCodeString();
243279

244280
var result = Run(pair, original, input);
245281
Assert.AreEqual(expected, result);

0 commit comments

Comments
 (0)