Skip to content

Commit e95198f

Browse files
authored
Fix ComposePreviewPublic to not look into non-public methods (#85)
`ComposePreviewPublic` was looking into private/internal methods and could have false positives if they used `PreviewParameter`s. This patch changes that behavior and adds a test to prevent regressions.
1 parent 6833a74 commit e95198f

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

rules/common/src/main/kotlin/com/twitter/compose/rules/ComposePreviewPublic.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ class ComposePreviewPublic : ComposeKtVisitor {
1515
override fun visitComposable(function: KtFunction, autoCorrect: Boolean, emitter: Emitter) {
1616
// We only want previews
1717
if (!function.isPreview) return
18-
// ...that if it is public, none of it's params is tagged as preview
19-
if (function.isPublic && function.valueParameters.none { it.isPreviewParameter }) return
20-
// ...and if it isn't public, all params are tagged as preview
21-
if (!function.isPublic && function.valueParameters.all { it.isPreviewParameter }) return
18+
// We only care about public methods
19+
if (!function.isPublic) return
20+
// If the method is public, none of it's params should be tagged as preview
21+
if (function.valueParameters.none { it.isPreviewParameter }) return
2222

23+
// If we got here, it's a public method in a @Preview composable with a @PreviewParameter parameter
2324
emitter.report(function, ComposablesPreviewShouldNotBePublic, true)
2425
if (autoCorrect) {
2526
function.addModifier(KtTokens.PRIVATE_KEYWORD)

rules/detekt/src/test/kotlin/com/twitter/compose/rules/detekt/ComposePreviewPublicCheckTest.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,24 @@ class ComposePreviewPublicCheckTest {
5757
}
5858
}
5959

60+
@Test
61+
fun `passes when a non-public preview composable uses preview params`() {
62+
@Language("kotlin")
63+
val code =
64+
"""
65+
@Preview
66+
@Composable
67+
private fun MyComposable(@PreviewParameter(User::class) user: User) {
68+
}
69+
@Preview
70+
@Composable
71+
internal fun MyComposable(@PreviewParameter(User::class) user: User) {
72+
}
73+
""".trimIndent()
74+
val errors = rule.lint(code)
75+
assertThat(errors).isEmpty()
76+
}
77+
6078
@Test
6179
fun `passes when a private preview composable uses preview params`() {
6280
@Language("kotlin")

rules/ktlint/src/test/kotlin/com/twitter/compose/rules/ktlint/ComposePreviewPublicCheckTest.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,23 @@ class ComposePreviewPublicCheckTest {
5151
)
5252
}
5353

54+
@Test
55+
fun `passes when a non-public preview composable uses preview params`() {
56+
@Language("kotlin")
57+
val code =
58+
"""
59+
@Preview
60+
@Composable
61+
private fun MyComposable(@PreviewParameter(User::class) user: User) {
62+
}
63+
@Preview
64+
@Composable
65+
internal fun MyComposable(@PreviewParameter(User::class) user: User) {
66+
}
67+
""".trimIndent()
68+
ruleAssertThat(code).hasNoLintViolations()
69+
}
70+
5471
@Test
5572
fun `autofix makes private the public preview`() {
5673
@Language("kotlin")

0 commit comments

Comments
 (0)