提交 83f553c9 编写于 作者: V Vadim Petrochenkov

Address review comments

上级 09fff506
......@@ -333,6 +333,22 @@ pub fn descr(self) -> &'static str {
NonMacroAttrKind::LegacyPluginHelper => "legacy plugin helper attribute",
}
}
pub fn article(self) -> &'static str {
match self {
NonMacroAttrKind::Registered => "an",
_ => "a",
}
}
/// Users of some attributes cannot mark them as used, so they are considered always used.
pub fn is_used(self) -> bool {
match self {
NonMacroAttrKind::Tool | NonMacroAttrKind::DeriveHelper => true,
NonMacroAttrKind::Builtin | NonMacroAttrKind::Registered |
NonMacroAttrKind::LegacyPluginHelper => false,
}
}
}
impl<Id> Res<Id> {
......@@ -389,6 +405,7 @@ pub fn descr(&self) -> &'static str {
pub fn article(&self) -> &'static str {
match *self {
Res::Def(kind, _) => kind.article(),
Res::NonMacroAttr(kind) => kind.article(),
Res::Err => "an",
_ => "a",
}
......
......@@ -141,8 +141,7 @@ impl<'a> Resolver<'a> {
crate fn get_macro(&mut self, res: Res) -> Option<Lrc<SyntaxExtension>> {
match res {
Res::Def(DefKind::Macro(..), def_id) => self.get_macro_by_def_id(def_id),
Res::NonMacroAttr(attr_kind) =>
Some(self.non_macro_attr(attr_kind == NonMacroAttrKind::Tool)),
Res::NonMacroAttr(attr_kind) => Some(self.non_macro_attr(attr_kind.is_used())),
_ => None,
}
}
......
......@@ -1472,7 +1472,7 @@ fn visit_scopes<T>(
Scope::MacroRules(..) => true,
Scope::CrateRoot => true,
Scope::Module(..) => true,
Scope::RegisteredAttrs => true,
Scope::RegisteredAttrs => use_prelude,
Scope::MacroUsePrelude => use_prelude || rust_2015,
Scope::BuiltinAttrs => true,
Scope::LegacyPluginHelpers => use_prelude || rust_2015,
......
......@@ -94,6 +94,7 @@ fn fast_print_path(path: &ast::Path) -> Symbol {
}
}
/// The code common between processing `#![register_tool]` and `#![register_attr]`.
fn registered_idents(
sess: &Session,
attrs: &[ast::Attribute],
......@@ -832,7 +833,8 @@ fn prohibit_imported_non_macro_attrs(&self, binding: Option<&'a NameBinding<'a>>
res: Option<Res>, span: Span) {
if let Some(Res::NonMacroAttr(kind)) = res {
if kind != NonMacroAttrKind::Tool && binding.map_or(true, |b| b.is_import()) {
let msg = format!("cannot use a {} through an import", kind.descr());
let msg =
format!("cannot use {} {} through an import", kind.article(), kind.descr());
let mut err = self.session.struct_span_err(span, &msg);
if let Some(binding) = binding {
err.span_note(binding.span, &format!("the {} imported here", kind.descr()));
......
......@@ -524,10 +524,10 @@ pub fn set(&self, features: &mut Features, span: Span) {
(active, abi_efiapi, "1.40.0", Some(65815), None),
/// Allows using the `#[register_attr]` attribute.
(active, register_attr, "1.41.0", Some(29642), None),
(active, register_attr, "1.41.0", Some(66080), None),
/// Allows using the `#[register_attr]` attribute.
(active, register_tool, "1.41.0", Some(44690), None),
(active, register_tool, "1.41.0", Some(66079), None),
// -------------------------------------------------------------------------
// feature-group-end: actual feature gates
......
......@@ -330,11 +330,11 @@ fn is_deprecated(&self) -> bool {
gated!(ffi_returns_twice, Whitelisted, template!(Word), experimental!(ffi_returns_twice)),
gated!(track_caller, Whitelisted, template!(Word), experimental!(track_caller)),
gated!(
register_attr, Whitelisted, template!(List: "attr1, attr2, ..."),
register_attr, CrateLevel, template!(List: "attr1, attr2, ..."),
experimental!(register_attr),
),
gated!(
register_tool, Whitelisted, template!(List: "tool1, tool2, ..."),
register_tool, CrateLevel, template!(List: "tool1, tool2, ..."),
experimental!(register_tool),
),
......
// edition:2018
#![feature(register_attr)]
#![feature(register_tool)]
#![register_attr(attr)]
#![register_tool(tool)]
use attr as renamed_attr; // OK
use tool as renamed_tool; // OK
#[renamed_attr] //~ ERROR cannot use an explicitly registered attribute through an import
#[renamed_tool::attr] //~ ERROR cannot use a tool module through an import
fn main() {}
error: cannot use an explicitly registered attribute through an import
--> $DIR/register-attr-tool-import.rs:12:3
|
LL | #[renamed_attr]
| ^^^^^^^^^^^^
|
note: the explicitly registered attribute imported here
--> $DIR/register-attr-tool-import.rs:9:5
|
LL | use attr as renamed_attr; // OK
| ^^^^^^^^^^^^^^^^^^^^
error: cannot use a tool module through an import
--> $DIR/register-attr-tool-import.rs:13:3
|
LL | #[renamed_tool::attr]
| ^^^^^^^^^^^^
|
note: the tool module imported here
--> $DIR/register-attr-tool-import.rs:10:5
|
LL | use tool as renamed_tool; // OK
| ^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors
#![feature(register_attr)]
#![feature(register_tool)]
#![register_attr(attr)]
#![register_tool(tool)]
#[no_implicit_prelude]
mod m {
#[attr] //~ ERROR cannot find attribute `attr` in this scope
#[tool::attr] //~ ERROR failed to resolve: use of undeclared type or module `tool`
fn check() {}
}
fn main() {}
error[E0433]: failed to resolve: use of undeclared type or module `tool`
--> $DIR/register-attr-tool-prelude.rs:10:7
|
LL | #[tool::attr]
| ^^^^ use of undeclared type or module `tool`
error: cannot find attribute `attr` in this scope
--> $DIR/register-attr-tool-prelude.rs:9:7
|
LL | #[attr]
| ^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0433`.
#![deny(unused)]
#![feature(register_attr)]
#![feature(register_tool)]
#[register_attr(attr)] //~ ERROR crate-level attribute should be an inner attribute
//~| ERROR unused attribute
#[register_tool(tool)] //~ ERROR crate-level attribute should be an inner attribute
//~| ERROR unused attribute
fn main() {}
error: unused attribute
--> $DIR/register-attr-tool-unused.rs:6:1
|
LL | #[register_attr(attr)]
| ^^^^^^^^^^^^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/register-attr-tool-unused.rs:1:9
|
LL | #![deny(unused)]
| ^^^^^^
= note: `#[deny(unused_attributes)]` implied by `#[deny(unused)]`
error: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]`
--> $DIR/register-attr-tool-unused.rs:6:1
|
LL | #[register_attr(attr)]
| ^^^^^^^^^^^^^^^^^^^^^^
error: unused attribute
--> $DIR/register-attr-tool-unused.rs:8:1
|
LL | #[register_tool(tool)]
| ^^^^^^^^^^^^^^^^^^^^^^
error: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]`
--> $DIR/register-attr-tool-unused.rs:8:1
|
LL | #[register_tool(tool)]
| ^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 4 previous errors
......@@ -4,7 +4,7 @@ error[E0658]: the `#[register_attr]` attribute is an experimental feature
LL | #![register_attr(attr)]
| ^^^^^^^^^^^^^^^^^^^^^^^
|
= note: for more information, see https://github.com/rust-lang/rust/issues/29642
= note: for more information, see https://github.com/rust-lang/rust/issues/66080
= help: add `#![feature(register_attr)]` to the crate attributes to enable
error: aborting due to previous error
......
......@@ -4,7 +4,7 @@ error[E0658]: the `#[register_tool]` attribute is an experimental feature
LL | #![register_tool(tool)]
| ^^^^^^^^^^^^^^^^^^^^^^^
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44690
= note: for more information, see https://github.com/rust-lang/rust/issues/66079
= help: add `#![feature(register_tool)]` to the crate attributes to enable
error: aborting due to previous error
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册