ConstructorFunctionsFactory::ConstructorFunctionsFactory(const NamePool::Ptr &np, const SchemaTypeFactory::Ptr &f) : m_typeFactory(f) { Q_ASSERT(m_typeFactory); Q_ASSERT(np); SchemaType::Hash::const_iterator it(m_typeFactory->types().constBegin()); const SchemaType::Hash::const_iterator end(m_typeFactory->types().constEnd()); FunctionArgument::List args; const QXmlName argName(StandardNamespaces::empty, StandardLocalNames::sourceValue); args.append(FunctionArgument::Ptr(new FunctionArgument(argName, CommonSequenceTypes::ZeroOrOneAtomicType))); while(it != end) { if(!BuiltinTypes::xsAnyAtomicType->wxsTypeMatches(*it) || *BuiltinTypes::xsAnyAtomicType == *static_cast<const AtomicType *>((*it).data()) || *BuiltinTypes::xsNOTATION == *static_cast<const AtomicType *>((*it).data())) { /* It's not a valid type for a constructor function -- skip it. */ ++it; continue; } const QXmlName name((*it)->name(np)); FunctionSignature::Ptr s(new FunctionSignature(name, 1, 1, makeGenericSequenceType(AtomicType::Ptr(*it), Cardinality::zeroOrOne()))); s->setArguments(args); m_signatures.insert(name, s); ++it; } }
SequenceType::List UserFunctionCallsite::expectedOperandTypes() const { SequenceType::List result; if(m_functionDeclaration) { const FunctionArgument::List args(m_functionDeclaration->signature()->arguments()); const FunctionArgument::List::const_iterator end(args.constEnd()); FunctionArgument::List::const_iterator it(args.constBegin()); for(; it != end; ++it) result.append((*it)->type()); } else result.append(CommonSequenceTypes::ZeroOrMoreItems); return result; }
FunctionSignature::Ptr ErrorFN::signature() const { const FunctionSignature::Ptr e(FunctionCall::signature()); if(m_operands.count() != 1) return e; FunctionSignature::Ptr nev(FunctionSignature::Ptr(new FunctionSignature(e->name(), e->minimumArguments(), e->maximumArguments(), e->returnType(), e->properties()))); const FunctionArgument::List args(e->arguments()); FunctionArgument::List nargs; const QXmlName argName(StandardNamespaces::empty, StandardLocalNames::error); nargs.append(FunctionArgument::Ptr(new FunctionArgument(argName, CommonSequenceTypes::ExactlyOneQName))); nargs.append(args[1]); nargs.append(args[2]); nev->setArguments(nargs); return nev; }