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); }