Skip to content

Commit e32d6ac

Browse files
authored
Merge pull request #851 from Kotlin/compiler-plugin-functions-1
Compiler plugin update
2 parents ea7dbe8 + a61f4a7 commit e32d6ac

File tree

26 files changed

+580
-203
lines changed

26 files changed

+580
-203
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ public class AddDsl<T>(
207207

208208
public infix fun <R> ColumnReference<R>.into(column: KProperty<R>): Boolean = into(column.name)
209209

210+
@Interpretable("AddDslStringInvoke")
210211
public operator fun String.invoke(body: AddDsl<T>.() -> Unit): Unit = group(this, body)
211212

212213
public infix fun AnyColumnGroupAccessor.from(body: AddDsl<T>.() -> Unit): Unit = group(this, body)

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/addId.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package org.jetbrains.kotlinx.dataframe.api
33
import org.jetbrains.kotlinx.dataframe.AnyCol
44
import org.jetbrains.kotlinx.dataframe.AnyFrame
55
import org.jetbrains.kotlinx.dataframe.DataFrame
6+
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
7+
import org.jetbrains.kotlinx.dataframe.annotations.Refine
68
import org.jetbrains.kotlinx.dataframe.columns.ColumnAccessor
79

810
// region DataColumn
@@ -15,6 +17,8 @@ public fun AnyCol.addId(columnName: String = "id"): AnyFrame = toDataFrame().add
1517

1618
public fun <T> DataFrame<T>.addId(column: ColumnAccessor<Int>): DataFrame<T> = insert(column) { index() }.at(0)
1719

20+
@Refine
21+
@Interpretable("AddId")
1822
public fun <T> DataFrame<T>.addId(columnName: String = "id"): DataFrame<T> = insert(columnName) { index() }.at(0)
1923

2024
// endregion

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/groupBy.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import kotlin.reflect.KProperty
2929
*
3030
* `df.add("columnName") { "someColumn"<Int>() + 15 }.groupBy("columnName")`
3131
*/
32+
@Refine
3233
@Interpretable("DataFrameGroupBy")
3334
public fun <T> DataFrame<T>.groupBy(moveToTop: Boolean = true, cols: ColumnsSelector<T, *>): GroupBy<T, T> =
3435
groupByImpl(moveToTop, cols)

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/map.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import org.jetbrains.kotlinx.dataframe.DataFrame
77
import org.jetbrains.kotlinx.dataframe.DataRow
88
import org.jetbrains.kotlinx.dataframe.RowExpression
99
import org.jetbrains.kotlinx.dataframe.Selector
10+
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
11+
import org.jetbrains.kotlinx.dataframe.annotations.Refine
1012
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1113
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
1214
import org.jetbrains.kotlinx.dataframe.impl.columnName
@@ -102,6 +104,8 @@ public fun <T, R> ColumnsContainer<T>.mapToColumn(
102104
body: AddExpression<T, R>,
103105
): DataColumn<R> = mapToColumn(column.columnName, type, infer, body)
104106

107+
@Refine
108+
@Interpretable("MapToFrame")
105109
public fun <T> DataFrame<T>.mapToFrame(body: AddDsl<T>.() -> Unit): AnyFrame {
106110
val dsl = AddDsl(this)
107111
body(dsl)

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/move.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import org.jetbrains.kotlinx.dataframe.AnyColumnReference
55
import org.jetbrains.kotlinx.dataframe.ColumnSelector
66
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
77
import org.jetbrains.kotlinx.dataframe.DataFrame
8+
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
9+
import org.jetbrains.kotlinx.dataframe.annotations.Refine
810
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
911
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
1012
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
@@ -18,6 +20,7 @@ import kotlin.reflect.KProperty
1820

1921
// region move
2022

23+
@Interpretable("Move0")
2124
public fun <T, C> DataFrame<T>.move(columns: ColumnsSelector<T, C>): MoveClause<T, C> = MoveClause(this, columns)
2225

2326
public fun <T> DataFrame<T>.move(vararg cols: String): MoveClause<T, Any?> = move { cols.toColumnSet() }
@@ -120,6 +123,8 @@ public fun <T, C> MoveClause<T, C>.under(
120123

121124
public fun <T, C> MoveClause<T, C>.to(columnIndex: Int): DataFrame<T> = moveTo(columnIndex)
122125

126+
@Refine
127+
@Interpretable("ToTop")
123128
public fun <T, C> MoveClause<T, C>.toTop(
124129
newColumnName: ColumnsSelectionDsl<T>.(ColumnWithPath<C>) -> String = { it.name() },
125130
): DataFrame<T> = into { newColumnName(it).toColumnAccessor() }

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/update.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ private interface UpdateWithNote
155155
* @include [SelectingColumns.Dsl.WithExample] {@include [SetSelectingColumnsOperationArg]}
156156
* @include [Update.DslParam]
157157
*/
158+
@Interpretable("Update0")
158159
public fun <T, C> DataFrame<T>.update(columns: ColumnsSelector<T, C>): Update<T, C> = Update(this, null, columns)
159160

160161
/**

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

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,33 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType
1212
import org.jetbrains.kotlin.fir.types.ConeTypeProjection
1313
import org.jetbrains.kotlin.fir.types.classId
1414
import org.jetbrains.kotlin.fir.types.resolvedType
15+
import org.jetbrains.kotlin.name.ClassId
1516
import org.jetbrains.kotlin.name.Name
1617
import org.jetbrains.kotlinx.dataframe.plugin.extensions.KotlinTypeFacade
1718
import org.jetbrains.kotlinx.dataframe.plugin.impl.Interpreter
18-
import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema
19-
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.aggregate
20-
import org.jetbrains.kotlinx.dataframe.plugin.utils.Names.DF_CLASS_ID
2119

22-
fun KotlinTypeFacade.analyzeRefinedCallShape(call: FirFunctionCall, reporter: InterpretationErrorReporter): CallResult? {
20+
internal inline fun <reified T> KotlinTypeFacade.analyzeRefinedCallShape(
21+
call: FirFunctionCall,
22+
expectedReturnType: ClassId,
23+
reporter: InterpretationErrorReporter
24+
): CallResult<T>? {
2325
val callReturnType = call.resolvedType
24-
if (callReturnType.classId != DF_CLASS_ID) return null
25-
val rootMarker = callReturnType.typeArguments[0]
26+
if (callReturnType.classId != expectedReturnType) return null
2627
// rootMarker is expected to be a token generated by the plugin.
2728
// it's implied by "refined call"
2829
// thus ConeClassLikeType
29-
if (rootMarker !is ConeClassLikeType) {
30-
return null
31-
}
30+
val rootMarkers = callReturnType.typeArguments.filterIsInstance<ConeClassLikeType>()
31+
if (rootMarkers.size != callReturnType.typeArguments.size) return null
3232

33-
val newSchema: PluginDataFrameSchema = call.interpreterName(session)?.let { name ->
33+
val newSchema: T = call.interpreterName(session)?.let { name ->
3434
when (name) {
35-
"Aggregate" -> {
36-
val groupByCall = call.explicitReceiver as? FirFunctionCall
37-
val interpreter = groupByCall?.loadInterpreter(session)
38-
if (interpreter != null) {
39-
aggregate(groupByCall, interpreter, reporter, call)
40-
} else {
41-
PluginDataFrameSchema(emptyList())
42-
}
43-
}
4435
else -> name.load<Interpreter<*>>().let { processor ->
4536
val dataFrameSchema = interpret(call, processor, reporter = reporter)
4637
.let {
4738
val value = it?.value
48-
if (value !is PluginDataFrameSchema) {
39+
if (value !is T) {
4940
if (!reporter.errorReported) {
50-
reporter.reportInterpretationError(call, "${processor::class} must return ${PluginDataFrameSchema::class}, but was ${value}")
41+
reporter.reportInterpretationError(call, "${processor::class} must return ${T::class}, but was $value")
5142
}
5243
return null
5344
}
@@ -58,10 +49,10 @@ fun KotlinTypeFacade.analyzeRefinedCallShape(call: FirFunctionCall, reporter: In
5849
}
5950
} ?: return null
6051

61-
return CallResult(rootMarker, newSchema)
52+
return CallResult(rootMarkers, newSchema)
6253
}
6354

64-
data class CallResult(val rootMarker: ConeClassLikeType, val newSchema: PluginDataFrameSchema)
55+
data class CallResult<T>(val markers: List<ConeClassLikeType>, val result: T)
6556

6657
class RefinedArguments(val refinedArguments: List<RefinedArgument>) : List<RefinedArgument> by refinedArguments
6758

0 commit comments

Comments
 (0)