Skip to content

Commit e19857c

Browse files
committed
Optimize glob_adjust and reverse_glob_adjust.
They can each now do a single `HygieneData::with` call by replacing the `SyntaxContext` and `Mark` methods with the equivalent methods from `HygieneData`.
1 parent 58a4869 commit e19857c

File tree

1 file changed

+27
-23
lines changed

1 file changed

+27
-23
lines changed

src/libsyntax_pos/hygiene.rs

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -499,18 +499,20 @@ impl SyntaxContext {
499499
/// This returns `None` if the context cannot be glob-adjusted.
500500
/// Otherwise, it returns the scope to use when privacy checking (see `adjust` for details).
501501
pub fn glob_adjust(&mut self, expansion: Mark, glob_span: Span) -> Option<Option<Mark>> {
502-
let mut scope = None;
503-
let mut glob_ctxt = glob_span.ctxt().modern();
504-
while !expansion.outer_is_descendant_of(glob_ctxt) {
505-
scope = Some(glob_ctxt.remove_mark());
506-
if self.remove_mark() != scope.unwrap() {
502+
HygieneData::with(|data| {
503+
let mut scope = None;
504+
let mut glob_ctxt = data.modern(glob_span.ctxt());
505+
while !data.is_descendant_of(expansion, data.outer(glob_ctxt)) {
506+
scope = Some(data.remove_mark(&mut glob_ctxt));
507+
if data.remove_mark(self) != scope.unwrap() {
508+
return None;
509+
}
510+
}
511+
if data.adjust(self, expansion).is_some() {
507512
return None;
508513
}
509-
}
510-
if self.adjust(expansion).is_some() {
511-
return None;
512-
}
513-
Some(scope)
514+
Some(scope)
515+
})
514516
}
515517

516518
/// Undo `glob_adjust` if possible:
@@ -522,21 +524,23 @@ impl SyntaxContext {
522524
/// ```
523525
pub fn reverse_glob_adjust(&mut self, expansion: Mark, glob_span: Span)
524526
-> Option<Option<Mark>> {
525-
if self.adjust(expansion).is_some() {
526-
return None;
527-
}
527+
HygieneData::with(|data| {
528+
if data.adjust(self, expansion).is_some() {
529+
return None;
530+
}
528531

529-
let mut glob_ctxt = glob_span.ctxt().modern();
530-
let mut marks = Vec::new();
531-
while !expansion.outer_is_descendant_of(glob_ctxt) {
532-
marks.push(glob_ctxt.remove_mark());
533-
}
532+
let mut glob_ctxt = data.modern(glob_span.ctxt());
533+
let mut marks = Vec::new();
534+
while !data.is_descendant_of(expansion, data.outer(glob_ctxt)) {
535+
marks.push(data.remove_mark(&mut glob_ctxt));
536+
}
534537

535-
let scope = marks.last().cloned();
536-
while let Some(mark) = marks.pop() {
537-
*self = self.apply_mark(mark);
538-
}
539-
Some(scope)
538+
let scope = marks.last().cloned();
539+
while let Some(mark) = marks.pop() {
540+
*self = data.apply_mark(*self, mark);
541+
}
542+
Some(scope)
543+
})
540544
}
541545

542546
#[inline]

0 commit comments

Comments
 (0)