Skip to content

Commit dd6347a

Browse files
committed
resolve: Integrate inert attributes registererd by legacy plugins into macro resolution
1 parent b8bea5a commit dd6347a

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

src/librustc/hir/def.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ pub enum NonMacroAttrKind {
3636
Tool,
3737
/// Single-segment custom attribute registered by a derive macro (`#[serde(default)]`).
3838
DeriveHelper,
39+
/// Single-segment custom attriubte registered by a legacy plugin (`register_attribute`).
40+
LegacyPluginHelper,
3941
/// Single-segment custom attribute not registered in any way (`#[my_attr]`).
4042
Custom,
4143
}
@@ -259,6 +261,7 @@ impl NonMacroAttrKind {
259261
NonMacroAttrKind::Builtin => "built-in attribute",
260262
NonMacroAttrKind::Tool => "tool attribute",
261263
NonMacroAttrKind::DeriveHelper => "derive helper attribute",
264+
NonMacroAttrKind::LegacyPluginHelper => "legacy plugin helper attribute",
262265
NonMacroAttrKind::Custom => "custom attribute",
263266
}
264267
}

src/librustc/ich/impls_hir.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,7 @@ impl_stable_hash_for!(enum hir::def::NonMacroAttrKind {
10121012
Builtin,
10131013
Tool,
10141014
DeriveHelper,
1015+
LegacyPluginHelper,
10151016
Custom,
10161017
});
10171018

src/librustc_resolve/macros.rs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -248,11 +248,6 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
248248
for i in 0..attrs.len() {
249249
let name = attrs[i].name();
250250

251-
if self.session.plugin_attributes.borrow().iter()
252-
.any(|&(ref attr_nm, _)| name == &**attr_nm) {
253-
attr::mark_known(&attrs[i]);
254-
}
255-
256251
match self.builtin_macros.get(&name).cloned() {
257252
Some(binding) => match *binding.get_macro(self) {
258253
MultiModifier(..) | MultiDecorator(..) | SyntaxExtension::AttrProcMacro(..) => {
@@ -591,6 +586,15 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
591586
// 2b. Standard library prelude is currently implemented as `macro-use` (closed, controlled)
592587
// 3. Language prelude: builtin macros (closed, controlled, except for legacy plugins).
593588
// 4. Language prelude: builtin attributes (closed, controlled).
589+
// N (unordered). Derive helpers (open, not controlled). All ambiguities with other names
590+
// are currently reported as errors. They should be higher in priority than preludes
591+
// and maybe even names in modules according to the "general principles" above. They
592+
// also should be subject to restricted shadowing because are effectively produced by
593+
// derives (you need to resolve the derive first to add helpers into scope), but they
594+
// should be available before the derive is expanded for compatibility.
595+
// It's mess in general, so we are being conservative for now.
596+
// N (unordered). Legacy plugin helpers (open, not controlled). Similar to derive helpers,
597+
// but introduced by legacy plugins using `register_attribute`.
594598

595599
assert!(ns == TypeNS || ns == MacroNS);
596600
assert!(force || !record_used); // `record_used` implies `force`
@@ -615,6 +619,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
615619
BuiltinMacros,
616620
BuiltinAttrs,
617621
DeriveHelpers,
622+
LegacyPluginHelpers,
618623
ExternPrelude,
619624
ToolPrelude,
620625
StdLibPrelude,
@@ -681,6 +686,17 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
681686
}
682687
result
683688
}
689+
WhereToResolve::LegacyPluginHelpers => {
690+
if self.session.plugin_attributes.borrow().iter()
691+
.any(|(name, _)| ident.name == &**name) {
692+
let binding = (Def::NonMacroAttr(NonMacroAttrKind::LegacyPluginHelper),
693+
ty::Visibility::Public, ident.span, Mark::root())
694+
.to_name_binding(self.arenas);
695+
Ok((binding, FromPrelude(false)))
696+
} else {
697+
Err(Determinacy::Determined)
698+
}
699+
}
684700
WhereToResolve::ExternPrelude => {
685701
if use_prelude && self.session.extern_prelude.contains(&ident.name) {
686702
let crate_id =
@@ -752,8 +768,9 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
752768
}
753769
WhereToResolve::MacroUsePrelude => WhereToResolve::BuiltinMacros,
754770
WhereToResolve::BuiltinMacros => WhereToResolve::BuiltinAttrs,
755-
WhereToResolve::BuiltinAttrs => break, // nowhere else to search
756-
WhereToResolve::DeriveHelpers => WhereToResolve::Module(parent_scope.module),
771+
WhereToResolve::BuiltinAttrs => WhereToResolve::DeriveHelpers,
772+
WhereToResolve::DeriveHelpers => WhereToResolve::LegacyPluginHelpers,
773+
WhereToResolve::LegacyPluginHelpers => break, // nowhere else to search
757774
WhereToResolve::ExternPrelude => WhereToResolve::ToolPrelude,
758775
WhereToResolve::ToolPrelude => WhereToResolve::StdLibPrelude,
759776
WhereToResolve::StdLibPrelude => WhereToResolve::BuiltinTypes,
@@ -775,12 +792,15 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
775792

776793
if let Some(innermost_result) = innermost_result {
777794
// Found another solution, if the first one was "weak", report an error.
778-
let (def, innermost_def) = (result.0.def(), innermost_result.0.def());
779-
if def != innermost_def &&
795+
let prohibit_ambiguities = |def| {
796+
def == Def::NonMacroAttr(NonMacroAttrKind::DeriveHelper) ||
797+
def == Def::NonMacroAttr(NonMacroAttrKind::LegacyPluginHelper)
798+
};
799+
if result.0.def() != innermost_result.0.def() &&
780800
(innermost_result.0.is_glob_import() ||
781801
innermost_result.0.may_appear_after(parent_scope.expansion, result.0) ||
782-
innermost_def == Def::NonMacroAttr(NonMacroAttrKind::DeriveHelper) ||
783-
def == Def::NonMacroAttr(NonMacroAttrKind::DeriveHelper)) {
802+
prohibit_ambiguities(innermost_result.0.def()) ||
803+
prohibit_ambiguities(result.0.def())) {
784804
self.ambiguity_errors.push(AmbiguityError {
785805
ident,
786806
b1: innermost_result.0,

0 commit comments

Comments
 (0)