Specify scope in out_of_scope_macro_calls lint

```
warning: cannot find macro `in_root` in the crate root
  --> $DIR/key-value-expansion-scope.rs:1:10
   |
LL | #![doc = in_root!()]
   |          ^^^^^^^ not found in the crate root
   |
   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
   = note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535>
   = help: import `macro_rules` with `use` to make it callable above its definition
   = note: `#[warn(out_of_scope_macro_calls)]` on by default
```
This commit is contained in:
Esteban Küber 2024-07-23 00:23:54 +00:00
parent ed49386d3a
commit fe7ed278b7
7 changed files with 48 additions and 26 deletions

View File

@ -630,7 +630,8 @@ lint_opaque_hidden_inferred_bound_sugg = add this bound
lint_or_patterns_back_compat = the meaning of the `pat` fragment specifier is changing in Rust 2021, which may affect this macro lint_or_patterns_back_compat = the meaning of the `pat` fragment specifier is changing in Rust 2021, which may affect this macro
.suggestion = use pat_param to preserve semantics .suggestion = use pat_param to preserve semantics
lint_out_of_scope_macro_calls = cannot find macro `{$path}` in this scope lint_out_of_scope_macro_calls = cannot find macro `{$path}` in {$scope}
.label = not found in {$scope}
.help = import `macro_rules` with `use` to make it callable above its definition .help = import `macro_rules` with `use` to make it callable above its definition
lint_overflowing_bin_hex = literal out of range for `{$ty}` lint_overflowing_bin_hex = literal out of range for `{$ty}`

View File

@ -444,8 +444,8 @@ pub(super) fn decorate_lint(
lints::InnerAttributeUnstable::CustomInnerAttribute lints::InnerAttributeUnstable::CustomInnerAttribute
} }
.decorate_lint(diag), .decorate_lint(diag),
BuiltinLintDiag::OutOfScopeMacroCalls { path } => { BuiltinLintDiag::OutOfScopeMacroCalls { span, path, scope } => {
lints::OutOfScopeMacroCalls { path }.decorate_lint(diag) lints::OutOfScopeMacroCalls { span, path, scope }.decorate_lint(diag)
} }
BuiltinLintDiag::UnexpectedBuiltinCfg { cfg, cfg_name, controlled_by } => { BuiltinLintDiag::UnexpectedBuiltinCfg { cfg, cfg_name, controlled_by } => {
lints::UnexpectedBuiltinCfg { cfg, cfg_name, controlled_by }.decorate_lint(diag) lints::UnexpectedBuiltinCfg { cfg, cfg_name, controlled_by }.decorate_lint(diag)

View File

@ -3108,7 +3108,10 @@ pub(crate) struct UnsafeAttrOutsideUnsafeSuggestion {
#[diag(lint_out_of_scope_macro_calls)] #[diag(lint_out_of_scope_macro_calls)]
#[help] #[help]
pub(crate) struct OutOfScopeMacroCalls { pub(crate) struct OutOfScopeMacroCalls {
#[label]
pub span: Span,
pub path: String, pub path: String,
pub scope: String,
} }
#[derive(LintDiagnostic)] #[derive(LintDiagnostic)]

View File

@ -819,7 +819,9 @@ pub enum BuiltinLintDiag {
is_macro: bool, is_macro: bool,
}, },
OutOfScopeMacroCalls { OutOfScopeMacroCalls {
span: Span,
path: String, path: String,
scope: String,
}, },
UnexpectedBuiltinCfg { UnexpectedBuiltinCfg {
cfg: String, cfg: String,

View File

@ -857,8 +857,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
), ),
path_res @ (PathResult::NonModule(..) | PathResult::Failed { .. }) => { path_res @ (PathResult::NonModule(..) | PathResult::Failed { .. }) => {
let mut suggestion = None; let mut suggestion = None;
let (span, label, module) = let (span, label, module, segment) =
if let PathResult::Failed { span, label, module, .. } = path_res { if let PathResult::Failed { span, label, module, segment_name, .. } =
path_res
{
// try to suggest if it's not a macro, maybe a function // try to suggest if it's not a macro, maybe a function
if let PathResult::NonModule(partial_res) = if let PathResult::NonModule(partial_res) =
self.maybe_resolve_path(&path, Some(ValueNS), &parent_scope, None) self.maybe_resolve_path(&path, Some(ValueNS), &parent_scope, None)
@ -876,7 +878,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
Applicability::MaybeIncorrect, Applicability::MaybeIncorrect,
)); ));
} }
(span, label, module) (span, label, module, segment_name)
} else { } else {
( (
path_span, path_span,
@ -886,12 +888,13 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
kind.descr() kind.descr()
), ),
None, None,
path.last().map(|segment| segment.ident.name).unwrap(),
) )
}; };
self.report_error( self.report_error(
span, span,
ResolutionError::FailedToResolve { ResolutionError::FailedToResolve {
segment: path.last().map(|segment| segment.ident.name), segment: Some(segment),
label, label,
suggestion, suggestion,
module, module,
@ -1067,11 +1070,24 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
None, None,
); );
if fallback_binding.ok().and_then(|b| b.res().opt_def_id()) != Some(def_id) { if fallback_binding.ok().and_then(|b| b.res().opt_def_id()) != Some(def_id) {
let scope = match parent_scope.module.kind {
ModuleKind::Def(_, _, name) if name == kw::Empty => {
"the crate root".to_string()
}
ModuleKind::Def(kind, def_id, name) => {
format!("{} `{name}`", kind.descr(def_id))
}
ModuleKind::Block => "this scope".to_string(),
};
self.tcx.sess.psess.buffer_lint( self.tcx.sess.psess.buffer_lint(
OUT_OF_SCOPE_MACRO_CALLS, OUT_OF_SCOPE_MACRO_CALLS,
path.span, path.span,
node_id, node_id,
BuiltinLintDiag::OutOfScopeMacroCalls { path: pprust::path_to_string(path) }, BuiltinLintDiag::OutOfScopeMacroCalls {
span: path.span,
path: pprust::path_to_string(path),
scope,
},
); );
} }
} }

View File

@ -1,7 +1,7 @@
#![doc = in_root!()] //~ WARN cannot find macro `in_root` in this scope #![doc = in_root!()] //~ WARN cannot find macro `in_root`
//~| WARN this was previously accepted by the compiler //~| WARN this was previously accepted by the compiler
#![doc = in_mod!()] //~ ERROR cannot find macro `in_mod` in this scope #![doc = in_mod!()] //~ ERROR cannot find macro `in_mod` in this scope
#![doc = in_mod_escape!()] //~ WARN cannot find macro `in_mod_escape` in this scope #![doc = in_mod_escape!()] //~ WARN cannot find macro `in_mod_escape`
//~| WARN this was previously accepted by the compiler //~| WARN this was previously accepted by the compiler
#![doc = in_block!()] //~ ERROR cannot find macro `in_block` in this scope #![doc = in_block!()] //~ ERROR cannot find macro `in_block` in this scope
@ -18,10 +18,10 @@ fn before() {
macro_rules! in_root { () => { "" } } macro_rules! in_root { () => { "" } }
#[doc = in_mod!()] //~ WARN cannot find macro `in_mod` in this scope #[doc = in_mod!()] //~ WARN cannot find macro `in_mod`
//~| WARN this was previously accepted by the compiler //~| WARN this was previously accepted by the compiler
mod macros_stay { mod macros_stay {
#![doc = in_mod!()] //~ WARN cannot find macro `in_mod` in this scope #![doc = in_mod!()] //~ WARN cannot find macro `in_mod`
//~| WARN this was previously accepted by the compiler //~| WARN this was previously accepted by the compiler
macro_rules! in_mod { () => { "" } } macro_rules! in_mod { () => { "" } }
@ -33,10 +33,10 @@ mod macros_stay {
} }
#[macro_use] #[macro_use]
#[doc = in_mod_escape!()] //~ WARN cannot find macro `in_mod_escape` in this scope #[doc = in_mod_escape!()] //~ WARN cannot find macro `in_mod_escape`
//~| WARN this was previously accepted by the compiler //~| WARN this was previously accepted by the compiler
mod macros_escape { mod macros_escape {
#![doc = in_mod_escape!()] //~ WARN cannot find macro `in_mod_escape` in this scope #![doc = in_mod_escape!()] //~ WARN cannot find macro `in_mod_escape`
//~| WARN this was previously accepted by the compiler //~| WARN this was previously accepted by the compiler
macro_rules! in_mod_escape { () => { "" } } macro_rules! in_mod_escape { () => { "" } }

View File

@ -126,62 +126,62 @@ LL | #![doc = in_block!()]
| |
= help: have you added the `#[macro_use]` on the module/import? = help: have you added the `#[macro_use]` on the module/import?
warning: cannot find macro `in_root` in this scope warning: cannot find macro `in_root` in the crate root
--> $DIR/key-value-expansion-scope.rs:1:10 --> $DIR/key-value-expansion-scope.rs:1:10
| |
LL | #![doc = in_root!()] LL | #![doc = in_root!()]
| ^^^^^^^ | ^^^^^^^ not found in the crate root
| |
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535> = note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535>
= help: import `macro_rules` with `use` to make it callable above its definition = help: import `macro_rules` with `use` to make it callable above its definition
= note: `#[warn(out_of_scope_macro_calls)]` on by default = note: `#[warn(out_of_scope_macro_calls)]` on by default
warning: cannot find macro `in_mod_escape` in this scope warning: cannot find macro `in_mod_escape` in the crate root
--> $DIR/key-value-expansion-scope.rs:4:10 --> $DIR/key-value-expansion-scope.rs:4:10
| |
LL | #![doc = in_mod_escape!()] LL | #![doc = in_mod_escape!()]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^ not found in the crate root
| |
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535> = note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535>
= help: import `macro_rules` with `use` to make it callable above its definition = help: import `macro_rules` with `use` to make it callable above its definition
warning: cannot find macro `in_mod` in this scope warning: cannot find macro `in_mod` in module `macros_stay`
--> $DIR/key-value-expansion-scope.rs:21:9 --> $DIR/key-value-expansion-scope.rs:21:9
| |
LL | #[doc = in_mod!()] LL | #[doc = in_mod!()]
| ^^^^^^ | ^^^^^^ not found in module `macros_stay`
| |
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535> = note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535>
= help: import `macro_rules` with `use` to make it callable above its definition = help: import `macro_rules` with `use` to make it callable above its definition
warning: cannot find macro `in_mod` in this scope warning: cannot find macro `in_mod` in module `macros_stay`
--> $DIR/key-value-expansion-scope.rs:24:14 --> $DIR/key-value-expansion-scope.rs:24:14
| |
LL | #![doc = in_mod!()] LL | #![doc = in_mod!()]
| ^^^^^^ | ^^^^^^ not found in module `macros_stay`
| |
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535> = note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535>
= help: import `macro_rules` with `use` to make it callable above its definition = help: import `macro_rules` with `use` to make it callable above its definition
warning: cannot find macro `in_mod_escape` in this scope warning: cannot find macro `in_mod_escape` in module `macros_escape`
--> $DIR/key-value-expansion-scope.rs:36:9 --> $DIR/key-value-expansion-scope.rs:36:9
| |
LL | #[doc = in_mod_escape!()] LL | #[doc = in_mod_escape!()]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^ not found in module `macros_escape`
| |
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535> = note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535>
= help: import `macro_rules` with `use` to make it callable above its definition = help: import `macro_rules` with `use` to make it callable above its definition
warning: cannot find macro `in_mod_escape` in this scope warning: cannot find macro `in_mod_escape` in module `macros_escape`
--> $DIR/key-value-expansion-scope.rs:39:14 --> $DIR/key-value-expansion-scope.rs:39:14
| |
LL | #![doc = in_mod_escape!()] LL | #![doc = in_mod_escape!()]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^ not found in module `macros_escape`
| |
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535> = note: for more information, see issue #124535 <https://github.com/rust-lang/rust/issues/124535>