Make Debug fancy again and handle #[cfg] properly. #14
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Debug
was implemented using the nice readable flag names in #7, but the flag names were removed in #9 because it used$Flags
which 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 friendlyDebug
again, 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
$value
successfully. This change causes this to work:(Formerly
all()
was still trying to useA.bits
whencfg(not(a))
and thusA
wasn’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.