ktrs_compose/rules/
modifier_naming.rs1use ktrs_ast::Ast;
4use ktrs_ast::psi::KtFunction;
5
6use crate::core::compose_kt_config::ComposeKtConfig;
7use crate::core::compose_kt_visitor::ComposeKtVisitor;
8use crate::core::emitter::Emitter;
9use crate::core::util::modifiers::is_modifier;
10
11pub struct ModifierNaming;
12
13impl ComposeKtVisitor for ModifierNaming {
14 fn visit_composable(&self, ast: &mut Ast, function: KtFunction, emitter: &mut dyn Emitter, config: &dyn ComposeKtConfig) {
15 let modifiers: Vec<_> = function.value_parameters(ast).into_iter().filter(|it| is_modifier(ast, it.node(), config)).collect();
16 if modifiers.is_empty() {
17 return;
18 }
19 if modifiers.len() == 1 {
20 if modifiers[0].name(ast).as_deref() != Some("modifier") {
21 emitter.report(ast, modifiers[0].node(), MODIFIERS_ARE_SUPPOSED_TO_BE_CALLED_MODIFIER_WHEN_ALONE, false);
22 }
23 } else {
24 for modifier in modifiers {
25 let valid = modifier.name(ast).is_some_and(|name| name.to_lowercase().ends_with("modifier"));
26 if !valid {
27 emitter.report(ast, modifier.node(), MODIFIERS_ARE_SUPPOSED_TO_END_IN_MODIFIER_WHEN_MULTIPLE, false);
28 }
29 }
30 }
31 }
32}
33
34pub const MODIFIERS_ARE_SUPPOSED_TO_BE_CALLED_MODIFIER_WHEN_ALONE: &str = "\
35Modifier parameters should be called `modifier`.
36See https://mrmans0n.github.io/compose-rules/rules/#naming-modifiers-properly for more information.";
37
38pub const MODIFIERS_ARE_SUPPOSED_TO_END_IN_MODIFIER_WHEN_MULTIPLE: &str = "\
39Modifier parameters should be called `modifier` or end in `Modifier` if there are more than one in the same @Composable.
40See https://mrmans0n.github.io/compose-rules/rules/#naming-modifiers-properly for more information.";