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);
}