File tree Expand file tree Collapse file tree 2 files changed +73
-6
lines changed
src/tools/rust-analyzer/crates
ide-diagnostics/src/handlers Expand file tree Collapse file tree 2 files changed +73
-6
lines changed Original file line number Diff line number Diff line change @@ -24,6 +24,7 @@ use hir_expand::{
24
24
name:: { AsName , Name } ,
25
25
HirFileId , HirFileIdExt ,
26
26
} ;
27
+ use intern:: sym;
27
28
use stdx:: { always, never} ;
28
29
use syntax:: {
29
30
ast:: { self , HasName } ,
@@ -197,12 +198,20 @@ impl<'a> DeclValidator<'a> {
197
198
// Skipped if function is an associated item of a trait implementation.
198
199
if !self . is_trait_impl_container ( container) {
199
200
let data = self . db . function_data ( func) ;
200
- self . create_incorrect_case_diagnostic_for_item_name (
201
- func,
202
- & data. name ,
203
- CaseType :: LowerSnakeCase ,
204
- IdentType :: Function ,
205
- ) ;
201
+
202
+ // Don't run the lint on extern "[not Rust]" fn items with the
203
+ // #[no_mangle] attribute.
204
+ let no_mangle = data. attrs . by_key ( & sym:: no_mangle) . exists ( ) ;
205
+ if no_mangle && data. abi . as_ref ( ) . is_some_and ( |abi| * abi != sym:: Rust ) {
206
+ cov_mark:: hit!( extern_func_no_mangle_ignored) ;
207
+ } else {
208
+ self . create_incorrect_case_diagnostic_for_item_name (
209
+ func,
210
+ & data. name ,
211
+ CaseType :: LowerSnakeCase ,
212
+ IdentType :: Function ,
213
+ ) ;
214
+ }
206
215
} else {
207
216
cov_mark:: hit!( trait_impl_assoc_func_name_incorrect_case_ignored) ;
208
217
}
Original file line number Diff line number Diff line change @@ -418,6 +418,64 @@ fn f((_O): u8) {}
418
418
)
419
419
}
420
420
421
+ #[ test]
422
+ fn ignores_no_mangle_items ( ) {
423
+ cov_mark:: check!( extern_func_no_mangle_ignored) ;
424
+ check_diagnostics (
425
+ r#"
426
+ #[no_mangle]
427
+ extern "C" fn NonSnakeCaseName(some_var: u8) -> u8;
428
+ "# ,
429
+ ) ;
430
+ }
431
+
432
+ #[ test]
433
+ fn ignores_no_mangle_items_with_no_abi ( ) {
434
+ cov_mark:: check!( extern_func_no_mangle_ignored) ;
435
+ check_diagnostics (
436
+ r#"
437
+ #[no_mangle]
438
+ extern fn NonSnakeCaseName(some_var: u8) -> u8;
439
+ "# ,
440
+ ) ;
441
+ }
442
+
443
+ #[ test]
444
+ fn no_mangle_items_with_rust_abi ( ) {
445
+ check_diagnostics (
446
+ r#"
447
+ #[no_mangle]
448
+ extern "Rust" fn NonSnakeCaseName(some_var: u8) -> u8;
449
+ // ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
450
+ "# ,
451
+ ) ;
452
+ }
453
+
454
+ #[ test]
455
+ fn no_mangle_items_non_extern ( ) {
456
+ check_diagnostics (
457
+ r#"
458
+ #[no_mangle]
459
+ fn NonSnakeCaseName(some_var: u8) -> u8;
460
+ // ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
461
+ "# ,
462
+ ) ;
463
+ }
464
+
465
+ #[ test]
466
+ fn extern_fn_name ( ) {
467
+ check_diagnostics (
468
+ r#"
469
+ extern "C" fn NonSnakeCaseName(some_var: u8) -> u8;
470
+ // ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
471
+ extern "Rust" fn NonSnakeCaseName(some_var: u8) -> u8;
472
+ // ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
473
+ extern fn NonSnakeCaseName(some_var: u8) -> u8;
474
+ // ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
475
+ "# ,
476
+ ) ;
477
+ }
478
+
421
479
#[ test]
422
480
fn ignores_extern_items ( ) {
423
481
cov_mark:: check!( extern_func_incorrect_case_ignored) ;
You can’t perform that action at this time.
0 commit comments