/// <summary>
 /// Library declaration departure.
 /// </summary>
 /// <param name="context"></param>
 public override void ExitLibrary_declaration(KryptonParser.Library_declarationContext context)
 {
     _memberContainers.Pop();
     _contextStack.Pop();
     _customizables.Pop();
     _documentables.Pop();
 }
        /// <summary>
        /// Library declaration entry.
        ///
        /// LIBRARY IDENTIFIER '{' member_options? namespace_member* '}'
        /// </summary>
        /// <param name="context"></param>
        public override void EnterLibrary_declaration(KryptonParser.Library_declarationContext context)
        {
            var     parent = _memberContainers.Peek();
            var     name   = context.IDENTIFIER().GetText();
            Library lib;

            // If we are taking the name of an already existant library, pass their reference
            if (parent.TryFindMember(name, out var member))
            {
                // verify the member we found is a library
                lib = member as Library;
                if (lib == null)
                {
                    throw new KryptonParserException($"Multiple definitions for {name}.");
                }
            }
            else
            {
                // looks like we need to create a new library instance
                lib = new Library(name, parent);
                parent.AddMember(lib);
            }

            _memberContainers.Push(lib);
            _contextStack.Push(lib);
            _customizables.Push(lib);
            _documentables.Push(lib);
        }