Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8b17bbb authored by Martin Geisler's avatar Martin Geisler Committed by Cherrypicker Worker
Browse files

pdl: Extract find_parents helper

Tag: #refactor
Bug: 228306436
Test: atest pdl_tests pdl_rust_generator_tests_{le,be}
(cherry picked from https://android-review.googlesource.com/q/commit:f584f4195345de09b78094391cc2d0299332f72d)
Merged-In: I7c93c6efb68e9cc2bb6660493950eae9022bbe42
Change-Id: I7c93c6efb68e9cc2bb6660493950eae9022bbe42
parent be170715
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -170,6 +170,22 @@ fn find_constrained_parent_fields<'a>(
    })
}

/// Find all parents from `id`.
///
/// This includes the `Decl` for `id` itself.
fn find_parents<'a>(scope: &lint::Scope<'a>, id: &str) -> Vec<&'a parser_ast::Decl> {
    let mut decl = scope.typedef[id];
    let mut parents = vec![decl];
    while let ast::DeclDesc::Packet { parent_id: Some(parent_id), .. }
    | ast::DeclDesc::Struct { parent_id: Some(parent_id), .. } = &decl.desc
    {
        decl = scope.typedef[parent_id];
        parents.push(decl);
    }
    parents.reverse();
    parents
}

/// Turn the constraint into a value (such as `10` or
/// `SomeEnum::Foo`).
pub fn constraint_to_value(
@@ -240,16 +256,7 @@ fn generate_packet_decl(
    let field_names =
        fields_with_ids.iter().map(|f| format_ident!("{}", f.id().unwrap())).collect::<Vec<_>>();

    let mut decl = scope.typedef[id];
    let mut parents = vec![decl];
    while let ast::DeclDesc::Packet { parent_id: Some(parent_id), .. }
    | ast::DeclDesc::Struct { parent_id: Some(parent_id), .. } = &decl.desc
    {
        decl = scope.typedef[parent_id];
        parents.push(decl);
    }
    parents.reverse();

    let parents = find_parents(scope, id);
    let parent_ids = parents.iter().map(|p| p.id().unwrap()).collect::<Vec<_>>();
    let parent_shifted_ids = parent_ids.iter().skip(1).map(|id| format_ident!("{id}"));
    let parent_lower_ids =