mirror of
https://github.com/github/codeql.git
synced 2026-04-30 11:15:13 +02:00
Fix functional interface selection
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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"}"
|
||||
@@ -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>
|
||||
|
||||
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user