Fix functional interface selection

This commit is contained in:
Tamas Vajk
2022-02-16 09:44:47 +01:00
committed by Ian Lynagh
parent 46bd6b096e
commit 3f2c275e5f
4 changed files with 41 additions and 48 deletions

View File

@@ -2584,6 +2584,14 @@ open class KotlinFileExtractor(
functionN(pluginContext)(functionNTypeArguments.size - 1).typeWith(functionNTypeArguments)
}
private fun getFunctionalInterfaceTypeWithTypeArgs(functionNTypeArguments: List<IrTypeArgument>) =
if (functionNTypeArguments.size > BuiltInFunctionArity.BIG_ARITY) {
pluginContext.referenceClass(FqName("kotlin.jvm.functions.FunctionN"))!!
.typeWithArguments(listOf(functionNTypeArguments.last()))
} else {
functionN(pluginContext)(functionNTypeArguments.size - 1).symbol.typeWithArguments(functionNTypeArguments)
}
private data class FunctionLabels(
val methodId: Label<DbMethod>,
val blockId: Label<DbBlock>,
@@ -2916,27 +2924,15 @@ open class KotlinFileExtractor(
return
}
val functionType = if (e.argument.type.isKFunction()) {
val st = e.argument.type as? IrSimpleType
if (st == null) {
logger.errorElement("Expected to find a simple type in SAM conversion.", e)
return
}
val typeArgs = mutableListOf<IrType>()
for (arg in st.arguments) {
if (arg !is IrTypeProjection) {
logger.errorElement("Expected to find only type projections in SAM conversion.", e)
return
}
typeArgs.add(arg.type)
}
getFunctionalInterfaceType(typeArgs)
} else {
e.argument.type
val st = e.argument.type as? IrSimpleType
if (st == null) {
logger.errorElement("Expected to find a simple type in SAM conversion.", e)
return
}
// Either Function1, ... Function22 or FunctionN type, but not Function23 or above.
val functionType = getFunctionalInterfaceTypeWithTypeArgs(st.arguments)
val invokeMethod = functionType.classOrNull?.owner?.declarations?.filterIsInstance<IrFunction>()?.find { it.name.asString() == "invoke"}
if (invokeMethod == null) {
logger.errorElement("Couldn't find `invoke` method on functional interface.", e)

View File

@@ -1,3 +0,0 @@
[VALUE_NOT_IN_TYPE] predicate callableBinding(@caller callerid, @callable callee): Value 4373 of field callee is not in type @callable. Appears in tuple (4372,4373)
Relevant element: callee=4373
Full ID for 4373: @"callable;(4112).invoke((18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18),(18))(186)". The ID may expand to @"callable;{@"class;kotlin.jvm.functions.FunctionN;{@"class;java.lang.Boolean"}"}.invoke({@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"},{@"class;java.lang.Integer"}){@"class;java.lang.Boolean"}"

View File

@@ -1,28 +1,3 @@
samConversion.kt:
# 43| [VarAccess] <fn>
# 43| [VarAccess] i0
# 43| [VarAccess] i1
# 43| [VarAccess] i2
# 43| [VarAccess] i3
# 43| [VarAccess] i4
# 43| [VarAccess] i5
# 43| [VarAccess] i6
# 43| [VarAccess] i7
# 43| [VarAccess] i8
# 43| [VarAccess] i9
# 43| [VarAccess] i10
# 43| [VarAccess] i11
# 43| [VarAccess] i12
# 43| [VarAccess] i13
# 43| [VarAccess] i14
# 43| [VarAccess] i15
# 43| [VarAccess] i16
# 43| [VarAccess] i17
# 43| [VarAccess] i18
# 43| [VarAccess] i19
# 43| [VarAccess] i20
# 43| [VarAccess] i21
# 43| [VarAccess] i22
exprs.kt:
# 0| [CompilationUnit] exprs
# 0| 1: [Class] ExprsKt
@@ -2746,6 +2721,31 @@ samConversion.kt:
# 33| 22: [Parameter] i22
# 43| 5: [BlockStmt] { ... }
# 43| 0: [ReturnStmt] return ...
# 43| 0: [MethodAccess] invoke(...)
# 43| -1: [VarAccess] <fn>
# 43| 0: [VarAccess] i0
# 43| 1: [VarAccess] i1
# 43| 2: [VarAccess] i2
# 43| 3: [VarAccess] i3
# 43| 4: [VarAccess] i4
# 43| 5: [VarAccess] i5
# 43| 6: [VarAccess] i6
# 43| 7: [VarAccess] i7
# 43| 8: [VarAccess] i8
# 43| 9: [VarAccess] i9
# 43| 10: [VarAccess] i10
# 43| 11: [VarAccess] i11
# 43| 12: [VarAccess] i12
# 43| 13: [VarAccess] i13
# 43| 14: [VarAccess] i14
# 43| 15: [VarAccess] i15
# 43| 16: [VarAccess] i16
# 43| 17: [VarAccess] i17
# 43| 18: [VarAccess] i18
# 43| 19: [VarAccess] i19
# 43| 20: [VarAccess] i20
# 43| 21: [VarAccess] i21
# 43| 22: [VarAccess] i22
# 43| 2: [Constructor]
#-----| 4: (Parameters)
# 43| 0: [Parameter] <fn>

View File

@@ -1580,7 +1580,6 @@
| samConversion.kt:42:31:42:31 | a | samConversion.kt:40:1:46:1 | fn | VarAccess |
| samConversion.kt:43:5:45:43 | c | samConversion.kt:40:1:46:1 | fn | LocalVariableDeclExpr |
| samConversion.kt:43:13:45:43 | (...)... | samConversion.kt:40:1:46:1 | fn | CastExpr |
| samConversion.kt:43:13:45:43 | (no string representation) | samConversion.kt:31:5:33:53 | accept | MethodAccess |
| samConversion.kt:43:13:45:43 | ...=... | samConversion.kt:43:13:45:43 | | AssignExpr |
| samConversion.kt:43:13:45:43 | <fn> | samConversion.kt:31:5:33:53 | accept | VarAccess |
| samConversion.kt:43:13:45:43 | <fn> | samConversion.kt:43:13:45:43 | | VarAccess |
@@ -1610,6 +1609,7 @@
| samConversion.kt:43:13:45:43 | i20 | samConversion.kt:31:5:33:53 | accept | VarAccess |
| samConversion.kt:43:13:45:43 | i21 | samConversion.kt:31:5:33:53 | accept | VarAccess |
| samConversion.kt:43:13:45:43 | i22 | samConversion.kt:31:5:33:53 | accept | VarAccess |
| samConversion.kt:43:13:45:43 | invoke(...) | samConversion.kt:31:5:33:53 | accept | MethodAccess |
| samConversion.kt:43:13:45:43 | new (...) | samConversion.kt:40:1:46:1 | fn | ClassInstanceExpr |
| samConversion.kt:43:13:45:43 | this | samConversion.kt:43:13:45:43 | | ThisAccess |
| samConversion.kt:43:13:45:43 | this.<fn> | samConversion.kt:43:13:45:43 | | VarAccess |