@@ -16,31 +16,34 @@ use crate::{
1616pub struct Hygiene {
1717 // This is what `$crate` expands to
1818 def_crate : Option < CrateId > ,
19+
20+ // Indiciate this is a local inner macro
21+ local_inner : bool ,
1922}
2023
2124impl Hygiene {
2225 pub fn new ( db : & dyn AstDatabase , file_id : HirFileId ) -> Hygiene {
23- let def_crate = match file_id. 0 {
24- HirFileIdRepr :: FileId ( _) => None ,
26+ let ( def_crate, local_inner ) = match file_id. 0 {
27+ HirFileIdRepr :: FileId ( _) => ( None , false ) ,
2528 HirFileIdRepr :: MacroFile ( macro_file) => match macro_file. macro_call_id {
2629 MacroCallId :: LazyMacro ( id) => {
2730 let loc = db. lookup_intern_macro ( id) ;
2831 match loc. def . kind {
29- MacroDefKind :: Declarative => loc. def . krate ,
30- MacroDefKind :: BuiltIn ( _) => None ,
31- MacroDefKind :: BuiltInDerive ( _) => None ,
32- MacroDefKind :: BuiltInEager ( _) => None ,
33- MacroDefKind :: CustomDerive ( _) => None ,
32+ MacroDefKind :: Declarative => ( loc. def . krate , loc . def . local_inner ) ,
33+ MacroDefKind :: BuiltIn ( _) => ( None , false ) ,
34+ MacroDefKind :: BuiltInDerive ( _) => ( None , false ) ,
35+ MacroDefKind :: BuiltInEager ( _) => ( None , false ) ,
36+ MacroDefKind :: CustomDerive ( _) => ( None , false ) ,
3437 }
3538 }
36- MacroCallId :: EagerMacro ( _id) => None ,
39+ MacroCallId :: EagerMacro ( _id) => ( None , false ) ,
3740 } ,
3841 } ;
39- Hygiene { def_crate }
42+ Hygiene { def_crate, local_inner }
4043 }
4144
4245 pub fn new_unhygienic ( ) -> Hygiene {
43- Hygiene { def_crate : None }
46+ Hygiene { def_crate : None , local_inner : false }
4447 }
4548
4649 // FIXME: this should just return name
@@ -52,4 +55,12 @@ impl Hygiene {
5255 }
5356 Either :: Left ( name_ref. as_name ( ) )
5457 }
58+
59+ pub fn local_inner_macros ( & self ) -> Option < CrateId > {
60+ if self . local_inner {
61+ self . def_crate
62+ } else {
63+ None
64+ }
65+ }
5566}
0 commit comments