* Deduplicate feature check macros * Re-enable rust-analyzer for most of the workspace * Cargo fix * Turn off defmt * Only build xtask * Clippy pls * Fix CI * Fix paths * Always create doc directory first * Revert r-a * Update esp-hal-procmacros/src/lp_core.rs Co-authored-by: Dominic Fischer <14130965+Dominaezzz@users.noreply.github.com> --------- Co-authored-by: Dominic Fischer <14130965+Dominaezzz@users.noreply.github.com>
48 lines
1.1 KiB
Rust
48 lines
1.1 KiB
Rust
use proc_macro::TokenStream;
|
|
use syn::{parse::Error, spanned::Spanned, AttrStyle, Attribute};
|
|
|
|
pub(crate) enum WhiteListCaller {
|
|
Interrupt,
|
|
}
|
|
|
|
pub(crate) fn check_attr_whitelist(
|
|
attrs: &[Attribute],
|
|
caller: WhiteListCaller,
|
|
) -> Result<(), TokenStream> {
|
|
let whitelist = &[
|
|
"doc",
|
|
"link_section",
|
|
"cfg",
|
|
"allow",
|
|
"warn",
|
|
"deny",
|
|
"forbid",
|
|
"cold",
|
|
"ram",
|
|
"inline",
|
|
];
|
|
|
|
'o: for attr in attrs {
|
|
for val in whitelist {
|
|
if eq(attr, val) {
|
|
continue 'o;
|
|
}
|
|
}
|
|
|
|
let err_str = match caller {
|
|
WhiteListCaller::Interrupt => {
|
|
"this attribute is not allowed on an interrupt handler controlled by esp-hal"
|
|
}
|
|
};
|
|
|
|
return Err(Error::new(attr.span(), err_str).to_compile_error().into());
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Returns `true` if `attr.path` matches `name`
|
|
fn eq(attr: &Attribute, name: &str) -> bool {
|
|
attr.style == AttrStyle::Outer && attr.path().is_ident(name)
|
|
}
|