1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtXmlPatterns module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40//
41// W A R N I N G
42// -------------
43//
44// This file is not part of the Qt API. It exists purely as an
45// implementation detail. This header file may change from version to
46// version without notice, or even be removed.
47//
48// We mean it.
49
50#ifndef Patternist_UserFunctionCallsite_H
51#define Patternist_UserFunctionCallsite_H
52
53#include <private/qcallsite_p.h>
54#include <private/qfunctionsignature_p.h>
55#include <private/qunlimitedcontainer_p.h>
56#include <private/quserfunction_p.h>
57#include <private/qvariabledeclaration_p.h>
58
59QT_BEGIN_NAMESPACE
60
61namespace QPatternist
62{
63 /**
64 * @short Performs a call to a UserFunction.
65 *
66 * UserFunctionCallsite is the call site to a function that has been
67 * declared in the query using <tt>declare function</tt>. That is, it is
68 * never used for builtin functions such as <tt>fn:count()</tt>.
69 *
70 * @see UserFunction
71 * @see ArgumentReference
72 * @author Frans Englich <frans.englich@nokia.com>
73 * @ingroup Patternist_expressions
74 */
75 class UserFunctionCallsite : public CallSite
76 {
77 public:
78 typedef QExplicitlySharedDataPointer<UserFunctionCallsite> Ptr;
79 typedef QList<UserFunctionCallsite::Ptr> List;
80
81 UserFunctionCallsite(const QXmlName name,
82 const FunctionSignature::Arity arity);
83
84 virtual bool evaluateEBV(const DynamicContext::Ptr &context) const;
85 virtual Item::Iterator::Ptr evaluateSequence(const DynamicContext::Ptr &context) const;
86 virtual Item evaluateSingleton(const DynamicContext::Ptr &context) const;
87 virtual void evaluateToSequenceReceiver(const DynamicContext::Ptr &context) const;
88
89 virtual Expression::Ptr typeCheck(const StaticContext::Ptr &context,
90 const SequenceType::Ptr &reqType);
91
92 /**
93 * We call compress on our body.
94 */
95 virtual Expression::Ptr compress(const StaticContext::Ptr &context);
96
97 virtual Expression::Properties properties() const;
98
99 /**
100 * @short Returns the types declared in the function declaration.
101 *
102 * @see CallTemplate::expectedOperandTypes()
103 */
104 virtual SequenceType::List expectedOperandTypes() const;
105
106 virtual SequenceType::Ptr staticType() const;
107 virtual ExpressionVisitorResult::Ptr accept(const ExpressionVisitor::Ptr &visitor) const;
108
109 /**
110 * @returns always IDUserFunctionCallsite.
111 */
112 virtual ID id() const;
113
114 /**
115 * If @p slotOffset is -1, it means this function has no arguments.
116 */
117 void setSource(const UserFunction::Ptr &userFunction,
118 const VariableSlotID cacheSlotOffset);
119
120 /**
121 * @returns @c true, if a function definition with signature @p sign
122 * would be valid to call from this callsite, otherwise @c false.
123 */
124 bool isSignatureValid(const FunctionSignature::Ptr &sign) const;
125
126 FunctionSignature::Arity arity() const;
127
128 inline Expression::Ptr body() const
129 {
130 return m_body;
131 }
132
133 virtual bool configureRecursion(const CallTargetDescription::Ptr &sign);
134 virtual CallTargetDescription::Ptr callTargetDescription() const;
135
136 private:
137 /**
138 * Creates a new context sets the arguments, and returns it.
139 */
140 DynamicContext::Ptr bindVariables(const DynamicContext::Ptr &context) const;
141
142 const FunctionSignature::Arity m_arity;
143 /**
144 * The reason this variable, as well as others, aren't const, is that
145 * the binding to the actual function, is resolved after this
146 * UserFunctionCallsite has been created.
147 */
148 VariableSlotID m_expressionSlotOffset;
149
150 /**
151 * @note This may be different from m_functionDeclaration->body(). It
152 * may differ on a per-callsite basis.
153 */
154 Expression::Ptr m_body;
155 UserFunction::Ptr m_functionDeclaration;
156 };
157
158 /**
159 * @short Formats UserFunctionCallsite.
160 *
161 * @relates UserFunctionCallsite
162 */
163 static inline QString formatFunction(const UserFunctionCallsite::Ptr &func)
164 {
165 Q_UNUSED(func);
166 // TODO TODO TODO
167 // TODO Make UserFunctionCallsite always use a FunctionSignature
168 return QLatin1String("<span class='XQuery-function'>") +
169 QString() +
170 //escape(func->name()->toString()) +
171 QLatin1String("</span>");
172 }
173}
174
175QT_END_NAMESPACE
176
177#endif
178

source code of qtxmlpatterns/src/xmlpatterns/expr/quserfunctioncallsite_p.h