Skip to content

Commit 5d40558

Browse files
committed
fix for #178
1 parent a87b440 commit 5d40558

File tree

5 files changed

+49
-22
lines changed

5 files changed

+49
-22
lines changed

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import org.jetbrains.dataframe.impl.codeGen.CodeGenerator
44
import org.jetbrains.kotlinx.dataframe.DataFrame
55
import org.jetbrains.kotlinx.dataframe.api.schema
66

7-
public inline fun <reified T> DataFrame<T>.generateCode(fields: Boolean = true, extensionProperties: Boolean = true): String {
7+
public inline fun <reified T> DataFrame<T>.generateCode(
8+
fields: Boolean = true,
9+
extensionProperties: Boolean = true,
10+
): String {
811
val name = if (T::class.isAbstract) {
912
T::class.simpleName!!
1013
} else "DataEntry"
@@ -15,16 +18,16 @@ public fun <T> DataFrame<T>.generateCode(
1518
markerName: String,
1619
fields: Boolean = true,
1720
extensionProperties: Boolean = true,
18-
visibility: MarkerVisibility = MarkerVisibility.IMPLICIT_PUBLIC
21+
visibility: MarkerVisibility = MarkerVisibility.IMPLICIT_PUBLIC,
1922
): String {
2023
val codeGen = CodeGenerator.create()
2124
return codeGen.generate(
22-
schema(),
23-
markerName,
25+
schema = schema(),
26+
name = markerName,
2427
fields = fields,
2528
extensionProperties = extensionProperties,
2629
isOpen = true,
27-
visibility
30+
visibility = visibility,
2831
).code.declarations
2932
}
3033

@@ -34,7 +37,7 @@ public inline fun <reified T> DataFrame<T>.generateInterfaces(): String = genera
3437
)
3538

3639
public fun <T> DataFrame<T>.generateInterfaces(markerName: String): String = generateCode(
37-
markerName,
40+
markerName = markerName,
3841
fields = true,
3942
extensionProperties = false
4043
)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ import org.jetbrains.kotlinx.jupyter.api.Code
3737

3838
private fun renderNullability(nullable: Boolean) = if (nullable) "?" else ""
3939

40-
internal fun getRequiredMarkers(schema: DataFrameSchema, markers: Iterable<Marker>) = markers
41-
.filter { it.isOpen && it.schema.compare(schema).isSuperOrEqual() }
40+
internal fun Iterable<Marker>.filterRequiredForSchema(schema: DataFrameSchema) =
41+
filter { it.isOpen && it.schema.compare(schema).isSuperOrEqual() }
4242

4343
internal val charsToQuote = """[ `(){}\[\].<>'"/|\\!?@:;%^&*#$-]""".toRegex()
4444

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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ internal class ReplCodeGeneratorImpl : ReplCodeGenerator {
6666
// for mutable properties we do strong typing only at the first processing, after that we allow its type to be more general than actual data frame type
6767
if (wasProcessedBefore || columnSchema == targetSchema) {
6868
// property scheme is valid for current data frame, but we should also check that all compatible open markers are implemented by it
69-
val requiredBaseMarkers =
70-
getRequiredMarkers(columnSchema, registeredMarkers.values)
69+
val requiredBaseMarkers = registeredMarkers.values.filterRequiredForSchema(columnSchema)
7170
if (requiredBaseMarkers.any() && requiredBaseMarkers.all { currentMarker.implements(it) }) {
7271
return CodeWithConverter.Empty
7372
}
@@ -87,13 +86,15 @@ internal class ReplCodeGeneratorImpl : ReplCodeGenerator {
8786
isOpen: Boolean,
8887
): CodeWithConverter {
8988
val result = generator.generate(
90-
schema,
91-
name,
89+
schema = schema,
90+
name = name,
9291
fields = false,
9392
extensionProperties = true,
94-
isOpen,
95-
MarkerVisibility.IMPLICIT_PUBLIC,
96-
registeredMarkers.values
93+
isOpen = isOpen,
94+
visibility = MarkerVisibility.IMPLICIT_PUBLIC,
95+
knownMarkers = registeredMarkers
96+
.filterKeys { !it.isData } // filter out data classes, so they aren't used as supertypes
97+
.values,
9798
)
9899

99100
result.newMarkers.forEach {
@@ -121,12 +122,12 @@ internal class ReplCodeGeneratorImpl : ReplCodeGenerator {
121122
if (baseClassNames == tempBaseClassNames) {
122123
val newBaseMarkers = baseClasses.map { resolve(it) }
123124
val newMarker = Marker(
124-
clazz.qualifiedName!!,
125-
temp.isOpen,
126-
temp.fields,
127-
newBaseMarkers,
128-
MarkerVisibility.IMPLICIT_PUBLIC,
129-
clazz
125+
name = clazz.qualifiedName!!,
126+
isOpen = temp.isOpen,
127+
fields = temp.fields,
128+
superMarkers = newBaseMarkers,
129+
visibility = MarkerVisibility.IMPLICIT_PUBLIC,
130+
klass = clazz,
130131
)
131132
registeredMarkers[markerClass] = newMarker
132133
generatedMarkers.remove(temp.name)

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
@@ -133,7 +133,7 @@ internal class SchemaProcessorImpl(
133133
return Marker(name, isOpen, fields, baseMarkers.onlyLeafs(), visibility, emptyList(), emptyList())
134134
}
135135

136-
private fun DataFrameSchema.getRequiredMarkers() = getRequiredMarkers(this, registeredMarkers)
136+
private fun DataFrameSchema.getRequiredMarkers() = registeredMarkers.filterRequiredForSchema(this)
137137

138138
override fun process(
139139
schema: DataFrameSchema,

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.jetbrains.kotlinx.dataframe.jupyter
22

33
import io.kotest.assertions.throwables.shouldNotThrowAny
4+
import io.kotest.matchers.should
45
import io.kotest.matchers.shouldBe
56
import io.kotest.matchers.types.shouldBeInstanceOf
67
import org.intellij.lang.annotations.Language
78
import org.jetbrains.kotlinx.dataframe.AnyFrame
9+
import org.jetbrains.kotlinx.dataframe.api.isNotEmpty
810
import org.jetbrains.kotlinx.dataframe.columns.ValueColumn
911
import org.jetbrains.kotlinx.dataframe.type
1012
import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult
@@ -29,6 +31,27 @@ class JupyterCodegenTests : JupyterReplTestCase() {
2931
res2["value"].type shouldBe typeOf<List<Any?>>()
3032
}
3133

34+
@Test
35+
fun `Don't inherit from data class`() {
36+
@Language("kts")
37+
val res1 = exec(
38+
"""
39+
@DataSchema(isOpen = false)
40+
data class A(val a: Int)
41+
""".trimIndent()
42+
)
43+
44+
@Language("kts")
45+
val res2 = execRaw(
46+
"""
47+
val df = dataFrameOf("a", "b")(1, 2)
48+
df
49+
""".trimIndent()
50+
)
51+
52+
(res2 as AnyFrame).should { it.isNotEmpty() }
53+
}
54+
3255
@Test
3356
fun `codegen for enumerated frames`() {
3457
@Language("kts")

0 commit comments

Comments
 (0)