Skip to content

Commit

Permalink
Only emit useless_vec suggestion if the macro does not contain code…
Browse files Browse the repository at this point in the history
… comments (#13911)

Fixes #13692.

If the `vec!` macro call contains comments, we should not provide
suggestions and let users handle it however they see fit.

changelog: Only emit `useless_vec` suggestion if the macro does not
contain code comments
  • Loading branch information
xFrednet authored Jan 4, 2025
2 parents 54f88c3 + b76e042 commit ad69c65
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 3 deletions.
16 changes: 13 additions & 3 deletions clippy_lints/src/vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use clippy_utils::msrvs::{self, Msrv};
use clippy_utils::source::SpanRangeExt;
use clippy_utils::ty::is_copy;
use clippy_utils::visitors::for_each_local_use_after_expr;
use clippy_utils::{get_parent_expr, higher, is_in_test, is_trait_method};
use clippy_utils::{get_parent_expr, higher, is_in_test, is_trait_method, span_contains_comment};
use rustc_errors::Applicability;
use rustc_hir::{BorrowKind, Expr, ExprKind, HirId, LetStmt, Mutability, Node, Pat, PatKind};
use rustc_lint::{LateContext, LateLintPass};
Expand Down Expand Up @@ -132,9 +132,19 @@ impl<'tcx> LateLintPass<'tcx> for UselessVec {
fn check_crate_post(&mut self, cx: &LateContext<'tcx>) {
for (span, lint_opt) in &self.span_to_lint_map {
if let Some((hir_id, suggest_slice, snippet, applicability)) = lint_opt {
let help_msg = format!("you can use {} directly", suggest_slice.desc(),);
let help_msg = format!("you can use {} directly", suggest_slice.desc());
span_lint_hir_and_then(cx, USELESS_VEC, *hir_id, *span, "useless use of `vec!`", |diag| {
diag.span_suggestion(*span, help_msg, snippet, *applicability);
// If the `vec!` macro contains comment, better not make the suggestion machine
// applicable as it would remove them.
let applicability = if *applicability != Applicability::Unspecified
&& let source_map = cx.tcx.sess.source_map()
&& span_contains_comment(source_map, *span)
{
Applicability::Unspecified
} else {
*applicability
};
diag.span_suggestion(*span, help_msg, snippet, applicability);
});
}
}
Expand Down
15 changes: 15 additions & 0 deletions tests/ui/useless_vec.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//@no-rustfix: no suggestions

#![warn(clippy::useless_vec)]

// Regression test for <https://github.com/rust-lang/rust-clippy/issues/13692>.
fn foo() {
// There should be no suggestion in this case.
let _some_variable = vec![
//~^ useless_vec
1, 2, // i'm here to stay
3, 4, // but this one going away ;-;
]; // that is life anyways
}

fn main() {}
21 changes: 21 additions & 0 deletions tests/ui/useless_vec.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
error: useless use of `vec!`
--> tests/ui/useless_vec.rs:8:26
|
LL | let _some_variable = vec![
| __________________________^
LL | |
LL | | 1, 2, // i'm here to stay
LL | | 3, 4, // but this one going away ;-;
LL | | ]; // that is life anyways
| |_____^
|
= note: `-D clippy::useless-vec` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::useless_vec)]`
help: you can use an array directly
|
LL ~ let _some_variable = [1, 2, // i'm here to stay
LL ~ 3, 4]; // that is life anyways
|

error: aborting due to 1 previous error

0 comments on commit ad69c65

Please sign in to comment.