Skip to main content

ktrs_compose/rules/
modifier_without_default.rs

1//! Port of `rules/ModifierWithoutDefault.kt`.
2
3use 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                // Re-parsed, not leaf-patched: a patched `Modifier` leaf would make no-unused-imports drop the import.
34                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.";