@@ -2,14 +2,15 @@ use clippy_utils::{
22 diagnostics:: span_lint_and_then, get_parent_expr, is_from_proc_macro, match_def_path, path_res, paths:: PATH_NEW ,
33 ty:: is_type_diagnostic_item,
44} ;
5- use rustc_ast:: LitKind ;
5+ use rustc_ast:: { LitKind , StrStyle } ;
66use rustc_errors:: Applicability ;
77use rustc_hir:: def_id:: DefId ;
88use rustc_hir:: { Expr , ExprKind , QPath } ;
99use rustc_lint:: { LateContext , LateLintPass , LintContext } ;
1010use rustc_middle:: { lint:: in_external_macro, ty} ;
1111use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
1212use rustc_span:: { sym, Symbol } ;
13+ use std:: borrow:: Cow ;
1314
1415declare_clippy_lint ! {
1516 /// ### What it does
@@ -38,10 +39,11 @@ declare_clippy_lint! {
3839declare_lint_pass ! ( BareDosDeviceNames => [ BARE_DOS_DEVICE_NAMES ] ) ;
3940
4041impl < ' tcx > LateLintPass < ' tcx > for BareDosDeviceNames {
42+ #[ expect( clippy:: cast_possible_truncation) ]
4143 fn check_expr ( & mut self , cx : & LateContext < ' tcx > , expr : & ' tcx Expr < ' tcx > ) {
4244 if !in_external_macro ( cx. sess ( ) , expr. span )
4345 && let ExprKind :: Lit ( arg) = expr. kind
44- && let LitKind :: Str ( str_sym, _ ) = arg. node
46+ && let LitKind :: Str ( str_sym, str_style ) = arg. node
4547 && matches ! (
4648 & * str_sym. as_str( ) . to_ascii_lowercase( ) ,
4749 "aux"
@@ -86,20 +88,26 @@ impl<'tcx> LateLintPass<'tcx> for BareDosDeviceNames {
8688 expr. span ,
8789 "this path refers to a DOS device" ,
8890 |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+
8998 // Suggest making current behavior explicit
9099 diag. span_suggestion_verbose (
91100 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}"# ) ,
95103 Applicability :: MaybeIncorrect ,
96104 ) ;
97105
98106 // Suggest making the code refer to a file or folder in the current directory
99107 diag. span_suggestion_verbose (
100108 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}"# ) ,
103111 Applicability :: MaybeIncorrect ,
104112 ) ;
105113 }
0 commit comments