private MethodSpec builderBuild(
NameAllocator nameAllocator, MessageType message, ClassName javaType) {
MethodSpec.Builder result = MethodSpec.methodBuilder("build")
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.returns(javaType);
List<Field> requiredFields = message.getRequiredFields();
if (!requiredFields.isEmpty()) {
CodeBlock.Builder conditionals = CodeBlock.builder().add("$[");
CodeBlock.Builder missingArgs = CodeBlock.builder();
for (int i = 0; i < requiredFields.size(); i++) {
Field requiredField = requiredFields.get(i);
if (i > 0) conditionals.add("\n|| ");
conditionals.add("$L == null", requiredField.name());
if (i > 0) missingArgs.add(",\n");
missingArgs.add("$1L, $1S", requiredField.name());
}
result.beginControlFlow("if ($L)", conditionals.add("$]").build())
.addStatement("throw $T.missingRequiredFields($L)", Internal.class,
missingArgs.build())
.endControlFlow();
}
result.addCode("return new $T(", javaType);
for (Field field : message.fieldsAndOneOfFields()) {
result.addCode("$L, ", nameAllocator.get(field));
}
result.addCode("super.buildUnknownFields());\n");
return result.build();
}