Skip to content

Commit f79c7e4

Browse files
committed
Refactor MarkData field modern: bool to kind: MarkKind.
1 parent 8dbe79a commit f79c7e4

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

src/libsyntax_pos/hygiene.rs

+28-14
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,34 @@ use std::fmt;
2727
#[derive(Clone, Copy, PartialEq, Eq, Default, PartialOrd, Ord, Hash)]
2828
pub struct SyntaxContext(pub(super) u32);
2929

30-
#[derive(Copy, Clone, Default)]
30+
#[derive(Copy, Clone)]
3131
pub 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)]
3939
pub struct Mark(u32);
4040

41-
#[derive(Default)]
4241
struct 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+
4854
impl 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 {
116122
impl 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

Comments
 (0)