Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6154c2b

Browse files
tamasvajkigfoo
authored andcommitted
Change arguments of big arity invoke call
1 parent 3f2c275 commit 6154c2b

3 files changed

Lines changed: 113 additions & 65 deletions

File tree

java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2989,9 +2989,8 @@ open class KotlinFileExtractor(
29892989
tw.writeStmts_returnstmt(returnId, blockId, 0, functionId)
29902990
tw.writeHasLocation(returnId, locId)
29912991

2992-
//extractExpressionExpr(b.expression, callable, returnId, 0, returnId)
29932992
//<fn>.invoke(vp0, cp1, vp2, vp3, ...) or
2994-
//<fn>.invoke(new Object[x]{vp0, vp1, vp2, ...}) // TODO: handle big arity functions. We'd need an arraycreationexpr with an initializer
2993+
//<fn>.invoke(new Object[x]{vp0, vp1, vp2, ...})
29952994

29962995
fun extractCommonExpr(id: Label<out DbExpr>) {
29972996
tw.writeHasLocation(id, locId)
@@ -3005,7 +3004,7 @@ open class KotlinFileExtractor(
30053004
tw.writeExprs_methodaccess(callId, callType.javaResult.id, returnId, 0)
30063005
tw.writeExprsKotlinType(callId, callType.kotlinResult.id)
30073006
extractCommonExpr(callId)
3008-
val calledMethodId = useFunction<DbMethod>(invokeMethod, (functionType as IrSimpleType).arguments)
3007+
val calledMethodId = useFunction<DbMethod>(invokeMethod, functionType.arguments)
30093008
tw.writeCallableBinding(callId, calledMethodId)
30103009

30113010
// <fn> access
@@ -3016,22 +3015,55 @@ open class KotlinFileExtractor(
30163015
extractCommonExpr(lhsId)
30173016
tw.writeVariableBinding(lhsId, fieldId)
30183017

3019-
fun extractArgument(p: IrValueParameter, idx: Int) {
3018+
val parameters = mutableListOf<IrValueParameter>()
3019+
val extParam = samMember.extensionReceiverParameter
3020+
if (extParam != null) {
3021+
parameters.add(extParam)
3022+
}
3023+
parameters.addAll(samMember.valueParameters)
3024+
3025+
fun extractArgument(p: IrValueParameter, idx: Int, parent: Label<out DbExprparent>) {
30203026
val argsAccessId = tw.getFreshIdLabel<DbVaraccess>()
30213027
val paramType = useType(p.type)
3022-
tw.writeExprs_varaccess(argsAccessId, paramType.javaResult.id, callId, idx)
3028+
tw.writeExprs_varaccess(argsAccessId, paramType.javaResult.id, parent, idx)
30233029
tw.writeExprsKotlinType(argsAccessId, paramType.kotlinResult.id)
30243030
extractCommonExpr(argsAccessId)
30253031
tw.writeVariableBinding(argsAccessId, useValueParameter(p, functionId))
30263032
}
30273033

3028-
var idx = 0
3029-
val extParam = samMember.extensionReceiverParameter
3030-
if (extParam != null) {
3031-
extractArgument(extParam, idx++)
3032-
}
3033-
for (vp in samMember.valueParameters) {
3034-
extractArgument(vp, idx++)
3034+
if (st.arguments.size > BuiltInFunctionArity.BIG_ARITY) {
3035+
//<fn>.invoke(new Object[x]{vp0, vp1, vp2, ...})
3036+
val arrayCreationId = tw.getFreshIdLabel<DbArraycreationexpr>()
3037+
val arrayType = pluginContext.irBuiltIns.arrayClass.typeWith(pluginContext.irBuiltIns.anyNType)
3038+
val at = useType(arrayType)
3039+
tw.writeExprs_arraycreationexpr(arrayCreationId, at.javaResult.id, callId, 0)
3040+
tw.writeExprsKotlinType(arrayCreationId, at.kotlinResult.id)
3041+
extractCommonExpr(arrayCreationId)
3042+
3043+
extractTypeAccess(pluginContext.irBuiltIns.anyNType, functionId, arrayCreationId, -1, e, returnId)
3044+
3045+
val initId = tw.getFreshIdLabel<DbArrayinit>()
3046+
tw.writeExprs_arrayinit(initId, at.javaResult.id, arrayCreationId, -2)
3047+
tw.writeExprsKotlinType(initId, at.kotlinResult.id)
3048+
extractCommonExpr(initId)
3049+
3050+
for ((idx, vp) in parameters.withIndex()) {
3051+
extractArgument(vp, idx, initId)
3052+
}
3053+
3054+
val dim = parameters.size.toString()
3055+
val dimId = tw.getFreshIdLabel<DbIntegerliteral>()
3056+
val dimType = useType(pluginContext.irBuiltIns.intType)
3057+
tw.writeExprs_integerliteral(dimId, dimType.javaResult.id, arrayCreationId, 0)
3058+
tw.writeExprsKotlinType(dimId, dimType.kotlinResult.id)
3059+
extractCommonExpr(dimId)
3060+
tw.writeNamestrings(dim, dim, dimId)
3061+
3062+
} else {
3063+
//<fn>.invoke(vp0, cp1, vp2, vp3, ...) or
3064+
for ((idx, vp) in parameters.withIndex()) {
3065+
extractArgument(vp, idx, callId)
3066+
}
30353067
}
30363068

30373069
val id = tw.getFreshIdLabel<DbCastexpr>()

java/ql/test/kotlin/library-tests/exprs/PrintAst.expected

Lines changed: 61 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2213,7 +2213,7 @@ samConversion.kt:
22132213
# 1| 5: [BlockStmt] { ... }
22142214
# 2| 0: [LocalVariableDeclStmt] var ...;
22152215
# 2| 1: [LocalVariableDeclExpr] isEven
2216-
# 2| 1: [CastExpr] (...)...
2216+
# 2| 0: [CastExpr] (...)...
22172217
# 2| 0: [TypeAccess] IntPredicate
22182218
# 2| 1: [ClassInstanceExpr] new (...)
22192219
# 2| -4: [AnonymousClass] new IntPredicate(...) { ... }
@@ -2256,7 +2256,7 @@ samConversion.kt:
22562256
# 2| -3: [TypeAccess] Function1<Integer,Boolean>
22572257
# 4| 1: [LocalVariableDeclStmt] var ...;
22582258
# 4| 1: [LocalVariableDeclExpr] i0
2259-
# 4| 2: [CastExpr] (...)...
2259+
# 4| 0: [CastExpr] (...)...
22602260
# 4| 0: [TypeAccess] InterfaceFn1
22612261
# 4| 1: [ClassInstanceExpr] new (...)
22622262
# 4| -4: [AnonymousClass] new InterfaceFn1(...) { ... }
@@ -2298,7 +2298,7 @@ samConversion.kt:
22982298
# 4| -3: [TypeAccess] Function2<Integer,Integer,Unit>
22992299
# 5| 2: [LocalVariableDeclStmt] var ...;
23002300
# 5| 1: [LocalVariableDeclExpr] i1
2301-
# 5| 2: [CastExpr] (...)...
2301+
# 5| 0: [CastExpr] (...)...
23022302
# 5| 0: [TypeAccess] InterfaceFn1
23032303
# 5| 1: [ClassInstanceExpr] new (...)
23042304
# 5| -4: [AnonymousClass] new InterfaceFn1(...) { ... }
@@ -2342,7 +2342,7 @@ samConversion.kt:
23422342
# 5| -3: [TypeAccess] Function2<Integer,Integer,Unit>
23432343
# 7| 3: [LocalVariableDeclStmt] var ...;
23442344
# 7| 1: [LocalVariableDeclExpr] i
2345-
# 7| 2: [CastExpr] (...)...
2345+
# 7| 0: [CastExpr] (...)...
23462346
# 7| 0: [TypeAccess] InterfaceFnExt1
23472347
# 7| 1: [ClassInstanceExpr] new (...)
23482348
# 7| -4: [AnonymousClass] new InterfaceFnExt1(...) { ... }
@@ -2386,7 +2386,7 @@ samConversion.kt:
23862386
# 7| -3: [TypeAccess] Function2<String,Integer,Boolean>
23872387
# 9| 4: [LocalVariableDeclStmt] var ...;
23882388
# 9| 1: [LocalVariableDeclExpr] x
2389-
# 9| 1: [CastExpr] (...)...
2389+
# 9| 0: [CastExpr] (...)...
23902390
# 9| 0: [TypeAccess] IntPredicate
23912391
# 9| 1: [ClassInstanceExpr] new (...)
23922392
# 9| -4: [AnonymousClass] new IntPredicate(...) { ... }
@@ -2618,7 +2618,7 @@ samConversion.kt:
26182618
# 41| -3: [TypeAccess] FunctionN<Boolean>
26192619
# 42| 1: [LocalVariableDeclStmt] var ...;
26202620
# 42| 1: [LocalVariableDeclExpr] b
2621-
# 42| 23: [CastExpr] (...)...
2621+
# 42| 0: [CastExpr] (...)...
26222622
# 42| 0: [TypeAccess] BigArityPredicate
26232623
# 42| 1: [ClassInstanceExpr] new (...)
26242624
# 42| -4: [AnonymousClass] new BigArityPredicate(...) { ... }
@@ -2651,29 +2651,33 @@ samConversion.kt:
26512651
# 42| 0: [ReturnStmt] return ...
26522652
# 42| 0: [MethodAccess] invoke(...)
26532653
# 42| -1: [VarAccess] <fn>
2654-
# 42| 0: [VarAccess] i0
2655-
# 42| 1: [VarAccess] i1
2656-
# 42| 2: [VarAccess] i2
2657-
# 42| 3: [VarAccess] i3
2658-
# 42| 4: [VarAccess] i4
2659-
# 42| 5: [VarAccess] i5
2660-
# 42| 6: [VarAccess] i6
2661-
# 42| 7: [VarAccess] i7
2662-
# 42| 8: [VarAccess] i8
2663-
# 42| 9: [VarAccess] i9
2664-
# 42| 10: [VarAccess] i10
2665-
# 42| 11: [VarAccess] i11
2666-
# 42| 12: [VarAccess] i12
2667-
# 42| 13: [VarAccess] i13
2668-
# 42| 14: [VarAccess] i14
2669-
# 42| 15: [VarAccess] i15
2670-
# 42| 16: [VarAccess] i16
2671-
# 42| 17: [VarAccess] i17
2672-
# 42| 18: [VarAccess] i18
2673-
# 42| 19: [VarAccess] i19
2674-
# 42| 20: [VarAccess] i20
2675-
# 42| 21: [VarAccess] i21
2676-
# 42| 22: [VarAccess] i22
2654+
# 42| 0: [ArrayCreationExpr] new Object[]
2655+
# 42| -2: [ArrayInit] {...}
2656+
# 42| 0: [VarAccess] i0
2657+
# 42| 1: [VarAccess] i1
2658+
# 42| 2: [VarAccess] i2
2659+
# 42| 3: [VarAccess] i3
2660+
# 42| 4: [VarAccess] i4
2661+
# 42| 5: [VarAccess] i5
2662+
# 42| 6: [VarAccess] i6
2663+
# 42| 7: [VarAccess] i7
2664+
# 42| 8: [VarAccess] i8
2665+
# 42| 9: [VarAccess] i9
2666+
# 42| 10: [VarAccess] i10
2667+
# 42| 11: [VarAccess] i11
2668+
# 42| 12: [VarAccess] i12
2669+
# 42| 13: [VarAccess] i13
2670+
# 42| 14: [VarAccess] i14
2671+
# 42| 15: [VarAccess] i15
2672+
# 42| 16: [VarAccess] i16
2673+
# 42| 17: [VarAccess] i17
2674+
# 42| 18: [VarAccess] i18
2675+
# 42| 19: [VarAccess] i19
2676+
# 42| 20: [VarAccess] i20
2677+
# 42| 21: [VarAccess] i21
2678+
# 42| 22: [VarAccess] i22
2679+
# 42| -1: [TypeAccess] Object
2680+
# 42| 0: [IntegerLiteral] 23
26772681
# 42| 2: [Constructor]
26782682
#-----| 4: (Parameters)
26792683
# 42| 0: [Parameter] <fn>
@@ -2690,7 +2694,7 @@ samConversion.kt:
26902694
# 42| 0: [VarAccess] a
26912695
# 43| 2: [LocalVariableDeclStmt] var ...;
26922696
# 43| 1: [LocalVariableDeclExpr] c
2693-
# 43| 23: [CastExpr] (...)...
2697+
# 43| 0: [CastExpr] (...)...
26942698
# 43| 0: [TypeAccess] BigArityPredicate
26952699
# 43| 1: [ClassInstanceExpr] new (...)
26962700
# 43| -4: [AnonymousClass] new BigArityPredicate(...) { ... }
@@ -2723,29 +2727,33 @@ samConversion.kt:
27232727
# 43| 0: [ReturnStmt] return ...
27242728
# 43| 0: [MethodAccess] invoke(...)
27252729
# 43| -1: [VarAccess] <fn>
2726-
# 43| 0: [VarAccess] i0
2727-
# 43| 1: [VarAccess] i1
2728-
# 43| 2: [VarAccess] i2
2729-
# 43| 3: [VarAccess] i3
2730-
# 43| 4: [VarAccess] i4
2731-
# 43| 5: [VarAccess] i5
2732-
# 43| 6: [VarAccess] i6
2733-
# 43| 7: [VarAccess] i7
2734-
# 43| 8: [VarAccess] i8
2735-
# 43| 9: [VarAccess] i9
2736-
# 43| 10: [VarAccess] i10
2737-
# 43| 11: [VarAccess] i11
2738-
# 43| 12: [VarAccess] i12
2739-
# 43| 13: [VarAccess] i13
2740-
# 43| 14: [VarAccess] i14
2741-
# 43| 15: [VarAccess] i15
2742-
# 43| 16: [VarAccess] i16
2743-
# 43| 17: [VarAccess] i17
2744-
# 43| 18: [VarAccess] i18
2745-
# 43| 19: [VarAccess] i19
2746-
# 43| 20: [VarAccess] i20
2747-
# 43| 21: [VarAccess] i21
2748-
# 43| 22: [VarAccess] i22
2730+
# 43| 0: [ArrayCreationExpr] new Object[]
2731+
# 43| -2: [ArrayInit] {...}
2732+
# 43| 0: [VarAccess] i0
2733+
# 43| 1: [VarAccess] i1
2734+
# 43| 2: [VarAccess] i2
2735+
# 43| 3: [VarAccess] i3
2736+
# 43| 4: [VarAccess] i4
2737+
# 43| 5: [VarAccess] i5
2738+
# 43| 6: [VarAccess] i6
2739+
# 43| 7: [VarAccess] i7
2740+
# 43| 8: [VarAccess] i8
2741+
# 43| 9: [VarAccess] i9
2742+
# 43| 10: [VarAccess] i10
2743+
# 43| 11: [VarAccess] i11
2744+
# 43| 12: [VarAccess] i12
2745+
# 43| 13: [VarAccess] i13
2746+
# 43| 14: [VarAccess] i14
2747+
# 43| 15: [VarAccess] i15
2748+
# 43| 16: [VarAccess] i16
2749+
# 43| 17: [VarAccess] i17
2750+
# 43| 18: [VarAccess] i18
2751+
# 43| 19: [VarAccess] i19
2752+
# 43| 20: [VarAccess] i20
2753+
# 43| 21: [VarAccess] i21
2754+
# 43| 22: [VarAccess] i22
2755+
# 43| -1: [TypeAccess] Object
2756+
# 43| 0: [IntegerLiteral] 23
27492757
# 43| 2: [Constructor]
27502758
#-----| 4: (Parameters)
27512759
# 43| 0: [Parameter] <fn>

java/ql/test/kotlin/library-tests/exprs/exprs.expected

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,13 +1543,15 @@
15431543
| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess |
15441544
| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess |
15451545
| samConversion.kt:42:5:42:32 | b | samConversion.kt:40:1:46:1 | fn | LocalVariableDeclExpr |
1546+
| samConversion.kt:42:13:42:32 | 23 | samConversion.kt:31:5:33:53 | accept | IntegerLiteral |
15461547
| samConversion.kt:42:13:42:32 | (...)... | samConversion.kt:40:1:46:1 | fn | CastExpr |
15471548
| samConversion.kt:42:13:42:32 | ...=... | samConversion.kt:42:13:42:32 | | AssignExpr |
15481549
| samConversion.kt:42:13:42:32 | <fn> | samConversion.kt:31:5:33:53 | accept | VarAccess |
15491550
| samConversion.kt:42:13:42:32 | <fn> | samConversion.kt:42:13:42:32 | | VarAccess |
15501551
| samConversion.kt:42:13:42:32 | BigArityPredicate | samConversion.kt:40:1:46:1 | fn | TypeAccess |
15511552
| samConversion.kt:42:13:42:32 | BigArityPredicate | samConversion.kt:40:1:46:1 | fn | TypeAccess |
15521553
| samConversion.kt:42:13:42:32 | FunctionN<Boolean> | file://:0:0:0:0 | <none> | TypeAccess |
1554+
| samConversion.kt:42:13:42:32 | Object | samConversion.kt:31:5:33:53 | accept | TypeAccess |
15531555
| samConversion.kt:42:13:42:32 | i0 | samConversion.kt:31:5:33:53 | accept | VarAccess |
15541556
| samConversion.kt:42:13:42:32 | i1 | samConversion.kt:31:5:33:53 | accept | VarAccess |
15551557
| samConversion.kt:42:13:42:32 | i2 | samConversion.kt:31:5:33:53 | accept | VarAccess |
@@ -1575,17 +1577,21 @@
15751577
| samConversion.kt:42:13:42:32 | i22 | samConversion.kt:31:5:33:53 | accept | VarAccess |
15761578
| samConversion.kt:42:13:42:32 | invoke(...) | samConversion.kt:31:5:33:53 | accept | MethodAccess |
15771579
| samConversion.kt:42:13:42:32 | new (...) | samConversion.kt:40:1:46:1 | fn | ClassInstanceExpr |
1580+
| samConversion.kt:42:13:42:32 | new Object[] | samConversion.kt:31:5:33:53 | accept | ArrayCreationExpr |
15781581
| samConversion.kt:42:13:42:32 | this | samConversion.kt:42:13:42:32 | | ThisAccess |
15791582
| samConversion.kt:42:13:42:32 | this.<fn> | samConversion.kt:42:13:42:32 | | VarAccess |
1583+
| samConversion.kt:42:13:42:32 | {...} | samConversion.kt:31:5:33:53 | accept | ArrayInit |
15801584
| samConversion.kt:42:31:42:31 | a | samConversion.kt:40:1:46:1 | fn | VarAccess |
15811585
| samConversion.kt:43:5:45:43 | c | samConversion.kt:40:1:46:1 | fn | LocalVariableDeclExpr |
1586+
| samConversion.kt:43:13:45:43 | 23 | samConversion.kt:31:5:33:53 | accept | IntegerLiteral |
15821587
| samConversion.kt:43:13:45:43 | (...)... | samConversion.kt:40:1:46:1 | fn | CastExpr |
15831588
| samConversion.kt:43:13:45:43 | ...=... | samConversion.kt:43:13:45:43 | | AssignExpr |
15841589
| samConversion.kt:43:13:45:43 | <fn> | samConversion.kt:31:5:33:53 | accept | VarAccess |
15851590
| samConversion.kt:43:13:45:43 | <fn> | samConversion.kt:43:13:45:43 | | VarAccess |
15861591
| samConversion.kt:43:13:45:43 | BigArityPredicate | samConversion.kt:40:1:46:1 | fn | TypeAccess |
15871592
| samConversion.kt:43:13:45:43 | BigArityPredicate | samConversion.kt:40:1:46:1 | fn | TypeAccess |
15881593
| samConversion.kt:43:13:45:43 | FunctionN<Boolean> | file://:0:0:0:0 | <none> | TypeAccess |
1594+
| samConversion.kt:43:13:45:43 | Object | samConversion.kt:31:5:33:53 | accept | TypeAccess |
15891595
| samConversion.kt:43:13:45:43 | i0 | samConversion.kt:31:5:33:53 | accept | VarAccess |
15901596
| samConversion.kt:43:13:45:43 | i1 | samConversion.kt:31:5:33:53 | accept | VarAccess |
15911597
| samConversion.kt:43:13:45:43 | i2 | samConversion.kt:31:5:33:53 | accept | VarAccess |
@@ -1611,8 +1617,10 @@
16111617
| samConversion.kt:43:13:45:43 | i22 | samConversion.kt:31:5:33:53 | accept | VarAccess |
16121618
| samConversion.kt:43:13:45:43 | invoke(...) | samConversion.kt:31:5:33:53 | accept | MethodAccess |
16131619
| samConversion.kt:43:13:45:43 | new (...) | samConversion.kt:40:1:46:1 | fn | ClassInstanceExpr |
1620+
| samConversion.kt:43:13:45:43 | new Object[] | samConversion.kt:31:5:33:53 | accept | ArrayCreationExpr |
16141621
| samConversion.kt:43:13:45:43 | this | samConversion.kt:43:13:45:43 | | ThisAccess |
16151622
| samConversion.kt:43:13:45:43 | this.<fn> | samConversion.kt:43:13:45:43 | | VarAccess |
1623+
| samConversion.kt:43:13:45:43 | {...} | samConversion.kt:31:5:33:53 | accept | ArrayInit |
16161624
| samConversion.kt:43:31:45:43 | 0 | samConversion.kt:43:31:45:43 | invoke | IntegerLiteral |
16171625
| samConversion.kt:43:31:45:43 | 1 | samConversion.kt:43:31:45:43 | invoke | IntegerLiteral |
16181626
| samConversion.kt:43:31:45:43 | 2 | samConversion.kt:43:31:45:43 | invoke | IntegerLiteral |

0 commit comments

Comments
 (0)