| Index: mojo/public/tools/bindings/generators/mojom_cpp_generator.py
|
| diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
|
| index c75013badf88a19cab5a678a1b77174e20c877fc..1e1e9836b1f8234cb284599d9fa94e6e84c4cacd 100644
|
| --- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
|
| +++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
|
| @@ -482,6 +482,58 @@ def ShouldInlineUnion(union):
|
| mojom.IsReferenceKind(field.kind) and not mojom.IsStringKind(field.kind)
|
| for field in union.fields)
|
|
|
| +
|
| +class StructConstructor(object):
|
| + """Represents a constructor for a generated struct.
|
| +
|
| + Fields:
|
| + fields: {[Field]} All struct fields in order.
|
| + params: {[Field]} The fields that are passed as params.
|
| + """
|
| +
|
| + def __init__(self, fields, params):
|
| + self._fields = fields
|
| + self._params = set(params)
|
| +
|
| + @property
|
| + def params(self):
|
| + return [field for field in self._fields if field in self._params]
|
| +
|
| + @property
|
| + def fields(self):
|
| + for field in self._fields:
|
| + yield (field, field in self._params)
|
| +
|
| +
|
| +def GetStructConstructors(struct):
|
| + """Returns a list of constructors for a struct.
|
| +
|
| + Params:
|
| + struct: {Struct} The struct to return constructors for.
|
| +
|
| + Returns:
|
| + {[StructConstructor]} A list of StructConstructors that should be generated
|
| + for |struct|.
|
| + """
|
| + if not mojom.IsStructKind(struct):
|
| + raise TypeError
|
| + # Types that are neither copyable nor movable can't be passed to a struct
|
| + # constructor so only generate a default constructor.
|
| + if any(IsTypemappedKind(field.kind) and _current_typemap[
|
| + GetFullMojomNameForKind(field.kind)]["non_copyable_non_movable"]
|
| + for field in struct.fields):
|
| + return [StructConstructor(struct.fields, [])]
|
| +
|
| + param_counts = [0]
|
| + for version in struct.versions:
|
| + if param_counts[-1] != version.num_fields:
|
| + param_counts.append(version.num_fields)
|
| +
|
| + ordinal_fields = sorted(struct.fields, key=lambda field: field.ordinal)
|
| + return (StructConstructor(struct.fields, ordinal_fields[:param_count])
|
| + for param_count in param_counts)
|
| +
|
| +
|
| def GetContainerValidateParamsCtorArgs(kind):
|
| if mojom.IsStringKind(kind):
|
| expected_num_elements = 0
|
| @@ -572,6 +624,7 @@ class Generator(generator.Generator):
|
| "is_typemapped_kind": IsTypemappedKind,
|
| "is_union_kind": mojom.IsUnionKind,
|
| "passes_associated_kinds": mojom.PassesAssociatedKinds,
|
| + "struct_constructors": GetStructConstructors,
|
| "stylize_method": generator.StudlyCapsToCamel,
|
| "under_to_camel": generator.UnderToCamel,
|
| "unmapped_type_for_serializer": GetUnmappedTypeForSerializer,
|
|
|