Skip to content

Commit fdbe794

Browse files
committed
Bug fix for TokenExtensions.cs where passing a newline tokens cause erroneous results and associated unit tests.
1 parent 48c91b8 commit fdbe794

File tree

2 files changed

+62
-4
lines changed

2 files changed

+62
-4
lines changed

Rubberduck.Parsing/TokenExtensions.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,13 @@ public static class TokenExtensions
1515
/// <returns>Zero-based column position</returns>
1616
public static int EndColumn(this IToken token)
1717
{
18-
if (token.Text.Contains(Environment.NewLine))
18+
if (token.Text == Environment.NewLine)
1919
{
20-
var splitStrings = token.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
20+
return token.Column;
21+
}
22+
else if (token.Text.Contains(Environment.NewLine))
23+
{
24+
var splitStrings = token.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
2125
var lastOccupiedLine = splitStrings[splitStrings.Length - 1];
2226

2327
return lastOccupiedLine.Length;
@@ -37,9 +41,9 @@ public static int EndColumn(this IToken token)
3741
/// <returns>One-based line position</returns>
3842
public static int EndLine(this IToken token)
3943
{
40-
if (token.Text.Contains(Environment.NewLine))
44+
if (token.Text != Environment.NewLine && token.Text.Contains(Environment.NewLine))
4145
{
42-
var splitStrings = token.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
46+
var splitStrings = token.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
4347

4448
return token.Line + (splitStrings.Length - 1);
4549
}

RubberduckTests/Grammar/SelectionExtensionsTests.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.VisualStudio.TestTools.UnitTesting;
33
using Rubberduck.Parsing;
44
using Rubberduck.Parsing.Grammar;
5+
using Rubberduck.Parsing.Symbols;
56
using static Rubberduck.Parsing.Grammar.VBAParser;
67
using Rubberduck.VBEditor;
78
using RubberduckTests.Mocks;
@@ -637,5 +638,58 @@ End If
637638
Assert.IsFalse(selection.Contains(contexts.ElementAt(1))); // first outer if block
638639
Assert.IsTrue(selection.Contains(contexts.ElementAt(2))); // second outer If block
639640
}
641+
642+
[TestMethod]
643+
[TestCategory("Grammar")]
644+
[TestCategory("Selection")]
645+
public void Selection_Token_BlankLines_Contains()
646+
{
647+
const string inputCode = @"
648+
649+
650+
651+
";
652+
653+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component);
654+
var pane = component.CodeModule.CodePane;
655+
var state = MockParser.CreateAndParse(vbe.Object);
656+
657+
658+
var tree = (Antlr4.Runtime.ParserRuleContext)state.GetParseTree(new QualifiedModuleName(component));
659+
var startToken = tree.Start;
660+
var endToken = tree.Stop;
661+
662+
// Reminder: token columns are zero-based but lines are one-based
663+
Assert.IsTrue(startToken.EndColumn() == 0);
664+
Assert.IsTrue(startToken.EndLine() == 1);
665+
Assert.IsTrue(endToken.EndColumn() == 0);
666+
Assert.IsTrue(endToken.EndLine() == 4);
667+
}
668+
669+
[TestMethod]
670+
[TestCategory("Grammar")]
671+
[TestCategory("Selection")]
672+
public void Selection_Token_BlankLines_LeadingSpaces_Contains()
673+
{
674+
const string inputCode = @"
675+
676+
677+
";
678+
679+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component);
680+
var pane = component.CodeModule.CodePane;
681+
var state = MockParser.CreateAndParse(vbe.Object);
682+
683+
684+
var tree = (Antlr4.Runtime.ParserRuleContext)state.GetParseTree(new QualifiedModuleName(component));
685+
var startToken = tree.Start;
686+
var endToken = tree.Stop;
687+
688+
// Reminder: token columns are zero-based but lines are one-based
689+
Assert.IsTrue(startToken.EndColumn() == 0);
690+
Assert.IsTrue(startToken.EndLine() == 1);
691+
Assert.IsTrue(endToken.EndColumn() == 3);
692+
Assert.IsTrue(endToken.EndLine() == 3);
693+
}
640694
}
641695
}

0 commit comments

Comments
 (0)