@@ -3459,64 +3459,57 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
34593459 let ns = if is_last { opt_ns. unwrap_or ( TypeNS ) } else { TypeNS } ;
34603460 let name = ident. name ;
34613461
3462- if i == 0 && ns == TypeNS && name == keywords:: SelfValue . name ( ) {
3463- let mut ctxt = ident. span . ctxt ( ) . modern ( ) ;
3464- module = Some ( ModuleOrUniformRoot :: Module (
3465- self . resolve_self ( & mut ctxt, self . current_module ) ) ) ;
3466- continue
3467- } else if allow_super && ns == TypeNS && name == keywords:: Super . name ( ) {
3468- let mut ctxt = ident. span . ctxt ( ) . modern ( ) ;
3469- let self_module_parent = match i {
3470- 0 => self . resolve_self ( & mut ctxt, self . current_module ) . parent ,
3471- _ => match module {
3472- Some ( ModuleOrUniformRoot :: Module ( module) ) => module. parent ,
3473- _ => None ,
3474- } ,
3475- } ;
3476- if let Some ( parent) = self_module_parent {
3477- module = Some ( ModuleOrUniformRoot :: Module (
3478- self . resolve_self ( & mut ctxt, parent) ) ) ;
3479- continue
3480- } else {
3462+ allow_super &= ns == TypeNS &&
3463+ ( name == keywords:: SelfValue . name ( ) ||
3464+ name == keywords:: Super . name ( ) ) ;
3465+
3466+ if ns == TypeNS {
3467+ if allow_super && name == keywords:: Super . name ( ) {
3468+ let mut ctxt = ident. span . ctxt ( ) . modern ( ) ;
3469+ let self_module = match i {
3470+ 0 => Some ( self . resolve_self ( & mut ctxt, self . current_module ) ) ,
3471+ _ => match module {
3472+ Some ( ModuleOrUniformRoot :: Module ( module) ) => Some ( module) ,
3473+ _ => None ,
3474+ } ,
3475+ } ;
3476+ if let Some ( self_module) = self_module {
3477+ if let Some ( parent) = self_module. parent {
3478+ module = Some ( ModuleOrUniformRoot :: Module (
3479+ self . resolve_self ( & mut ctxt, parent) ) ) ;
3480+ continue ;
3481+ }
3482+ }
34813483 let msg = "There are too many initial `super`s." . to_string ( ) ;
34823484 return PathResult :: Failed ( ident. span , msg, false ) ;
34833485 }
3484- }
3485- allow_super = false ;
3486-
3487- if ns == TypeNS {
34883486 if i == 0 {
3487+ if name == keywords:: SelfValue . name ( ) {
3488+ let mut ctxt = ident. span . ctxt ( ) . modern ( ) ;
3489+ module = Some ( ModuleOrUniformRoot :: Module (
3490+ self . resolve_self ( & mut ctxt, self . current_module ) ) ) ;
3491+ continue ;
3492+ }
34893493 if name == keywords:: Extern . name ( ) ||
34903494 name == keywords:: CrateRoot . name ( ) &&
34913495 self . session . features_untracked ( ) . extern_absolute_paths &&
34923496 self . session . rust_2018 ( ) {
34933497 module = Some ( ModuleOrUniformRoot :: UniformRoot ( name) ) ;
34943498 continue ;
34953499 }
3496- }
3497- if ( i == 0 && name == keywords:: CrateRoot . name ( ) ) ||
3498- ( i == 0 && name == keywords:: Crate . name ( ) ) ||
3499- ( i == 0 && name == keywords:: DollarCrate . name ( ) ) ||
3500- ( i == 1 && name == keywords:: Crate . name ( ) &&
3501- path[ 0 ] . name == keywords:: CrateRoot . name ( ) ) {
3502- // `::a::b`, `crate::a::b`, `::crate::a::b` or `$crate::a::b`
3503- module = Some ( ModuleOrUniformRoot :: Module (
3504- self . resolve_crate_root ( ident) ) ) ;
3505- continue
3500+ if name == keywords:: CrateRoot . name ( ) ||
3501+ name == keywords:: Crate . name ( ) ||
3502+ name == keywords:: DollarCrate . name ( ) {
3503+ // `::a::b`, `crate::a::b` or `$crate::a::b`
3504+ module = Some ( ModuleOrUniformRoot :: Module (
3505+ self . resolve_crate_root ( ident) ) ) ;
3506+ continue ;
3507+ }
35063508 }
35073509 }
35083510
35093511 // Report special messages for path segment keywords in wrong positions.
3510- if name == keywords:: CrateRoot . name ( ) && i != 0 ||
3511- name == keywords:: DollarCrate . name ( ) && i != 0 ||
3512- name == keywords:: SelfValue . name ( ) && i != 0 ||
3513- name == keywords:: SelfType . name ( ) && i != 0 ||
3514- name == keywords:: Super . name ( ) && i != 0 ||
3515- name == keywords:: Extern . name ( ) && i != 0 ||
3516- // we allow crate::foo and ::crate::foo but nothing else
3517- name == keywords:: Crate . name ( ) && i > 1 &&
3518- path[ 0 ] . name != keywords:: CrateRoot . name ( ) ||
3519- name == keywords:: Crate . name ( ) && path. len ( ) == 1 {
3512+ if ident. is_path_segment_keyword ( ) && i != 0 {
35203513 let name_str = if name == keywords:: CrateRoot . name ( ) {
35213514 "crate root" . to_string ( )
35223515 } else {
0 commit comments