emitEachFunction()

in lib/client_generator.js [196:263]


  emitEachFunction(ast, level) {
    this.visitAnnotation(ast.annotation, level);
    if (!this.ctx.exec && this.ctx.implements && !ast.isStatic) {
      this.emitln(`@Override`, level);
    }
    this.emit('public ', level);
    if (ast.isStatic) {
      this.emit('static ');
    }
    if (_name(ast.functionName).endsWith('WithAsyncResponseHandler')) {
      this.emit(`<ReturnT> CompletableFuture<ReturnT>`);
      this.emit(` ${_name(ast.functionName)}`);
    } else {
      this.emit(`${_name(ast.functionName) === 'main' ? '' : ast.isAsync ? 'CompletableFuture<' : ''}`);
      if (ast.isAsync && (ast.returnType.lexeme === 'void' || ast.returnType.name === 'void')) {
        this.emit(`Void`);
      } else {
        this.visitType(ast.returnType);
      }
      this.emit(`${_name(ast.functionName) === 'main' ? '' : ast.isAsync ? '>' : ''}`);
      this.emit(` ${_name(ast.functionName)}`);
    }
    if (_name(ast.functionName) === 'main') {
      if (!ast.params.params || ast.params.params.length === 0) {
        throw new Error('static function main must have a argument');
      }
      this.emit(`(String[] ${_name(ast.params.params[0].paramName)}_)`);
    } else if (_name(ast.functionName).endsWith('WithAsyncResponseHandler')) {
      const params = JSON.parse(JSON.stringify(ast.params));
      params.params.pop();
      this.emit('(');
      this.visitPureParams(params, level);
      this.emit(`, AsyncResponseHandler<`);
      this.visitType(ast.returnType);
      this.emit(`, ReturnT> responseHandler)`);
    } else {
      this.visitParams(ast.params, level);
    }
    this.emitln(' {');
    if (ast.functionBody) {
      if (_name(ast.functionName) === 'main') {
        const args = _name(ast.params.params[0].paramName);
        this.emitln(`java.util.List<String> ${args} = java.util.Arrays.asList(${args}_);`, level + 1);
        this.visitFunctionBody(ast.functionBody, false, level + 1);
      } else {
        if (ast.isAsync) {
          this.emitln(`try {`, level + 1);
          this.visitFunctionBody(ast.functionBody, true, level + 2);
          this.emitln(`} catch (Exception e) {`, level + 1);
          this.emit(`CompletableFuture<`, level + 2);
          if (_name(ast.functionName).endsWith('WithAsyncResponseHandler')) {
            this.emit(`ReturnT`);
          } else if (ast.returnType.lexeme === 'void' || ast.returnType.name === 'void') {
            this.emit(`Void`);
          } else {
            this.visitType(ast.returnType);
          }
          this.emitln(`> future = new CompletableFuture<>();`);
          this.emitln(`future.completeExceptionally(e);`, level + 2);
          this.emitln(`return future;`, level + 2);
          this.emitln(`}`, level + 1);
        } else {
          this.visitFunctionBody(ast.functionBody, false, level + 1);
        }
      }
    }
    this.emitln('}', level);
  }