Skip to content

Commit 9056633

Browse files
authored
Merge pull request #184 from spreadsheetlab/fix-issue-183
Fix: exception for parser references of special ranges
2 parents 804802f + 2de2563 commit 9056633

2 files changed

Lines changed: 43 additions & 4 deletions

File tree

src/XLParser.Tests/FormulaAnalysisTest.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,6 +1212,44 @@ public void AbsoluteRowReference()
12121212
Assert.AreEqual("$1", references.First().MaxLocation);
12131213
}
12141214

1215+
[TestMethod]
1216+
public void RefError()
1217+
{
1218+
List<ParserReference> references = new FormulaAnalyzer("#REF!").ParserReferences().ToList();
1219+
1220+
Assert.AreEqual(1, references.Count);
1221+
Assert.AreEqual(ReferenceType.RefError, references.First().ReferenceType);
1222+
Assert.AreEqual("#REF!", references.First().LocationString);
1223+
}
1224+
1225+
[TestMethod]
1226+
public void RefErrorRange()
1227+
{
1228+
List<ParserReference> references = new FormulaAnalyzer("#REF!:#REF!").ParserReferences().ToList();
1229+
1230+
Assert.AreEqual(2, references.Count);
1231+
Assert.AreEqual("#REF!", references.First().LocationString);
1232+
Assert.AreEqual("#REF!", references.Last().LocationString);
1233+
}
1234+
1235+
[TestMethod]
1236+
public void RefErrorCellRange()
1237+
{
1238+
List<ParserReference> references = new FormulaAnalyzer("A1:#REF!").ParserReferences().ToList();
1239+
1240+
Assert.AreEqual(2, references.Count);
1241+
Assert.AreEqual("A1", references.First().LocationString);
1242+
Assert.AreEqual("#REF!", references.Last().LocationString);
1243+
}
1244+
1245+
[TestMethod]
1246+
public void IndirectFunctionRange()
1247+
{
1248+
List<ParserReference> references = new FormulaAnalyzer(@"INDIRECT(""A3""):INDIRECT(""A20000"")").ParserReferences().ToList();
1249+
1250+
Assert.AreEqual(0, references.Count);
1251+
}
1252+
12151253
[TestMethod]
12161254
public void ReferenceFunctionAsArgument()
12171255
{

src/XLParser/ExcelFormulaParser.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ public static IEnumerable<ParserReference> GetParserReferences(this ParseTreeNod
415415
case GrammarNames.HorizontalRange:
416416
case GrammarNames.VerticalRange:
417417
case GrammarNames.StructuredReference:
418+
case GrammarNames.RefError:
418419
list.Add(new ParserReference(node));
419420
break;
420421
case GrammarNames.Reference:
@@ -424,9 +425,9 @@ public static IEnumerable<ParserReference> GetParserReferences(this ParseTreeNod
424425
default:
425426
if (node.IsRange())
426427
{
427-
var rangeStart = GetParserReferences(node.ChildNodes[0].SkipToRelevant()).First();
428-
var rangeEnd = GetParserReferences(node.ChildNodes[2].SkipToRelevant()).First();
429-
if (rangeStart.ReferenceType == ReferenceType.Cell && rangeEnd.ReferenceType == ReferenceType.Cell)
428+
var rangeStart = GetParserReferences(node.ChildNodes[0]).FirstOrDefault();
429+
var rangeEnd = GetParserReferences(node.ChildNodes[2]).FirstOrDefault();
430+
if (rangeStart?.ReferenceType == ReferenceType.Cell && rangeEnd?.ReferenceType == ReferenceType.Cell)
430431
{
431432
ParserReference range = rangeStart;
432433
range.MaxLocation = rangeEnd.MinLocation;
@@ -436,7 +437,7 @@ public static IEnumerable<ParserReference> GetParserReferences(this ParseTreeNod
436437
list.Add(range);
437438
break;
438439
}
439-
if (rangeStart.ReferenceType == ReferenceType.Table && rangeEnd.ReferenceType == ReferenceType.Table && rangeStart.Name == rangeEnd.Name && rangeStart.TableColumns.Length == 1 && rangeEnd.TableColumns.Length == 1)
440+
if (rangeStart?.ReferenceType == ReferenceType.Table && rangeEnd?.ReferenceType == ReferenceType.Table && rangeStart.Name == rangeEnd.Name && rangeStart.TableColumns.Length == 1 && rangeEnd.TableColumns.Length == 1)
440441
{
441442
ParserReference range = rangeStart;
442443
range.TableColumns = rangeStart.TableColumns.Concat(rangeEnd.TableColumns).ToArray();

0 commit comments

Comments
 (0)