Skip to content

Commit

Permalink
Merge pull request #184 from spreadsheetlab/fix-issue-183
Browse files Browse the repository at this point in the history
Fix: exception for parser references of special ranges
  • Loading branch information
joerivv authored Sep 19, 2023
2 parents 804802f + 2de2563 commit 9056633
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 4 deletions.
38 changes: 38 additions & 0 deletions src/XLParser.Tests/FormulaAnalysisTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1212,6 +1212,44 @@ public void AbsoluteRowReference()
Assert.AreEqual("$1", references.First().MaxLocation);
}

[TestMethod]
public void RefError()
{
List<ParserReference> references = new FormulaAnalyzer("#REF!").ParserReferences().ToList();

Assert.AreEqual(1, references.Count);
Assert.AreEqual(ReferenceType.RefError, references.First().ReferenceType);
Assert.AreEqual("#REF!", references.First().LocationString);
}

[TestMethod]
public void RefErrorRange()
{
List<ParserReference> references = new FormulaAnalyzer("#REF!:#REF!").ParserReferences().ToList();

Assert.AreEqual(2, references.Count);
Assert.AreEqual("#REF!", references.First().LocationString);
Assert.AreEqual("#REF!", references.Last().LocationString);
}

[TestMethod]
public void RefErrorCellRange()
{
List<ParserReference> references = new FormulaAnalyzer("A1:#REF!").ParserReferences().ToList();

Assert.AreEqual(2, references.Count);
Assert.AreEqual("A1", references.First().LocationString);
Assert.AreEqual("#REF!", references.Last().LocationString);
}

[TestMethod]
public void IndirectFunctionRange()
{
List<ParserReference> references = new FormulaAnalyzer(@"INDIRECT(""A3""):INDIRECT(""A20000"")").ParserReferences().ToList();

Assert.AreEqual(0, references.Count);
}

[TestMethod]
public void ReferenceFunctionAsArgument()
{
Expand Down
9 changes: 5 additions & 4 deletions src/XLParser/ExcelFormulaParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,7 @@ public static IEnumerable<ParserReference> GetParserReferences(this ParseTreeNod
case GrammarNames.HorizontalRange:
case GrammarNames.VerticalRange:
case GrammarNames.StructuredReference:
case GrammarNames.RefError:
list.Add(new ParserReference(node));
break;
case GrammarNames.Reference:
Expand All @@ -424,9 +425,9 @@ public static IEnumerable<ParserReference> GetParserReferences(this ParseTreeNod
default:
if (node.IsRange())
{
var rangeStart = GetParserReferences(node.ChildNodes[0].SkipToRelevant()).First();
var rangeEnd = GetParserReferences(node.ChildNodes[2].SkipToRelevant()).First();
if (rangeStart.ReferenceType == ReferenceType.Cell && rangeEnd.ReferenceType == ReferenceType.Cell)
var rangeStart = GetParserReferences(node.ChildNodes[0]).FirstOrDefault();
var rangeEnd = GetParserReferences(node.ChildNodes[2]).FirstOrDefault();
if (rangeStart?.ReferenceType == ReferenceType.Cell && rangeEnd?.ReferenceType == ReferenceType.Cell)
{
ParserReference range = rangeStart;
range.MaxLocation = rangeEnd.MinLocation;
Expand All @@ -436,7 +437,7 @@ public static IEnumerable<ParserReference> GetParserReferences(this ParseTreeNod
list.Add(range);
break;
}
if (rangeStart.ReferenceType == ReferenceType.Table && rangeEnd.ReferenceType == ReferenceType.Table && rangeStart.Name == rangeEnd.Name && rangeStart.TableColumns.Length == 1 && rangeEnd.TableColumns.Length == 1)
if (rangeStart?.ReferenceType == ReferenceType.Table && rangeEnd?.ReferenceType == ReferenceType.Table && rangeStart.Name == rangeEnd.Name && rangeStart.TableColumns.Length == 1 && rangeEnd.TableColumns.Length == 1)
{
ParserReference range = rangeStart;
range.TableColumns = rangeStart.TableColumns.Concat(rangeEnd.TableColumns).ToArray();
Expand Down

0 comments on commit 9056633

Please sign in to comment.