Skip to content

Commit dff1e5d

Browse files
committed
adding check for non-sealed interface in MarkersExtractor for a Marker to be isOpen.
Extra check for isOpen in getAllSuperMarkers
1 parent 5d40558 commit dff1e5d

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/MarkersExtractor.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ internal object MarkersExtractor {
3737
fun get(markerClass: KClass<*>, nullableProperties: Boolean = false): Marker =
3838
cache.getOrPut(Pair(markerClass, nullableProperties)) {
3939
val fields = getFields(markerClass, nullableProperties)
40-
val isOpen = markerClass.findAnnotation<DataSchema>()?.isOpen ?: false
40+
val isOpen = !markerClass.isSealed &&
41+
markerClass.java.isInterface &&
42+
markerClass.findAnnotation<DataSchema>()?.isOpen == true
43+
4144
val baseSchemas = markerClass.superclasses.filter { it != Any::class }.map { get(it, nullableProperties) }
4245
Marker(
4346
name = markerClass.qualifiedName ?: markerClass.simpleName!!,

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/ReplCodeGeneratorImpl.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,7 @@ internal class ReplCodeGeneratorImpl : ReplCodeGenerator {
9292
extensionProperties = true,
9393
isOpen = isOpen,
9494
visibility = MarkerVisibility.IMPLICIT_PUBLIC,
95-
knownMarkers = registeredMarkers
96-
.filterKeys { !it.isData } // filter out data classes, so they aren't used as supertypes
97-
.values,
95+
knownMarkers = registeredMarkers.values,
9896
)
9997

10098
result.newMarkers.forEach {

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/SchemaProcessorImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal class SchemaProcessorImpl(
2222
override val generatedMarkers = mutableListOf<Marker>()
2323

2424
private fun DataFrameSchema.getAllSuperMarkers() = registeredMarkers
25-
.filter { it.schema.compare(this).isSuperOrEqual() }
25+
.filter { it.isOpen && it.schema.compare(this).isSuperOrEqual() }
2626

2727
private fun List<Marker>.onlyLeafs(): List<Marker> {
2828
val skip = flatMap { it.allSuperMarkers.keys }.toSet()

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/JupyterCodegenTests.kt

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class JupyterCodegenTests : JupyterReplTestCase() {
3636
@Language("kts")
3737
val res1 = exec(
3838
"""
39-
@DataSchema(isOpen = false)
39+
@DataSchema
4040
data class A(val a: Int)
4141
""".trimIndent()
4242
)
@@ -52,6 +52,69 @@ class JupyterCodegenTests : JupyterReplTestCase() {
5252
(res2 as AnyFrame).should { it.isNotEmpty() }
5353
}
5454

55+
@Test
56+
fun `Don't inherit from non open class`() {
57+
@Language("kts")
58+
val res1 = exec(
59+
"""
60+
@DataSchema
61+
class A(val a: Int)
62+
""".trimIndent()
63+
)
64+
65+
@Language("kts")
66+
val res2 = execRaw(
67+
"""
68+
val df = dataFrameOf("a", "b")(1, 2)
69+
df
70+
""".trimIndent()
71+
)
72+
73+
(res2 as AnyFrame).should { it.isNotEmpty() }
74+
}
75+
76+
@Test
77+
fun `Don't inherit from open class`() {
78+
@Language("kts")
79+
val res1 = exec(
80+
"""
81+
@DataSchema
82+
open class A(val a: Int)
83+
""".trimIndent()
84+
)
85+
86+
@Language("kts")
87+
val res2 = execRaw(
88+
"""
89+
val df = dataFrameOf("a", "b")(1, 2)
90+
df
91+
""".trimIndent()
92+
)
93+
94+
(res2 as AnyFrame).should { it.isNotEmpty() }
95+
}
96+
97+
@Test
98+
fun `Do inherit from open interface`() {
99+
@Language("kts")
100+
val res1 = exec(
101+
"""
102+
@DataSchema
103+
interface A { val a: Int }
104+
""".trimIndent()
105+
)
106+
107+
@Language("kts")
108+
val res2 = execRaw(
109+
"""
110+
val df = dataFrameOf("a", "b")(1, 2)
111+
df
112+
""".trimIndent()
113+
)
114+
115+
(res2 as AnyFrame).should { it.isNotEmpty() }
116+
}
117+
55118
@Test
56119
fun `codegen for enumerated frames`() {
57120
@Language("kts")

0 commit comments

Comments
 (0)