Konsist: check that if sealed interface is used in parameter of Composable, it has the @Stable or @Immutable annotation

This commit is contained in:
Benoit Marty 2023-11-02 18:52:09 +01:00 committed by Benoit Marty
parent 3092ca23f0
commit 21200df294
19 changed files with 63 additions and 3 deletions

View file

@ -16,11 +16,16 @@
package io.element.android.tests.konsist
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.Stable
import com.lemonappdev.konsist.api.Konsist
import com.lemonappdev.konsist.api.ext.list.constructors
import com.lemonappdev.konsist.api.ext.list.modifierprovider.withSealedModifier
import com.lemonappdev.konsist.api.ext.list.parameters
import com.lemonappdev.konsist.api.ext.list.withAnnotationOf
import com.lemonappdev.konsist.api.ext.list.withNameEndingWith
import com.lemonappdev.konsist.api.ext.list.withoutAnnotationOf
import com.lemonappdev.konsist.api.ext.list.withoutConstructors
import com.lemonappdev.konsist.api.ext.list.withoutName
import com.lemonappdev.konsist.api.ext.list.withoutParents
@ -67,4 +72,23 @@ class KonsistArchitectureTest {
.withoutParents()
.assertEmpty(additionalMessage = "Sealed class without constructor MUST be sealed interface")
}
@Test
fun `Composable MUST not have sealed interface in parameter`() {
// List all sealed interface without Immutable nor Stable annotation in the project
val forbiddenInterfacesForComposableParameter = Konsist.scopeFromProject()
.interfaces()
.withSealedModifier()
.withoutAnnotationOf(Immutable::class, Stable::class)
.map { it.fullyQualifiedName }
Konsist.scopeFromProject()
.functions()
.withAnnotationOf(Composable::class)
.assertTrue(additionalMessage = "Consider adding the @Immutable or @Stable annotation to the sealed interface") {
it.parameters.all { param ->
param.type.fullyQualifiedName !in forbiddenInterfacesForComposableParameter
}
}
}
}