/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtXmlPatterns module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qxsdschemaparsercontext_p.h"

QT_BEGIN_NAMESPACE

using namespace QPatternist;

XsdSchemaParserContext::XsdSchemaParserContext(const NamePool::Ptr &namePool, const XsdSchemaContext::Ptr &context)
    : m_namePool(namePool)
    , m_schema(new XsdSchema(m_namePool))
    , m_checker(new XsdSchemaChecker(context, this))
    , m_resolver(new XsdSchemaResolver(context, this))
    , m_elementDescriptions(setupElementDescriptions())
{
}

NamePool::Ptr XsdSchemaParserContext::namePool() const
{
    return m_namePool;
}

XsdSchemaResolver::Ptr XsdSchemaParserContext::resolver() const
{
    return m_resolver;
}

XsdSchemaChecker::Ptr XsdSchemaParserContext::checker() const
{
    return m_checker;
}

XsdSchema::Ptr XsdSchemaParserContext::schema() const
{
    return m_schema;
}

ElementDescription<XsdSchemaToken, XsdTagScope::Type>::Hash XsdSchemaParserContext::elementDescriptions() const
{
    return m_elementDescriptions;
}

QXmlName XsdSchemaParserContext::createAnonymousName(const QString &targetNamespace) const
{
    m_anonymousNameCounter.ref();

    const QString name = QString::fromLatin1("__AnonymousClass_%1").arg(m_anonymousNameCounter.loadRelaxed());

    return m_namePool->allocateQName(targetNamespace, name);
}

ElementDescription<XsdSchemaToken, XsdTagScope::Type>::Hash  XsdSchemaParserContext::setupElementDescriptions()
{
    enum
    {
        ReservedForElements = 60
    };

    ElementDescription<XsdSchemaToken, XsdTagScope::Type>::Hash elementDescriptions;
    elementDescriptions.reserve(ReservedForElements);

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Schema];
        description.optionalAttributes.reserve(10);
        //description.tagToken = XsdSchemaToken::Schema;
        description.optionalAttributes.insert(XsdSchemaToken::AttributeFormDefault);
        description.optionalAttributes.insert(XsdSchemaToken::BlockDefault);
        description.optionalAttributes.insert(XsdSchemaToken::DefaultAttributes);
        description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace);
        description.optionalAttributes.insert(XsdSchemaToken::ElementFormDefault);
        description.optionalAttributes.insert(XsdSchemaToken::FinalDefault);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::TargetNamespace);
        description.optionalAttributes.insert(XsdSchemaToken::Version);
        description.optionalAttributes.insert(XsdSchemaToken::XmlLanguage);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Include];
        //description.tagToken = XsdSchemaToken::Include;
        description.requiredAttributes.insert(XsdSchemaToken::SchemaLocation);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Import];
        //description.tagToken = XsdSchemaToken::Import;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Namespace);
        description.optionalAttributes.insert(XsdSchemaToken::SchemaLocation);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Redefine];
        //description.tagToken = XsdSchemaToken::Redefine;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::SchemaLocation);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Override];
        //description.tagToken = XsdSchemaToken::Override;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::SchemaLocation);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Annotation];
        //description.tagToken = XsdSchemaToken::Annotation;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::AppInfo];
        //description.tagToken = XsdSchemaToken::Appinfo;
        description.optionalAttributes.insert(XsdSchemaToken::Source);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Documentation];
        //description.tagToken = XsdSchemaToken::Documentation;
        description.optionalAttributes.insert(XsdSchemaToken::Source);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::GlobalSimpleType];
        //description.tagToken = XsdSchemaToken::SimpleType;
        description.optionalAttributes.insert(XsdSchemaToken::Final);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::LocalSimpleType];
        //description.tagToken = XsdSchemaToken::SimpleType;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::SimpleRestriction];
        //description.tagToken = XsdSchemaToken::Restriction;
        description.optionalAttributes.insert(XsdSchemaToken::Base);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::List];
        //description.tagToken = XsdSchemaToken::List;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::ItemType);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Union];
        //description.tagToken = XsdSchemaToken::Union;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::MemberTypes);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::MinExclusiveFacet];
        //description.tagToken = XsdSchemaToken::MinExclusive;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::MinInclusiveFacet];
        //description.tagToken = XsdSchemaToken::MinInclusive;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::MaxExclusiveFacet];
        //description.tagToken = XsdSchemaToken::MaxExclusive;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::MaxInclusiveFacet];
        //description.tagToken = XsdSchemaToken::MaxInclusive;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::TotalDigitsFacet];
        //description.tagToken = XsdSchemaToken::TotalDigits;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::FractionDigitsFacet];
        //description.tagToken = XsdSchemaToken::FractionDigits;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::LengthFacet];
        //description.tagToken = XsdSchemaToken::Length;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::MinLengthFacet];
        //description.tagToken = XsdSchemaToken::MinLength;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::MaxLengthFacet];
        //description.tagToken = XsdSchemaToken::MaxLength;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::EnumerationFacet];
        //description.tagToken = XsdSchemaToken::Enumeration;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::WhiteSpaceFacet];
        //description.tagToken = XsdSchemaToken::WhiteSpace;
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::PatternFacet];
        //description.tagToken = XsdSchemaToken::Pattern;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Value);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::GlobalComplexType];
        description.optionalAttributes.reserve(7);
        //description.tagToken = XsdSchemaToken::ComplexType;
        description.optionalAttributes.insert(XsdSchemaToken::Abstract);
        description.optionalAttributes.insert(XsdSchemaToken::Block);
        description.optionalAttributes.insert(XsdSchemaToken::DefaultAttributesApply);
        description.optionalAttributes.insert(XsdSchemaToken::Final);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Mixed);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::LocalComplexType];
        //description.tagToken = XsdSchemaToken::ComplexType;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Mixed);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::SimpleContent];
        //description.tagToken = XsdSchemaToken::SimpleContent;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::SimpleContentRestriction];
        //description.tagToken = XsdSchemaToken::Restriction;
        description.requiredAttributes.insert(XsdSchemaToken::Base);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::SimpleContentExtension];
        //description.tagToken = XsdSchemaToken::Extension;
        description.requiredAttributes.insert(XsdSchemaToken::Base);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::ComplexContent];
        //description.tagToken = XsdSchemaToken::ComplexContent;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Mixed);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::ComplexContentRestriction];
        //description.tagToken = XsdSchemaToken::Restriction;
        description.requiredAttributes.insert(XsdSchemaToken::Base);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::ComplexContentExtension];
        //description.tagToken = XsdSchemaToken::Extension;
        description.requiredAttributes.insert(XsdSchemaToken::Base);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::NamedGroup];
        //description.tagToken = XsdSchemaToken::Group;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::ReferredGroup];
        description.optionalAttributes.reserve(4);
        //description.tagToken = XsdSchemaToken::Group;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs);
        description.optionalAttributes.insert(XsdSchemaToken::MinOccurs);
        description.requiredAttributes.insert(XsdSchemaToken::Ref);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::All];
        //description.tagToken = XsdSchemaToken::All;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::LocalAll];
        //description.tagToken = XsdSchemaToken::All;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs);
        description.optionalAttributes.insert(XsdSchemaToken::MinOccurs);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Choice];
        //description.tagToken = XsdSchemaToken::Choice;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::LocalChoice];
        //description.tagToken = XsdSchemaToken::Choice;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs);
        description.optionalAttributes.insert(XsdSchemaToken::MinOccurs);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Sequence];
        //description.tagToken = XsdSchemaToken::Sequence;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::LocalSequence];
        //description.tagToken = XsdSchemaToken::Sequence;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs);
        description.optionalAttributes.insert(XsdSchemaToken::MinOccurs);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::GlobalAttribute];
        description.optionalAttributes.reserve(5);
        //description.tagToken = XsdSchemaToken::Attribute;
        description.optionalAttributes.insert(XsdSchemaToken::Default);
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
        description.optionalAttributes.insert(XsdSchemaToken::Type);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::LocalAttribute];
        description.optionalAttributes.reserve(8);
        //description.tagToken = XsdSchemaToken::Attribute;
        description.optionalAttributes.insert(XsdSchemaToken::Default);
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Form);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Name);
        description.optionalAttributes.insert(XsdSchemaToken::Ref);
        description.optionalAttributes.insert(XsdSchemaToken::Type);
        description.optionalAttributes.insert(XsdSchemaToken::Use);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::NamedAttributeGroup];
        //description.tagToken = XsdSchemaToken::AttributeGroup;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::ReferredAttributeGroup];
        //description.tagToken = XsdSchemaToken::AttributeGroup;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Ref);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::LocalElement];
        description.optionalAttributes.reserve(11);
        //description.tagToken = XsdSchemaToken::Element;
        description.optionalAttributes.insert(XsdSchemaToken::Block);
        description.optionalAttributes.insert(XsdSchemaToken::Default);
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Form);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::MinOccurs);
        description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs);
        description.optionalAttributes.insert(XsdSchemaToken::Name);
        description.optionalAttributes.insert(XsdSchemaToken::Nillable);
        description.optionalAttributes.insert(XsdSchemaToken::Ref);
        description.optionalAttributes.insert(XsdSchemaToken::Type);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::GlobalElement];
        description.optionalAttributes.reserve(10);
        //description.tagToken = XsdSchemaToken::Element;
        description.optionalAttributes.insert(XsdSchemaToken::Abstract);
        description.optionalAttributes.insert(XsdSchemaToken::Block);
        description.optionalAttributes.insert(XsdSchemaToken::Default);
        description.optionalAttributes.insert(XsdSchemaToken::Final);
        description.optionalAttributes.insert(XsdSchemaToken::Fixed);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
        description.optionalAttributes.insert(XsdSchemaToken::Nillable);
        description.optionalAttributes.insert(XsdSchemaToken::SubstitutionGroup);
        description.optionalAttributes.insert(XsdSchemaToken::Type);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Unique];
        //description.tagToken = XsdSchemaToken::Unique;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Key];
        //description.tagToken = XsdSchemaToken::Key;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::KeyRef];
        //description.tagToken = XsdSchemaToken::Keyref;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
        description.requiredAttributes.insert(XsdSchemaToken::Refer);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Selector];
        //description.tagToken = XsdSchemaToken::Selector;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Xpath);
        description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Field];
        //description.tagToken = XsdSchemaToken::Field;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Xpath);
        description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Notation];
        description.optionalAttributes.reserve(4);
        //description.tagToken = XsdSchemaToken::Notation;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Name);
        description.optionalAttributes.insert(XsdSchemaToken::Public);
        description.optionalAttributes.insert(XsdSchemaToken::System);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Any];
        description.optionalAttributes.reserve(7);
        //description.tagToken = XsdSchemaToken::Any;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs);
        description.optionalAttributes.insert(XsdSchemaToken::MinOccurs);
        description.optionalAttributes.insert(XsdSchemaToken::Namespace);
        description.optionalAttributes.insert(XsdSchemaToken::NotNamespace);
        description.optionalAttributes.insert(XsdSchemaToken::NotQName);
        description.optionalAttributes.insert(XsdSchemaToken::ProcessContents);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::AnyAttribute];
        description.optionalAttributes.reserve(5);
        //description.tagToken = XsdSchemaToken::AnyAttribute;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Namespace);
        description.optionalAttributes.insert(XsdSchemaToken::NotNamespace);
        description.optionalAttributes.insert(XsdSchemaToken::NotQName);
        description.optionalAttributes.insert(XsdSchemaToken::ProcessContents);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Alternative];
        //description.tagToken = XsdSchemaToken::Alternative;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Test);
        description.optionalAttributes.insert(XsdSchemaToken::Type);
        description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::OpenContent];
        //description.tagToken = XsdSchemaToken::OpenContent;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Mode);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::DefaultOpenContent];
        //description.tagToken = XsdSchemaToken::DefaultOpenContent;
        description.optionalAttributes.insert(XsdSchemaToken::AppliesToEmpty);
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.optionalAttributes.insert(XsdSchemaToken::Mode);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Assert];
        //description.tagToken = XsdSchemaToken::Assert;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Test);
        description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace);
    }

    {
        ElementDescription<XsdSchemaToken, XsdTagScope::Type> &description = elementDescriptions[XsdTagScope::Assertion];
        //description.tagToken = XsdSchemaToken::Assertion;
        description.optionalAttributes.insert(XsdSchemaToken::Id);
        description.requiredAttributes.insert(XsdSchemaToken::Test);
        description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace);
    }

    Q_ASSERT_X(elementDescriptions.count() == ReservedForElements, Q_FUNC_INFO,
               qPrintable(QString::fromLatin1("Expected is %1, actual is %2.").arg(ReservedForElements).arg(elementDescriptions.count())));

    return elementDescriptions;
}

QT_END_NAMESPACE
