/// <summary>
        /// Type declaration entry.
        ///
        /// DECLARE IDENTIFIER generic_type_attributes? '{' operation_statement+ '}'
        /// </summary>
        /// <param name="context"></param>
        public override void EnterType_declaration(KryptonParser.Type_declarationContext context)
        {
            var parent = _memberContainers.Peek();

            TypeDeclarationBase declared;
            var name = context.IDENTIFIER().GetText();

            // Verify our name is unique
            if (parent.TryFindMember(name, out var _))
            {
                throw new KryptonParserException($"Multiple definitions for {name}.");
            }

            // Declare a generic if we have attributes
            var generics = context.generic_type_attributes()?.IDENTIFIER();

            if (generics != null)
            {
                var generic = new GenericTypeDeclaration(name, parent);
                foreach (var g in generics)
                {
                    var t = new GenericAttribute(g.GetText());
                    generic.AddGeneric(t);
                }
                declared = generic;
            }
            else
            {
                declared = new TypeDeclaration(name, parent);
            }

            parent.AddMember(declared);
            _statementContainers.Push(declared);
            _documentables.Push(declared);
        }
 /// <summary>
 /// Type declaration departure.
 /// </summary>
 /// <param name="context"></param>
 public override void ExitType_declaration(KryptonParser.Type_declarationContext context)
 {
     _statementContainers.Pop();
     _documentables.Pop();
 }