@@ -70,6 +70,7 @@ bitflags! {
70
70
const RESTRICTION_STMT_EXPR = 1 << 0 ,
71
71
const RESTRICTION_NO_STRUCT_LITERAL = 1 << 1 ,
72
72
const NO_NONINLINE_MOD = 1 << 2 ,
73
+ const ALLOW_MODULE_PATHS = 1 << 3 ,
73
74
}
74
75
}
75
76
@@ -560,7 +561,9 @@ impl<'a> Parser<'a> {
560
561
}
561
562
562
563
pub fn parse_ident ( & mut self ) -> PResult < ' a , ast:: Ident > {
563
- self . check_strict_keywords ( ) ;
564
+ if !self . restrictions . contains ( Restrictions :: ALLOW_MODULE_PATHS ) {
565
+ self . check_strict_keywords ( ) ;
566
+ }
564
567
self . check_reserved_keywords ( ) ;
565
568
match self . token {
566
569
token:: Ident ( i, _) => {
@@ -4938,7 +4941,7 @@ impl<'a> Parser<'a> {
4938
4941
4939
4942
let mut attrs = self . parse_outer_attributes ( ) ?;
4940
4943
let lo = self . span . lo ;
4941
- let vis = self . parse_visibility ( ) ?;
4944
+ let vis = self . parse_visibility ( true ) ?;
4942
4945
let defaultness = self . parse_defaultness ( ) ?;
4943
4946
let ( name, node) = if self . eat_keyword ( keywords:: Type ) {
4944
4947
let name = self . parse_ident ( ) ?;
@@ -5250,7 +5253,7 @@ impl<'a> Parser<'a> {
5250
5253
|p| {
5251
5254
let attrs = p. parse_outer_attributes ( ) ?;
5252
5255
let lo = p. span . lo ;
5253
- let vis = p. parse_visibility ( ) ?;
5256
+ let vis = p. parse_visibility ( false ) ?;
5254
5257
let ty = p. parse_ty_sum ( ) ?;
5255
5258
Ok ( StructField {
5256
5259
span : mk_sp ( lo, p. span . hi ) ,
@@ -5290,20 +5293,26 @@ impl<'a> Parser<'a> {
5290
5293
5291
5294
/// Parse an element of a struct definition
5292
5295
fn parse_struct_decl_field ( & mut self ) -> PResult < ' a , StructField > {
5293
-
5294
5296
let attrs = self . parse_outer_attributes ( ) ?;
5295
-
5296
- if self . eat_keyword ( keywords:: Pub ) {
5297
- return self . parse_single_struct_field ( Visibility :: Public , attrs) ;
5298
- }
5299
-
5300
- return self . parse_single_struct_field ( Visibility :: Inherited , attrs) ;
5297
+ let vis = self . parse_visibility ( true ) ?;
5298
+ self . parse_single_struct_field ( vis, attrs)
5301
5299
}
5302
5300
5303
- /// Parse visibility: PUB or nothing
5304
- fn parse_visibility ( & mut self ) -> PResult < ' a , Visibility > {
5305
- if self . eat_keyword ( keywords:: Pub ) { Ok ( Visibility :: Public ) }
5306
- else { Ok ( Visibility :: Inherited ) }
5301
+ fn parse_visibility ( & mut self , allow_restricted : bool ) -> PResult < ' a , Visibility > {
5302
+ if !self . eat_keyword ( keywords:: Pub ) {
5303
+ Ok ( Visibility :: Inherited )
5304
+ } else if !allow_restricted || !self . eat ( & token:: OpenDelim ( token:: Paren ) ) {
5305
+ Ok ( Visibility :: Public )
5306
+ } else if self . eat_keyword ( keywords:: Crate ) {
5307
+ let span = self . last_span ;
5308
+ self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
5309
+ Ok ( Visibility :: Crate ( span) )
5310
+ } else {
5311
+ let path = self . with_res ( Restrictions :: ALLOW_MODULE_PATHS ,
5312
+ |this| this. parse_path ( NoTypesAllowed ) ) ?;
5313
+ self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
5314
+ Ok ( Visibility :: Restricted { path : P ( path) , id : ast:: DUMMY_NODE_ID } )
5315
+ }
5307
5316
}
5308
5317
5309
5318
/// Parse defaultness: DEFAULT or nothing
@@ -5765,7 +5774,7 @@ impl<'a> Parser<'a> {
5765
5774
5766
5775
let lo = self . span . lo ;
5767
5776
5768
- let visibility = self . parse_visibility ( ) ?;
5777
+ let visibility = self . parse_visibility ( true ) ?;
5769
5778
5770
5779
if self . eat_keyword ( keywords:: Use ) {
5771
5780
// USE ITEM
@@ -6015,7 +6024,7 @@ impl<'a> Parser<'a> {
6015
6024
fn parse_foreign_item ( & mut self ) -> PResult < ' a , Option < ForeignItem > > {
6016
6025
let attrs = self . parse_outer_attributes ( ) ?;
6017
6026
let lo = self . span . lo ;
6018
- let visibility = self . parse_visibility ( ) ?;
6027
+ let visibility = self . parse_visibility ( true ) ?;
6019
6028
6020
6029
if self . check_keyword ( keywords:: Static ) {
6021
6030
// FOREIGN STATIC ITEM
0 commit comments