usecrate::common::visit::{AsIfPrinted, FlattenParens}; use quote::ToTokens as _; use std::fs; use std::panic; use std::path::Path; use std::sync::atomic::{AtomicUsize, Ordering}; use syn::visit_mut::VisitMut as _;
let failed = failed.into_inner(); if failed > 0 {
panic!("{} failures", failed);
}
}
fn test(path: &Path, failed: &AtomicUsize) { let content = fs::read_to_string(path).unwrap();
match panic::catch_unwind(|| -> syn::Result<()> { letmut before = syn::parse_file(&content)?;
FlattenParens::discard_attrs().visit_file_mut(&mut before); let printed = before.to_token_stream(); letmut after = syn::parse2::<syn::File>(printed.clone())?;
FlattenParens::discard_attrs().visit_file_mut(&mut after); // Normalize features that we expect Syn not to print.
AsIfPrinted.visit_file_mut(&mut before); if before != after {
errorf!("=== {}\n", path.display()); if failed.fetch_add(1, Ordering::Relaxed) == 0 {
errorf!("BEFORE:\n{:#?}\nAFTER:\n{:#?}\n", before, after);
}
}
Ok(())
}) {
Err(_) => {
errorf!("=== {}: syn panic\n", path.display());
failed.fetch_add(1, Ordering::Relaxed);
}
Ok(Err(msg)) => {
errorf!("=== {}: syn failed to parse\n{:?}\n", path.display(), msg);
failed.fetch_add(1, Ordering::Relaxed);
}
Ok(Ok(())) => {}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.