Skip to content

Commit 7f8fc78

Browse files
committed
Report all non-public composables unconditionally
1 parent 497fc0d commit 7f8fc78

File tree

7 files changed

+12
-172
lines changed

7 files changed

+12
-172
lines changed

docs/detekt.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ Compose:
5555
active: true
5656
PreviewPublic:
5757
active: true
58-
# You can optionally disable that only previews with @PreviewParameter are flagged
59-
# previewPublicOnlyIfParams: false
6058
RememberMissing:
6159
active: true
6260
UnstableCollections:

docs/ktlint.md

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,6 @@ For `compositionlocal-allowlist` rule you can define a list of `CompositionLocal
6666
compose_allowed_composition_locals = LocalSomething,LocalSomethingElse
6767
```
6868

69-
### Make it so that all @Preview composables must be not public, no exceptions
70-
71-
In `preview-public-check`, only previews with a `@PreviewParameter` are required to be non-public by default. However, if you want to make it so ALL `@Preview` composables are non-public, you can add this to your `.editorconfig` file:
72-
73-
```editorconfig
74-
[*.{kt,kts}]
75-
compose_preview_public_only_if_params = false
76-
```
77-
7869
### Allowing matching function names
7970

8071
The `naming-check` rule requires all composables that return a value to be lowercased. If you want to allow certain patterns though, you can configure a comma-separated list of matching regexes in your `.editorconfig` file:

rules/common/src/main/kotlin/io/nlopez/compose/rules/ComposePreviewPublic.kt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package io.nlopez.compose.rules
44

5-
import io.nlopez.rules.core.ComposeKtConfig.Companion.config
65
import io.nlopez.rules.core.ComposeKtVisitor
76
import io.nlopez.rules.core.Emitter
87
import io.nlopez.rules.core.util.isPreview
9-
import io.nlopez.rules.core.util.isPreviewParameter
108
import org.jetbrains.kotlin.lexer.KtTokens
119
import org.jetbrains.kotlin.psi.KtFunction
1210
import org.jetbrains.kotlin.psi.psiUtil.isPublic
@@ -19,13 +17,6 @@ class ComposePreviewPublic : ComposeKtVisitor {
1917
// We only care about public methods
2018
if (!function.isPublic) return
2119

22-
// If the method is public, none of it's params should be tagged as preview
23-
// This is configurable by the `previewPublicOnlyIfParams` config value
24-
if (function.config().getBoolean("previewPublicOnlyIfParams", true)) {
25-
if (function.valueParameters.none { it.isPreviewParameter }) return
26-
}
27-
28-
// If we got here, it's a public method in a @Preview composable with a @PreviewParameter parameter
2920
emitter.report(function, ComposablesPreviewShouldNotBePublic, true)
3021
if (autoCorrect) {
3122
function.addModifier(KtTokens.PRIVATE_KEYWORD)

rules/detekt/src/test/kotlin/io/nlopez/compose/rules/detekt/ComposePreviewPublicCheckTest.kt

Lines changed: 3 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ package io.nlopez.compose.rules.detekt
44

55
import io.gitlab.arturbosch.detekt.api.Config
66
import io.gitlab.arturbosch.detekt.api.SourceLocation
7-
import io.gitlab.arturbosch.detekt.test.TestConfig
87
import io.gitlab.arturbosch.detekt.test.assertThat
98
import io.gitlab.arturbosch.detekt.test.lint
109
import io.nlopez.compose.rules.ComposePreviewPublic
@@ -28,7 +27,7 @@ class ComposePreviewPublicCheckTest {
2827
}
2928

3029
@Test
31-
fun `passes for preview public composables that don't have preview params`() {
30+
fun `errors for preview public composables`() {
3231
@Language("kotlin")
3332
val code =
3433
"""
@@ -40,25 +39,6 @@ class ComposePreviewPublicCheckTest {
4039
fun MyComposable() { }
4140
""".trimIndent()
4241
val errors = rule.lint(code)
43-
assertThat(errors).isEmpty()
44-
}
45-
46-
@Test
47-
fun `errors when a public preview composable is used when previewPublicOnlyIfParams is false`() {
48-
val config = TestConfig("previewPublicOnlyIfParams" to false)
49-
val ruleWithParams = ComposePreviewPublicCheck(config)
50-
51-
@Language("kotlin")
52-
val code =
53-
"""
54-
@Preview
55-
@Composable
56-
fun MyComposable() { }
57-
@CombinedPreviews
58-
@Composable
59-
fun MyComposable() { }
60-
""".trimIndent()
61-
val errors = ruleWithParams.lint(code)
6242
assertThat(errors).hasStartSourceLocations(
6343
SourceLocation(3, 5),
6444
SourceLocation(6, 5),
@@ -68,60 +48,18 @@ class ComposePreviewPublicCheckTest {
6848
}
6949
}
7050

71-
@Test
72-
fun `errors when a public preview composable uses preview params`() {
73-
@Language("kotlin")
74-
val code =
75-
"""
76-
@Preview
77-
@Composable
78-
fun MyComposable(@PreviewParameter(User::class) user: User) {
79-
}
80-
@CombinedPreviews
81-
@Composable
82-
fun MyComposable(@PreviewParameter(User::class) user: User) {
83-
}
84-
""".trimIndent()
85-
val errors = rule.lint(code)
86-
assertThat(errors).hasStartSourceLocations(
87-
SourceLocation(3, 5),
88-
SourceLocation(7, 5),
89-
)
90-
for (error in errors) {
91-
assertThat(error).hasMessage(ComposePreviewPublic.ComposablesPreviewShouldNotBePublic)
92-
}
93-
}
94-
9551
@Test
9652
fun `passes when a non-public preview composable uses preview params`() {
9753
@Language("kotlin")
9854
val code =
9955
"""
10056
@Preview
10157
@Composable
102-
private fun MyComposable(@PreviewParameter(User::class) user: User) {
103-
}
104-
@CombinedPreviews
105-
@Composable
106-
internal fun MyComposable(@PreviewParameter(User::class) user: User) {
107-
}
108-
""".trimIndent()
109-
val errors = rule.lint(code)
110-
assertThat(errors).isEmpty()
111-
}
112-
113-
@Test
114-
fun `passes when a private preview composable uses preview params`() {
115-
@Language("kotlin")
116-
val code =
117-
"""
118-
@Preview
119-
@Composable
120-
private fun MyComposable(@PreviewParameter(User::class) user: User) {
58+
private fun MyComposable(user: User) {
12159
}
12260
@CombinedPreviews
12361
@Composable
124-
private fun MyComposable(@PreviewParameter(User::class) user: User) {
62+
internal fun MyComposable(user: User) {
12563
}
12664
""".trimIndent()
12765
val errors = rule.lint(code)

rules/ktlint/src/main/kotlin/io/nlopez/compose/rules/ktlint/ComposePreviewPublicCheck.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,5 @@ import io.nlopez.rules.core.ComposeKtVisitor
77
import io.nlopez.rules.core.ktlint.KtlintRule
88

99
class ComposePreviewPublicCheck :
10-
KtlintRule(
11-
id = "compose:preview-public-check",
12-
editorConfigProperties = setOf(previewPublicOnlyIfParams),
13-
),
10+
KtlintRule("compose:preview-public-check"),
1411
ComposeKtVisitor by ComposePreviewPublic()

rules/ktlint/src/main/kotlin/io/nlopez/compose/rules/ktlint/EditorConfigProperties.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,6 @@ val compositionLocalAllowlistProperty: EditorConfigProperty<String> =
6060
},
6161
)
6262

63-
val previewPublicOnlyIfParams: EditorConfigProperty<Boolean> =
64-
EditorConfigProperty(
65-
type = PropertyType.LowerCasingPropertyType(
66-
"compose_preview_public_only_if_params",
67-
"If set to true, it means ",
68-
//
69-
PropertyValueParser.BOOLEAN_VALUE_PARSER,
70-
"true",
71-
"false",
72-
),
73-
defaultValue = true,
74-
)
75-
7663
val allowedComposeNamingNames: EditorConfigProperty<String> =
7764
EditorConfigProperty(
7865
type = PropertyType.LowerCasingPropertyType(

rules/ktlint/src/test/kotlin/io/nlopez/compose/rules/ktlint/ComposePreviewPublicCheckTest.kt

Lines changed: 8 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class ComposePreviewPublicCheckTest {
2424
}
2525

2626
@Test
27-
fun `passes for preview public composables that don't have preview params`() {
27+
fun `errors for preview public composables`() {
2828
@Language("kotlin")
2929
val code =
3030
"""
@@ -35,77 +35,32 @@ class ComposePreviewPublicCheckTest {
3535
@Composable
3636
fun MyComposable() { }
3737
""".trimIndent()
38-
ruleAssertThat(code).hasNoLintViolations()
39-
}
40-
41-
@Test
42-
fun `errors when a public preview composable uses preview params`() {
43-
@Language("kotlin")
44-
val code =
45-
"""
46-
@Preview
47-
@Composable
48-
fun MyComposable(@PreviewParameter(User::class) user: User) {
49-
}
50-
@CombinedPreviews
51-
@Composable
52-
fun MyComposable(@PreviewParameter(User::class) user: User) {
53-
}
54-
""".trimIndent()
5538
ruleAssertThat(code).hasLintViolations(
5639
LintViolation(
5740
line = 3,
5841
col = 5,
5942
detail = ComposePreviewPublic.ComposablesPreviewShouldNotBePublic,
6043
),
6144
LintViolation(
62-
line = 7,
45+
line = 6,
6346
col = 5,
6447
detail = ComposePreviewPublic.ComposablesPreviewShouldNotBePublic,
6548
),
6649
)
6750
}
6851

69-
@Test
70-
fun `errors when a public preview composable is used when previewPublicOnlyIfParams is false`() {
71-
@Language("kotlin")
72-
val code =
73-
"""
74-
@Preview
75-
@Composable
76-
fun MyComposable() { }
77-
@CombinedPreviews
78-
@Composable
79-
fun MyComposable() { }
80-
""".trimIndent()
81-
ruleAssertThat(code)
82-
.withEditorConfigOverride(previewPublicOnlyIfParams to false)
83-
.hasLintViolations(
84-
LintViolation(
85-
line = 3,
86-
col = 5,
87-
detail = ComposePreviewPublic.ComposablesPreviewShouldNotBePublic,
88-
),
89-
LintViolation(
90-
line = 6,
91-
col = 5,
92-
detail = ComposePreviewPublic.ComposablesPreviewShouldNotBePublic,
93-
),
94-
)
95-
}
96-
9752
@Test
9853
fun `passes when a non-public preview composable uses preview params`() {
9954
@Language("kotlin")
10055
val code =
10156
"""
10257
@Preview
10358
@Composable
104-
private fun MyComposable(@PreviewParameter(User::class) user: User) {
59+
private fun MyComposable(user: User) {
10560
}
10661
@CombinedPreviews
10762
@Composable
108-
internal fun MyComposable(@PreviewParameter(User::class) user: User) {
63+
internal fun MyComposable(user: User) {
10964
}
11065
""".trimIndent()
11166
ruleAssertThat(code).hasNoLintViolations()
@@ -117,42 +72,25 @@ class ComposePreviewPublicCheckTest {
11772
val badCode = """
11873
@Preview
11974
@Composable
120-
fun MyComposable(@PreviewParameter(User::class) user: User) {
75+
fun MyComposable(user: User) {
12176
}
12277
@CombinedPreviews
12378
@Composable
124-
fun MyComposable(@PreviewParameter(User::class) user: User) {
79+
fun MyComposable(user: User) {
12580
}
12681
""".trimIndent()
12782

12883
@Language("kotlin")
12984
val expectedCode = """
13085
@Preview
13186
@Composable
132-
private fun MyComposable(@PreviewParameter(User::class) user: User) {
87+
private fun MyComposable(user: User) {
13388
}
13489
@CombinedPreviews
13590
@Composable
136-
private fun MyComposable(@PreviewParameter(User::class) user: User) {
91+
private fun MyComposable(user: User) {
13792
}
13893
""".trimIndent()
13994
ruleAssertThat(badCode).isFormattedAs(expectedCode)
14095
}
141-
142-
@Test
143-
fun `passes when a private preview composable uses preview params`() {
144-
@Language("kotlin")
145-
val code =
146-
"""
147-
@Preview
148-
@Composable
149-
private fun MyComposable(@PreviewParameter(User::class) user: User) {
150-
}
151-
@CombinedPreviews
152-
@Composable
153-
private fun MyComposable(@PreviewParameter(User::class) user: User) {
154-
}
155-
""".trimIndent()
156-
ruleAssertThat(code).hasNoLintViolations()
157-
}
15896
}

0 commit comments

Comments
 (0)