本文整理汇总了C++中staticcontext::Ptr::error方法的典型用法代码示例。如果您正苦于以下问题:C++ Ptr::error方法的具体用法?C++ Ptr::error怎么用?C++ Ptr::error使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类staticcontext::Ptr
的用法示例。
在下文中一共展示了Ptr::error方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: verifyArity
void AbstractFunctionFactory::verifyArity(const FunctionSignature::Ptr &s,
const StaticContext::Ptr &context,
const xsInteger arity,
const SourceLocationReflection *const r) const
{
/* Same code in both branches, but more specific error messages in order
* to improve usability. */
if(s->maximumArguments() != FunctionSignature::UnlimitedArity &&
arity > s->maximumArguments())
{
context->error(QtXmlPatterns::tr("%1 takes at most %n argument(s). "
"%2 is therefore invalid.", 0, s->maximumArguments())
.arg(formatFunction(context->namePool(), s))
.arg(arity),
ReportContext::XPST0017,
r);
return;
}
if(arity < s->minimumArguments())
{
context->error(QtXmlPatterns::tr("%1 requires at least %n argument(s). "
"%2 is therefore invalid.", 0, s->minimumArguments())
.arg(formatFunction(context->namePool(), s))
.arg(arity),
ReportContext::XPST0017,
r);
return;
}
}
示例2: typeCheck
Expression::Ptr CastAs::typeCheck(const StaticContext::Ptr &context,
const SequenceType::Ptr &reqType)
{
checkTargetType(context);
const SequenceType::Ptr seqt(m_operand->staticType());
ItemType::Ptr t(seqt->itemType());
/* Special case xs:QName */
if(BuiltinTypes::xsQName->xdtTypeMatches(m_targetType->itemType()))
{
/* Ok, We're casting to xs:QName. */
if(m_operand->is(IDStringValue)) /* A valid combination, let's do the cast. */
return castToQName(context)->typeCheck(context, reqType);
else if(BuiltinTypes::xsQName->xdtTypeMatches(t))
return m_operand->typeCheck(context, reqType);
else if(seqt->cardinality().isEmpty() && m_targetType->cardinality().allowsEmpty())
return EmptySequence::create(this, context);
else if(!(seqt->cardinality().isEmpty() && !m_targetType->cardinality().allowsEmpty()))
{
context->error(QtXmlPatterns::tr("When casting to %1 or types "
"derived from it, the source "
"value must be of the same type, "
"or it must be a string literal. "
"Type %2 is not allowed.")
.arg(formatType(context->namePool(), BuiltinTypes::xsQName))
.arg(formatType(context->namePool(), seqt)),
ReportContext::XPTY0004, this);
return Expression::Ptr(this);
}
}
const Expression::Ptr me(SingleContainer::typeCheck(context, reqType));
/* Type may have changed, such as that atomization has been applied. */
t = m_operand->staticType()->itemType();
if(m_targetType->itemType()->xdtTypeMatches(t) &&
!BuiltinTypes::xsDayTimeDuration->xdtTypeMatches(t) &&
!BuiltinTypes::xsYearMonthDuration->xdtTypeMatches(t))
{ /* At least casting is superflorous. */
if(m_operand->staticType()->cardinality().isMatch(m_targetType->cardinality()))
return m_operand; /* The whole cast expression is redundant. */
else
{ /* Only cardinality check is needed, rewrite to CardinalityVerifier. */
return Expression::Ptr(new CardinalityVerifier(m_operand,
m_targetType->cardinality(),
ReportContext::FORG0001));
}
}
/* Let the CastingPlatform look up its AtomicCaster. */
prepareCasting(context, t);
return me;
}
示例3: create
Expression::Ptr GenericPredicate::create(const Expression::Ptr &sourceExpression,
const Expression::Ptr &predicateExpression,
const StaticContext::Ptr &context,
const QSourceLocation &location)
{
Q_ASSERT(sourceExpression);
Q_ASSERT(predicateExpression);
Q_ASSERT(context);
const ItemType::Ptr type(predicateExpression->staticType()->itemType());
if(predicateExpression->is(IDIntegerValue) &&
predicateExpression->as<Literal>()->item().as<Numeric>()->toInteger() == 1)
{ /* Handle [1] */
return createFirstItem(sourceExpression);
}
else if(BuiltinTypes::numeric->xdtTypeMatches(type))
{ /* A numeric predicate, other than [1]. */
/* TODO at somepoint we'll return a specialized expr here, NumericPredicate or so.
* Dependency analysis is a bit tricky, since the contained expression can depend on
* some loop component. */
return Expression::Ptr(new GenericPredicate(sourceExpression, predicateExpression));
}
else if(*CommonSequenceTypes::Empty == *type)
{
return EmptySequence::create(predicateExpression.data(), context);
}
else if(*BuiltinTypes::item == *type ||
*BuiltinTypes::xsAnyAtomicType == *type)
{
/* The type couldn't be narrowed at compile time, so we use
* a generic predicate. This check is before the CommonSequenceTypes::EBV check,
* because the latter matches these types as well. */
return Expression::Ptr(new GenericPredicate(sourceExpression, predicateExpression));
}
else if(CommonSequenceTypes::EBV->itemType()->xdtTypeMatches(type))
{
return Expression::Ptr(new TruthPredicate(sourceExpression, predicateExpression));
}
else
{
context->error(QtXmlPatterns::tr("A value of type %1 cannot be a "
"predicate. A predicate must have "
"either a numeric type or an "
"Effective Boolean Value type.")
.arg(formatType(context->namePool(),
sourceExpression->staticType())),
ReportContext::FORG0006, location);
return Expression::Ptr(); /* Silence compiler warning. */
}
}
示例4: typeCheck
Expression::Ptr AvgFN::typeCheck(const StaticContext::Ptr &context,
const SequenceType::Ptr &reqType)
{
const Expression::Ptr me(FunctionCall::typeCheck(context, reqType));
ItemType::Ptr t1(m_operands.first()->staticType()->itemType());
if(*CommonSequenceTypes::Empty == *t1)
return me;
else if(*BuiltinTypes::xsAnyAtomicType == *t1 ||
*BuiltinTypes::numeric == *t1)
return me;
else if(BuiltinTypes::xsUntypedAtomic->xdtTypeMatches(t1))
{
m_operands.replace(0, Expression::Ptr(new UntypedAtomicConverter(m_operands.first(),
BuiltinTypes::xsDouble)));
t1 = m_operands.first()->staticType()->itemType();
}
else if(!BuiltinTypes::numeric->xdtTypeMatches(t1) &&
!BuiltinTypes::xsDayTimeDuration->xdtTypeMatches(t1) &&
!BuiltinTypes::xsYearMonthDuration->xdtTypeMatches(t1))
{
/* Translator, don't translate the type names. */
context->error(QtXmlPatterns::tr("The first argument to %1 cannot be "
"of type %2. It must be of type %3, "
"%4, or %5.")
.arg(signature())
.arg(formatType(context->namePool(), m_operands.first()->staticType()))
.arg(formatType(context->namePool(), BuiltinTypes::numeric))
.arg(formatType(context->namePool(), BuiltinTypes::xsYearMonthDuration))
.arg(formatType(context->namePool(), BuiltinTypes::xsDayTimeDuration)),
ReportContext::FORG0006, this);
}
if(!m_operands.first()->staticType()->cardinality().allowsMany())
return m_operands.first();
/* We use CommonValues::IntegerOne here because it is an arbitrary Expression
* of type xs:integer */
Expression::Ptr op2(wrapLiteral(CommonValues::IntegerOne, context, this));
m_adder = ArithmeticExpression::fetchMathematician(m_operands.first(), m_operands.first(),
AtomicMathematician::Add, true, context, this);
m_divider = ArithmeticExpression::fetchMathematician(m_operands.first(), op2,
AtomicMathematician::Div, true, context, this);
return me;
}
示例5: namespaceForPrefix
QXmlName::NamespaceCode QNameConstructor::namespaceForPrefix(const QXmlName::PrefixCode prefix,
const StaticContext::Ptr &context,
const SourceLocationReflection *const r)
{
Q_ASSERT(context);
const QXmlName::NamespaceCode ns(context->namespaceBindings()->lookupNamespaceURI(prefix));
if(ns == NamespaceResolver::NoBinding)
{
context->error(QtXmlPatterns::tr("No namespace binding exists for the prefix %1")
.arg(formatKeyword(context->namePool()->stringForPrefix(prefix))),
ReportContext::XPST0081,
r);
return NamespaceResolver::NoBinding;
}
else
return ns;
}
示例6: create
Expression::Ptr
ComparingAggregator<oper, result>::typeCheck(const StaticContext::Ptr &context,
const SequenceType::Ptr &reqType)
{
Q_ASSERT(oper == AtomicComparator::OperatorGreaterThan ||
oper == AtomicComparator::OperatorLessThan);
const Expression::Ptr me(FunctionCall::typeCheck(context, reqType));
ItemType::Ptr t1(m_operands.first()->staticType()->itemType());
if(*CommonSequenceTypes::Empty == *t1)
return EmptySequence::create(this, context);
else if(*BuiltinTypes::xsAnyAtomicType == *t1 ||
BuiltinTypes::numeric->xdtTypeMatches(t1))
return me;
else if(BuiltinTypes::xsUntypedAtomic->xdtTypeMatches(t1))
{
m_operands.replace(0, Expression::Ptr(new UntypedAtomicConverter(m_operands.first(),
BuiltinTypes::xsDouble)));
t1 = m_operands.first()->staticType()->itemType();
}
else if(!BuiltinTypes::xsString->xdtTypeMatches(t1) &&
!BuiltinTypes::xsAnyURI->xdtTypeMatches(t1) &&
!BuiltinTypes::xsDayTimeDuration->xdtTypeMatches(t1) &&
!BuiltinTypes::xsDate->xdtTypeMatches(t1) &&
!BuiltinTypes::xsTime->xdtTypeMatches(t1) &&
!BuiltinTypes::xsDateTime->xdtTypeMatches(t1) &&
!BuiltinTypes::xsYearMonthDuration->xdtTypeMatches(t1))
{
context->error(QtXmlPatterns::tr("The first argument to %1 cannot be of type %2.")
.arg(QPatternist::formatFunction(context->namePool(), signature()))
.arg(formatType(context->namePool(), m_operands.first()->staticType())),
ReportContext::FORG0006, this);
return me;
}
if(!m_operands.first()->staticType()->cardinality().allowsMany())
return m_operands.first();
// explicit scope needed in RVCT
ComparingAggregator<oper, result>::prepareComparison(fetchComparator(t1, t1, context));
return me;
}
示例7: typeCheck
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();
}
}
示例8: verifyCardinality
Expression::Ptr CardinalityVerifier::verifyCardinality(const Expression::Ptr &operand,
const Cardinality &requiredCard,
const StaticContext::Ptr &context,
const ReportContext::ErrorCode code)
{
const Cardinality opCard(operand->staticType()->cardinality());
if(requiredCard.isMatch(opCard))
return operand;
else if(requiredCard.canMatch(opCard))
return Expression::Ptr(new CardinalityVerifier(operand, requiredCard, code));
else if(context->compatModeEnabled() &&
!opCard.isEmpty())
{
return GenericPredicate::createFirstItem(operand);
}
else
{
/* Sequences within this cardinality can never match. */
context->error(wrongCardinality(requiredCard, opCard), code, operand.data());
return operand;
}
}
示例9: verifyType
Expression::Ptr TypeChecker::verifyType(const Expression::Ptr &operand,
const SequenceType::Ptr &reqSeqType,
const StaticContext::Ptr &context,
const ReportContext::ErrorCode code,
const Options options)
{
const ItemType::Ptr reqType(reqSeqType->itemType());
const Expression::Properties props(operand->properties());
/* If operand requires a focus, do the necessary type checking for that. */
if(props.testFlag(Expression::RequiresFocus) && options.testFlag(CheckFocus))
{
const ItemType::Ptr contextType(context->contextItemType());
if(contextType)
{
if(props.testFlag(Expression::RequiresContextItem))
{
Q_ASSERT_X(operand->expectedContextItemType(), Q_FUNC_INFO,
"When the Expression sets the RequiresContextItem property, it must "
"return a type in expectedContextItemType()");
const ItemType::Ptr expectedContextType(operand->expectedContextItemType());
/* Allow the empty sequence. We don't want to trigger XPTY0020 on ()/... . */
if(!expectedContextType->xdtTypeMatches(contextType) && contextType != CommonSequenceTypes::Empty)
{
context->error(wrongType(context->namePool(), operand->expectedContextItemType(), contextType),
ReportContext::XPTY0020, operand.data());
return operand;
}
}
}
else
{
context->error(QtXmlPatterns::tr("The focus is undefined."), ReportContext::XPDY0002, operand.data());
return operand;
}
}
SequenceType::Ptr operandSeqType(operand->staticType());
ItemType::Ptr operandType(operandSeqType->itemType());
/* This returns the operand if the types are identical or if operandType
* is a subtype of reqType. */
if(reqType->xdtTypeMatches(operandType) || *operandType == *CommonSequenceTypes::Empty)
return operand;
/* Since we haven't exited yet, it means that the operandType is a super type
* of reqType, and that there hence is a path down to it through the
* type hierachy -- but that doesn't necessarily mean that a up-cast(down the
* hierarchy) would succeed. */
Expression::Ptr result(operand);
if(reqType->isAtomicType())
{
const Expression::ID opID = operand->id();
if((opID == Expression::IDArgumentReference ||
(opID == Expression::IDCardinalityVerifier && operand->operands().first()->is(Expression::IDArgumentReference)))
&& *BuiltinTypes::item == *operandType)
return Expression::Ptr(new ArgumentConverter(result, reqType));
if(!operandType->isAtomicType())
{
result = Expression::Ptr(new Atomizer(result));
/* The atomizer might know more about the type. */
operandType = result->staticType()->itemType();
}
if(reqType->xdtTypeMatches(operandType))
{
/* Atomization was sufficient. Either the expected type is xs:anyAtomicType
* or the type the Atomizer knows it returns, matches the required type. */
return result;
}
const bool compatModeEnabled = context->compatModeEnabled();
if((options.testFlag(AutomaticallyConvert) && BuiltinTypes::xsUntypedAtomic->xdtTypeMatches(operandType)) ||
(compatModeEnabled && BuiltinTypes::xsString->xdtTypeMatches(reqType)))
{
if(*reqType == *BuiltinTypes::numeric)
{
result = typeCheck(new UntypedAtomicConverter(result, BuiltinTypes::xsDouble, code),
context, reqSeqType);
}
else
result = typeCheck(new UntypedAtomicConverter(result, reqType, code), context, reqSeqType);
/* The UntypedAtomicConverter might know more about the type, so reload. */
operandType = result->staticType()->itemType();
}
else if(compatModeEnabled && *reqType == *BuiltinTypes::xsDouble)
{
const FunctionFactory::Ptr functions(context->functionSignatures());
Expression::List numberArgs;
numberArgs.append(operand);
result = functions->createFunctionCall(QXmlName(StandardNamespaces::fn, StandardLocalNames::number),
numberArgs,
context,
//.........这里部分代码省略.........
示例10: createExpression
Expression::Ptr ExpressionFactory::createExpression(const Tokenizer::Ptr &tokenizer,
const StaticContext::Ptr &context,
const QXmlQuery::QueryLanguage lang,
const SequenceType::Ptr &requiredType,
const QUrl &queryURI,
const QXmlName &initialTemplateName)
{
Q_ASSERT(context);
Q_ASSERT(requiredType);
Q_ASSERT(queryURI.isValid());
Tokenizer::Ptr effectiveTokenizer(tokenizer);
#ifdef Patternist_DEBUG
effectiveTokenizer = Tokenizer::Ptr(new TokenRevealer(queryURI, tokenizer));
#endif
OptimizationPasses::Coordinator::init();
const ParserContext::Ptr info(new ParserContext(context, lang, effectiveTokenizer.data()));
info->initialTemplateName = initialTemplateName;
effectiveTokenizer->setParserContext(info);
const int bisonRetval = QPatternist::XPathparse(info.data());
Q_ASSERT_X(bisonRetval == 0, Q_FUNC_INFO,
"We shouldn't be able to get an error, because we throw exceptions.");
Q_UNUSED(bisonRetval); /* Needed when not compiled in debug mode, since bisonRetval won't
* be used in the Q_ASSERT_X above. */
Expression::Ptr result(info->queryBody);
if(!result)
{
context->error(QtXmlPatterns::tr("A library module cannot be evaluated "
"directly. It must be imported from a "
"main module."),
ReportContext::XPST0003,
QSourceLocation(queryURI, 1, 1));
}
/* Optimization: I think many things are done in the wrong order below. We
* probably want everything typechecked before compressing, since we can
* have references all over the place(variable references, template
* invocations, function callsites). This could even be a source to bugs.
*/
/* Here, we type check user declared functions and global variables. This
* means that variables and functions that are not used are type
* checked(which they otherwise wouldn't have been), and those which are
* used, are type-checked twice, unfortunately. */
const bool hasExternalFocus = context->contextItemType();
if(lang == QXmlQuery::XSLT20)
{
/* Bind xsl:call-template instructions to their template bodies.
*
* We do this before type checking and compressing them, because a
* CallTemplate obviously needs its template before being compressed.
*
* Also, we do this before type checking and compressing user
* functions, since they can contain template call sites.
*/
for(int i = 0; i < info->templateCalls.count(); ++i)
{
CallTemplate *const site = info->templateCalls.at(i)->as<CallTemplate>();
const QXmlName targetName(site->name());
const Template::Ptr t(info->namedTemplates.value(targetName));
if(t)
site->setTemplate(t);
else
{
context->error(QtXmlPatterns::tr("No template by name %1 exists.").arg(formatKeyword(context->namePool(), targetName)),
ReportContext::XTSE0650,
site);
}
}
}
/* Type check and compress user functions. */
{
const UserFunction::List::const_iterator end(info->userFunctions.constEnd());
UserFunction::List::const_iterator it(info->userFunctions.constBegin());
/* If the query has a focus(which is common, in the case of a
* stylesheet), we must ensure that the focus isn't visible in the
* function body. */
StaticContext::Ptr effectiveContext;
if(hasExternalFocus)
{
effectiveContext = StaticContext::Ptr(new StaticFocusContext(ItemType::Ptr(),
context));
}
else
effectiveContext = context;
for(; it != end; ++it)
//.........这里部分代码省略.........
示例11: createExpression
Expression::Ptr ExpressionFactory::createExpression(const QString &expr,
const StaticContext::Ptr &context,
const LanguageAccent lang,
const SequenceType::Ptr &requiredType,
const QUrl &queryURI)
{
pDebug() << Q_FUNC_INFO << queryURI;
Q_ASSERT(context);
Q_ASSERT(requiredType);
Q_ASSERT(queryURI.isValid());
OptimizationPasses::Coordinator::init();
ParserContext::Ptr info(new ParserContext(context, lang,
Tokenizer::Ptr(new XQueryTokenizer(expr, queryURI))));
const int bisonRetval = XPathparse(info.data());
Q_ASSERT_X(bisonRetval == 0, Q_FUNC_INFO,
"We shouldn't be able to get an error, because we throw exceptions.");
Q_UNUSED(bisonRetval); /* Needed when not compiled in debug mode, since bisonRetval won't
* be used in the Q_ASSERT_X above. */
Expression::Ptr result(info->queryBody);
if(!result)
{
context->error(QtXmlPatterns::tr("A library module cannot be evaluated "
"directly. It must be imported from a "
"main module."),
ReportContext::XPST0003,
QSourceLocation(queryURI, 1, 1));
}
/* Here, we type check user declared functions and global variables. This means
* that variables and functions that are not used are type checked(which they otherwise
* wouldn't have been), and those which are used, are type-checked twice, unfortunately. */
const UserFunction::List::const_iterator end(info->userFunctions.constEnd());
UserFunction::List::const_iterator it(info->userFunctions.constBegin());
for(; it != end; ++it)
{
pDebug() << "----- User Function Typecheck -----";
registerLastPath((*it)->body());
/* We will most likely call body()->typeCheck() again, once for each callsite. That is, it will
* be called from UserFunctionCallsite::typeCheck(), which will be called indirectly when
* we check the query body. */
const Expression::Ptr typeCheck((*it)->body()->typeCheck(context, (*it)->signature()->returnType()));
/* We don't have to call (*it)->setBody(typeCheck) here since it's only used directly below. */
processTreePass(typeCheck, UserFunctionTypeCheck);
pDebug() << "------------------------------";
pDebug() << "----- User Function Compress -----";
const Expression::Ptr comp(typeCheck->compress(context));
(*it)->setBody(comp);
processTreePass(comp, UserFunctionCompression);
pDebug() << "------------------------------";
}
const VariableDeclaration::Stack::const_iterator vend(info->variables.constEnd());
VariableDeclaration::Stack::const_iterator vit(info->variables.constBegin());
for(; vit != vend; ++vit)
{
Q_ASSERT(*vit);
/* If it's already used, it will be typeChecked later on. */
if((*vit)->isUsed() || (*vit)->type == VariableDeclaration::ExternalVariable)
continue;
pDebug() << "----- Global Variable Typecheck -----";
Q_ASSERT((*vit)->expression());
/* We supply ZeroOrMoreItems, meaning the variable can evaluate to anything. */
// FIXME which is a source to bugs
// TODO What about compressing variables?
const Expression::Ptr
nev((*vit)->expression()->typeCheck(context, CommonSequenceTypes::ZeroOrMoreItems));
processTreePass(nev, GlobalVariableTypeCheck);
pDebug() << "------------------------------";
}
pDebug() << "----- Initial AST build. -----";
processTreePass(result, QueryBodyInitial);
pDebug() << "------------------------------";
pDebug() << "----- Type Check -----";
registerLastPath(result);
result->rewrite(result, result->typeCheck(context, requiredType), context);
processTreePass(result, QueryBodyTypeCheck);
pDebug() << "------------------------------";
pDebug() << "----- Compress -----";
result->rewrite(result, result->compress(context), context);
processTreePass(result, QueryBodyCompression);
pDebug() << "------------------------------";
return result;
}