@@ -27,28 +27,34 @@ use std::fmt;
27
27
#[ derive( Clone , Copy , PartialEq , Eq , Default , PartialOrd , Ord , Hash ) ]
28
28
pub struct SyntaxContext ( pub ( super ) u32 ) ;
29
29
30
- #[ derive( Copy , Clone , Default ) ]
30
+ #[ derive( Copy , Clone ) ]
31
31
pub struct SyntaxContextData {
32
32
pub outer_mark : Mark ,
33
33
pub prev_ctxt : SyntaxContext ,
34
34
pub modern : SyntaxContext ,
35
35
}
36
36
37
37
/// 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 ) ]
39
39
pub struct Mark ( u32 ) ;
40
40
41
- #[ derive( Default ) ]
42
41
struct MarkData {
43
42
parent : Mark ,
44
- modern : bool ,
43
+ kind : MarkKind ,
45
44
expn_info : Option < ExpnInfo > ,
46
45
}
47
46
47
+ #[ derive( Copy , Clone , PartialEq , Eq ) ]
48
+ pub enum MarkKind {
49
+ Modern ,
50
+ Builtin ,
51
+ Legacy ,
52
+ }
53
+
48
54
impl Mark {
49
55
pub fn fresh ( parent : Mark ) -> Self {
50
56
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 } ) ;
52
58
Mark ( data. marks . len ( ) as u32 - 1 )
53
59
} )
54
60
}
@@ -77,20 +83,20 @@ impl Mark {
77
83
pub fn modern ( mut self ) -> Mark {
78
84
HygieneData :: with ( |data| {
79
85
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 {
81
87
return self ;
82
88
}
83
89
self = data. marks [ self . 0 as usize ] . parent ;
84
90
}
85
91
} )
86
92
}
87
93
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 )
90
96
}
91
97
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 )
94
100
}
95
101
96
102
pub fn is_descendant_of ( mut self , ancestor : Mark ) -> bool {
@@ -116,8 +122,16 @@ struct HygieneData {
116
122
impl HygieneData {
117
123
fn new ( ) -> Self {
118
124
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
+ } ] ,
121
135
markings : HashMap :: new ( ) ,
122
136
gensym_to_ctxt : HashMap :: new ( ) ,
123
137
}
@@ -150,7 +164,7 @@ impl SyntaxContext {
150
164
HygieneData :: with ( |data| {
151
165
data. marks . push ( MarkData {
152
166
parent : Mark :: root ( ) ,
153
- modern : false ,
167
+ kind : MarkKind :: Legacy ,
154
168
expn_info : Some ( expansion_info)
155
169
} ) ;
156
170
@@ -170,7 +184,7 @@ impl SyntaxContext {
170
184
HygieneData :: with ( |data| {
171
185
let syntax_contexts = & mut data. syntax_contexts ;
172
186
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 {
174
188
modern = * data. markings . entry ( ( modern, mark) ) . or_insert_with ( || {
175
189
let len = syntax_contexts. len ( ) as u32 ;
176
190
syntax_contexts. push ( SyntaxContextData {
0 commit comments