Skip to main content

ktrs_compose/rules/
modifier_naming.rs

1//! Port of `rules/ModifierNaming.kt`.
2
3use 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.";