@@ -2,14 +2,15 @@ use clippy_utils::{
2
2
diagnostics:: span_lint_and_then, get_parent_expr, is_from_proc_macro, match_def_path, path_res, paths:: PATH_NEW ,
3
3
ty:: is_type_diagnostic_item,
4
4
} ;
5
- use rustc_ast:: LitKind ;
5
+ use rustc_ast:: { LitKind , StrStyle } ;
6
6
use rustc_errors:: Applicability ;
7
7
use rustc_hir:: def_id:: DefId ;
8
8
use rustc_hir:: { Expr , ExprKind , QPath } ;
9
9
use rustc_lint:: { LateContext , LateLintPass , LintContext } ;
10
10
use rustc_middle:: { lint:: in_external_macro, ty} ;
11
11
use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
12
12
use rustc_span:: { sym, Symbol } ;
13
+ use std:: borrow:: Cow ;
13
14
14
15
declare_clippy_lint ! {
15
16
/// ### What it does
@@ -38,10 +39,11 @@ declare_clippy_lint! {
38
39
declare_lint_pass ! ( BareDosDeviceNames => [ BARE_DOS_DEVICE_NAMES ] ) ;
39
40
40
41
impl < ' tcx > LateLintPass < ' tcx > for BareDosDeviceNames {
42
+ #[ expect( clippy:: cast_possible_truncation) ]
41
43
fn check_expr ( & mut self , cx : & LateContext < ' tcx > , expr : & ' tcx Expr < ' tcx > ) {
42
44
if !in_external_macro ( cx. sess ( ) , expr. span )
43
45
&& let ExprKind :: Lit ( arg) = expr. kind
44
- && let LitKind :: Str ( str_sym, _ ) = arg. node
46
+ && let LitKind :: Str ( str_sym, str_style ) = arg. node
45
47
&& matches ! (
46
48
& * str_sym. as_str( ) . to_ascii_lowercase( ) ,
47
49
"aux"
@@ -86,20 +88,26 @@ impl<'tcx> LateLintPass<'tcx> for BareDosDeviceNames {
86
88
expr. span ,
87
89
"this path refers to a DOS device" ,
88
90
|diag| {
91
+ // Keep `r###` and `###`
92
+ let ( prefix, hashes) = if let StrStyle :: Raw ( num) = str_style {
93
+ ( Cow :: Borrowed ( "r" ) , "#" . repeat ( num as usize ) . into ( ) )
94
+ } else {
95
+ ( Cow :: Borrowed ( "" ) , Cow :: Borrowed ( "" ) )
96
+ } ;
97
+
89
98
// Suggest making current behavior explicit
90
99
diag. span_suggestion_verbose (
91
100
expr. span ,
92
- "if this is intended, try" ,
93
- // FIXME: I have zero clue why it normalizes this. `\` -> `/`
94
- format ! ( r#"r"\\.\{str_sym}"\"# ) ,
101
+ "if this is intended, use" ,
102
+ format ! ( r#"r{hashes}"\\.\{str_sym}"{hashes}"# ) ,
95
103
Applicability :: MaybeIncorrect ,
96
104
) ;
97
105
98
106
// Suggest making the code refer to a file or folder in the current directory
99
107
diag. span_suggestion_verbose (
100
108
expr. span ,
101
- "if this was intended to point to a file or folder, try " ,
102
- format ! ( " \ " ./{str_sym}\" " ) ,
109
+ "if this was intended to point to a file or folder, use " ,
110
+ format ! ( r#"{prefix}{hashes} "./{str_sym}"{hashes}"# ) ,
103
111
Applicability :: MaybeIncorrect ,
104
112
) ;
105
113
}
0 commit comments