From 6cd9f944098dafb1c0fb9e9a3d9d3fb3fdc625d6 Mon Sep 17 00:00:00 2001 From: Alissa Rao Date: Mon, 4 Apr 2022 00:56:10 -0700 Subject: [PATCH] Use proc-macro-crate to allow easier use when enumset is renamed. --- enumset/src/lib.rs | 3 ++- enumset_derive/Cargo.toml | 1 + enumset_derive/src/lib.rs | 12 +++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/enumset/src/lib.rs b/enumset/src/lib.rs index b05fcf7..0ff95fb 100644 --- a/enumset/src/lib.rs +++ b/enumset/src/lib.rs @@ -164,7 +164,8 @@ use crate::repr::EnumSetTypeRepr; /// automatically derived versions, or unintentional behavior may be a result. /// * `#[enumset(no_ops)` prevents the derive from implementing any operator traits. /// * `#[enumset(crate_name = "enumset2")]` may be used to change the name of the `enumset` crate -/// used in the generated code, if you have renamed the crate via cargo options. +/// used in the generated code. By default enumset parses `Cargo.toml` to determine the name of +/// the crate, or falls back to `enumset` if it cannot be parsed. /// /// When the `serde` feature is used, the following features may also be specified. These options /// may be used (with no effect) when building without the feature enabled: diff --git a/enumset_derive/Cargo.toml b/enumset_derive/Cargo.toml index aeed2dc..48f40d9 100644 --- a/enumset_derive/Cargo.toml +++ b/enumset_derive/Cargo.toml @@ -22,3 +22,4 @@ darling = { version = "0.13.0", default-features = false } syn = "1" quote = "1" proc-macro2 = "1" +proc-macro-crate = "1.1.3" diff --git a/enumset_derive/src/lib.rs b/enumset_derive/src/lib.rs index 993ccc0..b779b8e 100644 --- a/enumset_derive/src/lib.rs +++ b/enumset_derive/src/lib.rs @@ -6,6 +6,7 @@ use darling::*; use proc_macro::TokenStream; use proc_macro2::{TokenStream as SynTokenStream, Literal, Span}; use std::collections::HashSet; +use proc_macro_crate::FoundCrate; use syn::{*, Result, Error}; use syn::spanned::Spanned; use quote::*; @@ -242,7 +243,16 @@ fn enum_set_type_impl(info: EnumSetInfo) -> SynTokenStream { let name = &info.name; let enumset = match &info.crate_name { Some(crate_name) => quote!(::#crate_name), - None => quote!(::enumset), + None => { + let crate_name = proc_macro_crate::crate_name("enumset"); + match crate_name { + Ok(FoundCrate::Name(name)) => { + let ident = Ident::new(&name, Span::call_site()); + quote!(::#ident) + } + _ => quote!(::enumset), + } + }, }; let typed_enumset = quote!(#enumset::EnumSet<#name>); let core = quote!(#enumset::__internal::core_export); -- 2.44.0