blob: 66ef83640a8009ead0a73c0a7f58417f0cc5967c [file] [log] [blame]
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();
}
}
}