This repository was archived by the owner on May 28, 2025. It is now read-only.
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::{
2424 name:: { AsName , Name } ,
2525 HirFileId , HirFileIdExt ,
2626} ;
27+ use intern:: sym;
2728use stdx:: { always, never} ;
2829use syntax:: {
2930 ast:: { self , HasName } ,
@@ -197,12 +198,20 @@ impl<'a> DeclValidator<'a> {
197198 // Skipped if function is an associated item of a trait implementation.
198199 if !self . is_trait_impl_container ( container) {
199200 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+ }
206215 } else {
207216 cov_mark:: hit!( trait_impl_assoc_func_name_incorrect_case_ignored) ;
208217 }
Original file line number Diff line number Diff line change @@ -418,6 +418,64 @@ fn f((_O): u8) {}
418418 )
419419 }
420420
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+
421479 #[ test]
422480 fn ignores_extern_items ( ) {
423481 cov_mark:: check!( extern_func_incorrect_case_ignored) ;
You can’t perform that action at this time.
0 commit comments