public override object VisitClassDeclaration(UHeaderParser.ClassDeclarationContext context)
        {
            if (_ignoreOfPragma)
            {
                return(null);
            }

            var namespaceBaseClass = _currentClass;

            _currentClass = Get(context.type(), n => new Class(n));

            var isStructReal = context.classOrStruct().GetText() == "struct";

            _currentClass.SourceFile    = _currentFile;
            _currentClass.SourceLine    = context.Start.Line;
            _currentClass.IsImplemented = true;
            _currentClass.IsTemplate    = context.FoundChild <UHeaderParser.TemplateDefineContext>();
            _currentClass.IsFinal       = context.FoundChild <UHeaderParser.IsFinalContext>();
            _currentClass.UMeta         = _currentUMeta ?? _currentClass.UMeta;
            _currentClass.Description   = _currentComment;

            switch (_currentClass.Name.First())
            {
            case 'U':
                _currentClass.IsStructure = false;
                break;

            case 'F':
                _currentClass.IsStructure = true;
                break;

            default:
                _currentClass.IsStructure = isStructReal;
                break;
            }

            _accessModifier = isStructReal
                ? AccessModifier.Public
                : AccessModifier.Private;

            _ignoreOfAccessModifier = _accessModifier == AccessModifier.Private;

            var parentClassName = context.Child <UHeaderParser.ClassParentListContext>()?.type();

            if (parentClassName != null)
            {
                _currentClass.BaseClass = Get(parentClassName, n => new Class(n));
            }

            _currentUMeta   = null;
            _currentComment = "";

            VisitClassBody(context.Child <UHeaderParser.ClassBodyContext>());

            _currentClass.NamespaceBaseType = namespaceBaseClass;
            _currentClass = namespaceBaseClass;

            return(null);
        }
 /// <summary>
 /// Visit a parse tree produced by <see cref="UHeaderParser.classDeclaration"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitClassDeclaration([NotNull] UHeaderParser.ClassDeclarationContext context)
 {
     return(VisitChildren(context));
 }