visitYieldReturnBody()

in lib/generator.js [3538:3588]


  visitYieldReturnBody(ast, funcName, level, env) {
    let args = [];
    args.push({
      name: '_yield chan',
      type: env.returnType.valueType,
    });
    if(env.hasThrow) {
      args.push({
        name: '_yieldErr chan error',
      });
    }
    let vars = this.getStmtsVars(ast.stmts.stmts);
    this.emit(`${funcName}(_yield`, level);
    if(env.hasThrow) {
      this.emit(', _yieldErr, ');
    }

    const argsMap = {};
    let params = new Set();
    for (let i = 0; i < vars.length; i++) {
      const arg = vars[i];
      params.add(arg.name);
      argsMap[arg.name] = arg.type;
    }
    params = [...params];
    this.emit(params.join(', '));

    params.map((name) => {
      const variable = (env.pointerParams && env.pointerParams.includes(name)) ? false : true;
      args.push({
        name,
        type: argsMap[name],
        variable,
      });
    });

    this.emit(')\n');

    if(env.hasThrow) {
      this.emit('_err = <-_yieldErr\n', level);
    }
    this.visitAPIErrCatch(level, env);

    this.emit('return\n', level);
    this.yieldFunc.push({
      args,
      functionBody: ast,
      name: funcName,
      pointerParams: env.pointerParams,
    });
  }