mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-16 21:15:18 +03:00
Add walk_chain.
This combines multiple `HygieneData::with` calls on a hot path.
This commit is contained in:
@@ -128,14 +128,7 @@ pub fn debug_loc(&self, source_info: mir::SourceInfo) -> (Option<Bx::DIScope>, S
|
||||
// Walk up the macro expansion chain until we reach a non-expanded span.
|
||||
// We also stop at the function body level because no line stepping can occur
|
||||
// at the level above that.
|
||||
let mut span = source_info.span;
|
||||
while span.ctxt() != NO_EXPANSION && span.ctxt() != self.mir.span.ctxt() {
|
||||
if let Some(info) = span.ctxt().outer_expn_info() {
|
||||
span = info.call_site;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
let span = syntax_pos::hygiene::walk_chain(source_info.span, self.mir.span.ctxt());
|
||||
let scope = self.scope_metadata_for_loc(source_info.scope, span.lo());
|
||||
// Use span of the outermost expansion site, while keeping the original lexical scope.
|
||||
(scope, span)
|
||||
|
||||
@@ -257,6 +257,17 @@ fn marks(&self, mut ctxt: SyntaxContext) -> Vec<(Mark, Transparency)> {
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user