Add external macro specific diagnostic to check-cfg
This commit is contained in:
parent
0ab3ae81a5
commit
e2fbeec150
5 changed files with 108 additions and 12 deletions
|
@ -1,9 +1,10 @@
|
|||
use rustc_hir::def_id::LOCAL_CRATE;
|
||||
use rustc_middle::bug;
|
||||
use rustc_session::Session;
|
||||
use rustc_session::config::ExpectedValues;
|
||||
use rustc_span::edit_distance::find_best_match_for_name;
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::{Span, Symbol, sym};
|
||||
use rustc_span::{ExpnKind, Span, Symbol, sym};
|
||||
|
||||
use crate::lints;
|
||||
|
||||
|
@ -60,6 +61,35 @@ fn cargo_help_sub(
|
|||
}
|
||||
}
|
||||
|
||||
fn rustc_macro_help(span: Span) -> Option<lints::UnexpectedCfgRustcMacroHelp> {
|
||||
let oexpn = span.ctxt().outer_expn_data();
|
||||
if let Some(def_id) = oexpn.macro_def_id
|
||||
&& let ExpnKind::Macro(macro_kind, macro_name) = oexpn.kind
|
||||
&& def_id.krate != LOCAL_CRATE
|
||||
{
|
||||
Some(lints::UnexpectedCfgRustcMacroHelp { macro_kind: macro_kind.descr(), macro_name })
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn cargo_macro_help(span: Span) -> Option<lints::UnexpectedCfgCargoMacroHelp> {
|
||||
let oexpn = span.ctxt().outer_expn_data();
|
||||
if let Some(def_id) = oexpn.macro_def_id
|
||||
&& let ExpnKind::Macro(macro_kind, macro_name) = oexpn.kind
|
||||
&& def_id.krate != LOCAL_CRATE
|
||||
{
|
||||
Some(lints::UnexpectedCfgCargoMacroHelp {
|
||||
macro_kind: macro_kind.descr(),
|
||||
macro_name,
|
||||
// FIXME: Get access to a `TyCtxt` from an `EarlyContext`
|
||||
// crate_name: cx.tcx.crate_name(def_id.krate),
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn unexpected_cfg_name(
|
||||
sess: &Session,
|
||||
(name, name_span): (Symbol, Span),
|
||||
|
@ -186,16 +216,21 @@ pub(super) fn unexpected_cfg_name(
|
|||
};
|
||||
|
||||
let invocation_help = if is_from_cargo {
|
||||
let sub = if !is_feature_cfg && !is_from_external_macro {
|
||||
let help = if !is_feature_cfg && !is_from_external_macro {
|
||||
Some(cargo_help_sub(sess, &inst))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
lints::unexpected_cfg_name::InvocationHelp::Cargo { sub }
|
||||
lints::unexpected_cfg_name::InvocationHelp::Cargo {
|
||||
help,
|
||||
macro_help: cargo_macro_help(name_span),
|
||||
}
|
||||
} else {
|
||||
lints::unexpected_cfg_name::InvocationHelp::Rustc(lints::UnexpectedCfgRustcHelp::new(
|
||||
&inst(EscapeQuotes::No),
|
||||
))
|
||||
let help = lints::UnexpectedCfgRustcHelp::new(&inst(EscapeQuotes::No));
|
||||
lints::unexpected_cfg_name::InvocationHelp::Rustc {
|
||||
help,
|
||||
macro_help: rustc_macro_help(name_span),
|
||||
}
|
||||
};
|
||||
|
||||
lints::UnexpectedCfgName { code_sugg, invocation_help, name }
|
||||
|
@ -302,14 +337,20 @@ pub(super) fn unexpected_cfg_value(
|
|||
} else {
|
||||
None
|
||||
};
|
||||
lints::unexpected_cfg_value::InvocationHelp::Cargo(help)
|
||||
lints::unexpected_cfg_value::InvocationHelp::Cargo {
|
||||
help,
|
||||
macro_help: cargo_macro_help(name_span),
|
||||
}
|
||||
} else {
|
||||
let help = if can_suggest_adding_value {
|
||||
Some(lints::UnexpectedCfgRustcHelp::new(&inst(EscapeQuotes::No)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
lints::unexpected_cfg_value::InvocationHelp::Rustc(help)
|
||||
lints::unexpected_cfg_value::InvocationHelp::Rustc {
|
||||
help,
|
||||
macro_help: rustc_macro_help(name_span),
|
||||
}
|
||||
};
|
||||
|
||||
lints::UnexpectedCfgValue {
|
||||
|
|
|
@ -2131,6 +2131,25 @@ impl UnexpectedCfgRustcHelp {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[note(lint_unexpected_cfg_from_external_macro_origin)]
|
||||
#[help(lint_unexpected_cfg_from_external_macro_refer)]
|
||||
pub(crate) struct UnexpectedCfgRustcMacroHelp {
|
||||
pub macro_kind: &'static str,
|
||||
pub macro_name: Symbol,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[note(lint_unexpected_cfg_from_external_macro_origin)]
|
||||
#[help(lint_unexpected_cfg_from_external_macro_refer)]
|
||||
#[help(lint_unexpected_cfg_cargo_update)]
|
||||
pub(crate) struct UnexpectedCfgCargoMacroHelp {
|
||||
pub macro_kind: &'static str,
|
||||
pub macro_name: Symbol,
|
||||
// FIXME: Figure out a way to get the crate name
|
||||
// crate_name: String,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_unexpected_cfg_name)]
|
||||
pub(crate) struct UnexpectedCfgName {
|
||||
|
@ -2235,10 +2254,17 @@ pub(crate) mod unexpected_cfg_name {
|
|||
#[note(lint_unexpected_cfg_doc_cargo)]
|
||||
Cargo {
|
||||
#[subdiagnostic]
|
||||
sub: Option<super::UnexpectedCfgCargoHelp>,
|
||||
macro_help: Option<super::UnexpectedCfgCargoMacroHelp>,
|
||||
#[subdiagnostic]
|
||||
help: Option<super::UnexpectedCfgCargoHelp>,
|
||||
},
|
||||
#[note(lint_unexpected_cfg_doc_rustc)]
|
||||
Rustc(#[subdiagnostic] super::UnexpectedCfgRustcHelp),
|
||||
Rustc {
|
||||
#[subdiagnostic]
|
||||
macro_help: Option<super::UnexpectedCfgRustcMacroHelp>,
|
||||
#[subdiagnostic]
|
||||
help: super::UnexpectedCfgRustcHelp,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2341,9 +2367,19 @@ pub(crate) mod unexpected_cfg_value {
|
|||
#[derive(Subdiagnostic)]
|
||||
pub(crate) enum InvocationHelp {
|
||||
#[note(lint_unexpected_cfg_doc_cargo)]
|
||||
Cargo(#[subdiagnostic] Option<CargoHelp>),
|
||||
Cargo {
|
||||
#[subdiagnostic]
|
||||
help: Option<CargoHelp>,
|
||||
#[subdiagnostic]
|
||||
macro_help: Option<super::UnexpectedCfgCargoMacroHelp>,
|
||||
},
|
||||
#[note(lint_unexpected_cfg_doc_rustc)]
|
||||
Rustc(#[subdiagnostic] Option<super::UnexpectedCfgRustcHelp>),
|
||||
Rustc {
|
||||
#[subdiagnostic]
|
||||
help: Option<super::UnexpectedCfgRustcHelp>,
|
||||
#[subdiagnostic]
|
||||
macro_help: Option<super::UnexpectedCfgRustcMacroHelp>,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue