summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2021-04-09 11:13:41 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-04-09 16:00:16 +0000
commiteff94d95aeb52906cb8066159606e1e0f0f81565 (patch)
treeeda4bb935a620bf91c4f08971699b3d5681310d2
parent0e967d6ed33cdf9eb8314e6ae3fb3e2261e213d7 (diff)
downloadmongo-eff94d95aeb52906cb8066159606e1e0f0f81565.tar.gz
SERVER-55960 always pass field name to IDL serializer
-rw-r--r--buildscripts/idl/idl/generator.py9
-rw-r--r--src/mongo/idl/basic_types.h6
2 files changed, 10 insertions, 5 deletions
diff --git a/buildscripts/idl/idl/generator.py b/buildscripts/idl/idl/generator.py
index 833004213d4..34747fd6d24 100644
--- a/buildscripts/idl/idl/generator.py
+++ b/buildscripts/idl/idl/generator.py
@@ -1980,7 +1980,11 @@ class _CppSourceFileWriter(_CppFileWriterBase):
method_name = writer.get_method_name(field.type.serializer)
template_params['method_name'] = method_name
- if field.type.is_array:
+ if field.chained:
+ # Just directly call the serializer for chained structs without opening up a
+ # nested document.
+ self._writer.write_template('${access_member}.${method_name}(builder);')
+ elif field.type.is_array:
self._writer.write_template(
'BSONArrayBuilder arrayBuilder(builder->subarrayStart(${field_name}));')
with self._block('for (const auto& item : ${access_member}) {', '}'):
@@ -1988,7 +1992,8 @@ class _CppSourceFileWriter(_CppFileWriterBase):
'BSONObjBuilder subObjBuilder(arrayBuilder.subobjStart());')
self._writer.write_template('item.${method_name}(&subObjBuilder);')
else:
- self._writer.write_template('${access_member}.${method_name}(builder);')
+ self._writer.write_template(
+ '${access_member}.${method_name}(${field_name}, builder);')
def _gen_serializer_method_struct(self, field):
# type: (ast.Field) -> None
diff --git a/src/mongo/idl/basic_types.h b/src/mongo/idl/basic_types.h
index 35516add195..c02366d3c5f 100644
--- a/src/mongo/idl/basic_types.h
+++ b/src/mongo/idl/basic_types.h
@@ -172,14 +172,14 @@ public:
uasserted(ErrorCodes::FailedToParse, "w has to be a number or string");
}
- void serializeWriteConcernW(BSONObjBuilder* builder) const {
+ void serializeWriteConcernW(StringData fieldName, BSONObjBuilder* builder) const {
if (auto stringVal = stdx::get_if<std::string>(&_w)) {
- builder->append("w", *stringVal);
+ builder->append(fieldName, *stringVal);
return;
}
auto intVal = stdx::get_if<std::int64_t>(&_w);
invariant(intVal);
- builder->appendNumber("w", static_cast<long long>(*intVal));
+ builder->appendNumber(fieldName, static_cast<long long>(*intVal));
}
WriteConcernW() : _w{1}, _usedDefault{true} {};