Expression::Ptr StaticBaseURIStore::typeCheck(const StaticContext::Ptr &context, const SequenceType::Ptr &reqType) { const StaticContext::Ptr newContext(new StaticBaseURIContext(context->baseURI().resolved(m_baseURI), context)); return m_operand->typeCheck(newContext, reqType); }
Expression::Ptr ElementConstructor::typeCheck(const StaticContext::Ptr &context, const SequenceType::Ptr &reqType) { /* What does this code do? When type checking our children, our namespace * bindings, which are also children of the form of NamespaceConstructor * instances, must be statically in-scope for them, so find them and * shuffle their bindings into the StaticContext. */ m_staticBaseURI = context->baseURI(); /* Namespace declarations changes the in-scope bindings, so let's * first lookup our child NamespaceConstructors. */ const ID operandID = m_operand2->id(); NamespaceResolver::Bindings overrides; if(operandID == IDExpressionSequence) { const Expression::List operands(m_operand2->operands()); const int len = operands.count(); for(int i = 0; i < len; ++i) { if(operands.at(i)->is(IDNamespaceConstructor)) { const QXmlName &nb = operands.at(i)->as<NamespaceConstructor>()->namespaceBinding(); overrides.insert(nb.prefix(), nb.namespaceURI()); } } } const NamespaceResolver::Ptr newResolver(new DelegatingNamespaceResolver(context->namespaceBindings(), overrides)); const StaticContext::Ptr augmented(new StaticNamespaceContext(newResolver, context)); return PairContainer::typeCheck(augmented, reqType); }
Expression::Ptr ElementConstructor::typeCheck(const StaticContext::Ptr &context, const SequenceType::Ptr &reqType) { m_staticBaseURI = context->baseURI(); /* Namespace declarations changes the in-scope bindings, so let's * first lookup our child NamespaceConstructors. */ const ID operandID = m_operand2->id(); NamespaceResolver::Bindings overrides; if(operandID == IDExpressionSequence) { const Expression::List operands(m_operand2->operands()); const int len = operands.count(); for(int i = 0; i < len; ++i) { if(operands.at(i)->is(IDNamespaceConstructor)) { const QXmlName &nb = operands.at(i)->as<NamespaceConstructor>()->namespaceBinding(); overrides.insert(nb.prefix(), nb.namespaceURI()); } } } const NamespaceResolver::Ptr newResolver(new DelegatingNamespaceResolver(context->namespaceBindings(), overrides)); const StaticContext::Ptr augmented(new StaticNamespaceContext(newResolver, context)); return PairContainer::typeCheck(augmented, reqType); }
Expression::Ptr ResolveURIFN::typeCheck(const StaticContext::Ptr &context, const SequenceType::Ptr &reqType) { Q_ASSERT(m_operands.count() == 1 || m_operands.count() == 2); if(m_operands.count() == 1) { /* Our base URI is always well-defined. */ m_operands.append(wrapLiteral(toItem(AnyURI::fromValue(context->baseURI())), context, this)); } return FunctionCall::typeCheck(context, reqType); }
Expression::Ptr DocumentConstructor::typeCheck(const StaticContext::Ptr &context, const SequenceType::Ptr &reqType) { m_staticBaseURI = context->baseURI(); return SingleContainer::typeCheck(context, reqType); }
Expression::Ptr StaticBaseURIFN::typeCheck(const StaticContext::Ptr &context, const SequenceType::Ptr &reqType) { /* Our base URI can never be undefined. */ return wrapLiteral(toItem(AnyURI::fromValue(context->baseURI())), context, this)->typeCheck(context, reqType); }