Use format_ident! when creating new identifiers in salsa-macros

This commit is contained in:
Lukas Wirth 2021-08-24 02:47:28 +02:00
parent 26b47e02e9
commit ea378103c3

View file

@ -37,14 +37,13 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
let mut queries = vec![]; let mut queries = vec![];
for item in input.items { for item in input.items {
if let TraitItem::Method(method) = item { if let TraitItem::Method(method) = item {
let query_name = method.sig.ident.to_string();
let mut storage = QueryStorage::Memoized; let mut storage = QueryStorage::Memoized;
let mut cycle = None; let mut cycle = None;
let mut invoke = None; let mut invoke = None;
let query_name = method.sig.ident.to_string();
let mut query_type = Ident::new( let mut query_type = format_ident!("{}Query", query_name.to_string().to_camel_case());
&format!("{}Query", method.sig.ident.to_string().to_camel_case()),
Span::call_site(),
);
let mut num_storages = 0; let mut num_storages = 0;
// Extract attributes. // Extract attributes.
@ -88,9 +87,10 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
} }
} }
let sig_span = method.sig.span();
// Check attribute combinations. // Check attribute combinations.
if num_storages > 1 { if num_storages > 1 {
return Error::new(method.sig.span(), "multiple storage attributes specified") return Error::new(sig_span, "multiple storage attributes specified")
.to_compile_error() .to_compile_error()
.into(); .into();
} }
@ -112,11 +112,8 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
Some(FnArg::Receiver(sr)) if sr.mutability.is_none() => (), Some(FnArg::Receiver(sr)) if sr.mutability.is_none() => (),
_ => { _ => {
return Error::new( return Error::new(
method.sig.span(), sig_span,
format!( format!("first argument of query `{}` must be `&self`", query_name),
"first argument of query `{}` must be `&self`",
method.sig.ident,
),
) )
.to_compile_error() .to_compile_error()
.into(); .into();
@ -128,14 +125,14 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
FnArg::Typed(syn::PatType { pat, ty, .. }) => keys.push(( FnArg::Typed(syn::PatType { pat, ty, .. }) => keys.push((
match pat.as_ref() { match pat.as_ref() {
syn::Pat::Ident(ident_pat) => ident_pat.ident.clone(), syn::Pat::Ident(ident_pat) => ident_pat.ident.clone(),
_ => Ident::new(&format!("key{}", idx), Span::call_site()), _ => format_ident!("key{}", idx),
}, },
Type::clone(ty), Type::clone(ty),
)), )),
arg => { arg => {
return Error::new( return Error::new(
arg.span(), arg.span(),
format!("unsupported argument `{:?}` of `{}`", arg, method.sig.ident,), format!("unsupported argument `{:?}` of `{}`", arg, query_name,),
) )
.to_compile_error() .to_compile_error()
.into(); .into();
@ -149,10 +146,7 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
ref ret => { ref ret => {
return Error::new( return Error::new(
ret.span(), ret.span(),
format!( format!("unsupported return type `{:?}` of `{}`", ret, query_name),
"unsupported return type `{:?}` of `{}`",
ret, method.sig.ident
),
) )
.to_compile_error() .to_compile_error()
.into(); .into();
@ -169,23 +163,15 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
// //
// fn lookup_foo(&self, x: u32) -> (Key1, Key2) // fn lookup_foo(&self, x: u32) -> (Key1, Key2)
let lookup_query = if let QueryStorage::Interned = storage { let lookup_query = if let QueryStorage::Interned = storage {
let lookup_query_type = Ident::new( let lookup_query_type =
&format!( format_ident!("{}LookupQuery", query_name.to_string().to_camel_case());
"{}LookupQuery", let lookup_fn_name = format_ident!("lookup_{}", query_name);
method.sig.ident.to_string().to_camel_case()
),
Span::call_site(),
);
let lookup_fn_name = Ident::new(
&format!("lookup_{}", method.sig.ident.to_string()),
method.sig.ident.span(),
);
let keys = keys.iter().map(|(_, ty)| ty); let keys = keys.iter().map(|(_, ty)| ty);
let lookup_value: Type = parse_quote!((#(#keys),*)); let lookup_value: Type = parse_quote!((#(#keys),*));
let lookup_keys = vec![(parse_quote! { key }, value.clone())]; let lookup_keys = vec![(parse_quote! { key }, value.clone())];
Some(Query { Some(Query {
query_type: lookup_query_type, query_type: lookup_query_type,
query_name: format!("lookup_{}", query_name), query_name: format!("{}", lookup_fn_name),
fn_name: lookup_fn_name, fn_name: lookup_fn_name,
attrs: vec![], // FIXME -- some automatically generated docs on this method? attrs: vec![], // FIXME -- some automatically generated docs on this method?
storage: QueryStorage::InternedLookup { storage: QueryStorage::InternedLookup {
@ -216,10 +202,7 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
} }
} }
let group_storage = Ident::new( let group_storage = format_ident!("{}GroupStorage__", trait_name, span = Span::call_site());
&format!("{}GroupStorage__", trait_name.to_string()),
Span::call_site(),
);
let mut query_fn_declarations = proc_macro2::TokenStream::new(); let mut query_fn_declarations = proc_macro2::TokenStream::new();
let mut query_fn_definitions = proc_macro2::TokenStream::new(); let mut query_fn_definitions = proc_macro2::TokenStream::new();
@ -268,9 +251,8 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
// For input queries, we need `set_foo` etc // For input queries, we need `set_foo` etc
if let QueryStorage::Input = query.storage { if let QueryStorage::Input = query.storage {
let set_fn_name = Ident::new(&format!("set_{}", fn_name), fn_name.span()); let set_fn_name = format_ident!("set_{}", fn_name);
let set_with_durability_fn_name = let set_with_durability_fn_name = format_ident!("set_{}_with_durability", fn_name);
Ident::new(&format!("set_{}_with_durability", fn_name), fn_name.span());
let set_fn_docs = format!( let set_fn_docs = format!(
" "