xqtref_t fn_remove::getReturnType(const fo_expr* caller) const { TypeManager* tm = caller->get_type_manager(); return tm->create_type_x_quant(*caller->get_arg(0)->get_return_type(), SequenceType::QUANT_QUESTION); }
xqtref_t op_concatenate::getReturnType(const fo_expr* caller) const { TypeManager* tm = caller->get_type_manager(); csize sz = caller->num_args(); if (sz == 0) { return GENV_TYPESYSTEM.EMPTY_TYPE; } else { xqtref_t t = caller->get_arg(0)->get_return_type(); SequenceType::Quantifier q = SequenceType::QUANT_STAR; for (csize i = 1; i < sz; i++) { t = TypeOps::union_type(*t, *caller->get_arg(i)->get_return_type(), tm); SequenceType::Quantifier pq = t->get_quantifier(); if (pq == SequenceType::QUANT_ONE || pq == SequenceType::QUANT_PLUS) q = SequenceType::QUANT_PLUS; } return tm->create_type_x_quant(*t, q); } }
xqtref_t op_zorba_subsequence_int::getReturnType(const fo_expr* caller) const { TypeManager* tm = caller->get_type_manager(); xqtref_t argType = caller->get_arg(0)->get_return_type(); //When there is a length argument and it's 1 then we know we will return //a value type T? where the input sequence was type T* or T+ if (caller->num_args() > 2 && caller->get_arg(2)->get_expr_kind() == const_expr_kind) { store::Item* len = static_cast<const_expr*>(caller->get_arg(2))->get_val(); if (len->getIntegerValue() == Integer(1)) return tm->create_type(*argType, SequenceType::QUANT_QUESTION); } return tm->create_type_x_quant(*argType, SequenceType::QUANT_QUESTION); }