@@ -309,13 +309,13 @@ impl DefCollector<'_> {
309309 let macro_def = match self . proc_macros . iter ( ) . find ( |( n, _) | n == name) {
310310 Some ( ( _, expander) ) => MacroDefId {
311311 ast_id : None ,
312- krate : Some ( self . def_map . krate ) ,
312+ krate : self . def_map . krate ,
313313 kind : MacroDefKind :: ProcMacro ( * expander) ,
314314 local_inner : false ,
315315 } ,
316316 None => MacroDefId {
317317 ast_id : None ,
318- krate : Some ( self . def_map . krate ) ,
318+ krate : self . def_map . krate ,
319319 kind : MacroDefKind :: ProcMacro ( ProcMacroExpander :: dummy ( self . def_map . krate ) ) ,
320320 local_inner : false ,
321321 } ,
@@ -784,14 +784,6 @@ impl DefCollector<'_> {
784784 directive : & DeriveDirective ,
785785 path : & ModPath ,
786786 ) -> Option < MacroDefId > {
787- if let Some ( name) = path. as_ident ( ) {
788- // FIXME this should actually be handled with the normal name
789- // resolution; the std lib defines built-in stubs for the derives,
790- // but these are new-style `macro`s, which we don't support yet
791- if let Some ( def_id) = find_builtin_derive ( name) {
792- return Some ( def_id) ;
793- }
794- }
795787 let resolved_res = self . def_map . resolve_path_fp_with_macro (
796788 self . db ,
797789 ResolveMode :: Other ,
@@ -976,6 +968,35 @@ impl ModCollector<'_, '_> {
976968 }
977969 ModItem :: MacroCall ( mac) => self . collect_macro_call ( & self . item_tree [ mac] ) ,
978970 ModItem :: MacroRules ( mac) => self . collect_macro_rules ( & self . item_tree [ mac] ) ,
971+ ModItem :: MacroDef ( id) => {
972+ let mac = & self . item_tree [ id] ;
973+ let ast_id = InFile :: new ( self . file_id , mac. ast_id . upcast ( ) ) ;
974+
975+ // "Macro 2.0" is not currently supported by rust-analyzer, but libcore uses it
976+ // to define builtin macros, so we support at least that part.
977+ if mac. is_builtin {
978+ let krate = self . def_collector . def_map . krate ;
979+ let macro_id = find_builtin_macro ( & mac. name , krate, ast_id)
980+ . or_else ( || find_builtin_derive ( & mac. name , krate, ast_id) ) ;
981+ if let Some ( macro_id) = macro_id {
982+ let vis = self
983+ . def_collector
984+ . def_map
985+ . resolve_visibility (
986+ self . def_collector . db ,
987+ self . module_id ,
988+ & self . item_tree [ mac. visibility ] ,
989+ )
990+ . unwrap_or ( Visibility :: Public ) ;
991+ self . def_collector . update (
992+ self . module_id ,
993+ & [ ( Some ( mac. name . clone ( ) ) , PerNs :: macros ( macro_id, vis) ) ] ,
994+ vis,
995+ ImportType :: Named ,
996+ ) ;
997+ }
998+ }
999+ }
9791000 ModItem :: Impl ( imp) => {
9801001 let module = ModuleId {
9811002 krate : self . def_collector . def_map . krate ,
@@ -1280,7 +1301,7 @@ impl ModCollector<'_, '_> {
12801301 }
12811302
12821303 fn collect_macro_rules ( & mut self , mac : & MacroRules ) {
1283- let ast_id = InFile :: new ( self . file_id , mac. ast_id ) ;
1304+ let ast_id = InFile :: new ( self . file_id , mac. ast_id . upcast ( ) ) ;
12841305
12851306 // Case 1: builtin macros
12861307 if mac. is_builtin {
@@ -1299,7 +1320,7 @@ impl ModCollector<'_, '_> {
12991320 // Case 2: normal `macro_rules!` macro
13001321 let macro_id = MacroDefId {
13011322 ast_id : Some ( ast_id) ,
1302- krate : Some ( self . def_collector . def_map . krate ) ,
1323+ krate : self . def_collector . def_map . krate ,
13031324 kind : MacroDefKind :: Declarative ,
13041325 local_inner : mac. is_local_inner ,
13051326 } ;
0 commit comments