mirror of
https://github.com/Noratrieb/cargo-minimize.git
synced 2026-01-14 16:35:01 +01:00
more
This commit is contained in:
parent
e4127f3e96
commit
133d42d9ba
2 changed files with 86 additions and 1 deletions
81
src/passes/field_deleter.rs
Normal file
81
src/passes/field_deleter.rs
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
use quote::ToTokens;
|
||||
use syn::{visit_mut::VisitMut, Fields};
|
||||
|
||||
use crate::processor::{tracking, Pass, PassController, ProcessState, SourceFile};
|
||||
|
||||
struct Visitor<'a> {
|
||||
current_path: Vec<String>,
|
||||
checker: &'a mut PassController,
|
||||
process_state: ProcessState,
|
||||
}
|
||||
|
||||
impl<'a> Visitor<'a> {
|
||||
fn new(checker: &'a mut PassController) -> Self {
|
||||
Self {
|
||||
current_path: Vec::new(),
|
||||
checker,
|
||||
process_state: ProcessState::NoChange,
|
||||
}
|
||||
}
|
||||
|
||||
fn consider_deleting_field(&mut self, name: String) -> bool {
|
||||
self.current_path.push(name);
|
||||
let can_process = self.checker.can_process(&self.current_path);
|
||||
if can_process {
|
||||
self.process_state = ProcessState::Changed;
|
||||
}
|
||||
self.current_path.pop();
|
||||
!can_process
|
||||
}
|
||||
}
|
||||
|
||||
impl VisitMut for Visitor<'_> {
|
||||
fn visit_fields_mut(&mut self, fields: &mut syn::Fields) {
|
||||
match fields {
|
||||
Fields::Named(named) => {
|
||||
named.named = named
|
||||
.named
|
||||
.clone()
|
||||
.into_pairs()
|
||||
.filter(|pair| {
|
||||
let field = pair.value();
|
||||
self.consider_deleting_field(field.ident.as_ref().unwrap().to_string())
|
||||
})
|
||||
.collect();
|
||||
}
|
||||
Fields::Unnamed(unnamed) => {
|
||||
unnamed.unnamed = unnamed
|
||||
.unnamed
|
||||
.clone()
|
||||
.into_pairs()
|
||||
.enumerate()
|
||||
.filter(|(i, _)| self.consider_deleting_field(i.to_string()))
|
||||
.map(|(_, f)| f)
|
||||
.collect();
|
||||
}
|
||||
Fields::Unit => {}
|
||||
}
|
||||
}
|
||||
|
||||
tracking!();
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct FieldDeleter;
|
||||
|
||||
impl Pass for FieldDeleter {
|
||||
fn process_file(
|
||||
&mut self,
|
||||
krate: &mut syn::File,
|
||||
_: &SourceFile,
|
||||
checker: &mut PassController,
|
||||
) -> ProcessState {
|
||||
let mut visitor = Visitor::new(checker);
|
||||
visitor.visit_file_mut(krate);
|
||||
visitor.process_state
|
||||
}
|
||||
|
||||
fn name(&self) -> &'static str {
|
||||
"field-deleter"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,9 @@
|
|||
mod everybody_loops;
|
||||
mod field_deleter;
|
||||
mod item_deleter;
|
||||
mod privatize;
|
||||
|
||||
pub use self::{everybody_loops::EverybodyLoops, item_deleter::ItemDeleter, privatize::Privatize};
|
||||
pub use self::{
|
||||
everybody_loops::EverybodyLoops, field_deleter::FieldDeleter, item_deleter::ItemDeleter,
|
||||
privatize::Privatize,
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue