using Antlr4.Runtime;
using Antlr4.Runtime.Tree;

namespace Rubberduck.Parsing.Listeners;

/// <summary>
/// A Class combining an arbitrary number of IParseTreeListener instances into one single instance
/// </summary>
public class CombinedParseTreeListener : IParseTreeListener
{
    private readonly IReadOnlyList<IParseTreeListener> _listeners;
    public CombinedParseTreeListener(IEnumerable<IParseTreeListener> listeners)
    {
        _listeners = listeners.Where(listener => listener != null).ToList();
    }

    public void EnterEveryRule(ParserRuleContext ctx)
    {
        foreach (var listener in _listeners)
        {
            listener.EnterEveryRule(ctx);
            ctx.EnterRule(listener);
        }
    }

    public void ExitEveryRule(ParserRuleContext ctx)
    {
        foreach (var listener in _listeners)
        {
            listener.ExitEveryRule(ctx);
            ctx.ExitRule(listener);
        }
    }

    public void VisitErrorNode(IErrorNode node)
    {
        foreach (var listener in _listeners)
        {
            listener.VisitErrorNode(node);
        }
    }

    public void VisitTerminal(ITerminalNode node)
    {
        foreach (var listener in _listeners)
        {
            listener.VisitTerminal(node);
        }
    }
}
