Skip to content

Commit fea737e

Browse files
authored
Merge pull request #907 from Kotlin/invent-local-names-fix
Generate valid code in transform(call) when interpret(call) fails
2 parents d1fe1ae + 693f14b commit fea737e

File tree

9 files changed

+46
-17
lines changed

9 files changed

+46
-17
lines changed

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

+6-5
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

+13-3
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!!

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

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ import org.jetbrains.kotlinx.dataframe.plugin.utils.Names
1818
data class PluginDataFrameSchema(
1919
private val columns: List<SimpleCol>
2020
) : DataFrameLikeContainer<SimpleCol> {
21+
companion object {
22+
val EMPTY = PluginDataFrameSchema(emptyList())
23+
}
2124
override fun columns(): List<SimpleCol> {
2225
return columns
2326
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fun KotlinTypeFacade.aggregate(
9292
}
9393
PluginDataFrameSchema(cols)
9494
} else {
95-
PluginDataFrameSchema(emptyList())
95+
PluginDataFrameSchema.EMPTY
9696
}
9797
}
9898

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ internal fun PluginDataFrameSchema.insertImpl(
132132
columns.firstOrNull()?.referenceNode?.getRoot(),
133133
0,
134134
factory = { PluginDataFrameSchema(it) },
135-
empty = PluginDataFrameSchema(emptyList()),
135+
empty = PluginDataFrameSchema.EMPTY,
136136
rename = { rename(it) },
137137
createColumnGroup = { name, columns ->
138138
SimpleColumnGroup(name, columns)

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,12 @@ internal fun KotlinTypeFacade.toDataFrame(
288288
}
289289
}
290290

291-
val receiver = explicitReceiver ?: return PluginDataFrameSchema(emptyList())
292-
val arg = receiver.resolvedType.typeArguments.firstOrNull() ?: return PluginDataFrameSchema(emptyList())
291+
val receiver = explicitReceiver ?: return PluginDataFrameSchema.EMPTY
292+
val arg = receiver.resolvedType.typeArguments.firstOrNull() ?: return PluginDataFrameSchema.EMPTY
293293
return when {
294-
arg.isStarProjection -> PluginDataFrameSchema(emptyList())
294+
arg.isStarProjection -> PluginDataFrameSchema.EMPTY
295295
else -> {
296-
val classLike = arg.type as? ConeClassLikeType ?: return PluginDataFrameSchema(emptyList())
296+
val classLike = arg.type as? ConeClassLikeType ?: return PluginDataFrameSchema.EMPTY
297297
val columns = convert(classLike, 0)
298298
PluginDataFrameSchema(columns)
299299
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -314,16 +314,16 @@ interface InterpretationErrorReporter {
314314

315315
fun KotlinTypeFacade.pluginDataFrameSchema(schemaTypeArg: ConeTypeProjection): PluginDataFrameSchema {
316316
val schema = if (schemaTypeArg.isStarProjection) {
317-
PluginDataFrameSchema(emptyList())
317+
PluginDataFrameSchema.EMPTY
318318
} else {
319-
val coneClassLikeType = schemaTypeArg.type as? ConeClassLikeType ?: return PluginDataFrameSchema(emptyList())
319+
val coneClassLikeType = schemaTypeArg.type as? ConeClassLikeType ?: return PluginDataFrameSchema.EMPTY
320320
pluginDataFrameSchema(coneClassLikeType)
321321
}
322322
return schema
323323
}
324324

325325
fun KotlinTypeFacade.pluginDataFrameSchema(coneClassLikeType: ConeClassLikeType): PluginDataFrameSchema {
326-
val symbol = coneClassLikeType.toSymbol(session) as? FirRegularClassSymbol ?: return PluginDataFrameSchema(emptyList())
326+
val symbol = coneClassLikeType.toSymbol(session) as? FirRegularClassSymbol ?: return PluginDataFrameSchema.EMPTY
327327
val declarationSymbols = if (symbol.isLocal && symbol.resolvedSuperTypes.firstOrNull() != session.builtinTypes.anyType.type) {
328328
val rootSchemaSymbol = symbol.resolvedSuperTypes.first().toSymbol(session) as? FirRegularClassSymbol
329329
rootSchemaSymbol?.declaredMemberScope(session, FirResolvePhase.DECLARATIONS)
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

+6
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)