Skip to content

Commit fcdc66d

Browse files
committed
numbered lines are ignored by parser.
1 parent 133f947 commit fcdc66d

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using Rubberduck.Parsing.Symbols;
1515
using Rubberduck.VBEditor;
1616
using Rubberduck.VBEditor.Extensions;
17+
using Rubberduck.VBA;
1718

1819
namespace Rubberduck.Parsing.VBA
1920
{
@@ -123,7 +124,7 @@ private void ParseInternal(VBComponent vbComponent, CancellationToken token)
123124
token.ThrowIfCancellationRequested();
124125

125126
ITokenStream stream;
126-
var code = vbComponent.CodeModule.Lines();
127+
var code = string.Join("\r\n", vbComponent.CodeModule.Code());
127128
var tree = ParseInternal(code, listeners, out stream);
128129

129130
token.ThrowIfCancellationRequested();
@@ -185,7 +186,14 @@ private void ResolveReferences(VBComponent component, IParseTree tree, Cancellat
185186
var resolver = new IdentifierReferenceResolver(new QualifiedModuleName(component), declarations);
186187
var listener = new IdentifierReferenceListener(resolver, token);
187188
var walker = new ParseTreeWalker();
188-
walker.Walk(listener, tree);
189+
try
190+
{
191+
walker.Walk(listener, tree);
192+
}
193+
catch(WalkerCancelledException)
194+
{
195+
// move on
196+
}
189197

190198
_state.SetModuleState(component, ParserState.Ready);
191199
}

Rubberduck.Parsing/VBA/StringExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace Rubberduck.Parsing.VBA
77
{
88
public static class StringExtensions
99
{
10+
11+
1012
/// <summary>
1113
/// Returns a value indicating whether line of code is/contains a comment.
1214
/// </summary>

Rubberduck.VBEEditor/Extensions/CodeModuleExtensions.cs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,49 @@ public static string[] Code(this CodeModule module)
1818
return new string[] { };
1919
}
2020

21-
return module.get_Lines(1, lines).Replace("\r", string.Empty).Split('\n');
21+
var code = module.get_Lines(1, lines).Replace("\r", string.Empty).Split('\n');
22+
23+
StripLineNumbers(code);
24+
return code;
25+
}
26+
27+
private static void StripLineNumbers(string[] lines)
28+
{
29+
var result = new string[lines.Length];
30+
for(var line = 0; line < lines.Length; line++)
31+
{
32+
var code = lines[line];
33+
int? lineNumber;
34+
if (HasNumberedLine(code, out lineNumber))
35+
{
36+
var lineNumberLength = lineNumber.ToString().Length;
37+
if (lines[line].Length > lineNumberLength)
38+
{
39+
// replace line number with as many spaces as characters taken, to avoid shifting the tokens
40+
lines[line] = new string(' ', lineNumberLength) + code.Substring(lineNumber.ToString().Length + 1);
41+
}
42+
}
43+
}
44+
}
45+
46+
private static bool HasNumberedLine(string codeLine, out int? lineNumber)
47+
{
48+
lineNumber = null;
49+
50+
if (string.IsNullOrWhiteSpace(codeLine.Trim()))
51+
{
52+
return false;
53+
}
54+
55+
int line;
56+
var firstToken = codeLine.TrimStart().Split(' ')[0];
57+
if (int.TryParse(firstToken, out line))
58+
{
59+
lineNumber = line;
60+
return true;
61+
}
62+
63+
return false;
2264
}
2365

2466
/// <summary>

0 commit comments

Comments
 (0)