Skip to content

Commit e9f6ea0

Browse files
committed
[Compiler plugin] Add ability to extract schema from implicit this receiver
1 parent 28088ea commit e9f6ea0

File tree

5 files changed

+60
-1
lines changed

5 files changed

+60
-1
lines changed

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/select.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnPathApproximation
1313
import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation
1414
import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
1515
import org.jetbrains.kotlinx.dataframe.plugin.impl.enum
16+
import org.jetbrains.kotlinx.dataframe.plugin.impl.ignore
1617
import org.jetbrains.kotlinx.dataframe.plugin.impl.type
1718

1819
internal class Select0 : AbstractInterpreter<PluginDataFrameSchema>() {
@@ -25,6 +26,7 @@ internal class Select0 : AbstractInterpreter<PluginDataFrameSchema>() {
2526
}
2627

2728
internal class Expr0 : AbstractInterpreter<ColumnsResolver>() {
29+
val Arguments.receiver by ignore()
2830
val Arguments.name: String by arg(defaultValue = Present("untitled"))
2931
val Arguments.infer: Infer by enum(defaultValue = Present(Infer.Nulls))
3032
val Arguments.expression: TypeApproximation by type()
@@ -53,6 +55,7 @@ internal class And0 : AbstractInterpreter<ColumnsResolver>() {
5355
}
5456

5557
internal class All0 : AbstractInterpreter<ColumnsResolver>() {
58+
val Arguments.receiver by ignore()
5659
override fun Arguments.interpret(): ColumnsResolver {
5760
return object : ColumnsResolver {
5861
override fun resolve(df: PluginDataFrameSchema): List<ColumnWithPathApproximation> {
@@ -66,6 +69,7 @@ internal class All0 : AbstractInterpreter<ColumnsResolver>() {
6669
}
6770

6871
internal class ColsOf0 : AbstractInterpreter<ColumnsResolver>() {
72+
val Arguments.receiver by ignore()
6973
val Arguments.typeArg0: TypeApproximation by arg()
7074

7175
override fun Arguments.interpret(): ColumnsResolver {
@@ -90,6 +94,7 @@ private fun Arguments.colsOf(cols: List<ColumnWithPathApproximation>, type: Cone
9094
}
9195

9296
internal class ColsAtAnyDepth0 : AbstractInterpreter<ColumnsResolver>() {
97+
val Arguments.receiver by ignore()
9398
override fun Arguments.interpret(): ColumnsResolver {
9499
return object : ColumnsResolver {
95100
override fun resolve(df: PluginDataFrameSchema): List<ColumnWithPathApproximation> {

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/interpret.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ internal fun FirFunctionCall.collectArgumentExpressions(): RefinedArguments {
505505
val refinedArgument = mutableListOf<RefinedArgument>()
506506

507507
val parameterName = Name.identifier("receiver")
508-
explicitReceiver?.let {
508+
(explicitReceiver ?: extensionReceiver)?.let {
509509
if (it is FirResolvedQualifier && it.resolvedToCompanionObject) {
510510
return@let
511511
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import org.jetbrains.kotlinx.dataframe.*
2+
import org.jetbrains.kotlinx.dataframe.annotations.*
3+
import org.jetbrains.kotlinx.dataframe.api.*
4+
import org.jetbrains.kotlinx.dataframe.io.*
5+
6+
data class Nested(val d: Double)
7+
8+
data class Record(val a: String, val b: Int, val nested: Nested)
9+
10+
fun box(): String {
11+
val df = dataFrameOf("a", "b", "c")(1, 2, 3)
12+
13+
df.groupBy { a }
14+
.updateGroups { remove { a } }
15+
.aggregate { c into "c" }
16+
return "OK"
17+
}
18+
19+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import org.jetbrains.kotlinx.dataframe.*
2+
import org.jetbrains.kotlinx.dataframe.annotations.*
3+
import org.jetbrains.kotlinx.dataframe.api.*
4+
import org.jetbrains.kotlinx.dataframe.io.*
5+
6+
@DataSchema
7+
interface JoinLeaf {
8+
val something: Int
9+
val somethingElse: String
10+
}
11+
12+
@DataSchema
13+
interface Join2 {
14+
val c: DataRow<JoinLeaf>
15+
}
16+
17+
fun selectionDsl(df: DataFrame<Join2>) {
18+
df.ungroup { c }.select { colsOf<String>() }.somethingElse
19+
}
20+
21+
fun box(): String {
22+
return "OK"
23+
}

plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,12 +454,24 @@ public void testSchema() {
454454
runTest("testData/box/Schema.kt");
455455
}
456456

457+
@Test
458+
@TestMetadata("schemaFromImplicitReceiver.kt")
459+
public void testSchemaFromImplicitReceiver() {
460+
runTest("testData/box/schemaFromImplicitReceiver.kt");
461+
}
462+
457463
@Test
458464
@TestMetadata("select.kt")
459465
public void testSelect() {
460466
runTest("testData/box/select.kt");
461467
}
462468

469+
@Test
470+
@TestMetadata("selectColsOf.kt")
471+
public void testSelectColsOf() {
472+
runTest("testData/box/selectColsOf.kt");
473+
}
474+
463475
@Test
464476
@TestMetadata("selectIt.kt")
465477
public void testSelectIt() {

0 commit comments

Comments
 (0)