Expression::Ptr PatternPlatform::compress(const StaticContext::Ptr &context) { const Expression::Ptr me(FunctionCall::compress(context)); if(me != this) return me; if(m_operands.at(1)->is(IDStringValue)) { const DynamicContext::Ptr dynContext(context->dynamicContext()); m_pattern = parsePattern(m_operands.at(1)->evaluateSingleton(dynContext).stringValue(), dynContext); m_compiledParts |= PatternPrecompiled; } const Expression::Ptr flagOperand(m_operands.value(m_flagsPosition)); if(!flagOperand) { m_flags = NoFlags; m_compiledParts |= FlagsPrecompiled; } else if(flagOperand->is(IDStringValue)) { const DynamicContext::Ptr dynContext(context->dynamicContext()); m_flags = parseFlags(flagOperand->evaluateSingleton(dynContext).stringValue(), dynContext); m_compiledParts |= FlagsPrecompiled; } if(m_compiledParts == FlagsAndPattern) applyFlags(m_flags, m_pattern); return me; }
Expression::Ptr DocFN::typeCheck(const StaticContext::Ptr &context, const SequenceType::Ptr &reqType) { /* See the doxygen documentation for this function for the explanation * to why this implementation is here, as opposed to in * qsequencegeneratingfns.cpp. */ Q_ASSERT(context); prepareStaticBaseURI(context); const Expression::Ptr uriOp(m_operands.first()); if(!uriOp->isEvaluated()) return Expression::Ptr(FunctionCall::typeCheck(context, reqType)); const Item uriItem(uriOp->evaluateSingleton(context->dynamicContext())); if(!uriItem) return EmptySequence::create(this, context)->typeCheck(context, reqType); // TODO test this /* These two lines were previously in a separate function but are now duplicated * in DocFN::evaluateSingleton(), as part of a workaround for solaris-cc-64. */ const QUrl mayRela(AnyURI::toQUrl<ReportContext::FODC0005>(uriItem.stringValue(), context, this)); const QUrl uri(context->resolveURI(mayRela, staticBaseURI())); /* The URI is supplied statically, so, let's try to be clever. */ Q_ASSERT_X(context->resourceLoader(), Q_FUNC_INFO, "No resource loader is set in the StaticContext."); m_type = context->resourceLoader()->announceDocument(uri, ResourceLoader::MayUse); if(m_type) { Q_ASSERT(CommonSequenceTypes::ZeroOrOneDocumentNode->matches(m_type)); return Expression::Ptr(FunctionCall::typeCheck(context, reqType)); } else { context->error(QtXmlPatterns::tr("It will not be possible to retrieve %1.").arg(formatURI(uri)), ReportContext::FODC0002, this); return Expression::Ptr(); } }
QRegExp PatternPlatform::pattern(const DynamicContext::Ptr &context) const { if(m_compiledParts == FlagsAndPattern) /* This is the most common case. */ { Q_ASSERT(m_pattern.isValid()); return m_pattern; } QRegExp retvalPattern; Flags flags; /* Compile the flags, if necessary. */ if(m_compiledParts.testFlag(FlagsPrecompiled)) flags = m_flags; else { const Expression::Ptr flagsOp(m_operands.value(m_flagsPosition)); if(flagsOp) flags = parseFlags(flagsOp->evaluateSingleton(context).stringValue(), context); else flags = NoFlags; } /* Compile the pattern, if necessary. */ if(m_compiledParts.testFlag(PatternPrecompiled)) retvalPattern = m_pattern; else { retvalPattern = parsePattern(m_operands.at(1)->evaluateSingleton(context).stringValue(), context); } applyFlags(flags, retvalPattern); Q_ASSERT(m_pattern.isValid()); return retvalPattern; }