@@ -107,6 +107,12 @@ pub enum TypeNs {
107107 // ModuleId(ModuleId)
108108}
109109
110+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
111+ pub enum ModuleOrTypeNs {
112+ ModuleNs ( ModuleId ) ,
113+ TypeNs ( TypeNs ) ,
114+ }
115+
110116#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
111117pub enum ResolveValueResult {
112118 ValueNs ( ValueNs , Option < ImportOrGlob > ) ,
@@ -163,22 +169,33 @@ impl Resolver {
163169 self . resolve_module_path ( db, path, BuiltinShadowMode :: Module )
164170 }
165171
166- pub fn resolve_path_in_type_ns (
167- & self ,
168- db : & dyn DefDatabase ,
169- path : & Path ,
170- ) -> Option < ( TypeNs , Option < usize > , Option < ImportOrExternCrate > ) > {
172+ pub fn resolve_path_in_type_ns < ' a > (
173+ & ' a self ,
174+ db : & ' a dyn DefDatabase ,
175+ path : & ' a Path ,
176+ ) -> impl Iterator < Item = ( ModuleOrTypeNs , Option < usize > , Option < ImportOrExternCrate > ) > + ' a
177+ {
171178 self . resolve_path_in_type_ns_with_prefix_info ( db, path) . map (
172- |( resolution, remaining_segments, import, _) | ( resolution, remaining_segments, import) ,
179+ move |( resolution, remaining_segments, import, _) | {
180+ ( resolution, remaining_segments, import)
181+ } ,
173182 )
174183 }
175184
176- pub fn resolve_path_in_type_ns_with_prefix_info (
177- & self ,
178- db : & dyn DefDatabase ,
179- path : & Path ,
180- ) -> Option < ( TypeNs , Option < usize > , Option < ImportOrExternCrate > , ResolvePathResultPrefixInfo ) >
181- {
185+ pub fn resolve_path_in_type_ns_with_prefix_info < ' a > (
186+ & ' a self ,
187+ db : & ' a dyn DefDatabase ,
188+ path : & ' a Path ,
189+ ) -> Box <
190+ dyn Iterator <
191+ Item = (
192+ ModuleOrTypeNs ,
193+ Option < usize > ,
194+ Option < ImportOrExternCrate > ,
195+ ResolvePathResultPrefixInfo ,
196+ ) ,
197+ > + ' a ,
198+ > {
182199 let path = match path {
183200 Path :: BarePath ( mod_path) => mod_path,
184201 Path :: Normal ( it) => & it. mod_path ,
@@ -192,75 +209,87 @@ impl Resolver {
192209 LangItemTarget :: Trait ( it) => TypeNs :: TraitId ( it) ,
193210 LangItemTarget :: Function ( _)
194211 | LangItemTarget :: ImplDef ( _)
195- | LangItemTarget :: Static ( _) => return None ,
212+ | LangItemTarget :: Static ( _) => return Box :: new ( iter :: empty ( ) ) ,
196213 } ;
197- return Some ( (
198- type_ns,
214+ return Box :: new ( iter :: once ( (
215+ ModuleOrTypeNs :: TypeNs ( type_ns) ,
199216 seg. as_ref ( ) . map ( |_| 1 ) ,
200217 None ,
201218 ResolvePathResultPrefixInfo :: default ( ) ,
202- ) ) ;
219+ ) ) ) ;
203220 }
204221 } ;
205- let first_name = path. segments ( ) . first ( ) ? ;
222+ let Some ( first_name) = path. segments ( ) . first ( ) else { return Box :: new ( iter :: empty ( ) ) } ;
206223 let skip_to_mod = path. kind != PathKind :: Plain ;
207224 if skip_to_mod {
208- return self . module_scope . resolve_path_in_type_ns ( db, path) ;
225+ return Box :: new ( self . module_scope . resolve_path_in_type_ns ( db, path) . into_iter ( ) ) ;
209226 }
210227
211228 let remaining_idx = || {
212229 if path. segments ( ) . len ( ) == 1 { None } else { Some ( 1 ) }
213230 } ;
214231
215- for scope in self . scopes ( ) {
216- match scope {
217- Scope :: ExprScope ( _) | Scope :: MacroDefScope ( _) => continue ,
232+ let ns = self
233+ . scopes ( )
234+ . filter_map ( move |scope| match scope {
235+ Scope :: ExprScope ( _) | Scope :: MacroDefScope ( _) => None ,
218236 Scope :: GenericParams { params, def } => {
219237 if let Some ( id) = params. find_type_by_name ( first_name, * def) {
220238 return Some ( (
221- TypeNs :: GenericParam ( id) ,
239+ ModuleOrTypeNs :: TypeNs ( TypeNs :: GenericParam ( id) ) ,
222240 remaining_idx ( ) ,
223241 None ,
224242 ResolvePathResultPrefixInfo :: default ( ) ,
225243 ) ) ;
226244 }
245+ None
227246 }
228247 & Scope :: ImplDefScope ( impl_) => {
229248 if * first_name == sym:: Self_ . clone ( ) {
230249 return Some ( (
231- TypeNs :: SelfType ( impl_) ,
250+ ModuleOrTypeNs :: TypeNs ( TypeNs :: SelfType ( impl_) ) ,
232251 remaining_idx ( ) ,
233252 None ,
234253 ResolvePathResultPrefixInfo :: default ( ) ,
235254 ) ) ;
236255 }
256+ None
237257 }
238258 & Scope :: AdtScope ( adt) => {
239259 if * first_name == sym:: Self_ . clone ( ) {
240260 return Some ( (
241- TypeNs :: AdtSelfType ( adt) ,
261+ ModuleOrTypeNs :: TypeNs ( TypeNs :: AdtSelfType ( adt) ) ,
242262 remaining_idx ( ) ,
243263 None ,
244264 ResolvePathResultPrefixInfo :: default ( ) ,
245265 ) ) ;
246266 }
267+ None
247268 }
248269 Scope :: BlockScope ( m) => {
249270 if let Some ( res) = m. resolve_path_in_type_ns ( db, path) {
250271 return Some ( res) ;
251272 }
273+ None
252274 }
253- }
254- }
255- self . module_scope . resolve_path_in_type_ns ( db, path)
275+ } )
276+ . chain ( self . module_scope . resolve_path_in_type_ns ( db, path) ) ;
277+
278+ Box :: new ( ns)
256279 }
257280
258281 pub fn resolve_path_in_type_ns_fully (
259282 & self ,
260283 db : & dyn DefDatabase ,
261284 path : & Path ,
262285 ) -> Option < TypeNs > {
263- let ( res, unresolved, _) = self . resolve_path_in_type_ns ( db, path) ?;
286+ let ( res, unresolved) = self
287+ . resolve_path_in_type_ns ( db, path)
288+ . filter_map ( |( res, unresolved, _) | match res {
289+ ModuleOrTypeNs :: TypeNs ( it) => Some ( ( it, unresolved) ) ,
290+ ModuleOrTypeNs :: ModuleNs ( _) => None ,
291+ } )
292+ . next ( ) ?;
264293 if unresolved. is_some ( ) {
265294 return None ;
266295 }
@@ -1158,16 +1187,20 @@ impl ModuleItemMap {
11581187 & self ,
11591188 db : & dyn DefDatabase ,
11601189 path : & ModPath ,
1161- ) -> Option < ( TypeNs , Option < usize > , Option < ImportOrExternCrate > , ResolvePathResultPrefixInfo ) >
1162- {
1190+ ) -> Option < (
1191+ ModuleOrTypeNs ,
1192+ Option < usize > ,
1193+ Option < ImportOrExternCrate > ,
1194+ ResolvePathResultPrefixInfo ,
1195+ ) > {
11631196 let ( module_def, idx, prefix_info) = self . def_map . resolve_path_locally (
11641197 & self . local_def_map ,
11651198 db,
11661199 self . module_id ,
11671200 path,
11681201 BuiltinShadowMode :: Other ,
11691202 ) ;
1170- let ( res, import) = to_type_ns ( module_def) ?;
1203+ let ( res, import) = to_module_or_type_ns ( module_def) ?;
11711204 Some ( ( res, idx, import, prefix_info) )
11721205 }
11731206}
@@ -1192,23 +1225,24 @@ fn to_value_ns(per_ns: PerNs) -> Option<(ValueNs, Option<ImportOrGlob>)> {
11921225 Some ( ( res, import) )
11931226}
11941227
1195- fn to_type_ns ( per_ns : PerNs ) -> Option < ( TypeNs , Option < ImportOrExternCrate > ) > {
1228+ fn to_module_or_type_ns ( per_ns : PerNs ) -> Option < ( ModuleOrTypeNs , Option < ImportOrExternCrate > ) > {
11961229 let def = per_ns. take_types_full ( ) ?;
11971230 let res = match def. def {
1198- ModuleDefId :: AdtId ( it) => TypeNs :: AdtId ( it) ,
1199- ModuleDefId :: EnumVariantId ( it) => TypeNs :: EnumVariantId ( it) ,
1231+ ModuleDefId :: AdtId ( it) => ModuleOrTypeNs :: TypeNs ( TypeNs :: AdtId ( it) ) ,
1232+ ModuleDefId :: EnumVariantId ( it) => ModuleOrTypeNs :: TypeNs ( TypeNs :: EnumVariantId ( it) ) ,
1233+
1234+ ModuleDefId :: TypeAliasId ( it) => ModuleOrTypeNs :: TypeNs ( TypeNs :: TypeAliasId ( it) ) ,
1235+ ModuleDefId :: BuiltinType ( it) => ModuleOrTypeNs :: TypeNs ( TypeNs :: BuiltinType ( it) ) ,
12001236
1201- ModuleDefId :: TypeAliasId ( it) => TypeNs :: TypeAliasId ( it) ,
1202- ModuleDefId :: BuiltinType ( it) => TypeNs :: BuiltinType ( it) ,
1237+ ModuleDefId :: TraitId ( it) => ModuleOrTypeNs :: TypeNs ( TypeNs :: TraitId ( it) ) ,
1238+ ModuleDefId :: TraitAliasId ( it) => ModuleOrTypeNs :: TypeNs ( TypeNs :: TraitAliasId ( it) ) ,
12031239
1204- ModuleDefId :: TraitId ( it) => TypeNs :: TraitId ( it) ,
1205- ModuleDefId :: TraitAliasId ( it) => TypeNs :: TraitAliasId ( it) ,
1240+ ModuleDefId :: ModuleId ( it) => ModuleOrTypeNs :: ModuleNs ( it) ,
12061241
12071242 ModuleDefId :: FunctionId ( _)
12081243 | ModuleDefId :: ConstId ( _)
12091244 | ModuleDefId :: MacroId ( _)
1210- | ModuleDefId :: StaticId ( _)
1211- | ModuleDefId :: ModuleId ( _) => return None ,
1245+ | ModuleDefId :: StaticId ( _) => return None ,
12121246 } ;
12131247 Some ( ( res, def. import ) )
12141248}
0 commit comments