@@ -23,7 +23,7 @@ use syntax::ast;
2323
2424use crate :: {
2525 attr:: { Attr , AttrId , AttrInput , Attrs } ,
26- builtin_attr,
26+ attr_macro_as_call_id , builtin_attr,
2727 db:: DefDatabase ,
2828 derive_macro_as_call_id,
2929 intern:: Interned ,
@@ -223,7 +223,7 @@ struct MacroDirective {
223223enum MacroDirectiveKind {
224224 FnLike { ast_id : AstIdWithPath < ast:: MacroCall > , fragment : FragmentKind } ,
225225 Derive { ast_id : AstIdWithPath < ast:: Item > , derive_attr : AttrId } ,
226- Attr { ast_id : AstIdWithPath < ast:: Item > , attr : AttrId , mod_item : ModItem } ,
226+ Attr { ast_id : AstIdWithPath < ast:: Item > , attr : Attr , mod_item : ModItem } ,
227227}
228228
229229struct DefData < ' a > {
@@ -419,7 +419,7 @@ impl DefCollector<'_> {
419419 let mut unresolved_macros = std:: mem:: replace ( & mut self . unresolved_macros , Vec :: new ( ) ) ;
420420 let pos = unresolved_macros. iter ( ) . position ( |directive| {
421421 if let MacroDirectiveKind :: Attr { ast_id, mod_item, attr } = & directive. kind {
422- self . skip_attrs . insert ( ast_id. ast_id . with_value ( * mod_item) , * attr) ;
422+ self . skip_attrs . insert ( ast_id. ast_id . with_value ( * mod_item) , attr. id ) ;
423423
424424 let file_id = ast_id. ast_id . file_id ;
425425 let item_tree = self . db . file_item_tree ( file_id) ;
@@ -1050,7 +1050,7 @@ impl DefCollector<'_> {
10501050 let file_id = ast_id. ast_id . file_id ;
10511051 let item_tree = self . db . file_item_tree ( file_id) ;
10521052 let mod_dir = self . mod_dirs [ & directive. module_id ] . clone ( ) ;
1053- self . skip_attrs . insert ( InFile :: new ( file_id, * mod_item) , * attr) ;
1053+ self . skip_attrs . insert ( InFile :: new ( file_id, * mod_item) , attr. id ) ;
10541054 ModCollector {
10551055 def_collector : & mut * self ,
10561056 macro_depth : directive. depth ,
@@ -1068,7 +1068,51 @@ impl DefCollector<'_> {
10681068 }
10691069
10701070 // Not resolved to a derive helper, so try to resolve as a macro.
1071- // FIXME: not yet :)
1071+ match attr_macro_as_call_id (
1072+ ast_id,
1073+ attr,
1074+ self . db ,
1075+ self . def_map . krate ,
1076+ & resolver,
1077+ ) {
1078+ Ok ( call_id) => {
1079+ let loc: MacroCallLoc = self . db . lookup_intern_macro ( call_id) ;
1080+ if let MacroDefKind :: ProcMacro ( exp, ..) = & loc. def . kind {
1081+ if exp. is_dummy ( ) {
1082+ // Proc macros that cannot be expanded are treated as not
1083+ // resolved, in order to fall back later.
1084+ self . def_map . diagnostics . push (
1085+ DefDiagnostic :: unresolved_proc_macro (
1086+ directive. module_id ,
1087+ loc. kind ,
1088+ ) ,
1089+ ) ;
1090+
1091+ let file_id = ast_id. ast_id . file_id ;
1092+ let item_tree = self . db . file_item_tree ( file_id) ;
1093+ let mod_dir = self . mod_dirs [ & directive. module_id ] . clone ( ) ;
1094+ self . skip_attrs
1095+ . insert ( InFile :: new ( file_id, * mod_item) , attr. id ) ;
1096+ ModCollector {
1097+ def_collector : & mut * self ,
1098+ macro_depth : directive. depth ,
1099+ module_id : directive. module_id ,
1100+ file_id,
1101+ item_tree : & item_tree,
1102+ mod_dir,
1103+ }
1104+ . collect ( & [ * mod_item] ) ;
1105+
1106+ // Remove the macro directive.
1107+ return false ;
1108+ }
1109+ }
1110+ resolved. push ( ( directive. module_id , call_id, directive. depth ) ) ;
1111+ res = ReachedFixedPoint :: No ;
1112+ return false ;
1113+ }
1114+ Err ( UnresolvedMacro { .. } ) => ( ) ,
1115+ }
10721116 }
10731117 }
10741118
@@ -1628,7 +1672,7 @@ impl ModCollector<'_, '_> {
16281672 self . def_collector . unresolved_macros . push ( MacroDirective {
16291673 module_id : self . module_id ,
16301674 depth : self . macro_depth + 1 ,
1631- kind : MacroDirectiveKind :: Attr { ast_id, attr : attr. id , mod_item } ,
1675+ kind : MacroDirectiveKind :: Attr { ast_id, attr : attr. clone ( ) , mod_item } ,
16321676 } ) ;
16331677
16341678 return Err ( ( ) ) ;
0 commit comments