use proc_macro2::TokenStream;
use quote::quote;
use crate::generating::bitfield::feature::{Feature, FeaturePosition};
use crate::generating::bitfield::features::common::generator_helper::{
generate_new_function_implementation_tokens, get_function_modifier_tokens,
};
use crate::parsing::bitfields::bitfield::Bitfield;
use crate::parsing::common::to_tokens::ToTokens;
pub struct NewFunctionsFeature;
impl Feature for NewFunctionsFeature {
fn generate_feature(&self, bitfield: &Bitfield) -> TokenStream {
Self::generate_new_functions_tokens(bitfield)
}
fn enabled(&self, bitfield: &Bitfield) -> bool {
bitfield.arguments().generate_new()
}
fn feature_position(&self) -> FeaturePosition {
FeaturePosition::Inside
}
fn order_priority(&self) -> u32 {
1
}
}
impl NewFunctionsFeature {
fn generate_new_functions_tokens(bitfield: &Bitfield) -> TokenStream {
let new_function_feature_tokens = Self::generate_new_function_feature_tokens(bitfield);
let new_without_defaults_function_feature_tokens =
Self::generate_new_without_defaults_function_feature_tokens(bitfield);
quote! {
#new_function_feature_tokens
#new_without_defaults_function_feature_tokens
}
}
fn generate_new_function_feature_tokens(bitfield: &Bitfield) -> TokenStream {
let visibility_tokens = bitfield.visibility().to_tokens();
let function_modifier_tokens = get_function_modifier_tokens(bitfield);
let function_implementation = generate_new_function_implementation_tokens(
bitfield, true, false,
false,
);
quote! {
#[doc = "Creates a new bitfield instance."]
#visibility_tokens #function_modifier_tokens fn new() -> Self {
#function_implementation
this
}
}
}
fn generate_new_without_defaults_function_feature_tokens(bitfield: &Bitfield) -> TokenStream {
let visibility_tokens = bitfield.visibility().to_tokens();
let function_modifier_tokens = get_function_modifier_tokens(bitfield);
let function_implementation = generate_new_function_implementation_tokens(
bitfield, false,
false, false,
);
quote! {
#[doc = "Creates a new bitfield instance without respecting \
default values."]
#visibility_tokens #function_modifier_tokens fn new_without_defaults() -> Self {
#function_implementation
this
}
}
}
}