diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-06-01 08:35:01 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-06-05 07:43:14 +1000 |
| commit | e19857c4dbbde65803d619011af4415fbdda8c01 (patch) | |
| tree | 22765b8610a8f8b8901731a4e3bbd1025b08000a /src/libsyntax_pos | |
| parent | 58a486928e4bf78cc33aaae43ad835eb482b14f1 (diff) | |
| download | rust-e19857c4dbbde65803d619011af4415fbdda8c01.tar.gz rust-e19857c4dbbde65803d619011af4415fbdda8c01.zip | |
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`.
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/hygiene.rs | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs index ff17256b732..e50b9da62e7 100644 --- a/src/libsyntax_pos/hygiene.rs +++ b/src/libsyntax_pos/hygiene.rs @@ -499,18 +499,20 @@ impl SyntaxContext { /// This returns `None` if the context cannot be glob-adjusted. /// Otherwise, it returns the scope to use when privacy checking (see `adjust` for details). pub fn glob_adjust(&mut self, expansion: Mark, glob_span: Span) -> Option<Option<Mark>> { - let mut scope = None; - let mut glob_ctxt = glob_span.ctxt().modern(); - while !expansion.outer_is_descendant_of(glob_ctxt) { - scope = Some(glob_ctxt.remove_mark()); - if self.remove_mark() != scope.unwrap() { + HygieneData::with(|data| { + let mut scope = None; + let mut glob_ctxt = data.modern(glob_span.ctxt()); + while !data.is_descendant_of(expansion, data.outer(glob_ctxt)) { + scope = Some(data.remove_mark(&mut glob_ctxt)); + if data.remove_mark(self) != scope.unwrap() { + return None; + } + } + if data.adjust(self, expansion).is_some() { return None; } - } - if self.adjust(expansion).is_some() { - return None; - } - Some(scope) + Some(scope) + }) } /// Undo `glob_adjust` if possible: @@ -522,21 +524,23 @@ impl SyntaxContext { /// ``` pub fn reverse_glob_adjust(&mut self, expansion: Mark, glob_span: Span) -> Option<Option<Mark>> { - if self.adjust(expansion).is_some() { - return None; - } + HygieneData::with(|data| { + if data.adjust(self, expansion).is_some() { + return None; + } - let mut glob_ctxt = glob_span.ctxt().modern(); - let mut marks = Vec::new(); - while !expansion.outer_is_descendant_of(glob_ctxt) { - marks.push(glob_ctxt.remove_mark()); - } + let mut glob_ctxt = data.modern(glob_span.ctxt()); + let mut marks = Vec::new(); + while !data.is_descendant_of(expansion, data.outer(glob_ctxt)) { + marks.push(data.remove_mark(&mut glob_ctxt)); + } - let scope = marks.last().cloned(); - while let Some(mark) = marks.pop() { - *self = self.apply_mark(mark); - } - Some(scope) + let scope = marks.last().cloned(); + while let Some(mark) = marks.pop() { + *self = data.apply_mark(*self, mark); + } + Some(scope) + }) } #[inline] |
