Skip to content

Commit a84aee3

Browse files
committed
Add HygieneData::apply_mark_internal.
1 parent a02b2e3 commit a84aee3

File tree

1 file changed

+58
-55
lines changed

1 file changed

+58
-55
lines changed

src/libsyntax_pos/hygiene.rs

Lines changed: 58 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,63 @@ impl HygieneData {
264264
}
265265
scope
266266
}
267+
268+
fn apply_mark_internal(&mut self, ctxt: SyntaxContext, mark: Mark, transparency: Transparency)
269+
-> SyntaxContext {
270+
let syntax_contexts = &mut self.syntax_contexts;
271+
let mut opaque = syntax_contexts[ctxt.0 as usize].opaque;
272+
let mut opaque_and_semitransparent =
273+
syntax_contexts[ctxt.0 as usize].opaque_and_semitransparent;
274+
275+
if transparency >= Transparency::Opaque {
276+
let prev_ctxt = opaque;
277+
opaque = *self.markings.entry((prev_ctxt, mark, transparency)).or_insert_with(|| {
278+
let new_opaque = SyntaxContext(syntax_contexts.len() as u32);
279+
syntax_contexts.push(SyntaxContextData {
280+
outer_mark: mark,
281+
transparency,
282+
prev_ctxt,
283+
opaque: new_opaque,
284+
opaque_and_semitransparent: new_opaque,
285+
dollar_crate_name: kw::DollarCrate,
286+
});
287+
new_opaque
288+
});
289+
}
290+
291+
if transparency >= Transparency::SemiTransparent {
292+
let prev_ctxt = opaque_and_semitransparent;
293+
opaque_and_semitransparent =
294+
*self.markings.entry((prev_ctxt, mark, transparency)).or_insert_with(|| {
295+
let new_opaque_and_semitransparent =
296+
SyntaxContext(syntax_contexts.len() as u32);
297+
syntax_contexts.push(SyntaxContextData {
298+
outer_mark: mark,
299+
transparency,
300+
prev_ctxt,
301+
opaque,
302+
opaque_and_semitransparent: new_opaque_and_semitransparent,
303+
dollar_crate_name: kw::DollarCrate,
304+
});
305+
new_opaque_and_semitransparent
306+
});
307+
}
308+
309+
let prev_ctxt = ctxt;
310+
*self.markings.entry((prev_ctxt, mark, transparency)).or_insert_with(|| {
311+
let new_opaque_and_semitransparent_and_transparent =
312+
SyntaxContext(syntax_contexts.len() as u32);
313+
syntax_contexts.push(SyntaxContextData {
314+
outer_mark: mark,
315+
transparency,
316+
prev_ctxt,
317+
opaque,
318+
opaque_and_semitransparent,
319+
dollar_crate_name: kw::DollarCrate,
320+
});
321+
new_opaque_and_semitransparent_and_transparent
322+
})
323+
}
267324
}
268325

269326
pub fn clear_markings() {
@@ -359,61 +416,7 @@ impl SyntaxContext {
359416
}
360417

361418
fn apply_mark_internal(self, mark: Mark, transparency: Transparency) -> SyntaxContext {
362-
HygieneData::with(|data| {
363-
let syntax_contexts = &mut data.syntax_contexts;
364-
let mut opaque = syntax_contexts[self.0 as usize].opaque;
365-
let mut opaque_and_semitransparent =
366-
syntax_contexts[self.0 as usize].opaque_and_semitransparent;
367-
368-
if transparency >= Transparency::Opaque {
369-
let prev_ctxt = opaque;
370-
opaque = *data.markings.entry((prev_ctxt, mark, transparency)).or_insert_with(|| {
371-
let new_opaque = SyntaxContext(syntax_contexts.len() as u32);
372-
syntax_contexts.push(SyntaxContextData {
373-
outer_mark: mark,
374-
transparency,
375-
prev_ctxt,
376-
opaque: new_opaque,
377-
opaque_and_semitransparent: new_opaque,
378-
dollar_crate_name: kw::DollarCrate,
379-
});
380-
new_opaque
381-
});
382-
}
383-
384-
if transparency >= Transparency::SemiTransparent {
385-
let prev_ctxt = opaque_and_semitransparent;
386-
opaque_and_semitransparent =
387-
*data.markings.entry((prev_ctxt, mark, transparency)).or_insert_with(|| {
388-
let new_opaque_and_semitransparent =
389-
SyntaxContext(syntax_contexts.len() as u32);
390-
syntax_contexts.push(SyntaxContextData {
391-
outer_mark: mark,
392-
transparency,
393-
prev_ctxt,
394-
opaque,
395-
opaque_and_semitransparent: new_opaque_and_semitransparent,
396-
dollar_crate_name: kw::DollarCrate,
397-
});
398-
new_opaque_and_semitransparent
399-
});
400-
}
401-
402-
let prev_ctxt = self;
403-
*data.markings.entry((prev_ctxt, mark, transparency)).or_insert_with(|| {
404-
let new_opaque_and_semitransparent_and_transparent =
405-
SyntaxContext(syntax_contexts.len() as u32);
406-
syntax_contexts.push(SyntaxContextData {
407-
outer_mark: mark,
408-
transparency,
409-
prev_ctxt,
410-
opaque,
411-
opaque_and_semitransparent,
412-
dollar_crate_name: kw::DollarCrate,
413-
});
414-
new_opaque_and_semitransparent_and_transparent
415-
})
416-
})
419+
HygieneData::with(|data| data.apply_mark_internal(self, mark, transparency))
417420
}
418421

419422
/// Pulls a single mark off of the syntax context. This effectively moves the

0 commit comments

Comments
 (0)