Skip to content

Commit 2960fd4

Browse files
committed
Fix #105 Excessive schema interface generation
1 parent 3e8a54a commit 2960fd4

File tree

5 files changed

+40
-13
lines changed

5 files changed

+40
-13
lines changed

src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/Marker.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public open class Marker(
3434
override val name: String,
3535
public val isOpen: Boolean,
3636
override val fields: List<GeneratedField>,
37-
base: List<Marker>,
37+
superMarkers: List<Marker>,
3838
override val visibility: MarkerVisibility,
3939
typeParameters: List<String>,
4040
typeArguments: List<String>
@@ -43,20 +43,20 @@ public open class Marker(
4343
public val shortName: String
4444
get() = name.substringAfterLast(".")
4545

46-
public val baseMarkers: Map<String, Marker> = base.associateBy { it.name }
46+
public val superMarkers: Map<String, Marker> = superMarkers.associateBy { it.name }
4747

48-
public val allBaseMarkers: Map<String, Marker> by lazy {
49-
val result = baseMarkers.toMutableMap()
50-
baseMarkers.forEach {
51-
result.putAll(it.value.allBaseMarkers)
48+
public val allSuperMarkers: Map<String, Marker> by lazy {
49+
val result = this.superMarkers.toMutableMap()
50+
this.superMarkers.forEach {
51+
result.putAll(it.value.allSuperMarkers)
5252
}
5353
result
5454
}
5555

5656
public val allFields: List<GeneratedField> by lazy {
5757

5858
val fieldsMap = mutableMapOf<String, GeneratedField>()
59-
baseMarkers.values.forEach {
59+
this.superMarkers.values.forEach {
6060
it.allFields.forEach {
6161
fieldsMap[it.fieldName.quotedIfNeeded] = it
6262
}
@@ -79,7 +79,7 @@ public open class Marker(
7979

8080
public val schema: DataFrameSchema by lazy { DataFrameSchemaImpl(allFields.map { it.columnName to it.columnSchema }.toMap()) }
8181

82-
public fun implements(schema: Marker): Boolean = if (schema.name == name) true else baseMarkers[schema.name]?.let { it === schema } ?: false
82+
public fun implements(schema: Marker): Boolean = if (schema.name == name) true else allSuperMarkers[schema.name]?.let { it === schema } ?: false
8383

8484
public fun implementsAll(schemas: Iterable<Marker>): Boolean = schemas.all { implements(it) }
8585

@@ -88,7 +88,7 @@ public open class Marker(
8888
name: String,
8989
isOpen: Boolean,
9090
fields: List<GeneratedField>,
91-
base: List<Marker>,
91+
superMarkers: List<Marker>,
9292
visibility: MarkerVisibility,
9393
klass: KClass<*>
9494
): Marker {
@@ -102,7 +102,7 @@ public open class Marker(
102102
}
103103
}
104104
val typeArguments = klass.typeParameters.map { it.name }
105-
return Marker(name, isOpen, fields, base, visibility, typeParameters, typeArguments)
105+
return Marker(name, isOpen, fields, superMarkers, visibility, typeParameters, typeArguments)
106106
}
107107
}
108108
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ internal class CodeGeneratorImpl(typeRendering: TypeRenderingStrategy = FqNames)
242242
val header =
243243
"@$annotationName${if (marker.isOpen) "" else "(isOpen = false)"}\n${visibility}interface ${marker.name}"
244244
val baseInterfacesDeclaration =
245-
if (marker.baseMarkers.isNotEmpty()) " : " + marker.baseMarkers.map { it.value.name }
245+
if (marker.superMarkers.isNotEmpty()) " : " + marker.superMarkers.map { it.value.name }
246246
.joinToString() else ""
247247
val resultDeclarations = mutableListOf<String>()
248248

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ internal class ReplCodeGeneratorImpl : ReplCodeGenerator {
112112
it.simpleName!!
113113
}.sorted()
114114

115-
val tempBaseClassNames = temp.baseMarkers.map { it.value.shortName }.sorted()
115+
val tempBaseClassNames = temp.superMarkers.map { it.value.shortName }.sorted()
116116

117117
if (baseClassNames == tempBaseClassNames) {
118118
val newBaseMarkers = baseClasses.map { resolve(it) }

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
@@ -25,7 +25,7 @@ internal class SchemaProcessorImpl(
2525
.filter { it.schema.compare(this).isSuperOrEqual() }
2626

2727
private fun List<Marker>.onlyLeafs(): List<Marker> {
28-
val skip = flatMap { it.allBaseMarkers.keys }.toSet()
28+
val skip = flatMap { it.allSuperMarkers.keys }.toSet()
2929
return filter { !skip.contains(it.name) }
3030
}
3131

src/test/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/ReplCodeGenTests.kt

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

33
import io.kotest.matchers.shouldBe
4+
import io.kotest.matchers.string.shouldBeEmpty
45
import org.jetbrains.dataframe.impl.codeGen.ReplCodeGenerator
56
import org.jetbrains.dataframe.impl.codeGen.process
67
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
78
import org.jetbrains.kotlinx.dataframe.DataColumn
89
import org.jetbrains.kotlinx.dataframe.DataRow
910
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
11+
import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
1012
import org.jetbrains.kotlinx.dataframe.api.filter
1113
import org.jetbrains.kotlinx.dataframe.api.select
1214
import org.jetbrains.kotlinx.dataframe.impl.codeGen.ReplCodeGeneratorImpl
@@ -39,6 +41,21 @@ class ReplCodeGenTests : BaseTest() {
3941
interface _DataFrameType2 : _DataFrameType, _DataFrameType1
4042
}
4143

44+
object Test3 {
45+
@DataSchema
46+
interface A { val x: List<*> }
47+
48+
@DataSchema
49+
interface B : A
50+
51+
@DataSchema(isOpen = false)
52+
interface C : B {
53+
override val x: List<Int>
54+
}
55+
56+
val df = dataFrameOf("x")(listOf(1))
57+
}
58+
4259
@Test
4360
fun `process derived markers`() {
4461
val repl = ReplCodeGenerator.create()
@@ -143,4 +160,14 @@ class ReplCodeGenTests : BaseTest() {
143160
val code = repl.process(typed).declarations.trimIndent()
144161
code shouldBe expected
145162
}
163+
164+
@Test
165+
fun `process overriden property`() {
166+
val repl = ReplCodeGenerator.create()
167+
repl.process<Test3.A>()
168+
repl.process<Test3.B>()
169+
repl.process<Test3.C>()
170+
val c = repl.process(Test3.df, Test3::df)
171+
c.declarations.shouldBeEmpty()
172+
}
146173
}

0 commit comments

Comments
 (0)