Skip to content

Commit 70f3355

Browse files
committed
omit more permissive modifiers on restricted visibility types
1 parent dd8a717 commit 70f3355

File tree

4 files changed

+99
-1
lines changed

4 files changed

+99
-1
lines changed

docs/changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Change: kotlinx-metadata 0.9.0. Note that the `KotlinClassMetadata .read` is dep
1616
* Fix: `MemberName`s without a package are now correctly imported (#1841)
1717
* Fix: Throw if primary constructor delegates to other constructors (#1859).
1818
* Fix: Aliased imports with nested class (#1876).
19+
* Fix: Omit more permissive modifiers on restricted visibility types (#1301).
1920

2021
## Version 1.16.0
2122

kotlinpoet/src/commonMain/kotlin/com/squareup/kotlinpoet/CodeWriter.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,10 @@ internal class CodeWriter constructor(
652652
return false
653653
}
654654

655+
if (implicitModifiers.contains(KModifier.INTERNAL)) {
656+
return false
657+
}
658+
655659
if (!implicitModifiers.contains(KModifier.PUBLIC)) {
656660
return false
657661
}

kotlinpoet/src/commonMain/kotlin/com/squareup/kotlinpoet/TypeSpec.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public class TypeSpec private constructor(
171171
codeWriter.emitAnnotations(annotations, false)
172172
codeWriter.emitModifiers(
173173
modifiers,
174-
if (isNestedExternal) setOf(PUBLIC, EXTERNAL) else setOf(PUBLIC),
174+
implicitModifiers + if (isNestedExternal) setOf(PUBLIC, EXTERNAL) else setOf(PUBLIC),
175175
)
176176
codeWriter.emit(kind.declarationKeyword)
177177
if (name != null) {
@@ -446,6 +446,7 @@ public class TypeSpec private constructor(
446446
ANNOTATION in modifiers -> emptySet()
447447
EXPECT in modifiers -> setOf(EXPECT)
448448
EXTERNAL in modifiers -> setOf(EXTERNAL)
449+
INTERNAL in modifiers -> setOf(INTERNAL)
449450
else -> emptySet()
450451
}
451452
}
@@ -454,6 +455,7 @@ public class TypeSpec private constructor(
454455
return defaultImplicitFunctionModifiers + when {
455456
EXPECT in modifiers -> setOf(EXPECT)
456457
EXTERNAL in modifiers -> setOf(EXTERNAL)
458+
INTERNAL in modifiers -> setOf(INTERNAL)
457459
else -> emptySet()
458460
}
459461
}
@@ -462,6 +464,7 @@ public class TypeSpec private constructor(
462464
return defaultImplicitTypeModifiers + when {
463465
EXPECT in modifiers -> setOf(EXPECT)
464466
EXTERNAL in modifiers -> setOf(EXTERNAL)
467+
INTERNAL in modifiers -> setOf(INTERNAL)
465468
else -> emptySet()
466469
}
467470
}

kotlinpoet/src/commonTest/kotlin/com/squareup/kotlinpoet/TypeSpecTest.kt

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5778,6 +5778,96 @@ class TypeSpecTest {
57785778
}.hasMessageThat().isEqualTo("primary constructor can't delegate to other constructors")
57795779
}
57805780

5781+
// https://github.com/square/kotlinpoet/issues/1301
5782+
@Test fun permissiveModifiersOmittedOnRestrictedVisibilityTypesInSealedInterface() {
5783+
val pageStateClass = ClassName("", "FeaturePageState")
5784+
val type =
5785+
TypeSpec.interfaceBuilder("FeaturePageState")
5786+
.addModifiers(SEALED)
5787+
.addModifiers(INTERNAL)
5788+
.addType(
5789+
TypeSpec.objectBuilder("Loading")
5790+
.addModifiers(DATA)
5791+
.addSuperinterface(pageStateClass)
5792+
.build(),
5793+
)
5794+
.addType(
5795+
TypeSpec.objectBuilder("Error")
5796+
.addModifiers(DATA)
5797+
.addSuperinterface(pageStateClass)
5798+
.build(),
5799+
)
5800+
.addType(
5801+
TypeSpec.objectBuilder("Content")
5802+
.addModifiers(DATA)
5803+
.addSuperinterface(pageStateClass)
5804+
.build(),
5805+
)
5806+
.build()
5807+
5808+
//language=kotlin
5809+
assertThat(type.toString()).isEqualTo(
5810+
// no public visibility modifier on implicitly internal sealed types
5811+
"""
5812+
internal sealed interface FeaturePageState {
5813+
data object Loading : FeaturePageState
5814+
5815+
data object Error : FeaturePageState
5816+
5817+
data object Content : FeaturePageState
5818+
}
5819+
5820+
""".trimIndent(),
5821+
)
5822+
}
5823+
5824+
@Test fun permissiveModifiersOmittedOnRestrictedVisibilityPropertyInClass() {
5825+
val type = TypeSpec.classBuilder("Taco")
5826+
.addModifiers(INTERNAL)
5827+
.addProperty("ints", IntArray::class)
5828+
.build()
5829+
5830+
//language=kotlin
5831+
assertThat(toString(type)).isEqualTo(
5832+
"""
5833+
package com.squareup.tacos
5834+
5835+
import kotlin.IntArray
5836+
5837+
internal class Taco {
5838+
val ints: IntArray
5839+
}
5840+
5841+
""".trimIndent(),
5842+
)
5843+
}
5844+
5845+
@Test fun permissiveModifiersOmittedOnRestrictedVisibilityFunctionInClass() {
5846+
val taco = TypeSpec.classBuilder("Taco")
5847+
.addModifiers(INTERNAL)
5848+
.addFunction(
5849+
FunSpec.builder("toString")
5850+
.addModifiers(KModifier.FINAL, KModifier.OVERRIDE)
5851+
.returns(String::class)
5852+
.addStatement("return %S", "taco")
5853+
.build(),
5854+
)
5855+
.build()
5856+
5857+
assertThat(toString(taco)).isEqualTo(
5858+
"""
5859+
|package com.squareup.tacos
5860+
|
5861+
|import kotlin.String
5862+
|
5863+
|internal class Taco {
5864+
| final override fun toString(): String = "taco"
5865+
|}
5866+
|
5867+
""".trimMargin(),
5868+
)
5869+
}
5870+
57815871
companion object {
57825872
private const val donutsPackage = "com.squareup.donuts"
57835873
}

0 commit comments

Comments
 (0)