@Override public Expr copy(final QueryContext ctx, final VarScope scp, final IntObjMap<Var> vs) { final Expr[] copy = copyAll(ctx, scp, vs, expr); final int last = copy.length - 1; final Expr[] args = Arrays.copyOf(copy, last); final DynFuncCall call = new DynFuncCall(info, sc, updating, copy[last], args); if (inlinedFrom != null) call.inlinedFrom = inlinedFrom.clone(); return copyType(call); }
@Override public Expr optimize(final QueryContext ctx, final VarScope scp) throws QueryException { final int ar = expr.length - 1; final Expr f = expr[ar]; final Type t = f.type().type; if (t instanceof FuncType) { final FuncType ft = (FuncType) t; if (ft.args != null && ft.args.length != ar) throw INVARITY.get(info, f, ar); if (ft.ret != null) type = ft.ret; } if (f instanceof XQFunctionExpr) { // maps can only contain fully evaluated Values, so this is safe if (allAreValues() && f instanceof Map) return optPre(value(ctx), ctx); // try to inline the function if (!(f instanceof FuncItem && comesFrom((FuncItem) f)) && !updating) { final Expr[] args = Arrays.copyOf(expr, expr.length - 1); final Expr inl = ((XQFunctionExpr) f).inlineExpr(args, ctx, scp, info); if (inl != null) return inl; } } return this; }
@Override public void checkUp() throws QueryException { checkNoneUp(Arrays.copyOf(expr, expr.length - 1)); }