@@ -70,7 +70,16 @@ impl CrateDefMap {
7070 path : & Path ,
7171 shadow : BuiltinShadowMode ,
7272 ) -> ResolvePathResult {
73- let mut segments = path. segments . iter ( ) . enumerate ( ) . peekable ( ) ;
73+ // if it is not the last segment, we prefer the module to the builtin
74+ let prefer_module = |index| {
75+ if index == path. segments . len ( ) - 1 {
76+ shadow
77+ } else {
78+ BuiltinShadowMode :: Module
79+ }
80+ } ;
81+
82+ let mut segments = path. segments . iter ( ) . enumerate ( ) ;
7483
7584 let mut curr_per_ns: PerNs = match path. kind {
7685 PathKind :: DollarCrate ( krate) => {
@@ -98,29 +107,21 @@ impl CrateDefMap {
98107 if self . edition == Edition :: Edition2015
99108 && ( path. kind == PathKind :: Abs || mode == ResolveMode :: Import ) =>
100109 {
101- let segment = match segments. next ( ) {
102- Some ( ( _ , segment) ) => segment,
110+ let ( idx , segment) = match segments. next ( ) {
111+ Some ( ( idx , segment) ) => ( idx , segment) ,
103112 None => return ResolvePathResult :: empty ( ReachedFixedPoint :: Yes ) ,
104113 } ;
105114 log:: debug!( "resolving {:?} in crate root (+ extern prelude)" , segment) ;
106115
107- self . resolve_name_in_crate_root_or_extern_prelude (
108- & segment. name ,
109- prefer_module ( & mut segments, shadow) ,
110- )
116+ self . resolve_name_in_crate_root_or_extern_prelude ( & segment. name , prefer_module ( idx) )
111117 }
112118 PathKind :: Plain => {
113- let segment = match segments. next ( ) {
114- Some ( ( _ , segment) ) => segment,
119+ let ( idx , segment) = match segments. next ( ) {
120+ Some ( ( idx , segment) ) => ( idx , segment) ,
115121 None => return ResolvePathResult :: empty ( ReachedFixedPoint :: Yes ) ,
116122 } ;
117123 log:: debug!( "resolving {:?} in module" , segment) ;
118- self . resolve_name_in_module (
119- db,
120- original_module,
121- & segment. name ,
122- prefer_module ( & mut segments, shadow) ,
123- )
124+ self . resolve_name_in_module ( db, original_module, & segment. name , prefer_module ( idx) )
124125 }
125126 PathKind :: Super => {
126127 if let Some ( p) = self . modules [ original_module] . parent {
@@ -150,7 +151,7 @@ impl CrateDefMap {
150151 }
151152 } ;
152153
153- while let Some ( ( i, segment) ) = segments. next ( ) {
154+ for ( i, segment) in segments {
154155 let curr = match curr_per_ns. take_types ( ) {
155156 Some ( r) => r,
156157 None => {
@@ -180,10 +181,7 @@ impl CrateDefMap {
180181 }
181182
182183 // Since it is a qualified path here, it should not contains legacy macros
183- match self [ module. local_id ]
184- . scope
185- . get ( & segment. name , prefer_module ( & mut segments, shadow) )
186- {
184+ match self [ module. local_id ] . scope . get ( & segment. name , prefer_module ( i) ) {
187185 Some ( res) => res. def ,
188186 _ => {
189187 log:: debug!( "path segment {:?} not found" , segment. name) ;
@@ -226,22 +224,8 @@ impl CrateDefMap {
226224 }
227225 } ;
228226 }
229- return ResolvePathResult :: with ( curr_per_ns, ReachedFixedPoint :: Yes , None ) ;
230227
231- // if it is not the last segment, we prefer builtin as module
232- fn prefer_module < I > (
233- segments : & mut std:: iter:: Peekable < I > ,
234- shadow : BuiltinShadowMode ,
235- ) -> BuiltinShadowMode
236- where
237- I : Iterator ,
238- {
239- if segments. peek ( ) . is_some ( ) {
240- BuiltinShadowMode :: Module
241- } else {
242- shadow
243- }
244- }
228+ ResolvePathResult :: with ( curr_per_ns, ReachedFixedPoint :: Yes , None )
245229 }
246230
247231 fn resolve_name_in_module (
0 commit comments