@@ -56,7 +56,7 @@ public StaticFunc declare(final StaticContext sc, final QNm name, final Params p
5656
5757 final byte [] modUri = Token .eq (name .uri (), FN_URI ) ? FN_URI : QNm .uri (sc .module );
5858 final StaticFunc sf = new StaticFunc (name , params , expr , anns , vs , info , doc );
59- if (get (sc , name , sf .min , sf .arity ()) != null ) throw DUPLFUNC_X .get (info , name );
59+ if (get (sc , name , sf .min , sf .arity (), false ) != null ) throw DUPLFUNC_X .get (info , name );
6060 funcsByModule .computeIfAbsent (modUri , QNmMap ::new ).computeIfAbsent (name , ArrayList ::new ).
6161 add (sf );
6262 return sf ;
@@ -76,14 +76,16 @@ public Expr newRef(final QuerySupplier<Expr> resolve) {
7676 /**
7777 * Assigns a function to a static function call.
7878 * @param call name function name
79+ * @param useDynamicContext {@code true} if function lookup should include the dynamic context
7980 * @param qc query context
8081 * @throws QueryException query exception
8182 */
82- void setFunc (final StaticFuncCall call , final QueryContext qc ) throws QueryException {
83+ void setFunc (final StaticFuncCall call , final boolean useDynamicContext , final QueryContext qc )
84+ throws QueryException {
8385 final InputInfo info = call .info ();
8486 final QNm name = call .name ;
8587 final int arity = call .arity ();
86- final StaticFunc func = get (info .sc (), name , arity );
88+ final StaticFunc func = get (info .sc (), name , arity , useDynamicContext );
8789 if (func != null ) {
8890 if (func .expr == null ) throw FUNCNOIMPL_X .get (func .info , func .name .prefixString ());
8991 call .setFunc (func );
@@ -128,10 +130,12 @@ public void compileAll(final CompileContext cc) {
128130 * @param sc static context
129131 * @param qname function name
130132 * @param arity function arity
133+ * @param useDynamicContext {@code true} if function lookup should include the dynamic context
131134 * @return function if found, {@code null} otherwise
132135 */
133- public StaticFunc get (final StaticContext sc , final QNm qname , final int arity ) {
134- return get (sc , qname , arity , arity );
136+ public StaticFunc get (final StaticContext sc , final QNm qname , final int arity ,
137+ final boolean useDynamicContext ) {
138+ return get (sc , qname , arity , arity , useDynamicContext );
135139 }
136140
137141 /**
@@ -140,13 +144,15 @@ public StaticFunc get(final StaticContext sc, final QNm qname, final int arity)
140144 * @param qname function name
141145 * @param min minimum function arity
142146 * @param max maximum function arity
147+ * @param useDynamicContext {@code true} if function lookup should include the dynamic context
143148 * @return function if found, {@code null} otherwise
144149 */
145- private StaticFunc get (final StaticContext sc , final QNm qname , final int min , final int max ) {
150+ private StaticFunc get (final StaticContext sc , final QNm qname , final int min , final int max ,
151+ final boolean useDynamicContext ) {
146152 final byte [] funcUri = qname .uri ();
147153 final byte [] modUri = Token .eq (funcUri , FN_URI ) ? FN_URI : QNm .uri (sc .module );
148154 StaticFunc func = get (modUri , qname , min , max );
149- if (func == null && sc .imports .contains (funcUri )) {
155+ if (func == null && ( useDynamicContext || sc .imports .contains (funcUri ) )) {
150156 func = get (funcUri , qname , min , max );
151157 if (func != null && func .anns .contains (Annotation .PRIVATE )) func = null ;
152158 }
0 commit comments