From 0361bd004a5074e7fddc8479bca9414e03178e04 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Mon, 12 Jan 2026 02:10:41 +0300 Subject: [PATCH] resolve: In `visit_scopes` do not extract ctxt out of span unless necessary --- compiler/rustc_resolve/src/diagnostics.rs | 5 ++++- compiler/rustc_resolve/src/ident.rs | 19 +++++++++++-------- compiler/rustc_resolve/src/late.rs | 8 +++----- compiler/rustc_resolve/src/lib.rs | 2 +- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index 7bc08f1de5462..899f81525529b 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -32,7 +32,9 @@ use rustc_span::edit_distance::find_best_match_for_name; use rustc_span::edition::Edition; use rustc_span::hygiene::MacroKind; use rustc_span::source_map::{SourceMap, Spanned}; -use rustc_span::{BytePos, Ident, Macros20NormalizedIdent, Span, Symbol, SyntaxContext, kw, sym}; +use rustc_span::{ + BytePos, DUMMY_SP, Ident, Macros20NormalizedIdent, Span, Symbol, SyntaxContext, kw, sym, +}; use thin_vec::{ThinVec, thin_vec}; use tracing::{debug, instrument}; @@ -1179,6 +1181,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { ctxt: SyntaxContext, filter_fn: &impl Fn(Res) -> bool, ) { + let ctxt = DUMMY_SP.with_ctxt(ctxt); self.cm().visit_scopes(scope_set, ps, ctxt, None, |this, scope, use_prelude, _| { match scope { Scope::DeriveHelpers(expn_id) => { diff --git a/compiler/rustc_resolve/src/ident.rs b/compiler/rustc_resolve/src/ident.rs index 7f04216c5553c..f7e628048ccd8 100644 --- a/compiler/rustc_resolve/src/ident.rs +++ b/compiler/rustc_resolve/src/ident.rs @@ -53,13 +53,15 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { mut self: CmResolver<'r, 'ra, 'tcx>, scope_set: ScopeSet<'ra>, parent_scope: &ParentScope<'ra>, - orig_ctxt: SyntaxContext, + // Location of the span is not significant, but pass a `Span` instead of `SyntaxContext` + // to avoid extracting and re-packaging the syntax context unnecessarily. + orig_ctxt: Span, derive_fallback_lint_id: Option, mut visitor: impl FnMut( &mut CmResolver<'r, 'ra, 'tcx>, Scope<'ra>, UsePrelude, - SyntaxContext, + Span, ) -> ControlFlow, ) -> Option { // General principles: @@ -238,11 +240,12 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn hygienic_lexical_parent( &self, module: Module<'ra>, - ctxt: &mut SyntaxContext, + span: &mut Span, derive_fallback_lint_id: Option, ) -> Option<(Module<'ra>, Option)> { - if !module.expansion.outer_expn_is_descendant_of(*ctxt) { - return Some((self.expn_def_scope(ctxt.remove_mark()), None)); + let ctxt = span.ctxt(); + if !module.expansion.outer_expn_is_descendant_of(ctxt) { + return Some((self.expn_def_scope(span.remove_mark()), None)); } if let ModuleKind::Block = module.kind { @@ -272,7 +275,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let ext = &self.get_macro_by_def_id(def_id).ext; if ext.builtin_name.is_none() && ext.macro_kinds() == MacroKinds::DERIVE - && parent.expansion.outer_expn_is_descendant_of(*ctxt) + && parent.expansion.outer_expn_is_descendant_of(ctxt) { return Some((parent, derive_fallback_lint_id)); } @@ -433,10 +436,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let break_result = self.visit_scopes( scope_set, parent_scope, - orig_ident.span.ctxt(), + orig_ident.span, derive_fallback_lint_id, |this, scope, use_prelude, ctxt| { - let ident = Ident::new(orig_ident.name, orig_ident.span.with_ctxt(ctxt)); + let ident = Ident::new(orig_ident.name, ctxt); // The passed `ctxt` is already normalized, so avoid expensive double normalization. let ident = Macros20NormalizedIdent(ident); let res = match this.reborrow().resolve_ident_in_scope( diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 6d00976317729..6557e1dea1a16 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -37,9 +37,7 @@ use rustc_session::config::{CrateType, ResolveDocLinks}; use rustc_session::lint; use rustc_session::parse::feature_err; use rustc_span::source_map::{Spanned, respan}; -use rustc_span::{ - BytePos, DUMMY_SP, Ident, Macros20NormalizedIdent, Span, Symbol, SyntaxContext, kw, sym, -}; +use rustc_span::{BytePos, DUMMY_SP, Ident, Macros20NormalizedIdent, Span, Symbol, kw, sym}; use smallvec::{SmallVec, smallvec}; use thin_vec::ThinVec; use tracing::{debug, instrument, trace}; @@ -5224,7 +5222,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { self.r.traits_in_scope( self.current_trait_ref.as_ref().map(|(module, _)| *module), &self.parent_scope, - ident.span.ctxt(), + ident.span, Some((ident.name, ns)), ) } @@ -5323,7 +5321,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { .entry(self.parent_scope.module.nearest_parent_mod().expect_local()) .or_insert_with(|| { self.r - .traits_in_scope(None, &self.parent_scope, SyntaxContext::root(), None) + .traits_in_scope(None, &self.parent_scope, DUMMY_SP, None) .into_iter() .filter_map(|tr| { if self.is_invalid_proc_macro_item_for_doc(tr.def_id) { diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index c4c1e06f94ae2..0939f8cddbe5b 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -1918,7 +1918,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { &mut self, current_trait: Option>, parent_scope: &ParentScope<'ra>, - ctxt: SyntaxContext, + ctxt: Span, assoc_item: Option<(Symbol, Namespace)>, ) -> Vec { let mut found_traits = Vec::new();