Skip to content

Commit 68e1141

Browse files
committed
resolve: Avoid creating fresh syntax extensions for all non-macro attributes
1 parent 085a8d0 commit 68e1141

File tree

3 files changed

+16
-11
lines changed

3 files changed

+16
-11
lines changed

src/librustc_resolve/build_reduced_graph.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use syntax::attr;
2929

3030
use syntax::ast::{self, Block, ForeignItem, ForeignItemKind, Item, ItemKind, NodeId};
3131
use syntax::ast::{MetaItemKind, StmtKind, TraitItem, TraitItemKind, Variant};
32-
use syntax::ext::base::{MacroKind, SyntaxExtension, SyntaxExtensionKind};
32+
use syntax::ext::base::{MacroKind, SyntaxExtension};
3333
use syntax::ext::base::Determinacy::Undetermined;
3434
use syntax::ext::hygiene::Mark;
3535
use syntax::ext::tt::macro_rules;
@@ -772,12 +772,8 @@ impl<'a> Resolver<'a> {
772772
pub fn get_macro(&mut self, res: Res) -> Lrc<SyntaxExtension> {
773773
let def_id = match res {
774774
Res::Def(DefKind::Macro(..), def_id) => def_id,
775-
Res::NonMacroAttr(attr_kind) => return Lrc::new(SyntaxExtension::default(
776-
SyntaxExtensionKind::NonMacroAttr {
777-
mark_used: attr_kind == NonMacroAttrKind::Tool
778-
},
779-
self.session.edition(),
780-
)),
775+
Res::NonMacroAttr(attr_kind) =>
776+
return self.non_macro_attr(attr_kind == NonMacroAttrKind::Tool),
781777
_ => panic!("expected `DefKind::Macro` or `Res::NonMacroAttr`"),
782778
};
783779
if let Some(ext) = self.macro_map.get(&def_id) {

src/librustc_resolve/lib.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use rustc_metadata::cstore::CStore;
4141
use syntax::source_map::SourceMap;
4242
use syntax::ext::hygiene::{Mark, Transparency, SyntaxContext};
4343
use syntax::ast::{self, Name, NodeId, Ident, FloatTy, IntTy, UintTy};
44-
use syntax::ext::base::SyntaxExtension;
44+
use syntax::ext::base::{SyntaxExtension, SyntaxExtensionKind};
4545
use syntax::ext::base::Determinacy::{self, Determined, Undetermined};
4646
use syntax::ext::base::MacroKind;
4747
use syntax::symbol::{Symbol, kw, sym};
@@ -1668,6 +1668,7 @@ pub struct Resolver<'a> {
16681668
macro_use_prelude: FxHashMap<Name, &'a NameBinding<'a>>,
16691669
pub all_macros: FxHashMap<Name, Res>,
16701670
macro_map: FxHashMap<DefId, Lrc<SyntaxExtension>>,
1671+
non_macro_attrs: [Lrc<SyntaxExtension>; 2],
16711672
macro_defs: FxHashMap<Mark, DefId>,
16721673
local_macro_def_scopes: FxHashMap<NodeId, Module<'a>>,
16731674

@@ -1941,6 +1942,10 @@ impl<'a> Resolver<'a> {
19411942
let mut macro_defs = FxHashMap::default();
19421943
macro_defs.insert(Mark::root(), root_def_id);
19431944

1945+
let non_macro_attr = |mark_used| Lrc::new(SyntaxExtension::default(
1946+
SyntaxExtensionKind::NonMacroAttr { mark_used }, session.edition()
1947+
));
1948+
19441949
Resolver {
19451950
session,
19461951

@@ -2014,6 +2019,7 @@ impl<'a> Resolver<'a> {
20142019
macro_use_prelude: FxHashMap::default(),
20152020
all_macros: FxHashMap::default(),
20162021
macro_map: FxHashMap::default(),
2022+
non_macro_attrs: [non_macro_attr(false), non_macro_attr(true)],
20172023
invocations,
20182024
macro_defs,
20192025
local_macro_def_scopes: FxHashMap::default(),
@@ -2030,6 +2036,10 @@ impl<'a> Resolver<'a> {
20302036
Default::default()
20312037
}
20322038

2039+
fn non_macro_attr(&self, mark_used: bool) -> Lrc<SyntaxExtension> {
2040+
self.non_macro_attrs[mark_used as usize].clone()
2041+
}
2042+
20332043
/// Runs the function on each namespace.
20342044
fn per_ns<F: FnMut(&mut Self, Namespace)>(&mut self, mut f: F) {
20352045
f(self, TypeNS);

src/librustc_resolve/macros.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use syntax::ast::{self, Ident};
1515
use syntax::attr;
1616
use syntax::errors::DiagnosticBuilder;
1717
use syntax::ext::base::{self, Determinacy};
18-
use syntax::ext::base::{MacroKind, SyntaxExtension, SyntaxExtensionKind};
18+
use syntax::ext::base::{MacroKind, SyntaxExtension};
1919
use syntax::ext::expand::{AstFragment, Invocation, InvocationKind};
2020
use syntax::ext::hygiene::Mark;
2121
use syntax::ext::tt::macro_rules;
@@ -211,8 +211,7 @@ impl<'a> base::Resolver for Resolver<'a> {
211211
Ok((res, ext)) => (res, ext),
212212
Err(Determinacy::Determined) if kind == MacroKind::Attr => {
213213
// Replace unresolved attributes with used inert attributes for better recovery.
214-
let kind = SyntaxExtensionKind::NonMacroAttr { mark_used: true };
215-
return Ok(Some(Lrc::new(SyntaxExtension::default(kind, self.session.edition()))));
214+
return Ok(Some(self.non_macro_attr(true)));
216215
}
217216
Err(determinacy) => return Err(determinacy),
218217
};

0 commit comments

Comments
 (0)