@@ -1990,7 +1990,7 @@ impl<'a> Parser<'a> {
19901990 let lo = self . meta_var_span . unwrap_or ( self . span ) ;
19911991 let mut segments = Vec :: new ( ) ;
19921992 if self . eat ( & token:: ModSep ) {
1993- segments. push ( PathSegment :: crate_root ( lo) ) ;
1993+ segments. push ( PathSegment :: crate_root ( lo. shrink_to_lo ( ) ) ) ;
19941994 }
19951995 self . parse_path_segments ( & mut segments, style, enable_warning) ?;
19961996
@@ -2025,7 +2025,7 @@ impl<'a> Parser<'a> {
20252025 loop {
20262026 segments. push ( self . parse_path_segment ( style, enable_warning) ?) ;
20272027
2028- if self . is_import_coupler ( false ) || !self . eat ( & token:: ModSep ) {
2028+ if self . is_import_coupler ( ) || !self . eat ( & token:: ModSep ) {
20292029 return Ok ( ( ) ) ;
20302030 }
20312031 }
@@ -6483,9 +6483,8 @@ impl<'a> Parser<'a> {
64836483 let item_ = ItemKind :: Use ( P ( self . parse_use_tree ( ) ?) ) ;
64846484 self . expect ( & token:: Semi ) ?;
64856485
6486- let prev_span = self . prev_span ;
6487- let invalid = keywords:: Invalid . ident ( ) ;
6488- let item = self . mk_item ( lo. to ( prev_span) , invalid, item_, visibility, attrs) ;
6486+ let span = lo. to ( self . prev_span ) ;
6487+ let item = self . mk_item ( span, keywords:: Invalid . ident ( ) , item_, visibility, attrs) ;
64896488 return Ok ( Some ( item) ) ;
64906489 }
64916490
@@ -6960,83 +6959,53 @@ impl<'a> Parser<'a> {
69606959 } ) )
69616960 }
69626961
6963- /// `{` or `::{` or `*` or `::*`
6964- /// `::{` or `::*` (also `{` or `*` if unprefixed is true)
6965- fn is_import_coupler ( & mut self , unprefixed : bool ) -> bool {
6966- self . is_import_coupler_inner ( & token:: OpenDelim ( token:: Brace ) , unprefixed) ||
6967- self . is_import_coupler_inner ( & token:: BinOp ( token:: Star ) , unprefixed)
6968- }
6969-
6970- fn is_import_coupler_inner ( & mut self , token : & token:: Token , unprefixed : bool ) -> bool {
6971- if self . check ( & token:: ModSep ) {
6972- self . look_ahead ( 1 , |t| t == token)
6973- } else if unprefixed {
6974- self . check ( token)
6975- } else {
6976- false
6977- }
6962+ /// `::{` or `::*`
6963+ fn is_import_coupler ( & mut self ) -> bool {
6964+ self . check ( & token:: ModSep ) &&
6965+ self . look_ahead ( 1 , |t| * t == token:: OpenDelim ( token:: Brace ) ||
6966+ * t == token:: BinOp ( token:: Star ) )
69786967 }
69796968
69806969 /// Parse UseTree
69816970 ///
6982- /// USE_TREE = `*` |
6983- /// `{` USE_TREE_LIST `}` |
6971+ /// USE_TREE = [`::`] `*` |
6972+ /// [`::`] `{` USE_TREE_LIST `}` |
69846973 /// PATH `::` `*` |
69856974 /// PATH `::` `{` USE_TREE_LIST `}` |
69866975 /// PATH [`as` IDENT]
69876976 fn parse_use_tree ( & mut self ) -> PResult < ' a , UseTree > {
69886977 let lo = self . span ;
69896978
6990- let mut prefix = ast:: Path {
6991- segments : vec ! [ ] ,
6992- span : lo. to ( self . span ) ,
6993- } ;
6994-
6995- let kind = if self . is_import_coupler ( true ) {
6996- // `use *;` or `use ::*;` or `use {...};` `use ::{...};`
6997-
6998- // Remove the first `::`
6979+ let mut prefix = ast:: Path { segments : Vec :: new ( ) , span : lo. shrink_to_lo ( ) } ;
6980+ let kind = if self . check ( & token:: OpenDelim ( token:: Brace ) ) ||
6981+ self . check ( & token:: BinOp ( token:: Star ) ) ||
6982+ self . is_import_coupler ( ) {
6983+ // `use *;` or `use ::*;` or `use {...};` or `use ::{...};`
69996984 if self . eat ( & token:: ModSep ) {
7000- prefix. segments . push ( PathSegment :: crate_root ( self . prev_span ) ) ;
6985+ prefix. segments . push ( PathSegment :: crate_root ( lo . shrink_to_lo ( ) ) ) ;
70016986 }
70026987
70036988 if self . eat ( & token:: BinOp ( token:: Star ) ) {
7004- // `use *;`
70056989 UseTreeKind :: Glob
7006- } else if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
7007- // `use {...};`
7008- UseTreeKind :: Nested ( self . parse_use_tree_list ( ) ?)
70096990 } else {
7010- return self . unexpected ( ) ;
6991+ UseTreeKind :: Nested ( self . parse_use_tree_list ( ) ? )
70116992 }
70126993 } else {
7013- // `use path::...;`
7014- let mut parsed = self . parse_path ( PathStyle :: Mod ) ?;
7015-
7016- prefix. segments . append ( & mut parsed. segments ) ;
7017- prefix. span = prefix. span . to ( parsed. span ) ;
6994+ // `use path::*;` or `use path::{...};` or `use path;` or `use path as bar;`
6995+ prefix = self . parse_path ( PathStyle :: Mod ) ?;
70186996
70196997 if self . eat ( & token:: ModSep ) {
70206998 if self . eat ( & token:: BinOp ( token:: Star ) ) {
7021- // `use path::*;`
70226999 UseTreeKind :: Glob
7023- } else if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
7024- // `use path::{...};`
7025- UseTreeKind :: Nested ( self . parse_use_tree_list ( ) ?)
70267000 } else {
7027- return self . unexpected ( ) ;
7001+ UseTreeKind :: Nested ( self . parse_use_tree_list ( ) ? )
70287002 }
70297003 } else {
7030- // `use path::foo;` or `use path::foo as bar;`
70317004 UseTreeKind :: Simple ( self . parse_rename ( ) ?)
70327005 }
70337006 } ;
70347007
7035- Ok ( UseTree {
7036- span : lo. to ( self . prev_span ) ,
7037- kind,
7038- prefix,
7039- } )
7008+ Ok ( UseTree { prefix, kind, span : lo. to ( self . prev_span ) } )
70407009 }
70417010
70427011 /// Parse UseTreeKind::Nested(list)
0 commit comments