Skip to content

Commit af99c1f

Browse files
committed
[Compiler plugin] Properly order nested schemas extracted from declarations
1 parent e49c0ac commit af99c1f

File tree

2 files changed

+32
-22
lines changed

2 files changed

+32
-22
lines changed

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

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -366,22 +366,30 @@ fun SessionContext.pluginDataFrameSchema(coneClassLikeType: ConeClassLikeType):
366366
.mapIndexed { i, symbol -> symbol to coneClassLikeType.typeArguments[i] }
367367
.toMap()
368368

369-
var propertySymbols = declarationSymbols.filterIsInstance<FirPropertySymbol>()
370-
val annotations = propertySymbols.mapNotNull {
369+
val propertySymbols = declarationSymbols
370+
.filterIsInstance<FirPropertySymbol>()
371+
.sortPropertiesByOrderAnnotation(sessionContext = this)
372+
373+
val columns = propertySymbols.mapNotNull { propertySymbol ->
374+
columnOf(propertySymbol, mapping)
375+
}
376+
377+
return PluginDataFrameSchema(columns)
378+
}
379+
380+
private fun List<FirPropertySymbol>.sortPropertiesByOrderAnnotation(sessionContext: SessionContext): List<FirPropertySymbol> {
381+
var result = this
382+
val annotations = result.mapNotNull {
371383
val orderArgument = it.getAnnotationByClassId(
372384
Names.ORDER_ANNOTATION,
373-
session
385+
sessionContext.session
374386
)?.argumentMapping?.mapping?.get(Names.ORDER_ARGUMENT)
375387
(orderArgument as? FirLiteralExpression)?.value as? Int
376388
}
377-
if (propertySymbols.size == annotations.size) {
378-
propertySymbols = propertySymbols.zip(annotations).sortedBy { it.second }.map { it.first }
379-
}
380-
val columns = propertySymbols.mapNotNull { propertySymbol ->
381-
columnOf(propertySymbol, mapping)
389+
if (result.size == annotations.size) {
390+
result = result.zip(annotations).sortedBy { it.second }.map { it.first }
382391
}
383-
384-
return PluginDataFrameSchema(columns)
392+
return result
385393
}
386394

387395
private fun KotlinTypeFacade.columnWithPathApproximations(result: FirPropertyAccessExpression): ColumnsResolver {
@@ -425,6 +433,7 @@ private fun SessionContext.columnOf(it: FirPropertySymbol, mapping: Map<FirTypeP
425433
?.declaredMemberScope(session, FirResolvePhase.DECLARATIONS)
426434
?.collectAllProperties()
427435
?.filterIsInstance<FirPropertySymbol>()
436+
?.sortPropertiesByOrderAnnotation(this)
428437
?.mapNotNull { columnOf(it, mapping) }
429438
?: emptyList()
430439

@@ -438,6 +447,7 @@ private fun SessionContext.columnOf(it: FirPropertySymbol, mapping: Map<FirTypeP
438447
?.declaredMemberScope(session, FirResolvePhase.DECLARATIONS)
439448
?.collectAllProperties()
440449
?.filterIsInstance<FirPropertySymbol>()
450+
?.sortPropertiesByOrderAnnotation(this)
441451
?.mapNotNull { columnOf(it, mapping) }
442452
?: emptyList()
443453
SimpleColumnGroup(name, nestedColumns)

plugins/kotlin-dataframe/testData/diagnostics/schemaInfo.fir.txt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -167,16 +167,16 @@ FILE: schemaInfo.kt
167167
}
168168

169169
local abstract class Participants_181 : R|kotlin/Any| {
170-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(0)) public abstract val city: R|kotlin/String|
170+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(3)) public abstract val city: R|kotlin/String|
171171
public get(): R|kotlin/String|
172172

173-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(1)) public abstract val firstName: R|kotlin/String|
173+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(0)) public abstract val firstName: R|kotlin/String|
174174
public get(): R|kotlin/String|
175175

176-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(2)) public abstract val lastName: R|kotlin/String|
176+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(1)) public abstract val lastName: R|kotlin/String|
177177
public get(): R|kotlin/String|
178178

179-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(3)) public abstract val age: R|kotlin/Int|
179+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(2)) public abstract val age: R|kotlin/Int|
180180
public get(): R|kotlin/Int|
181181

182182
public constructor(): R|<local>/Participants_181|
@@ -261,16 +261,16 @@ FILE: schemaInfo.kt
261261
}
262262

263263
local abstract class Participants_181 : R|kotlin/Any| {
264-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(0)) public abstract val city: R|kotlin/String|
264+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(3)) public abstract val city: R|kotlin/String|
265265
public get(): R|kotlin/String|
266266

267-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(1)) public abstract val firstName: R|kotlin/String|
267+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(0)) public abstract val firstName: R|kotlin/String|
268268
public get(): R|kotlin/String|
269269

270-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(2)) public abstract val lastName: R|kotlin/String|
270+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(1)) public abstract val lastName: R|kotlin/String|
271271
public get(): R|kotlin/String|
272272

273-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(3)) public abstract val age: R|kotlin/Int|
273+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(2)) public abstract val age: R|kotlin/Int|
274274
public get(): R|kotlin/Int|
275275

276276
public constructor(): R|<local>/Participants_181|
@@ -352,16 +352,16 @@ FILE: schemaInfo.kt
352352
}
353353

354354
local abstract class GroupParticipants_461 : R|kotlin/Any| {
355-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(0)) public abstract val city: R|kotlin/String|
355+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(3)) public abstract val city: R|kotlin/String|
356356
public get(): R|kotlin/String|
357357

358-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(1)) public abstract val firstName: R|kotlin/String|
358+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(0)) public abstract val firstName: R|kotlin/String|
359359
public get(): R|kotlin/String|
360360

361-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(2)) public abstract val lastName: R|kotlin/String|
361+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(1)) public abstract val lastName: R|kotlin/String|
362362
public get(): R|kotlin/String|
363363

364-
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(3)) public abstract val age: R|kotlin/Int|
364+
@R|org/jetbrains/kotlinx/dataframe/annotations/Order|(order = Int(2)) public abstract val age: R|kotlin/Int|
365365
public get(): R|kotlin/Int|
366366

367367
public constructor(): R|<local>/GroupParticipants_461|

0 commit comments

Comments
 (0)