Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pub(restricted) bitflags #72

Closed
dtolnay opened this issue Mar 7, 2017 · 2 comments
Closed

pub(restricted) bitflags #72

dtolnay opened this issue Mar 7, 2017 · 2 comments

Comments

@dtolnay
Copy link
Contributor

dtolnay commented Mar 7, 2017

cc rust-lang/rust#32409 - maybe no action is warranted until this feature is stable.

bitflags! {
    pub(super) flags Flags: u8 {
        const A = 1
    }
}
@kennytm
Copy link

kennytm commented Jun 13, 2017

pub(restricted) is now stable. But I think it is still blocked by :vis matcher (rust-lang/rust#41022) to allow a proper fix.


Currently the straightforward fix using :vis causes an error in example_generated.rs

error: local ambiguity: multiple parsing options: built-in NTs vis ('vis') or 1 other option.
  --> src/example_generated.rs:5:5
   |
4  | / bitflags! {
5  | |     /// This is the same `Flags` struct defined in the [crate level example](../index.html#example).
   | |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6  | |     /// Note that this struct is just for documentation purposes only, it must not be used outside
7  | |     /// this crate.
...  |
15 | |     }
16 | | }
   | |_- in this macro invocation

error: Could not compile `bitflags`.
(diff)
diff --git a/src/lib.rs b/src/lib.rs
index 1694837..356fba1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -8,6 +8,8 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(macro_vis_matcher)]
+
 //! A typesafe bitmask flag generator useful for sets of C-style bitmask flags.
 //! It can be used for creating typesafe wrappers around C APIs.
 //!
@@ -305,16 +307,16 @@ pub extern crate core as _core;
 /// ```
 #[macro_export]
 macro_rules! bitflags {
-    ($(#[$attr:meta])* pub struct $BitFlags:ident: $T:ty {
+    ($(#[$attr:meta])* $vis:vis struct $BitFlags:ident: $T:ty {
         $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr;)+
     }) => {
         #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
         $(#[$attr])*
-        pub struct $BitFlags {
+        $vis struct $BitFlags {
             bits: $T,
         }
 
-        $($(#[$Flag_attr])* pub const $Flag: $BitFlags = $BitFlags { bits: $value };)+
+        $($(#[$Flag_attr])* $vis const $Flag: $BitFlags = $BitFlags { bits: $value };)+
 
         __impl_bitflags! {
             struct $BitFlags: $T {
@@ -322,24 +324,6 @@ macro_rules! bitflags {
             }
         }
     };
-    ($(#[$attr:meta])* struct $BitFlags:ident: $T:ty {
-        $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr;)+
-    }) => {
-        #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
-        $(#[$attr])*
-        struct $BitFlags {
-            bits: $T,
-        }
-
-        $($(#[$Flag_attr])* const $Flag: $BitFlags = $BitFlags { bits: $value };)+
-
-        __impl_bitflags! {
-            struct $BitFlags: $T {
-                $($(#[$Flag_attr])* const $Flag = $value;)+
-            }
-        }
-
-    };
 }

@KodrAus
Copy link
Member

KodrAus commented Oct 10, 2017

It looks like using :vis here is unblocked now, right?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants