refactor: Stop using Ident as BTreeMap key

Using Ident as the key type is inconvenient since creating an Ident
requires the specification of a Span, which isn't actually used by
the Hash implementation of Ident.
This commit is contained in:
Martin Fischer
2023-01-21 05:40:31 +01:00
committed by Charlie Marsh
parent 4f12b31dc8
commit aedee7294e

View File

@@ -91,9 +91,9 @@ pub fn expand<'a>(
variant_name: impl Fn(&str) -> &'a Ident,
) -> proc_macro2::TokenStream {
// Build up a map from prefix to matching RuleCodes.
let mut prefix_to_codes: BTreeMap<Ident, BTreeSet<String>> = BTreeMap::default();
let mut prefix_to_codes: BTreeMap<String, BTreeSet<String>> = BTreeMap::default();
for variant in variants {
let span = variant.span();
let code_str = variant.to_string();
let code_prefix_len = code_str
.chars()
@@ -103,12 +103,12 @@ pub fn expand<'a>(
for i in 0..=code_suffix_len {
let prefix = code_str[..code_prefix_len + i].to_string();
prefix_to_codes
.entry(Ident::new(&prefix, span))
.entry(prefix)
.or_default()
.insert(code_str.clone());
}
prefix_to_codes
.entry(Ident::new(ALL, span))
.entry(ALL.to_string())
.or_default()
.insert(code_str.clone());
}
@@ -116,15 +116,16 @@ pub fn expand<'a>(
// Add any prefix aliases (e.g., "U" to "UP").
for (alias, rule_code) in PREFIX_REDIRECTS.iter() {
prefix_to_codes.insert(
Ident::new(alias, Span::call_site()),
(*alias).to_string(),
prefix_to_codes
.get(&Ident::new(rule_code, Span::call_site()))
.get(*rule_code)
.unwrap_or_else(|| panic!("Unknown RuleCode: {alias:?}"))
.clone(),
);
}
let prefix_variants = prefix_to_codes.keys().map(|prefix| {
let prefix = Ident::new(prefix, Span::call_site());
quote! {
#prefix
}
@@ -181,17 +182,17 @@ pub fn expand<'a>(
fn generate_impls<'a>(
rule_type: &Ident,
prefix_ident: &Ident,
prefix_to_codes: &BTreeMap<Ident, BTreeSet<String>>,
prefix_to_codes: &BTreeMap<String, BTreeSet<String>>,
variant_name: impl Fn(&str) -> &'a Ident,
) -> proc_macro2::TokenStream {
let into_iter_match_arms = prefix_to_codes.iter().map(|(prefix, codes)| {
let into_iter_match_arms = prefix_to_codes.iter().map(|(prefix_str, codes)| {
let codes = codes.iter().map(|code| {
let rule_variant = variant_name(code);
quote! {
#rule_type::#rule_variant
}
});
let prefix_str = prefix.to_string();
let prefix = Ident::new(prefix_str, Span::call_site());
if let Some(target) = PREFIX_REDIRECTS.get(prefix_str.as_str()) {
quote! {
#prefix_ident::#prefix => {
@@ -208,17 +209,14 @@ fn generate_impls<'a>(
}
});
let specificity_match_arms = prefix_to_codes.keys().map(|prefix| {
if *prefix == ALL {
let specificity_match_arms = prefix_to_codes.keys().map(|prefix_str| {
let prefix = Ident::new(prefix_str, Span::call_site());
if prefix_str == ALL {
quote! {
#prefix_ident::#prefix => SuffixLength::None,
}
} else {
let num_numeric = prefix
.to_string()
.chars()
.filter(|char| char.is_numeric())
.count();
let num_numeric = prefix_str.chars().filter(|char| char.is_numeric()).count();
let suffix_len = match num_numeric {
0 => quote! { SuffixLength::Zero },
1 => quote! { SuffixLength::One },
@@ -233,11 +231,11 @@ fn generate_impls<'a>(
}
});
let categories = prefix_to_codes.keys().map(|prefix| {
let prefix_str = prefix.to_string();
let categories = prefix_to_codes.keys().map(|prefix_str| {
if prefix_str.chars().all(char::is_alphabetic)
&& !PREFIX_REDIRECTS.contains_key(&prefix_str.as_str())
{
let prefix = Ident::new(prefix_str, Span::call_site());
quote! {
#prefix_ident::#prefix,
}