Skip to content

Commit 693f14b

Browse files
committed
[Compiler plugin] Generate valid code in transform(call) when interpret(call) fails
1 parent 1cd6f8c commit 693f14b

File tree

4 files changed

+34
-8
lines changed

4 files changed

+34
-8
lines changed

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ internal inline fun <reified T> KotlinTypeFacade.analyzeRefinedCallShape(
3030
val rootMarkers = callReturnType.typeArguments.filterIsInstance<ConeClassLikeType>()
3131
if (rootMarkers.size != callReturnType.typeArguments.size) return null
3232

33-
val newSchema: T = call.interpreterName(session)?.let { name ->
33+
val newSchema: T? = call.interpreterName(session)?.let { name ->
3434
when (name) {
3535
else -> name.load<Interpreter<*>>().let { processor ->
3636
val dataFrameSchema = interpret(call, processor, reporter = reporter)
@@ -40,19 +40,20 @@ internal inline fun <reified T> KotlinTypeFacade.analyzeRefinedCallShape(
4040
if (!reporter.errorReported) {
4141
reporter.reportInterpretationError(call, "${processor::class} must return ${T::class}, but was $value")
4242
}
43-
return null
43+
null
44+
} else {
45+
value
4446
}
45-
value
4647
}
4748
dataFrameSchema
4849
}
4950
}
50-
} ?: return null
51+
}
5152

5253
return CallResult(rootMarkers, newSchema)
5354
}
5455

55-
data class CallResult<T>(val markers: List<ConeClassLikeType>, val result: T)
56+
data class CallResult<T>(val markers: List<ConeClassLikeType>, val result: T?)
5657

5758
class RefinedArguments(val refinedArguments: List<RefinedArgument>) : List<RefinedArgument> by refinedArguments
5859

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ class FunctionCallTransformer(
9797

9898
private interface CallTransformer {
9999
fun interceptOrNull(callInfo: CallInfo, symbol: FirNamedFunctionSymbol, hash: String): CallReturnType?
100+
101+
/**
102+
* must still generate let with declared class from interceptOrNull when interpretation fails.
103+
* it should only return null if later some frontend checker fails compilation in general
104+
*/
100105
fun transformOrNull(call: FirFunctionCall, originalSymbol: FirNamedFunctionSymbol): FirFunctionCall?
101106
}
102107

@@ -180,7 +185,7 @@ class FunctionCallTransformer(
180185
val (tokens, dataFrameSchema) = callResult ?: return null
181186
val token = tokens[0]
182187
val firstSchema = token.toClassSymbol(session)?.resolvedSuperTypes?.get(0)!!.toRegularClassSymbol(session)?.fir!!
183-
val dataSchemaApis = materialize(dataFrameSchema, call, firstSchema)
188+
val dataSchemaApis = materialize(dataFrameSchema ?: PluginDataFrameSchema.EMPTY, call, firstSchema)
184189

185190
val tokenFir = token.toClassSymbol(session)!!.fir
186191
tokenFir.callShapeData = CallShapeData.RefinedType(dataSchemaApis.map { it.scope.symbol })
@@ -228,8 +233,13 @@ class FunctionCallTransformer(
228233
val keyMarker = rootMarkers[0]
229234
val groupMarker = rootMarkers[1]
230235

231-
val keySchema = createPluginDataFrameSchema(groupBy.keys, groupBy.moveToTop)
232-
val groupSchema = PluginDataFrameSchema(groupBy.df.columns())
236+
val (keySchema, groupSchema) = if (groupBy != null) {
237+
val keySchema = createPluginDataFrameSchema(groupBy.keys, groupBy.moveToTop)
238+
val groupSchema = PluginDataFrameSchema(groupBy.df.columns())
239+
keySchema to groupSchema
240+
} else {
241+
PluginDataFrameSchema.EMPTY to PluginDataFrameSchema.EMPTY
242+
}
233243

234244
val firstSchema = keyMarker.toClassSymbol(session)?.resolvedSuperTypes?.get(0)!!.toRegularClassSymbol(session)?.fir!!
235245
val firstSchema1 = groupMarker.toClassSymbol(session)?.resolvedSuperTypes?.get(0)!!.toRegularClassSymbol(session)?.fir!!
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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+
fun box(): String {
7+
val df = dataFrameOf("versions")(mapOf("a" to 1)).convert { versions }.with { dataFrameOf(it.keys)(it.values) }
8+
return "OK"
9+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@ public void testInsert() {
226226
runTest("testData/box/insert.kt");
227227
}
228228

229+
@Test
230+
@TestMetadata("inventNamesForLocalClasses.kt")
231+
public void testInventNamesForLocalClasses() {
232+
runTest("testData/box/inventNamesForLocalClasses.kt");
233+
}
234+
229235
@Test
230236
@TestMetadata("join.kt")
231237
public void testJoin() {

0 commit comments

Comments
 (0)