ktrs_compose/rules/
modifier_without_default.rs1use ktrs_ast::Ast;
4use ktrs_ast::psi::{KtFunction, kt_psi_factory};
5
6use crate::core::compose_kt_config::ComposeKtConfig;
7use crate::core::compose_kt_visitor::ComposeKtVisitor;
8use crate::core::emitter::Emitter;
9use crate::core::util::kt_functions::{defined_in_interface, is_abstract, is_actual, is_open, is_override};
10use crate::core::util::modifiers::{is_modifier, is_modifier_receiver};
11
12pub struct ModifierWithoutDefault;
13
14impl ComposeKtVisitor for ModifierWithoutDefault {
15 fn visit_composable(&self, ast: &mut Ast, function: KtFunction, emitter: &mut dyn Emitter, config: &dyn ComposeKtConfig) {
16 if defined_in_interface(ast, function)
17 || is_actual(ast, function)
18 || is_override(ast, function)
19 || is_abstract(ast, function)
20 || is_open(ast, function)
21 || is_modifier_receiver(ast, function.node(), config)
22 {
23 return;
24 }
25 let modifier_parameters: Vec<_> = function
26 .value_parameters(ast)
27 .into_iter()
28 .filter(|it| is_modifier(ast, it.node(), config))
29 .filter(|it| !it.has_default_value(ast))
30 .collect();
31 for modifier_parameter in modifier_parameters {
32 emitter.report(ast, modifier_parameter.node(), MISSING_MODIFIER_DEFAULT_PARAM, true).if_fix(|| {
33 let text = format!("{} = Modifier", ast.text(modifier_parameter.node()));
35 let new_parameter = kt_psi_factory::create_parameter(ast, &text);
36 let parent = ast.tree_parent(modifier_parameter.node()).expect("NullPointerException: treeParent");
37 ast.replace_child(parent, modifier_parameter.node(), new_parameter.node());
38 });
39 }
40 }
41}
42
43pub const MISSING_MODIFIER_DEFAULT_PARAM: &str = "\
44This @Composable function has a modifier parameter but it doesn't have a default value.
45See https://mrmans0n.github.io/compose-rules/rules/#modifiers-should-have-default-parameters for more information.";