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

Skip to content

Commit 3f2c275

Browse files
tamasvajkigfoo
authored andcommitted
Fix functional interface selection
1 parent 46bd6b0 commit 3f2c275

4 files changed

Lines changed: 41 additions & 48 deletions

File tree

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

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2584,6 +2584,14 @@ open class KotlinFileExtractor(
25842584
functionN(pluginContext)(functionNTypeArguments.size - 1).typeWith(functionNTypeArguments)
25852585
}
25862586

2587+
private fun getFunctionalInterfaceTypeWithTypeArgs(functionNTypeArguments: List<IrTypeArgument>) =
2588+
if (functionNTypeArguments.size > BuiltInFunctionArity.BIG_ARITY) {
2589+
pluginContext.referenceClass(FqName("kotlin.jvm.functions.FunctionN"))!!
2590+
.typeWithArguments(listOf(functionNTypeArguments.last()))
2591+
} else {
2592+
functionN(pluginContext)(functionNTypeArguments.size - 1).symbol.typeWithArguments(functionNTypeArguments)
2593+
}
2594+
25872595
private data class FunctionLabels(
25882596
val methodId: Label<DbMethod>,
25892597
val blockId: Label<DbBlock>,
@@ -2916,27 +2924,15 @@ open class KotlinFileExtractor(
29162924
return
29172925
}
29182926

2919-
val functionType = if (e.argument.type.isKFunction()) {
2920-
val st = e.argument.type as? IrSimpleType
2921-
if (st == null) {
2922-
logger.errorElement("Expected to find a simple type in SAM conversion.", e)
2923-
return
2924-
}
2925-
2926-
val typeArgs = mutableListOf<IrType>()
2927-
for (arg in st.arguments) {
2928-
if (arg !is IrTypeProjection) {
2929-
logger.errorElement("Expected to find only type projections in SAM conversion.", e)
2930-
return
2931-
}
2932-
typeArgs.add(arg.type)
2933-
}
2934-
2935-
getFunctionalInterfaceType(typeArgs)
2936-
} else {
2937-
e.argument.type
2927+
val st = e.argument.type as? IrSimpleType
2928+
if (st == null) {
2929+
logger.errorElement("Expected to find a simple type in SAM conversion.", e)
2930+
return
29382931
}
29392932

2933+
// Either Function1, ... Function22 or FunctionN type, but not Function23 or above.
2934+
val functionType = getFunctionalInterfaceTypeWithTypeArgs(st.arguments)
2935+
29402936
val invokeMethod = functionType.classOrNull?.owner?.declarations?.filterIsInstance<IrFunction>()?.find { it.name.asString() == "invoke"}
29412937
if (invokeMethod == null) {
29422938
logger.errorElement("Couldn't find `invoke` method on functional interface.", e)

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

Lines changed: 0 additions & 3 deletions
This file was deleted.

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

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,3 @@
1-
samConversion.kt:
2-
# 43| [VarAccess] <fn>
3-
# 43| [VarAccess] i0
4-
# 43| [VarAccess] i1
5-
# 43| [VarAccess] i2
6-
# 43| [VarAccess] i3
7-
# 43| [VarAccess] i4
8-
# 43| [VarAccess] i5
9-
# 43| [VarAccess] i6
10-
# 43| [VarAccess] i7
11-
# 43| [VarAccess] i8
12-
# 43| [VarAccess] i9
13-
# 43| [VarAccess] i10
14-
# 43| [VarAccess] i11
15-
# 43| [VarAccess] i12
16-
# 43| [VarAccess] i13
17-
# 43| [VarAccess] i14
18-
# 43| [VarAccess] i15
19-
# 43| [VarAccess] i16
20-
# 43| [VarAccess] i17
21-
# 43| [VarAccess] i18
22-
# 43| [VarAccess] i19
23-
# 43| [VarAccess] i20
24-
# 43| [VarAccess] i21
25-
# 43| [VarAccess] i22
261
exprs.kt:
272
# 0| [CompilationUnit] exprs
283
# 0| 1: [Class] ExprsKt
@@ -2746,6 +2721,31 @@ samConversion.kt:
27462721
# 33| 22: [Parameter] i22
27472722
# 43| 5: [BlockStmt] { ... }
27482723
# 43| 0: [ReturnStmt] return ...
2724+
# 43| 0: [MethodAccess] invoke(...)
2725+
# 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
27492749
# 43| 2: [Constructor]
27502750
#-----| 4: (Parameters)
27512751
# 43| 0: [Parameter] <fn>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1580,7 +1580,6 @@
15801580
| samConversion.kt:42:31:42:31 | a | samConversion.kt:40:1:46:1 | fn | VarAccess |
15811581
| samConversion.kt:43:5:45:43 | c | samConversion.kt:40:1:46:1 | fn | LocalVariableDeclExpr |
15821582
| samConversion.kt:43:13:45:43 | (...)... | samConversion.kt:40:1:46:1 | fn | CastExpr |
1583-
| samConversion.kt:43:13:45:43 | (no string representation) | samConversion.kt:31:5:33:53 | accept | MethodAccess |
15841583
| samConversion.kt:43:13:45:43 | ...=... | samConversion.kt:43:13:45:43 | | AssignExpr |
15851584
| samConversion.kt:43:13:45:43 | <fn> | samConversion.kt:31:5:33:53 | accept | VarAccess |
15861585
| samConversion.kt:43:13:45:43 | <fn> | samConversion.kt:43:13:45:43 | | VarAccess |
@@ -1610,6 +1609,7 @@
16101609
| samConversion.kt:43:13:45:43 | i20 | samConversion.kt:31:5:33:53 | accept | VarAccess |
16111610
| samConversion.kt:43:13:45:43 | i21 | samConversion.kt:31:5:33:53 | accept | VarAccess |
16121611
| samConversion.kt:43:13:45:43 | i22 | samConversion.kt:31:5:33:53 | accept | VarAccess |
1612+
| samConversion.kt:43:13:45:43 | invoke(...) | samConversion.kt:31:5:33:53 | accept | MethodAccess |
16131613
| samConversion.kt:43:13:45:43 | new (...) | samConversion.kt:40:1:46:1 | fn | ClassInstanceExpr |
16141614
| samConversion.kt:43:13:45:43 | this | samConversion.kt:43:13:45:43 | | ThisAccess |
16151615
| samConversion.kt:43:13:45:43 | this.<fn> | samConversion.kt:43:13:45:43 | | VarAccess |

0 commit comments

Comments
 (0)