in src/languages/java.ts [460:502]
public override newExpression(node: ts.NewExpression, renderer: JavaRenderer): OTree {
const argsLength = node.arguments ? node.arguments.length : 0;
const lastArg = argsLength > 0 ? node.arguments![argsLength - 1] : undefined;
// We render the ClassName.Builder.create(...) expression
// if the last argument is an object literal, and either a known struct (because
// those are the jsii rules) or an unknown type (because the example didn't
// compile but most of the target examples will intend this to be a struct).
const structArgument = lastArg && ts.isObjectLiteralExpression(lastArg) ? lastArg : undefined;
let renderBuilder = false;
if (lastArg && ts.isObjectLiteralExpression(lastArg)) {
const analysis = analyzeObjectLiteral(renderer.typeChecker, lastArg);
renderBuilder = analysis.kind === 'struct' || analysis.kind === 'unknown';
}
const className = renderer
.updateContext({
discardPropertyAccess: true,
convertPropertyToGetter: false,
})
.convert(node.expression);
if (renderBuilder) {
const initialArguments = node.arguments!.slice(0, argsLength - 1);
return new OTree(
[],
[
className,
'.Builder.create(',
this.argumentList(initialArguments, renderer),
')',
...renderer.convertAll(structArgument!.properties),
new OTree([renderer.mirrorNewlineBefore(structArgument!.properties[0])], ['.build()']),
],
{ canBreakLine: true, indent: 8 },
);
}
return new OTree([], ['new ', className, '(', this.argumentList(node.arguments, renderer), ')'], {
canBreakLine: true,
});
}