Videos
What's the state of static analysis linting in rust?
What are some linting solutions you are using for your rust project?
I've always been big fan of eslint, with its plugin system, highly configurable rules sets, and excellent ide support. Eslint makes both importing, writing, and configuring static analysis lints pretty easy. Does clippy aim to function in a similar way to eslint, or is it headed in a different direction?
Now, obviously eslint has a lot of financial backing and javascript has a huge userbase, but I really feel like good linting solutions are a big plus for a language user group as a whole.
I believe I have the "default" clippy settings, so I get in-editor (VSCode) warnings for things like unused variables, naming conventions, etc, but I'd love more lints that helped with code smell. When looking over other people's rust projects, I rarely see anything in their code that reveals a custom linting solution.
Is having an extensive linting setup just not common for rust projects?
The only rust project I've been able to find that seems to have a "custom" linting setup is egui.
In the egui demo source files libs.rs , I see a long list of what appears to be linting flags:
#![warn(
clippy::all,
clippy::await_holding_lock,
clippy::char_lit_as_u8,
clippy::checked_conversions,
clippy::dbg_macro,
clippy::debug_assert_with_mut_call,
clippy::doc_markdown,
clippy::empty_enum,
clippy::enum_glob_use,
clippy::exit,
clippy::expl_impl_clone_on_copy,
clippy::explicit_deref_methods,
clippy::explicit_into_iter_loop,
clippy::fallible_impl_from,
clippy::filter_map_next,
clippy::float_cmp_const,
clippy::fn_params_excessive_bools,
clippy::if_let_mutex,
clippy::imprecise_flops,
clippy::inefficient_to_string,
clippy::invalid_upcast_comparisons,
clippy::large_types_passed_by_value,
clippy::let_unit_value,
clippy::linkedlist,
clippy::lossy_float_literal,
clippy::macro_use_imports,
clippy::manual_ok_or,
clippy::map_err_ignore,
clippy::map_flatten,
clippy::match_on_vec_items,
clippy::match_same_arms,
clippy::match_wildcard_for_single_variants,
clippy::mem_forget,
clippy::mismatched_target_os,
clippy::missing_errors_doc,
clippy::missing_safety_doc,
clippy::mut_mut,
clippy::mutex_integer,
clippy::needless_borrow,
clippy::needless_continue,
clippy::needless_pass_by_value,
clippy::option_option,
clippy::path_buf_push_overwrite,
clippy::ptr_as_ptr,
clippy::pub_enum_variant_names,
clippy::ref_option_ref,
clippy::rest_pat_in_fully_bound_structs,
clippy::same_functions_in_if_condition,
clippy::string_add_assign,
clippy::string_add,
clippy::string_lit_as_bytes,
clippy::string_to_string,
clippy::todo,
clippy::trait_duplication_in_bounds,
clippy::unimplemented,
clippy::unnested_or_patterns,
clippy::unused_self,
clippy::useless_transmute,
clippy::verbose_file_reads,
clippy::wrong_pub_self_convention,
clippy::zero_sized_map_values,
future_incompatible,
nonstandard_style,
rust_2018_idioms
)]What exactly are these flags about?
Wouldn't it make more sense for there to be a linting config file, similar to a .eslintrc file rather than having to specify all of these lints in a lib.rs file or otherwise?