Skip to content

Commit e790709

Browse files
authored
Merge pull request #182 from spreadsheetlab/fix-issue-151
Support user defined functions in parser references
2 parents 728e211 + 963434b commit e790709

2 files changed

Lines changed: 27 additions & 1 deletion

File tree

src/XLParser.Tests/FormulaAnalysisTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,22 @@ public void MultiAreaRangeFormula()
12861286
Assert.AreEqual("Sheet1!$A$1", references[0].LocationString);
12871287
Assert.AreEqual("Sheet1!$B$2", references[1].LocationString);
12881288
}
1289+
1290+
[TestMethod]
1291+
public void UserDefinedFunction()
1292+
{
1293+
List<ParserReference> references = new FormulaAnalyzer(@"='C:\AddIns\Something.xlam'!fT_Value(A1)").ParserReferences().ToList();
1294+
Assert.AreEqual(2, references.Count);
1295+
1296+
Assert.AreEqual(ReferenceType.UserDefinedFunction, references[0].ReferenceType);
1297+
Assert.AreEqual(@"C:\AddIns\", references[0].FilePath);
1298+
Assert.AreEqual("Something.xlam", references[0].FileName);
1299+
Assert.AreEqual("fT_Value", references[0].Name);
1300+
Assert.AreEqual(@"'C:\AddIns\Something.xlam'!fT_Value", references[0].LocationString);
1301+
1302+
Assert.AreEqual(ReferenceType.Cell, references[1].ReferenceType);
1303+
Assert.AreEqual("A1", references[1].LocationString);
1304+
}
12891305
#endregion
12901306

12911307
#region Depth() and ConditionalComplexity()

src/XLParser/ParserReference.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ public enum ReferenceType
1111
HorizontalRange,
1212
VerticalRange,
1313
RefError,
14-
Table
14+
Table,
15+
UserDefinedFunction
1516
}
1617

1718
public class ParserReference
@@ -102,10 +103,19 @@ public void InitializeReference(ParseTreeNode node)
102103
case GrammarNames.RefError:
103104
ReferenceType = ReferenceType.RefError;
104105
break;
106+
case GrammarNames.UDFunctionCall:
107+
ReferenceType = ReferenceType.UserDefinedFunction;
108+
Name = node.ChildNodes[0].ChildNodes[0].Token.ValueString.TrimEnd('(');
109+
break;
105110
}
106111

107112
ReferenceNode = node;
108113
LocationString = node.Print();
114+
115+
if (ReferenceType == ReferenceType.UserDefinedFunction && Name != null)
116+
{
117+
LocationString = LocationString.Substring(0, LocationString.IndexOf('(', LocationString.LastIndexOf(Name, System.StringComparison.Ordinal)));
118+
}
109119
}
110120

111121
private string UnEscape(string value, string escapeCharacter)

0 commit comments

Comments
 (0)