@@ -1600,11 +1600,13 @@ open class KotlinFileExtractor(
16001600 return result
16011601 }
16021602
1603- private fun findTopLevelFunctionOrWarn (functionFilter : String , type : String , warnAgainstElement : IrElement ): IrFunction ? {
1603+ private fun findTopLevelFunctionOrWarn (functionFilter : String , type : String , parameterTypes : Array < String >, warnAgainstElement : IrElement ): IrFunction ? {
16041604
16051605 val fn = pluginContext.referenceFunctions(FqName (functionFilter))
1606- .firstOrNull { it.owner.parentClassOrNull?.fqNameWhenAvailable?.asString() == type }
1607- ?.owner
1606+ .firstOrNull { fnSymbol ->
1607+ fnSymbol.owner.parentClassOrNull?.fqNameWhenAvailable?.asString() == type &&
1608+ fnSymbol.owner.valueParameters.map { it.type.classFqName?.asString() }.toTypedArray() contentEquals parameterTypes
1609+ }?.owner
16081610
16091611 if (fn != null ) {
16101612 if (fn.parentClassOrNull != null ) {
@@ -1754,6 +1756,12 @@ open class KotlinFileExtractor(
17541756 else -> false
17551757 }
17561758
1759+ private fun isGenericArrayType (typeName : String ) =
1760+ when (typeName) {
1761+ " Array" -> true
1762+ else -> false
1763+ }
1764+
17571765 private fun extractCall (c : IrCall , callable : Label <out DbCallable >, stmtExprParent : StmtExprParent ) {
17581766 with (" call" , c) {
17591767 val target = tryReplaceSyntheticFunction(c.symbol.owner)
@@ -2175,8 +2183,20 @@ open class KotlinFileExtractor(
21752183 extractRawMethodAccess(getter, c, callable, parent, idx, enclosingStmt, listOf (), null , ext, typeArguments)
21762184 }
21772185 }
2178- isFunction(target, " kotlin" , " (some array type)" , { isArrayType(it) }, " iterator" ) && c.origin == IrStatementOrigin .FOR_LOOP_ITERATOR -> {
2179- findTopLevelFunctionOrWarn(" kotlin.jvm.internal.iterator" , " kotlin.jvm.internal.ArrayIteratorKt" , c)?.let { iteratorFn ->
2186+ isFunction(target, " kotlin" , " (some array type)" , { isArrayType(it) }, " iterator" ) -> {
2187+ val parentClass = target.parent
2188+ if (parentClass !is IrClass ) {
2189+ logger.errorElement(" Iterator parent is not a class" , c)
2190+ return
2191+ }
2192+
2193+ var typeFilter = if (isGenericArrayType(parentClass.name.asString())) {
2194+ " kotlin.jvm.internal.ArrayIteratorKt"
2195+ } else {
2196+ " kotlin.jvm.internal.ArrayIteratorsKt"
2197+ }
2198+
2199+ findTopLevelFunctionOrWarn(" kotlin.jvm.internal.iterator" , typeFilter, arrayOf(parentClass.kotlinFqName.asString()), c)?.let { iteratorFn ->
21802200 val dispatchReceiver = c.dispatchReceiver
21812201 if (dispatchReceiver == null ) {
21822202 logger.errorElement(" No dispatch receiver found for array iterator call" , c)
0 commit comments