public override void ExitXppclassModifiers([NotNull] XP.XppclassModifiersContext context)
        {
            SyntaxListBuilder modifiers = _pool.Allocate();

            foreach (var m in context._Tokens)
            {
                SyntaxToken kw = null;
                switch (m.Type)
                {
                case XP.STATIC:
                    kw = SyntaxFactory.MakeToken(SyntaxKind.InternalKeyword, m.Text);
                    // todo place in unique namespace
                    break;

                case XP.FINAL:
                    kw = SyntaxFactory.MakeToken(SyntaxKind.SealedKeyword, m.Text);
                    break;

                default:
                    break;
                }
                if (kw != null)
                {
                    modifiers.AddCheckUnique(kw);
                }
            }
            context.PutList(modifiers.ToList <SyntaxToken>());
            _pool.Free(modifiers);
        }
        public override void ExitXppdeclareModifiers([NotNull] XP.XppdeclareModifiersContext context)
        {
            SyntaxListBuilder modifiers = _pool.Allocate();
            bool hasFinal   = false;
            bool noOverRide = false;

            foreach (var m in context._Tokens)
            {
                SyntaxToken kw = null;
                switch (m.Type)
                {
                case XP.DEFERRED:     // DEFERRED METHOD becomes ABSTRACT METHOD
                    kw = SyntaxFactory.MakeToken(SyntaxKind.AbstractKeyword, m.Text);
                    break;

                case XP.FINAL:     // FINAL METHOD will generate non virtual method, even when the Default Virtual is on
                    hasFinal = true;
                    break;

                case XP.INTRODUCE:     //  INTRODUCE METHOD will generate NEW METHOD
                    kw         = SyntaxFactory.MakeToken(SyntaxKind.NewKeyword, m.Text);
                    noOverRide = true;
                    break;

                case XP.OVERRIDE:     // OVERRIDE METHOD is obvious
                    kw = SyntaxFactory.MakeToken(SyntaxKind.OverrideKeyword, m.Text);
                    break;

                case XP.CLASS:
                    kw = SyntaxFactory.MakeToken(SyntaxKind.StaticKeyword, m.Text);
                    break;

                case XP.SYNC:       // Handled later
                    break;

                default:
                    break;
                }
                if (kw != null)
                {
                    modifiers.AddCheckUnique(kw);
                }
            }
            if (_options.VirtualInstanceMethods && !hasFinal)
            {
                modifiers.FixDefaultVirtual();
            }
            else if (!noOverRide && !hasFinal)
            {
                modifiers.FixDefaultMethod();
            }
            context.PutList(modifiers.ToList <SyntaxToken>());
            _pool.Free(modifiers);
        }
        private SyntaxList <SyntaxToken> decodeXppMemberModifiers(int visibility, bool isStatic, IList <IToken> tokens = null)
        {
            SyntaxListBuilder modifiers = _pool.Allocate();

            if (isStatic)
            {
                modifiers.Add(SyntaxFactory.MakeToken(SyntaxKind.StaticKeyword, "CLASS"));
            }
            else
            {
                modifiers.Add(DecodeVisibility(visibility));
            }
            if (tokens != null)
            {
                foreach (var token in tokens)
                {
                    SyntaxToken kw = null;
                    switch (token.Type)
                    {
                    // Member Modifiers from XppMemberModifiers rule
                    case XP.CLASS:
                        kw = SyntaxFactory.MakeToken(SyntaxKind.StaticKeyword, token.Text);
                        break;

                    case XP.STATIC:
                        // remove visibility modifiers
                        // STATIC CLASS (Visibility only in the scope of the prg).
                        // class becomes Internal and is added to the static globals class
                        kw = SyntaxFactory.MakeToken(SyntaxKind.InternalKeyword, token.Text);
                        var tmp = modifiers.ToList();
                        modifiers.Clear();

                        foreach (SyntaxToken mod in tmp)
                        {
                            // remove all existing visibility keywords
                            switch (mod.Kind)
                            {
                            case SyntaxKind.ProtectedKeyword:
                            case SyntaxKind.PublicKeyword:
                            case SyntaxKind.PrivateKeyword:
                            case SyntaxKind.InternalKeyword:
                                break;

                            default:
                                modifiers.Add(mod);
                                break;
                            }
                        }
                        break;
                    }
                    if (kw != null)
                    {
                        modifiers.AddCheckUnique(kw);
                    }
                }
            }
            var result = modifiers.ToList <SyntaxToken>();

            _pool.Free(modifiers);
            return(result);
        }