Skip to content

Commit cb9125d

Browse files
committed
added tests and a fix for when an empty column was inferred as Any instead of Nothing
1 parent 7ec0ff5 commit cb9125d

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -197,15 +197,19 @@ internal fun commonParent(vararg classes: KClass<*>): KClass<*>? = commonParent(
197197
internal fun Iterable<KClass<*>>.withMostSuperclasses(): KClass<*>? = maxByOrNull { it.allSuperclasses.size }
198198

199199
internal fun Iterable<KClass<*>>.createType(nullable: Boolean, upperBound: KType? = null): KType =
200-
if (upperBound == null) {
201-
(withMostSuperclasses() ?: Any::class).createStarProjectedType(nullable)
202-
} else {
203-
val upperClass = upperBound.classifier as KClass<*>
204-
val baseClass = filter { it.isSubclassOf(upperClass) }.withMostSuperclasses() ?: withMostSuperclasses()
205-
if (baseClass == null) {
206-
upperBound.withNullability(nullable)
207-
} else {
208-
upperBound.projectTo(baseClass).withNullability(nullable)
200+
when {
201+
!iterator().hasNext() -> upperBound?.withNullability(nullable) ?: nothingType(nullable)
202+
203+
upperBound == null -> (withMostSuperclasses() ?: Any::class).createStarProjectedType(nullable)
204+
205+
else -> {
206+
val upperClass = upperBound.classifier as KClass<*>
207+
val baseClass = filter { it.isSubclassOf(upperClass) }.withMostSuperclasses() ?: withMostSuperclasses()
208+
if (baseClass == null) {
209+
upperBound.withNullability(nullable)
210+
} else {
211+
upperBound.projectTo(baseClass).withNullability(nullable)
212+
}
209213
}
210214
}
211215

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/constructors.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.jetbrains.kotlinx.dataframe.api
22

33
import io.kotest.matchers.shouldBe
4+
import org.jetbrains.kotlinx.dataframe.impl.nothingType
5+
import org.jetbrains.kotlinx.dataframe.type
46
import org.junit.Test
57

68
class ConstructorsTests {
@@ -24,4 +26,10 @@ class ConstructorsTests {
2426
df.columnsCount() shouldBe 2
2527
df.columnNames() shouldBe listOf(column.name(), "${column.name()}1")
2628
}
29+
30+
@Test
31+
fun `dataFrameOf with nothing columns`() {
32+
dataFrameOf("a" to emptyList())["a"].type shouldBe nothingType(false)
33+
dataFrameOf("a" to listOf(null))["a"].type shouldBe nothingType(true)
34+
}
2735
}

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/types/UtilTests.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ class UtilTests {
9797

9898
@Test
9999
fun `createType test`() {
100-
emptyList<KClass<*>>().createType(nullable = false) shouldBe typeOf<Any>()
101-
emptyList<KClass<*>>().createType(nullable = true) shouldBe typeOf<Any?>()
100+
emptyList<KClass<*>>().createType(nullable = false) shouldBe nothingType(nullable = false)
101+
emptyList<KClass<*>>().createType(nullable = true) shouldBe nothingType(nullable = true)
102102

103103
listOf(Nothing::class).createType(nullable = false) shouldBe nothingType(nullable = false)
104104
listOf(Nothing::class).createType(nullable = true) shouldBe nothingType(nullable = true)
@@ -111,6 +111,9 @@ class UtilTests {
111111

112112
listOf(Nothing::class).commonType(false) shouldBe nothingType(nullable = false)
113113
listOf(Nothing::class).commonType(true) shouldBe nothingType(nullable = true)
114+
115+
emptyList<KClass<*>>().commonType(false, null) shouldBe nothingType(nullable = false)
116+
emptyList<KClass<*>>().commonType(true, null) shouldBe nothingType(nullable = true)
114117
}
115118

116119
val a = listOf(1, 2.0, "a")
@@ -133,6 +136,7 @@ class UtilTests {
133136
guessValueType(sequenceOf(1, 2.0, "a", null, listOf(1, 2))) shouldBe typeOf<Any?>()
134137

135138
guessValueType(sequenceOf(null, null)) shouldBe nothingType(nullable = true)
139+
guessValueType(emptySequence()) shouldBe nothingType(nullable = false)
136140

137141
guessValueType(sequenceOf(listOf<Int?>(null))) shouldBe typeOf<List<Nothing?>>()
138142
guessValueType(sequenceOf(emptyList<Int>())) shouldBe typeOf<List<Nothing>>()

0 commit comments

Comments
 (0)