@@ -32,7 +32,7 @@ use crate::{
3232 BindingId , ExprId , LabelId ,
3333 generics:: { GenericParams , TypeOrConstParamData } ,
3434 } ,
35- item_scope:: { BUILTIN_SCOPE , BuiltinShadowMode , ImportOrExternCrate , ImportOrGlob , ItemScope } ,
35+ item_scope:: { BUILTIN_SCOPE , BuiltinShadowMode , ImportOrExternCrate , ItemScope } ,
3636 lang_item:: LangItemTarget ,
3737 nameres:: { DefMap , LocalDefMap , MacroSubNs , ResolvePathResultPrefixInfo , block_def_map} ,
3838 per_ns:: PerNs ,
@@ -111,8 +111,8 @@ pub enum TypeNs {
111111
112112#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
113113pub enum ResolveValueResult {
114- ValueNs ( ValueNs , Option < ImportOrGlob > ) ,
115- Partial ( TypeNs , usize , Option < ImportOrExternCrate > ) ,
114+ ValueNs ( ValueNs ) ,
115+ Partial ( TypeNs , usize ) ,
116116}
117117
118118#[ derive( Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
@@ -332,20 +332,17 @@ impl<'db> Resolver<'db> {
332332 Path :: Normal ( it) => & it. mod_path ,
333333 Path :: LangItem ( l, None ) => {
334334 return Some ( (
335- ResolveValueResult :: ValueNs (
336- match * l {
337- LangItemTarget :: FunctionId ( it) => ValueNs :: FunctionId ( it) ,
338- LangItemTarget :: StaticId ( it) => ValueNs :: StaticId ( it) ,
339- LangItemTarget :: StructId ( it) => ValueNs :: StructId ( it) ,
340- LangItemTarget :: EnumVariantId ( it) => ValueNs :: EnumVariantId ( it) ,
341- LangItemTarget :: UnionId ( _)
342- | LangItemTarget :: ImplId ( _)
343- | LangItemTarget :: TypeAliasId ( _)
344- | LangItemTarget :: TraitId ( _)
345- | LangItemTarget :: EnumId ( _) => return None ,
346- } ,
347- None ,
348- ) ,
335+ ResolveValueResult :: ValueNs ( match * l {
336+ LangItemTarget :: FunctionId ( it) => ValueNs :: FunctionId ( it) ,
337+ LangItemTarget :: StaticId ( it) => ValueNs :: StaticId ( it) ,
338+ LangItemTarget :: StructId ( it) => ValueNs :: StructId ( it) ,
339+ LangItemTarget :: EnumVariantId ( it) => ValueNs :: EnumVariantId ( it) ,
340+ LangItemTarget :: UnionId ( _)
341+ | LangItemTarget :: ImplId ( _)
342+ | LangItemTarget :: TypeAliasId ( _)
343+ | LangItemTarget :: TraitId ( _)
344+ | LangItemTarget :: EnumId ( _) => return None ,
345+ } ) ,
349346 ResolvePathResultPrefixInfo :: default ( ) ,
350347 ) ) ;
351348 }
@@ -363,7 +360,7 @@ impl<'db> Resolver<'db> {
363360 } ;
364361 // Remaining segments start from 0 because lang paths have no segments other than the remaining.
365362 return Some ( (
366- ResolveValueResult :: Partial ( type_ns, 0 , None ) ,
363+ ResolveValueResult :: Partial ( type_ns, 0 ) ,
367364 ResolvePathResultPrefixInfo :: default ( ) ,
368365 ) ) ;
369366 }
@@ -388,10 +385,7 @@ impl<'db> Resolver<'db> {
388385
389386 if let Some ( e) = entry {
390387 return Some ( (
391- ResolveValueResult :: ValueNs (
392- ValueNs :: LocalBinding ( e. binding ( ) ) ,
393- None ,
394- ) ,
388+ ResolveValueResult :: ValueNs ( ValueNs :: LocalBinding ( e. binding ( ) ) ) ,
395389 ResolvePathResultPrefixInfo :: default ( ) ,
396390 ) ) ;
397391 }
@@ -404,14 +398,14 @@ impl<'db> Resolver<'db> {
404398 && * first_name == sym:: Self_
405399 {
406400 return Some ( (
407- ResolveValueResult :: ValueNs ( ValueNs :: ImplSelf ( impl_) , None ) ,
401+ ResolveValueResult :: ValueNs ( ValueNs :: ImplSelf ( impl_) ) ,
408402 ResolvePathResultPrefixInfo :: default ( ) ,
409403 ) ) ;
410404 }
411405 if let Some ( id) = params. find_const_by_name ( first_name, * def) {
412406 let val = ValueNs :: GenericParam ( id) ;
413407 return Some ( (
414- ResolveValueResult :: ValueNs ( val, None ) ,
408+ ResolveValueResult :: ValueNs ( val) ,
415409 ResolvePathResultPrefixInfo :: default ( ) ,
416410 ) ) ;
417411 }
@@ -431,7 +425,7 @@ impl<'db> Resolver<'db> {
431425 if let & GenericDefId :: ImplId ( impl_) = def {
432426 if * first_name == sym:: Self_ {
433427 return Some ( (
434- ResolveValueResult :: Partial ( TypeNs :: SelfType ( impl_) , 1 , None ) ,
428+ ResolveValueResult :: Partial ( TypeNs :: SelfType ( impl_) , 1 ) ,
435429 ResolvePathResultPrefixInfo :: default ( ) ,
436430 ) ) ;
437431 }
@@ -440,14 +434,14 @@ impl<'db> Resolver<'db> {
440434 {
441435 let ty = TypeNs :: AdtSelfType ( adt) ;
442436 return Some ( (
443- ResolveValueResult :: Partial ( ty, 1 , None ) ,
437+ ResolveValueResult :: Partial ( ty, 1 ) ,
444438 ResolvePathResultPrefixInfo :: default ( ) ,
445439 ) ) ;
446440 }
447441 if let Some ( id) = params. find_type_by_name ( first_name, * def) {
448442 let ty = TypeNs :: GenericParam ( id) ;
449443 return Some ( (
450- ResolveValueResult :: Partial ( ty, 1 , None ) ,
444+ ResolveValueResult :: Partial ( ty, 1 ) ,
451445 ResolvePathResultPrefixInfo :: default ( ) ,
452446 ) ) ;
453447 }
@@ -473,7 +467,7 @@ impl<'db> Resolver<'db> {
473467 && let Some ( builtin) = BuiltinType :: by_name ( first_name)
474468 {
475469 return Some ( (
476- ResolveValueResult :: Partial ( TypeNs :: BuiltinType ( builtin) , 1 , None ) ,
470+ ResolveValueResult :: Partial ( TypeNs :: BuiltinType ( builtin) , 1 ) ,
477471 ResolvePathResultPrefixInfo :: default ( ) ,
478472 ) ) ;
479473 }
@@ -488,7 +482,7 @@ impl<'db> Resolver<'db> {
488482 hygiene : HygieneId ,
489483 ) -> Option < ValueNs > {
490484 match self . resolve_path_in_value_ns ( db, path, hygiene) ? {
491- ResolveValueResult :: ValueNs ( it, _ ) => Some ( it) ,
485+ ResolveValueResult :: ValueNs ( it) => Some ( it) ,
492486 ResolveValueResult :: Partial ( ..) => None ,
493487 }
494488 }
@@ -1153,12 +1147,12 @@ impl<'db> ModuleItemMap<'db> {
11531147 ) ;
11541148 match unresolved_idx {
11551149 None => {
1156- let ( value, import ) = to_value_ns ( module_def) ?;
1157- Some ( ( ResolveValueResult :: ValueNs ( value, import ) , prefix_info) )
1150+ let value = to_value_ns ( module_def, self . def_map ) ?;
1151+ Some ( ( ResolveValueResult :: ValueNs ( value) , prefix_info) )
11581152 }
11591153 Some ( unresolved_idx) => {
1160- let def = module_def. take_types_full ( ) ?;
1161- let ty = match def. def {
1154+ let def = module_def. take_types ( ) ?;
1155+ let ty = match def {
11621156 ModuleDefId :: AdtId ( it) => TypeNs :: AdtId ( it) ,
11631157 ModuleDefId :: TraitId ( it) => TypeNs :: TraitId ( it) ,
11641158 ModuleDefId :: TypeAliasId ( it) => TypeNs :: TypeAliasId ( it) ,
@@ -1171,7 +1165,7 @@ impl<'db> ModuleItemMap<'db> {
11711165 | ModuleDefId :: MacroId ( _)
11721166 | ModuleDefId :: StaticId ( _) => return None ,
11731167 } ;
1174- Some ( ( ResolveValueResult :: Partial ( ty, unresolved_idx, def . import ) , prefix_info) )
1168+ Some ( ( ResolveValueResult :: Partial ( ty, unresolved_idx) , prefix_info) )
11751169 }
11761170 }
11771171 }
@@ -1194,8 +1188,13 @@ impl<'db> ModuleItemMap<'db> {
11941188 }
11951189}
11961190
1197- fn to_value_ns ( per_ns : PerNs ) -> Option < ( ValueNs , Option < ImportOrGlob > ) > {
1198- let ( def, import) = per_ns. take_values_import ( ) ?;
1191+ fn to_value_ns ( per_ns : PerNs , def_map : & DefMap ) -> Option < ValueNs > {
1192+ let def = per_ns. take_values ( ) . or_else ( || {
1193+ let Some ( MacroId :: ProcMacroId ( proc_macro) ) = per_ns. take_macros ( ) else { return None } ;
1194+ // If we cannot resolve to value ns, but we can resolve to a proc macro, and this is the crate
1195+ // defining this proc macro - inside this crate, we should treat the macro as a function.
1196+ def_map. proc_macro_as_fn ( proc_macro) . map ( ModuleDefId :: FunctionId )
1197+ } ) ?;
11991198 let res = match def {
12001199 ModuleDefId :: FunctionId ( it) => ValueNs :: FunctionId ( it) ,
12011200 ModuleDefId :: AdtId ( AdtId :: StructId ( it) ) => ValueNs :: StructId ( it) ,
@@ -1210,7 +1209,7 @@ fn to_value_ns(per_ns: PerNs) -> Option<(ValueNs, Option<ImportOrGlob>)> {
12101209 | ModuleDefId :: MacroId ( _)
12111210 | ModuleDefId :: ModuleId ( _) => return None ,
12121211 } ;
1213- Some ( ( res, import ) )
1212+ Some ( res)
12141213}
12151214
12161215fn to_type_ns ( per_ns : PerNs ) -> Option < ( TypeNs , Option < ImportOrExternCrate > ) > {
0 commit comments