mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 09:14:20 +00:00
Apply rc_buffer lint to Arc<T>
This commit is contained in:
parent
1b5317f68b
commit
2dd7175d60
@ -480,6 +480,46 @@ impl Types {
|
||||
);
|
||||
return; // don't recurse into the type
|
||||
}
|
||||
} else if cx.tcx.is_diagnostic_item(sym::Arc, def_id) {
|
||||
if let Some(alternate) = match_buffer_type(cx, qpath) {
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
RC_BUFFER,
|
||||
hir_ty.span,
|
||||
"usage of `Arc<T>` when T is a buffer type",
|
||||
"try",
|
||||
format!("Arc<{}>", alternate),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
return; // don't recurse into the type
|
||||
}
|
||||
if match_type_parameter(cx, qpath, &paths::VEC).is_some() {
|
||||
let vec_ty = match &last_path_segment(qpath).args.unwrap().args[0] {
|
||||
GenericArg::Type(ty) => match &ty.kind {
|
||||
TyKind::Path(qpath) => qpath,
|
||||
_ => return,
|
||||
},
|
||||
_ => return,
|
||||
};
|
||||
let inner_span = match &last_path_segment(&vec_ty).args.unwrap().args[0] {
|
||||
GenericArg::Type(ty) => ty.span,
|
||||
_ => return,
|
||||
};
|
||||
let mut applicability = Applicability::MachineApplicable;
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
RC_BUFFER,
|
||||
hir_ty.span,
|
||||
"usage of `Arc<T>` when T is a buffer type",
|
||||
"try",
|
||||
format!(
|
||||
"Arc<[{}]>",
|
||||
snippet_with_applicability(cx, inner_span, "..", &mut applicability)
|
||||
),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
return; // don't recurse into the type
|
||||
}
|
||||
} else if cx.tcx.is_diagnostic_item(sym!(vec_type), def_id) {
|
||||
if_chain! {
|
||||
// Get the _ part of Vec<_>
|
||||
|
13
tests/ui/rc_buffer_arc.rs
Normal file
13
tests/ui/rc_buffer_arc.rs
Normal file
@ -0,0 +1,13 @@
|
||||
use std::ffi::OsString;
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[warn(clippy::rc_buffer)]
|
||||
struct S {
|
||||
a: Arc<String>,
|
||||
b: Arc<PathBuf>,
|
||||
c: Arc<Vec<u8>>,
|
||||
d: Arc<OsString>,
|
||||
}
|
||||
|
||||
fn main() {}
|
28
tests/ui/rc_buffer_arc.stderr
Normal file
28
tests/ui/rc_buffer_arc.stderr
Normal file
@ -0,0 +1,28 @@
|
||||
error: usage of `Arc<T>` when T is a buffer type
|
||||
--> $DIR/rc_buffer_arc.rs:7:8
|
||||
|
|
||||
LL | a: Arc<String>,
|
||||
| ^^^^^^^^^^^ help: try: `Arc<str>`
|
||||
|
|
||||
= note: `-D clippy::rc-buffer` implied by `-D warnings`
|
||||
|
||||
error: usage of `Arc<T>` when T is a buffer type
|
||||
--> $DIR/rc_buffer_arc.rs:8:8
|
||||
|
|
||||
LL | b: Arc<PathBuf>,
|
||||
| ^^^^^^^^^^^^ help: try: `Arc<std::path::Path>`
|
||||
|
||||
error: usage of `Arc<T>` when T is a buffer type
|
||||
--> $DIR/rc_buffer_arc.rs:9:8
|
||||
|
|
||||
LL | c: Arc<Vec<u8>>,
|
||||
| ^^^^^^^^^^^^ help: try: `Arc<[u8]>`
|
||||
|
||||
error: usage of `Arc<T>` when T is a buffer type
|
||||
--> $DIR/rc_buffer_arc.rs:10:8
|
||||
|
|
||||
LL | d: Arc<OsString>,
|
||||
| ^^^^^^^^^^^^^ help: try: `Arc<std::ffi::OsStr>`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user