Skip to content

Commit bae40b7

Browse files
committed
"If Foo Then Bar Else" fix. Closes #1858
1 parent 2414e80 commit bae40b7

File tree

2 files changed

+103
-4
lines changed

2 files changed

+103
-4
lines changed

Rubberduck.SmartIndenter/AbsoluteCodeLine.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ internal class AbsoluteCodeLine
1919
private static readonly Regex ProcedureEndRegex = new Regex(@"^End\s(Sub|Function|Property)");
2020
private static readonly Regex TypeEnumStartRegex = new Regex(@"^(Public\s|Private\s)?(Enum\s|Type\s)");
2121
private static readonly Regex TypeEnumEndRegex = new Regex(@"^End\s(Enum|Type)");
22-
private static readonly Regex InProcedureInRegex = new Regex(@"^(Else)?If\s.*\sThen|^Else$|^Case\s|^With|^For\s|^Do$|^Do\s|^While$|^While\s|^Select Case");
23-
private static readonly Regex InProcedureOutRegex = new Regex(@"^If\s.*\sThen\s|^Else$|^ElseIf\s.*\sThen|^Case\s|^End With|^Next\s|^Next$|^Loop$|^Loop\s|^Wend$|^End If$|^End Select");
22+
private static readonly Regex InProcedureInRegex = new Regex(@"^(Else)?If\s.*\sThen$|^(Else)?If\s.*\sThen\s.*\sElse$|^Else$|^Case\s|^With|^For\s|^Do$|^Do\s|^While$|^While\s|^Select Case");
23+
private static readonly Regex InProcedureOutRegex = new Regex(@"^(Else)?If\s.*\sThen\s.*(?<!\sElse)$|^Else$|ElseIf\s.*\sThen$|^Case\s|^End With|^Next\s|^Next$|^Loop$|^Loop\s|^Wend$|^End If$|^End Select");
2424
private static readonly Regex DeclarationRegex = new Regex(@"^(Dim|Const|Static|Public|Private)\s.*\sAs\s");
2525
private static readonly Regex PrecompilerInRegex = new Regex(@"^#(Else)?If\s.+Then$|^#Else$");
2626
private static readonly Regex PrecompilerOutRegex = new Regex(@"^#ElseIf\s.+Then|^#Else$|#End\sIf$");
27-
private static readonly Regex SingleLineIfRegex = new Regex(@"^If\s.*\sThen\s.*$");
27+
private static readonly Regex SingleLineIfRegex = new Regex(@"^If\s.*\sThen\s.*(?<!\sElse)$");
28+
private static readonly Regex SingleLineElseIfRegex = new Regex(@"^ElseIf\s.*\sThen\s.*(?<!\sElse)$");
2829

2930
private readonly IIndenterSettings _settings;
3031
private uint _lineNumber;
@@ -155,7 +156,7 @@ public int NextLineIndents
155156
var adjust = _settings.IndentCase && _segments.Any(s => s.TrimStart().StartsWith("Select Case")) ? 1 : 0;
156157
var ins = _segments.Count(s => InProcedureInRegex.IsMatch(s.Trim())) + (IsProcedureStart && _settings.IndentEntireProcedureBody ? 1 : 0) + adjust;
157158

158-
ins -= _segments.Count(s => SingleLineIfRegex.IsMatch(s));
159+
ins += _segments.Count(s => SingleLineElseIfRegex.IsMatch(s));
159160
ins -= MultipleCaseAdjustment();
160161

161162
if (_settings.IndentCompilerDirectives && PrecompilerInRegex.IsMatch(_segments[0].Trim()))

RubberduckTests/SmartIndenter/MiscAndCornerCaseTests.cs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,104 @@ public void ElseIfStatementWorks()
8181
Assert.IsTrue(expected.SequenceEqual(actual));
8282
}
8383

84+
//https://github.com/rubberduck-vba/Rubberduck/issues/1858
85+
[TestMethod]
86+
[TestCategory("Indenter")]
87+
public void MultipleElseIfStatementWorks()
88+
{
89+
var code = new[]
90+
{
91+
"Public Sub Test()",
92+
"If Foo And Bar Then",
93+
"Call Foobar",
94+
"ElseIf Not Foo Then",
95+
"Call Baz",
96+
"ElseIf Not Bar Then",
97+
"Call NoBaz",
98+
"Else",
99+
"MsgBox \"No Foos or Bars\"",
100+
"End If",
101+
"End Sub"
102+
};
103+
104+
var expected = new[]
105+
{
106+
"Public Sub Test()",
107+
" If Foo And Bar Then",
108+
" Call Foobar",
109+
" ElseIf Not Foo Then",
110+
" Call Baz",
111+
" ElseIf Not Bar Then",
112+
" Call NoBaz",
113+
" Else",
114+
" MsgBox \"No Foos or Bars\"",
115+
" End If",
116+
"End Sub"
117+
};
118+
119+
var indenter = new Indenter(null, () => IndenterSettingsTests.GetMockIndenterSettings());
120+
var actual = indenter.Indent(code, string.Empty);
121+
Assert.IsTrue(expected.SequenceEqual(actual));
122+
}
123+
124+
//https://github.com/rubberduck-vba/Rubberduck/issues/1858
125+
[TestMethod]
126+
[TestCategory("Indenter")]
127+
public void IfThenElseStatementWorks()
128+
{
129+
var code = new[]
130+
{
131+
"Public Sub Test()",
132+
"If Foo And Bar Then Foobar Else",
133+
"Baz",
134+
"End If",
135+
"End Sub"
136+
};
137+
138+
var expected = new[]
139+
{
140+
"Public Sub Test()",
141+
" If Foo And Bar Then Foobar Else",
142+
" Baz",
143+
" End If",
144+
"End Sub"
145+
};
146+
147+
var indenter = new Indenter(null, () => IndenterSettingsTests.GetMockIndenterSettings());
148+
var actual = indenter.Indent(code, string.Empty);
149+
Assert.IsTrue(expected.SequenceEqual(actual));
150+
}
151+
152+
//https://github.com/rubberduck-vba/Rubberduck/issues/1858
153+
[TestMethod]
154+
[TestCategory("Indenter")]
155+
public void ElseIfThenElseStatementWorks()
156+
{
157+
var code = new[]
158+
{
159+
"Public Sub Test()",
160+
"If Foo Then NotFoobar",
161+
"ElseIf Foo And Bar Then Foobar Else",
162+
"Baz",
163+
"End If",
164+
"End Sub"
165+
};
166+
167+
var expected = new[]
168+
{
169+
"Public Sub Test()",
170+
" If Foo Then NotFoobar",
171+
" ElseIf Foo And Bar Then Foobar Else",
172+
" Baz",
173+
" End If",
174+
"End Sub"
175+
};
176+
177+
var indenter = new Indenter(null, () => IndenterSettingsTests.GetMockIndenterSettings());
178+
var actual = indenter.Indent(code, string.Empty);
179+
Assert.IsTrue(expected.SequenceEqual(actual));
180+
}
181+
84182
[TestMethod]
85183
[TestCategory("Indenter")]
86184
public void SingleLineElseIfStatementWorks()

0 commit comments

Comments
 (0)