@@ -1990,7 +1990,7 @@ impl<'a> Parser<'a> {
1990
1990
let lo = self . meta_var_span . unwrap_or ( self . span ) ;
1991
1991
let mut segments = Vec :: new ( ) ;
1992
1992
if self . eat ( & token:: ModSep ) {
1993
- segments. push ( PathSegment :: crate_root ( lo) ) ;
1993
+ segments. push ( PathSegment :: crate_root ( lo. shrink_to_lo ( ) ) ) ;
1994
1994
}
1995
1995
self . parse_path_segments ( & mut segments, style, enable_warning) ?;
1996
1996
@@ -2025,7 +2025,7 @@ impl<'a> Parser<'a> {
2025
2025
loop {
2026
2026
segments. push ( self . parse_path_segment ( style, enable_warning) ?) ;
2027
2027
2028
- if self . is_import_coupler ( false ) || !self . eat ( & token:: ModSep ) {
2028
+ if self . is_import_coupler ( ) || !self . eat ( & token:: ModSep ) {
2029
2029
return Ok ( ( ) ) ;
2030
2030
}
2031
2031
}
@@ -6483,9 +6483,8 @@ impl<'a> Parser<'a> {
6483
6483
let item_ = ItemKind :: Use ( P ( self . parse_use_tree ( ) ?) ) ;
6484
6484
self . expect ( & token:: Semi ) ?;
6485
6485
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) ;
6489
6488
return Ok ( Some ( item) ) ;
6490
6489
}
6491
6490
@@ -6960,83 +6959,53 @@ impl<'a> Parser<'a> {
6960
6959
} ) )
6961
6960
}
6962
6961
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 ) )
6978
6967
}
6979
6968
6980
6969
/// Parse UseTree
6981
6970
///
6982
- /// USE_TREE = `*` |
6983
- /// `{` USE_TREE_LIST `}` |
6971
+ /// USE_TREE = [`::`] `*` |
6972
+ /// [`::`] `{` USE_TREE_LIST `}` |
6984
6973
/// PATH `::` `*` |
6985
6974
/// PATH `::` `{` USE_TREE_LIST `}` |
6986
6975
/// PATH [`as` IDENT]
6987
6976
fn parse_use_tree ( & mut self ) -> PResult < ' a , UseTree > {
6988
6977
let lo = self . span ;
6989
6978
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 ::{...};`
6999
6984
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 ( ) ) ) ;
7001
6986
}
7002
6987
7003
6988
if self . eat ( & token:: BinOp ( token:: Star ) ) {
7004
- // `use *;`
7005
6989
UseTreeKind :: Glob
7006
- } else if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
7007
- // `use {...};`
7008
- UseTreeKind :: Nested ( self . parse_use_tree_list ( ) ?)
7009
6990
} else {
7010
- return self . unexpected ( ) ;
6991
+ UseTreeKind :: Nested ( self . parse_use_tree_list ( ) ? )
7011
6992
}
7012
6993
} 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 ) ?;
7018
6996
7019
6997
if self . eat ( & token:: ModSep ) {
7020
6998
if self . eat ( & token:: BinOp ( token:: Star ) ) {
7021
- // `use path::*;`
7022
6999
UseTreeKind :: Glob
7023
- } else if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
7024
- // `use path::{...};`
7025
- UseTreeKind :: Nested ( self . parse_use_tree_list ( ) ?)
7026
7000
} else {
7027
- return self . unexpected ( ) ;
7001
+ UseTreeKind :: Nested ( self . parse_use_tree_list ( ) ? )
7028
7002
}
7029
7003
} else {
7030
- // `use path::foo;` or `use path::foo as bar;`
7031
7004
UseTreeKind :: Simple ( self . parse_rename ( ) ?)
7032
7005
}
7033
7006
} ;
7034
7007
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 ) } )
7040
7009
}
7041
7010
7042
7011
/// Parse UseTreeKind::Nested(list)
0 commit comments