Auto merge of #60827 - oli-obk:late_symbol, r=nnethercote
Use `Symbol` more in lint APIs r? @nnethercote This will cause clippy breakage, but super trivial to fix since we can then remove the hacky `match_def_path` function that I added and go back to calling rustc's `match_def_path` method.
This commit is contained in:
commit
fa40a111ff
@ -759,27 +759,27 @@ pub fn current_lint_root(&self) -> hir::HirId {
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust,ignore (no context or def id available)
|
||||
/// if cx.match_def_path(def_id, &["core", "option", "Option"]) {
|
||||
/// if cx.match_def_path(def_id, &[sym::core, sym::option, sym::Option]) {
|
||||
/// // The given `def_id` is that of an `Option` type
|
||||
/// }
|
||||
/// ```
|
||||
pub fn match_def_path(&self, def_id: DefId, path: &[&str]) -> bool {
|
||||
pub fn match_def_path(&self, def_id: DefId, path: &[Symbol]) -> bool {
|
||||
let names = self.get_def_path(def_id);
|
||||
|
||||
names.len() == path.len() && names.into_iter().zip(path.iter()).all(|(a, &b)| *a == *b)
|
||||
names.len() == path.len() && names.into_iter().zip(path.iter()).all(|(a, &b)| a == b)
|
||||
}
|
||||
|
||||
/// Gets the absolute path of `def_id` as a vector of `&str`.
|
||||
/// Gets the absolute path of `def_id` as a vector of `Symbol`.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust,ignore (no context or def id available)
|
||||
/// let def_path = cx.get_def_path(def_id);
|
||||
/// if let &["core", "option", "Option"] = &def_path[..] {
|
||||
/// if let &[sym::core, sym::option, sym::Option] = &def_path[..] {
|
||||
/// // The given `def_id` is that of an `Option` type
|
||||
/// }
|
||||
/// ```
|
||||
pub fn get_def_path(&self, def_id: DefId) -> Vec<LocalInternedString> {
|
||||
pub fn get_def_path(&self, def_id: DefId) -> Vec<Symbol> {
|
||||
pub struct AbsolutePathPrinter<'a, 'tcx> {
|
||||
pub tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
}
|
||||
@ -787,7 +787,7 @@ pub struct AbsolutePathPrinter<'a, 'tcx> {
|
||||
impl<'tcx> Printer<'tcx, 'tcx> for AbsolutePathPrinter<'_, 'tcx> {
|
||||
type Error = !;
|
||||
|
||||
type Path = Vec<LocalInternedString>;
|
||||
type Path = Vec<Symbol>;
|
||||
type Region = ();
|
||||
type Type = ();
|
||||
type DynExistential = ();
|
||||
@ -820,14 +820,14 @@ fn print_const(
|
||||
}
|
||||
|
||||
fn path_crate(self, cnum: CrateNum) -> Result<Self::Path, Self::Error> {
|
||||
Ok(vec![self.tcx.original_crate_name(cnum).as_str()])
|
||||
Ok(vec![self.tcx.original_crate_name(cnum)])
|
||||
}
|
||||
|
||||
fn path_qualified(
|
||||
self,
|
||||
self_ty: Ty<'tcx>,
|
||||
trait_ref: Option<ty::TraitRef<'tcx>>,
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
if trait_ref.is_none() {
|
||||
if let ty::Adt(def, substs) = self_ty.sty {
|
||||
return self.print_def_path(def.did, substs);
|
||||
@ -836,8 +836,8 @@ fn path_qualified(
|
||||
|
||||
// This shouldn't ever be needed, but just in case:
|
||||
Ok(vec![match trait_ref {
|
||||
Some(trait_ref) => LocalInternedString::intern(&format!("{:?}", trait_ref)),
|
||||
None => LocalInternedString::intern(&format!("<{}>", self_ty)),
|
||||
Some(trait_ref) => Symbol::intern(&format!("{:?}", trait_ref)),
|
||||
None => Symbol::intern(&format!("<{}>", self_ty)),
|
||||
}])
|
||||
}
|
||||
|
||||
@ -847,16 +847,16 @@ fn path_append_impl(
|
||||
_disambiguated_data: &DisambiguatedDefPathData,
|
||||
self_ty: Ty<'tcx>,
|
||||
trait_ref: Option<ty::TraitRef<'tcx>>,
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
let mut path = print_prefix(self)?;
|
||||
|
||||
// This shouldn't ever be needed, but just in case:
|
||||
path.push(match trait_ref {
|
||||
Some(trait_ref) => {
|
||||
LocalInternedString::intern(&format!("<impl {} for {}>", trait_ref,
|
||||
Symbol::intern(&format!("<impl {} for {}>", trait_ref,
|
||||
self_ty))
|
||||
},
|
||||
None => LocalInternedString::intern(&format!("<impl {}>", self_ty)),
|
||||
None => Symbol::intern(&format!("<impl {}>", self_ty)),
|
||||
});
|
||||
|
||||
Ok(path)
|
||||
@ -866,7 +866,7 @@ fn path_append(
|
||||
self,
|
||||
print_prefix: impl FnOnce(Self) -> Result<Self::Path, Self::Error>,
|
||||
disambiguated_data: &DisambiguatedDefPathData,
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
let mut path = print_prefix(self)?;
|
||||
|
||||
// Skip `::{{constructor}}` on tuple/unit structs.
|
||||
@ -875,7 +875,7 @@ fn path_append(
|
||||
_ => {}
|
||||
}
|
||||
|
||||
path.push(disambiguated_data.data.as_interned_str().as_str());
|
||||
path.push(disambiguated_data.data.as_interned_str().as_symbol());
|
||||
Ok(path)
|
||||
}
|
||||
|
||||
@ -883,7 +883,7 @@ fn path_generic_args(
|
||||
self,
|
||||
print_prefix: impl FnOnce(Self) -> Result<Self::Path, Self::Error>,
|
||||
_args: &[Kind<'tcx>],
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
print_prefix(self)
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@
|
||||
use errors::Applicability;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use syntax::ast::Ident;
|
||||
use syntax::symbol::{sym, Symbol};
|
||||
|
||||
declare_lint! {
|
||||
pub DEFAULT_HASH_TYPES,
|
||||
@ -16,14 +17,16 @@
|
||||
}
|
||||
|
||||
pub struct DefaultHashTypes {
|
||||
map: FxHashMap<String, String>,
|
||||
map: FxHashMap<Symbol, Symbol>,
|
||||
}
|
||||
|
||||
impl DefaultHashTypes {
|
||||
// we are allowed to use `HashMap` and `HashSet` as identifiers for implementing the lint itself
|
||||
#[allow(internal)]
|
||||
pub fn new() -> Self {
|
||||
let mut map = FxHashMap::default();
|
||||
map.insert("HashMap".to_string(), "FxHashMap".to_string());
|
||||
map.insert("HashSet".to_string(), "FxHashSet".to_string());
|
||||
map.insert(sym::HashMap, sym::FxHashMap);
|
||||
map.insert(sym::HashSet, sym::FxHashSet);
|
||||
Self { map }
|
||||
}
|
||||
}
|
||||
@ -32,11 +35,10 @@ pub fn new() -> Self {
|
||||
|
||||
impl EarlyLintPass for DefaultHashTypes {
|
||||
fn check_ident(&mut self, cx: &EarlyContext<'_>, ident: Ident) {
|
||||
let ident_string = ident.to_string();
|
||||
if let Some(replace) = self.map.get(&ident_string) {
|
||||
if let Some(replace) = self.map.get(&ident.name) {
|
||||
let msg = format!(
|
||||
"Prefer {} over {}, it has better performance",
|
||||
replace, ident_string
|
||||
replace, ident
|
||||
);
|
||||
let mut db = cx.struct_span_lint(DEFAULT_HASH_TYPES, ident.span, &msg);
|
||||
db.span_suggestion(
|
||||
@ -169,10 +171,10 @@ fn check_ty(&mut self, cx: &LateContext<'_, '_>, ty: &'tcx Ty) {
|
||||
}
|
||||
|
||||
fn lint_ty_kind_usage(cx: &LateContext<'_, '_>, segment: &PathSegment) -> bool {
|
||||
if segment.ident.as_str() == "TyKind" {
|
||||
if segment.ident.name == sym::TyKind {
|
||||
if let Some(res) = segment.res {
|
||||
if let Some(did) = res.opt_def_id() {
|
||||
return cx.match_def_path(did, &["rustc", "ty", "sty", "TyKind"]);
|
||||
return cx.match_def_path(did, TYKIND_PATH);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -180,14 +182,18 @@ fn lint_ty_kind_usage(cx: &LateContext<'_, '_>, segment: &PathSegment) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
const TYKIND_PATH: &[Symbol] = &[sym::rustc, sym::ty, sym::sty, sym::TyKind];
|
||||
const TY_PATH: &[Symbol] = &[sym::rustc, sym::ty, sym::Ty];
|
||||
const TYCTXT_PATH: &[Symbol] = &[sym::rustc, sym::ty, sym::context, sym::TyCtxt];
|
||||
|
||||
fn is_ty_or_ty_ctxt(cx: &LateContext<'_, '_>, ty: &Ty) -> Option<String> {
|
||||
match &ty.node {
|
||||
TyKind::Path(qpath) => {
|
||||
if let QPath::Resolved(_, path) = qpath {
|
||||
let did = path.res.opt_def_id()?;
|
||||
if cx.match_def_path(did, &["rustc", "ty", "Ty"]) {
|
||||
if cx.match_def_path(did, TY_PATH) {
|
||||
return Some(format!("Ty{}", gen_args(path.segments.last().unwrap())));
|
||||
} else if cx.match_def_path(did, &["rustc", "ty", "context", "TyCtxt"]) {
|
||||
} else if cx.match_def_path(did, TYCTXT_PATH) {
|
||||
return Some(format!("TyCtxt{}", gen_args(path.segments.last().unwrap())));
|
||||
}
|
||||
}
|
||||
|
@ -194,6 +194,7 @@
|
||||
const_raw_ptr_to_usize_cast,
|
||||
const_transmute,
|
||||
contents,
|
||||
context,
|
||||
convert,
|
||||
copy_closures,
|
||||
core,
|
||||
@ -282,6 +283,8 @@
|
||||
fundamental,
|
||||
future,
|
||||
Future,
|
||||
FxHashSet,
|
||||
FxHashMap,
|
||||
gen_future,
|
||||
generators,
|
||||
generic_associated_types,
|
||||
@ -291,6 +294,8 @@
|
||||
globs,
|
||||
hash,
|
||||
Hash,
|
||||
HashSet,
|
||||
HashMap,
|
||||
hexagon_target_feature,
|
||||
hidden,
|
||||
homogeneous_aggregate,
|
||||
@ -505,6 +510,7 @@
|
||||
rust_2015_preview,
|
||||
rust_2018_preview,
|
||||
rust_begin_unwind,
|
||||
rustc,
|
||||
rustc_allocator_nounwind,
|
||||
rustc_allow_const_fn_ptr,
|
||||
rustc_args_required_const,
|
||||
@ -590,6 +596,7 @@
|
||||
struct_inherit,
|
||||
structural_match,
|
||||
struct_variant,
|
||||
sty,
|
||||
suggestion,
|
||||
target_feature,
|
||||
target_has_atomic,
|
||||
@ -618,7 +625,10 @@
|
||||
try_trait,
|
||||
tt,
|
||||
tuple_indexing,
|
||||
Ty,
|
||||
ty,
|
||||
TyCtxt,
|
||||
TyKind,
|
||||
type_alias_enum_variants,
|
||||
type_ascription,
|
||||
type_length_limit,
|
||||
|
Loading…
Reference in New Issue
Block a user