visitStmt()

in lib/generator.js [1151:1209]


  visitStmt(ast, level, env) {
    let comments = DSL.comment.getFrontComments(this.comments, ast.tokenRange[0]);
    this.visitComments(comments, level);
    if (ast.type === 'return') {
      this.visitReturn(ast, level, env);
    } else if (ast.type === 'yield') {
      this.visitYield(ast, level, env);
    } else if (ast.type === 'if') {
      this.visitIf(ast, level, env);
    } else if (ast.type === 'throw') {
      this.visitThrow(ast, level, env);
    } else if (ast.type === 'assign') {
      this.visitAssign(ast, level, env);
    } else if (ast.type === 'retry') {
      this.visitRetry(ast, level);
    } else if (ast.type === 'declare') {
      this.visitDeclare(ast, level, env);
    } else if (ast.type === 'while') {
      this.visitWhile(ast, level, env);
    } else if (ast.type === 'for') {
      this.visitFor(ast, level, env);
    } else if (ast.type === 'try') {
      this.visitTry(ast, level, env);
    } else if (ast.type === 'break') {
      this.emit(`break\n`, level);
    } else {
      if (ast.type === 'call' && ast.hasThrow) {
        if (ast.inferred && _name(ast.inferred) !== 'void') {
          this.emit(`_, _err ${env.yieldFunc ? ':' : ''}= `, level);
        } else {
          this.emit(`_err ${env.yieldFunc ? ':' : ''}= `, level);
        }
        this.visitExpr(ast, level, env, { pointer: false });
        this.emit(`\n`);
        if(env.runtimeBody){
          this.visitAPIErrCatch(level, env);
        } else if(env.try) {
          const tryStmt = env.try;
          env.try = null;
          this.visitCatch(tryStmt, level, env);
        } else {
          this.emit(`if _err != nil {\n`, level);
          if (env.returnType && _name(env.returnType) !== 'void') {
            this.emit(`return _result, _err\n`, level + 1);
          } else if(env.yieldFunc){
            this.emit(`_yieldErr <- _err\n`, level + 1);
            this.emit(`return\n`, level + 1);
          } else {
            this.emit(`return _err\n`, level + 1);
          }
          this.emit(`}\n`, level);
        }
      } else {
        this.emit(``, level);
        this.visitExpr(ast, level, env, { pointer: false });
        this.emit(`\n`);
      }
    }
  }