@@ -27,28 +27,34 @@ use std::fmt;
2727#[ derive( Clone , Copy , PartialEq , Eq , Default , PartialOrd , Ord , Hash ) ]
2828pub struct SyntaxContext ( pub ( super ) u32 ) ;
2929
30- #[ derive( Copy , Clone , Default ) ]
30+ #[ derive( Copy , Clone ) ]
3131pub struct SyntaxContextData {
3232 pub outer_mark : Mark ,
3333 pub prev_ctxt : SyntaxContext ,
3434 pub modern : SyntaxContext ,
3535}
3636
3737/// A mark is a unique id associated with a macro expansion.
38- #[ derive( Copy , Clone , PartialEq , Eq , Hash , Debug , Default , RustcEncodable , RustcDecodable ) ]
38+ #[ derive( Copy , Clone , PartialEq , Eq , Hash , Debug , RustcEncodable , RustcDecodable ) ]
3939pub struct Mark ( u32 ) ;
4040
41- #[ derive( Default ) ]
4241struct MarkData {
4342 parent : Mark ,
44- modern : bool ,
43+ kind : MarkKind ,
4544 expn_info : Option < ExpnInfo > ,
4645}
4746
47+ #[ derive( Copy , Clone , PartialEq , Eq ) ]
48+ pub enum MarkKind {
49+ Modern ,
50+ Builtin ,
51+ Legacy ,
52+ }
53+
4854impl Mark {
4955 pub fn fresh ( parent : Mark ) -> Self {
5056 HygieneData :: with ( |data| {
51- data. marks . push ( MarkData { parent : parent, modern : false , expn_info : None } ) ;
57+ data. marks . push ( MarkData { parent : parent, kind : MarkKind :: Legacy , expn_info : None } ) ;
5258 Mark ( data. marks . len ( ) as u32 - 1 )
5359 } )
5460 }
@@ -77,20 +83,20 @@ impl Mark {
7783 pub fn modern ( mut self ) -> Mark {
7884 HygieneData :: with ( |data| {
7985 loop {
80- if self == Mark :: root ( ) || data. marks [ self . 0 as usize ] . modern {
86+ if self == Mark :: root ( ) || data. marks [ self . 0 as usize ] . kind == MarkKind :: Modern {
8187 return self ;
8288 }
8389 self = data. marks [ self . 0 as usize ] . parent ;
8490 }
8591 } )
8692 }
8793
88- pub fn is_modern ( self ) -> bool {
89- HygieneData :: with ( |data| data. marks [ self . 0 as usize ] . modern )
94+ pub fn kind ( self ) -> MarkKind {
95+ HygieneData :: with ( |data| data. marks [ self . 0 as usize ] . kind )
9096 }
9197
92- pub fn set_modern ( self ) {
93- HygieneData :: with ( |data| data. marks [ self . 0 as usize ] . modern = true )
98+ pub fn set_kind ( self , kind : MarkKind ) {
99+ HygieneData :: with ( |data| data. marks [ self . 0 as usize ] . kind = kind )
94100 }
95101
96102 pub fn is_descendant_of ( mut self , ancestor : Mark ) -> bool {
@@ -116,8 +122,16 @@ struct HygieneData {
116122impl HygieneData {
117123 fn new ( ) -> Self {
118124 HygieneData {
119- marks : vec ! [ MarkData :: default ( ) ] ,
120- syntax_contexts : vec ! [ SyntaxContextData :: default ( ) ] ,
125+ marks : vec ! [ MarkData {
126+ parent: Mark :: root( ) ,
127+ kind: MarkKind :: Builtin ,
128+ expn_info: None ,
129+ } ] ,
130+ syntax_contexts : vec ! [ SyntaxContextData {
131+ outer_mark: Mark :: root( ) ,
132+ prev_ctxt: SyntaxContext ( 0 ) ,
133+ modern: SyntaxContext ( 0 ) ,
134+ } ] ,
121135 markings : HashMap :: new ( ) ,
122136 gensym_to_ctxt : HashMap :: new ( ) ,
123137 }
@@ -150,7 +164,7 @@ impl SyntaxContext {
150164 HygieneData :: with ( |data| {
151165 data. marks . push ( MarkData {
152166 parent : Mark :: root ( ) ,
153- modern : false ,
167+ kind : MarkKind :: Legacy ,
154168 expn_info : Some ( expansion_info)
155169 } ) ;
156170
@@ -170,7 +184,7 @@ impl SyntaxContext {
170184 HygieneData :: with ( |data| {
171185 let syntax_contexts = & mut data. syntax_contexts ;
172186 let mut modern = syntax_contexts[ self . 0 as usize ] . modern ;
173- if data. marks [ mark. 0 as usize ] . modern {
187+ if data. marks [ mark. 0 as usize ] . kind == MarkKind :: Modern {
174188 modern = * data. markings . entry ( ( modern, mark) ) . or_insert_with ( || {
175189 let len = syntax_contexts. len ( ) as u32 ;
176190 syntax_contexts. push ( SyntaxContextData {
0 commit comments