diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-06-03 12:07:51 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-06-05 07:43:15 +1000 |
| commit | dc807a9f7ec02d425b4e3350a87b29f6cf7fa4ff (patch) | |
| tree | 05a0bcdc93c8c3ed0ff0d1b95da645b38e2b5f19 /src/libsyntax_pos | |
| parent | 6596743d5e710e69d88f9522a207f41731177ef0 (diff) | |
| download | rust-dc807a9f7ec02d425b4e3350a87b29f6cf7fa4ff.tar.gz rust-dc807a9f7ec02d425b4e3350a87b29f6cf7fa4ff.zip | |
Add `walk_chain`.
This combines multiple `HygieneData::with` calls on a hot path.
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/hygiene.rs | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs index 451ae5808f6..7ff7a9db497 100644 --- a/src/libsyntax_pos/hygiene.rs +++ b/src/libsyntax_pos/hygiene.rs @@ -257,6 +257,17 @@ impl HygieneData { marks } + fn walk_chain(&self, mut span: Span, to: SyntaxContext) -> Span { + while span.ctxt() != crate::NO_EXPANSION && span.ctxt() != to { + if let Some(info) = self.expn_info(self.outer(span.ctxt())) { + span = info.call_site; + } else { + break; + } + } + span + } + fn adjust(&self, ctxt: &mut SyntaxContext, expansion: Mark) -> Option<Mark> { let mut scope = None; while !self.is_descendant_of(expansion, self.outer(*ctxt)) { @@ -366,6 +377,10 @@ pub fn clear_markings() { HygieneData::with(|data| data.markings = FxHashMap::default()); } +pub fn walk_chain(span: Span, to: SyntaxContext) -> Span { + HygieneData::with(|data| data.walk_chain(span, to)) +} + impl SyntaxContext { #[inline] pub const fn empty() -> Self { |
