ktrs_compose/rules/
mutable_parameters.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::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.";