Make Debug fancy again and handle #[cfg] properly. #14
No reviewers
Labels
No labels
bug
good first issue
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gh-bitflags/bitflags!14
Loading…
Reference in a new issue
No description provided.
Delete branch "master"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Debugwas implemented using the nice readable flag names in #7, but the flag names were removed in #9 because it used$Flagswhich broke trivial#[cfg]-based removal of flags. Changing.contains($Flag)to.contains($BitFlags { bits: $value })instead (akin to what.all()did) would have fixed that issue, allowing a friendlyDebugagain, but then I found a further improvement to make, because the#[cfg]behaviour was still off, as a flag’s value was still written out regardless of the#[cfg]attribute, so if it contained stuff that didn’t existbitflags!would still blow up. This is inconsistent with how such things work in Rust proper, so I’ve fixed it.The fix is rather convoluted, involving a dummy module, a bunch of dummy constants, a nested function and glob imports, but it works, avoiding referring to
$valuesuccessfully. This change causes this to work:(Formerly
all()was still trying to useA.bitswhencfg(not(a))and thusAwasn’t defined.)This change allows
#[cfg]on a flag to work like it should, allowing it to depend on things that don’t exist unless the conditions are met. Sure, that seems a pretty rare case for flags, but it’s real. Beyond the style of example above, my imagined scenario is a -sys crate having declared certain flag values, but only when certain features are enabled, and so when defining the bitflags in another crate (for the -sys crate doesn’t use bitflags) you can only use those values with the appropriate features.Thanks!