Commit 99b76908 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

tools: ynl-gen: prepare for submsg structs



Prepare for constructing Struct() instances which represent
sub-messages rather than nested attributes.
Restructure the code / indentation to more easily insert
a case where nested reference comes from annotation other
than the 'nested-attributes' property. Make sure we don't
construct the Struct() object from scratch in multiple
places as the constructor will soon have more arguments.

This should cause no functional change.

Reviewed-by: default avatarDonald Hunter <donald.hunter@gmail.com>
Link: https://patch.msgid.link/20250515231650.1325372-4-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c9c04899
Loading
Loading
Loading
Loading
+39 −23
Original line number Diff line number Diff line
@@ -60,7 +60,12 @@ class Type(SpecAttr):
            self.len = attr['len']

        if 'nested-attributes' in attr:
            self.nested_attrs = attr['nested-attributes']
            nested = attr['nested-attributes']
        else:
            nested = None

        if nested:
            self.nested_attrs = nested
            if self.nested_attrs == family.name:
                self.nested_render_name = c_lower(f"{family.ident_name}")
            else:
@@ -1225,6 +1230,9 @@ class Family(SpecFamily):
            for _, spec in self.attr_sets[name].items():
                if 'nested-attributes' in spec:
                    nested = spec['nested-attributes']
                else:
                    continue

                # If the unknown nest we hit is recursive it's fine, it'll be a pointer
                if self.pure_nested_structs[nested].recursive:
                    continue
@@ -1278,10 +1286,15 @@ class Family(SpecFamily):
            for attr, spec in self.attr_sets[root_set].items():
                if 'nested-attributes' in spec:
                    nested = spec['nested-attributes']
                else:
                    nested = None

                if nested:
                    if attr in rs_members['request']:
                        self.pure_nested_structs[nested].request = True
                    if attr in rs_members['reply']:
                        self.pure_nested_structs[nested].reply = True

                    if spec.is_multi_val():
                        child = self.pure_nested_structs.get(nested)
                        child.in_multi_val = True
@@ -1291,8 +1304,14 @@ class Family(SpecFamily):
        # Propagate the request / reply / recursive
        for attr_set, struct in reversed(self.pure_nested_structs.items()):
            for _, spec in self.attr_sets[attr_set].items():
                if attr_set in struct.child_nests:
                    struct.recursive = True

                if 'nested-attributes' in spec:
                    child_name = spec['nested-attributes']
                else:
                    continue

                struct.child_nests.add(child_name)
                child = self.pure_nested_structs.get(child_name)
                if child:
@@ -1302,8 +1321,6 @@ class Family(SpecFamily):
                    child.reply |= struct.reply
                    if spec.is_multi_val():
                        child.in_multi_val = True
                if attr_set in struct.child_nests:
                    struct.recursive = True

        self._sort_pure_types()

@@ -3307,8 +3324,7 @@ def main():
                    has_recursive_nests = True
            if has_recursive_nests:
                cw.nl()
            for name in parsed.pure_nested_structs:
                struct = Struct(parsed, name)
            for struct in parsed.pure_nested_structs.values():
                put_typol(cw, struct)
            for name in parsed.root_sets:
                struct = Struct(parsed, name)