@@ -4630,7 +4630,7 @@ impl<'a> Parser<'a> {
4630
4630
4631
4631
let mut attrs = self . parse_outer_attributes ( ) ?;
4632
4632
let lo = self . span . lo ;
4633
- let vis = self . parse_visibility ( true ) ?;
4633
+ let vis = self . parse_visibility ( ) ?;
4634
4634
let defaultness = self . parse_defaultness ( ) ?;
4635
4635
let ( name, node) = if self . eat_keyword ( keywords:: Type ) {
4636
4636
let name = self . parse_ident ( ) ?;
@@ -4963,7 +4963,7 @@ impl<'a> Parser<'a> {
4963
4963
|p| {
4964
4964
let attrs = p. parse_outer_attributes ( ) ?;
4965
4965
let lo = p. span . lo ;
4966
- let mut vis = p. parse_visibility ( false ) ?;
4966
+ let mut vis = p. parse_visibility ( ) ?;
4967
4967
let ty_is_interpolated =
4968
4968
p. token . is_interpolated ( ) || p. look_ahead ( 1 , |t| t. is_interpolated ( ) ) ;
4969
4969
let mut ty = p. parse_ty ( ) ?;
@@ -5020,38 +5020,46 @@ impl<'a> Parser<'a> {
5020
5020
fn parse_struct_decl_field ( & mut self ) -> PResult < ' a , StructField > {
5021
5021
let attrs = self . parse_outer_attributes ( ) ?;
5022
5022
let lo = self . span . lo ;
5023
- let vis = self . parse_visibility ( true ) ?;
5023
+ let vis = self . parse_visibility ( ) ?;
5024
5024
self . parse_single_struct_field ( lo, vis, attrs)
5025
5025
}
5026
5026
5027
- // If `allow_path` is false, just parse the `pub` in `pub(path)` (but still parse `pub(crate)`)
5028
- fn parse_visibility ( & mut self , allow_path : bool ) -> PResult < ' a , Visibility > {
5029
- let pub_crate = |this : & mut Self | {
5030
- let span = this. prev_span ;
5031
- this. expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
5032
- Ok ( Visibility :: Crate ( span) )
5033
- } ;
5034
-
5027
+ // Parse `pub`, `pub(crate)` and `pub(in path)` plus shortcuts
5028
+ // `pub(self)` for `pub(in self)` and `pub(super)` for `pub(in super)`.
5029
+ fn parse_visibility ( & mut self ) -> PResult < ' a , Visibility > {
5035
5030
if !self . eat_keyword ( keywords:: Pub ) {
5036
- Ok ( Visibility :: Inherited )
5037
- } else if !allow_path {
5038
- // Look ahead to avoid eating the `(` in `pub(path)` while still parsing `pub(crate)`
5039
- if self . token == token:: OpenDelim ( token:: Paren ) &&
5040
- self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Crate ) ) {
5041
- self . bump ( ) ; self . bump ( ) ;
5042
- pub_crate ( self )
5043
- } else {
5044
- Ok ( Visibility :: Public )
5045
- }
5046
- } else if !self . eat ( & token:: OpenDelim ( token:: Paren ) ) {
5047
- Ok ( Visibility :: Public )
5048
- } else if self . eat_keyword ( keywords:: Crate ) {
5049
- pub_crate ( self )
5050
- } else {
5051
- let path = self . parse_path ( PathStyle :: Mod ) ?. default_to_global ( ) ;
5052
- self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
5053
- Ok ( Visibility :: Restricted { path : P ( path) , id : ast:: DUMMY_NODE_ID } )
5054
- }
5031
+ return Ok ( Visibility :: Inherited )
5032
+ }
5033
+
5034
+ if self . check ( & token:: OpenDelim ( token:: Paren ) ) {
5035
+ if self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Crate ) ) {
5036
+ // `pub(crate)`
5037
+ self . bump ( ) ; // `(`
5038
+ self . bump ( ) ; // `crate`
5039
+ let vis = Visibility :: Crate ( self . prev_span ) ;
5040
+ self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?; // `)`
5041
+ return Ok ( vis)
5042
+ } else if self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: In ) ) {
5043
+ // `pub(in path)`
5044
+ self . bump ( ) ; // `(`
5045
+ self . bump ( ) ; // `in`
5046
+ let path = self . parse_path ( PathStyle :: Mod ) ?. default_to_global ( ) ; // `path`
5047
+ let vis = Visibility :: Restricted { path : P ( path) , id : ast:: DUMMY_NODE_ID } ;
5048
+ self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?; // `)`
5049
+ return Ok ( vis)
5050
+ } else if self . look_ahead ( 2 , |t| t == & token:: CloseDelim ( token:: Paren ) ) &&
5051
+ self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Super ) ||
5052
+ t. is_keyword ( keywords:: SelfValue ) ) {
5053
+ // `pub(self)` or `pub(super)`
5054
+ self . bump ( ) ; // `(`
5055
+ let path = self . parse_path ( PathStyle :: Mod ) ?. default_to_global ( ) ; // `super`/`self`
5056
+ let vis = Visibility :: Restricted { path : P ( path) , id : ast:: DUMMY_NODE_ID } ;
5057
+ self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?; // `)`
5058
+ return Ok ( vis)
5059
+ }
5060
+ }
5061
+
5062
+ Ok ( Visibility :: Public )
5055
5063
}
5056
5064
5057
5065
/// Parse defaultness: DEFAULT or nothing
@@ -5526,7 +5534,7 @@ impl<'a> Parser<'a> {
5526
5534
5527
5535
let lo = self . span . lo ;
5528
5536
5529
- let visibility = self . parse_visibility ( true ) ?;
5537
+ let visibility = self . parse_visibility ( ) ?;
5530
5538
5531
5539
if self . eat_keyword ( keywords:: Use ) {
5532
5540
// USE ITEM
@@ -5801,7 +5809,7 @@ impl<'a> Parser<'a> {
5801
5809
fn parse_foreign_item ( & mut self ) -> PResult < ' a , Option < ForeignItem > > {
5802
5810
let attrs = self . parse_outer_attributes ( ) ?;
5803
5811
let lo = self . span . lo ;
5804
- let visibility = self . parse_visibility ( true ) ?;
5812
+ let visibility = self . parse_visibility ( ) ?;
5805
5813
5806
5814
if self . check_keyword ( keywords:: Static ) {
5807
5815
// FOREIGN STATIC ITEM
0 commit comments