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

Commit b79be8fa authored by Martin Geisler's avatar Martin Geisler
Browse files

pdl: move ‘generate_field’ to ‘Field’

The ‘Field::from’ calls will eventually go away when we moved more
code to ‘Field’.

Test: atest pdl_tests pdl_inline_tests
Change-Id: I59c1d4c42fa47e512e037d7219ffa937a15c2be3
parent a30186d5
Loading
Loading
Loading
Loading
+2 −15
Original line number Diff line number Diff line
@@ -31,19 +31,6 @@ macro_rules! quote_block {
    }
}

fn generate_field(field: &ast::Field, visibility: syn::Visibility) -> proc_macro2::TokenStream {
    let field_name = Field::from(field).get_ident();
    match field {
        ast::Field::Scalar { width, .. } => {
            let field_type = types::Integer::new(*width);
            quote! {
                #visibility #field_name: #field_type
            }
        }
        _ => todo!("unsupported field: {:?}", field),
    }
}

fn generate_field_getter(packet_name: &syn::Ident, field: &ast::Field) -> proc_macro2::TokenStream {
    let field_name = Field::from(field).get_ident();
    match field {
@@ -356,7 +343,7 @@ fn generate_packet_decl(
            child: #data_child_ident,
        }
    });
    let plain_fields = fields.iter().map(|field| generate_field(field, parse_quote!()));
    let plain_fields = fields.iter().map(|field| Field::from(field).generate_decl(parse_quote!()));
    code.push_str(&quote_block! {
        #[derive(Debug)]
        struct #data_name {
@@ -386,7 +373,7 @@ fn generate_packet_decl(
    });

    let builder_name = format_ident!("{id}Builder");
    let pub_fields = fields.iter().map(|field| generate_field(field, parse_quote!(pub)));
    let pub_fields = fields.iter().map(|field| Field::from(field).generate_decl(parse_quote!(pub)));
    code.push_str(&quote_block! {
        #[derive(Debug)]
        pub struct #builder_name {
+16 −1
Original line number Diff line number Diff line
use quote::format_ident;
use quote::{format_ident, quote};

use crate::ast;
use crate::backends::rust::types;

/// Like [`ast::Field::Scalar`].
#[derive(Debug, Clone)]
@@ -21,6 +22,14 @@ impl ScalarField {
    fn get_ident(&self) -> proc_macro2::Ident {
        format_ident!("{}", self.id)
    }

    fn generate_decl(&self, visibility: syn::Visibility) -> proc_macro2::TokenStream {
        let field_name = self.get_ident();
        let field_type = types::Integer::new(self.width);
        quote! {
            #visibility #field_name: #field_type
        }
    }
}

/// Projection of [`ast::Field`] with the bits needed for the Rust
@@ -51,4 +60,10 @@ impl Field {
            Field::Scalar(field) => field.get_ident(),
        }
    }

    pub fn generate_decl(&self, visibility: syn::Visibility) -> proc_macro2::TokenStream {
        match self {
            Field::Scalar(field) => field.generate_decl(visibility),
        }
    }
}