| using System.Collections.Generic; |
| using System.Linq; |
| using OfficeOpenXml.FormulaParsing.ExcelUtilities; |
| |
| namespace OfficeOpenXml.FormulaParsing; |
| |
| /// <summary> |
| /// This class implements a stack on which instances of <see cref="ParsingScope"/> |
| /// are put. Each ParsingScope represents the parsing of an address in the workbook. |
| /// </summary> |
| public class ParsingScopes { |
| private readonly IParsingLifetimeEventHandler _lifetimeEventHandler; |
| |
| public ParsingScopes(IParsingLifetimeEventHandler lifetimeEventHandler) { |
| _lifetimeEventHandler = lifetimeEventHandler; |
| } |
| |
| private readonly Stack<ParsingScope> _scopes = new(); |
| |
| /// <summary> |
| /// Creates a new <see cref="ParsingScope"/> and puts it on top of the stack. |
| /// </summary> |
| /// <param name="address"></param> |
| /// <returns></returns> |
| public virtual ParsingScope NewScope(RangeAddress address) { |
| ParsingScope scope; |
| if (_scopes.Count() > 0) { |
| scope = new(this, _scopes.Peek(), address); |
| } else { |
| scope = new(this, address); |
| } |
| _scopes.Push(scope); |
| return scope; |
| } |
| |
| /// <summary> |
| /// The current parsing scope. |
| /// </summary> |
| public virtual ParsingScope Current => _scopes.Count() > 0 ? _scopes.Peek() : null; |
| |
| /// <summary> |
| /// Removes the current scope, setting the calling scope to current. |
| /// </summary> |
| /// <param name="parsingScope"></param> |
| public virtual void KillScope(ParsingScope parsingScope) { |
| _scopes.Pop(); |
| if (_scopes.Count() == 0) { |
| _lifetimeEventHandler.ParsingCompleted(); |
| } |
| } |
| } |