Skip to main content

ktrs_compose/rules/
mutable_parameters.rs

1//! Port of `rules/MutableParameters.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::kt_callable_declarations::is_type_mutable;
10
11pub struct MutableParameters;
12
13impl ComposeKtVisitor for MutableParameters {
14    fn visit_composable(&self, ast: &mut Ast, function: KtFunction, emitter: &mut dyn Emitter, _config: &dyn ComposeKtConfig) {
15        for parameter in function.value_parameters(ast).into_iter().filter(|it| is_type_mutable(ast, it.node())) {
16            emitter.report(ast, parameter.node(), MUTABLE_PARAMETER_IN_COMPOSE, false);
17        }
18    }
19}
20
21pub const MUTABLE_PARAMETER_IN_COMPOSE: &str = "\
22Using mutable objects as state in Compose will cause your users to see incorrect or stale data in your app.
23Mutable objects that are not observable, such as ArrayList<T> or a mutable data class, cannot be observed by Compose to trigger recomposition when they change.
24See https://mrmans0n.github.io/compose-rules/rules/#do-not-use-inherently-mutable-types-as-parameters for more information.";