Skip to content

Commit ff42617

Browse files
authored
Merge pull request #4462 from retailcoder/scp
SCP hotfix
2 parents e8564b4 + 9d51719 commit ff42617

File tree

4 files changed

+35
-7
lines changed

4 files changed

+35
-7
lines changed

Rubberduck.Core/AutoComplete/Service/SelfClosingPairCompletionService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ private CodeString HandleOpeningChar(SelfClosingPair pair, CodeString original)
7878
var line = lines[original.CaretPosition.StartLine];
7979

8080
string newCode;
81-
if (string.IsNullOrEmpty(original.Code))
81+
if (string.IsNullOrEmpty(line))
8282
{
8383
newCode = autoCode;
8484
}
@@ -88,7 +88,7 @@ private CodeString HandleOpeningChar(SelfClosingPair pair, CodeString original)
8888
}
8989
else
9090
{
91-
newCode = original.CaretPosition.StartColumn == line.Length
91+
newCode = original.CaretPosition.StartColumn >= line.Length
9292
? line + autoCode
9393
: line.Insert(original.CaretPosition.StartColumn, autoCode);
9494
}

Rubberduck.VBEEditor/SourceCodeHandling/CodePaneSourceCodeHandler.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,17 @@ public CodeString Prettify(ICodeModule module, CodeString original)
9191
var originalCode = original.Code.Replace("\r", string.Empty).Split('\n');
9292
var originalPosition = original.CaretPosition.StartColumn;
9393
var originalNonWhitespaceCharacters = 0;
94+
var isAllWhitespace = true;
9495
for (var i = 0; i <= Math.Min(originalPosition - 1, originalCode[original.CaretPosition.StartLine].Length - 1); i++)
9596
{
9697
if (originalCode[original.CaretPosition.StartLine][i] != ' ')
9798
{
9899
originalNonWhitespaceCharacters++;
100+
isAllWhitespace = false;
99101
}
100102
}
101103

102-
var indent = originalCode[original.CaretPosition.StartLine].TakeWhile(c => c == ' ').Count();
104+
var indent = original.CaretLine.TakeWhile(c => c == ' ').Count();
103105

104106
module.DeleteLines(original.SnippetPosition.StartLine, original.SnippetPosition.LineCount);
105107
module.InsertLines(original.SnippetPosition.StartLine, string.Join("\r\n", originalCode));
@@ -125,9 +127,9 @@ public CodeString Prettify(ICodeModule module, CodeString original)
125127
}
126128

127129
var prettifiedPosition = new Selection(
128-
original.SnippetPosition.StartLine - 1 + original.CaretPosition.StartLine,
129-
prettifiedCode[original.CaretPosition.StartLine].Trim().Length == 0
130-
? indent
130+
original.SnippetPosition.ToZeroBased().StartLine + original.CaretPosition.StartLine,
131+
prettifiedCode[original.CaretPosition.StartLine].Trim().Length == 0 || (isAllWhitespace && !string.IsNullOrEmpty(original.CaretLine.Substring(original.CaretPosition.StartColumn).Trim()))
132+
? Math.Min(indent, original.CaretPosition.StartColumn)
131133
: Math.Min(prettifiedCode[original.CaretPosition.StartLine].Length, prettifiedCaretCharIndex + 1))
132134
.ToOneBased();
133135

RubberduckTests/AutoComplete/CodePaneHandlerTests.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void GivenExtraWhitespace_PrettifiedCaretStillAtSameToken()
7979

8080
[Test]
8181
[Category("AutoComplete")]
82-
public void GivenMultilineLogicalLine_StillTracksCaret()
82+
public void GivenMultilineLogicalLine_TracksCaret()
8383
{
8484
var original = @"
8585
MsgBox ""test"" & vbNewLine & _
@@ -91,6 +91,20 @@ public void GivenMultilineLogicalLine_StillTracksCaret()
9191
Assert.AreEqual(original, actual);
9292
}
9393

94+
[Test]
95+
[Category("AutoComplete")]
96+
public void GivenPartialMultilineInstruction_TracksCaret()
97+
{
98+
var original = @"
99+
ExecuteStoredProcedure (""AddAppointmentCountForAClinic"", False,dbconfig.SQLConString, _
100+
| thisClinic.ClinicID ,".ToCodeString();
101+
102+
var sut = InitializeSut(original, original, out var module, out _);
103+
var actual = new TestCodeString(sut.Prettify(module.Object, original));
104+
105+
Assert.AreEqual(original, actual);
106+
}
107+
94108
private static ICodePaneHandler InitializeSut(TestCodeString original, TestCodeString prettified, out Mock<ICodeModule> module, out Mock<ICodePane> pane)
95109
{
96110
var builder = new MockVbeBuilder();

RubberduckTests/AutoComplete/SelfClosingPairCompletionTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,18 @@ public void WhenCaretBetweenOpeningAndClosingChars_BackspaceRemovesBoth_Indented
342342
Assert.AreEqual(expected, result);
343343
}
344344

345+
[Test]
346+
public void GivenEmptyIndentedLine_OpeningCharIsInsertedAtCaretPosition()
347+
{
348+
var pair = new SelfClosingPair('"', '"');
349+
var input = '"';
350+
var original = @" |".ToCodeString();
351+
var expected = @" ""|""".ToCodeString();
352+
353+
var result = Run(pair, original, input);
354+
Assert.AreEqual(expected, result);
355+
}
356+
345357
[Test]
346358
public void DeleteKey_ReturnsNull()
347359
{

0 commit comments

Comments
 (0)