docs: @Override
    protected PyExpr visitFunctionNode(FunctionNode node) {
      Object soyFunction = node.getSoyFunction();
      if (soyFunction instanceof BuiltinFunction) {
        return visitNonPluginFunction(node, (BuiltinFunction) soyFunction);
      } else if (soyFunction instanceof SoyPythonSourceFunction) {
        return pluginValueFactory.applyFunction(
            node.getSourceLocation(),
            node.getFunctionName(),
            (SoyPythonSourceFunction) soyFunction,
            visitChildren(node));
      } else if (soyFunction instanceof SoyPySrcFunction) {
        List<PyExpr> args = visitChildren(node);
        return ((SoyPySrcFunction) soyFunction).computeForPySrc(args);
      } else if (soyFunction instanceof LoggingFunction) {
        // trivial logging function support
        return new PyStringExpr("'" + ((LoggingFunction) soyFunction).getPlaceholder() + "'");
      } else {
        errorReporter.report(
            node.getSourceLocation(), SOY_PY_SRC_FUNCTION_NOT_FOUND, node.getFunctionName());
        return ERROR;
      }
    }