@@ -957,7 +957,7 @@ open class KotlinFileExtractor(
957957 val locId = getLocation(f, null )
958958 val extReceiver = f.extensionReceiverParameter
959959 val dispatchReceiver = if (f.shouldExtractAsStatic) null else f.dispatchReceiverParameter
960- val parameterTypes = listOfNotNull(extReceiver?. let { erase(it.type) }) + getDefaultsMethodArgTypes(f)
960+ val parameterTypes = getDefaultsMethodArgTypes(f)
961961 val allParamTypeResults = parameterTypes.mapIndexed { i, paramType ->
962962 val paramId = tw.getLabelFor<DbParam >(getValueParameterLabel(id, i))
963963 extractValueParameter(paramId, paramType, " p$i " , locId, id, i, paramId, isVararg = false , syntheticParameterNames = true , isCrossinline = false , isNoinline = false ).also {
@@ -976,7 +976,8 @@ open class KotlinFileExtractor(
976976 extractMethod(methodId, locId, shortName, erase(f.returnType), paramsSignature, parentId, methodId, origin = null , extractTypeAccess = extractMethodAndParameterTypeAccesses)
977977 addModifiers(id, " static" )
978978 if (extReceiver != null ) {
979- val extendedType = allParamTypeResults[0 ] // TODO: this is not correct for member extension methods, where the dispatch receiver is the first parameter
979+ val idx = if (dispatchReceiver != null ) 1 else 0
980+ val extendedType = allParamTypeResults[idx]
980981 tw.writeKtExtensionFunctions(methodId, extendedType.javaResult.id, extendedType.kotlinResult.id)
981982 }
982983 }
@@ -1044,8 +1045,8 @@ open class KotlinFileExtractor(
10441045 val realFnIdxOffset = if (f.extensionReceiverParameter != null ) 1 else 0
10451046 val paramMappings = f.valueParameters.mapIndexed { idx, param -> Triple (param.type, idx + paramIdxOffset, idx + realFnIdxOffset) } +
10461047 listOfNotNull(
1047- dispatchReceiver?.let { Triple (it.type, realFnIdxOffset , - 1 ) },
1048- extReceiver?.let { Triple (it.type, 0 , 0 ) }
1048+ dispatchReceiver?.let { Triple (it.type, 0 , - 1 ) },
1049+ extReceiver?.let { Triple (it.type, if (dispatchReceiver != null ) 1 else 0 , 0 ) }
10491050 )
10501051 paramMappings.forEach { (type, fromIdx, toIdx) ->
10511052 extractVariableAccess(tw.getLabelFor<DbParam >(getValueParameterLabel(id, fromIdx)), type, locId, thisCallId, toIdx, id, returnId)
@@ -1188,6 +1189,7 @@ open class KotlinFileExtractor(
11881189 id
11891190
11901191 val extReceiver = f.extensionReceiverParameter
1192+ // The following parameter order is correct, because member $default methods (where the order would be [dispatchParam], [extensionParam], normalParams) are not extracted here
11911193 val fParameters = listOfNotNull(extReceiver) + (overriddenAttributes?.valueParameters ? : f.valueParameters)
11921194 val paramTypes = fParameters.mapIndexed { i, vp ->
11931195 extractValueParameter(vp, id, i, typeSubstitution, sourceDeclaration, classTypeArgsIncludingOuterClasses, extractTypeAccess = extractMethodAndParameterTypeAccesses, overriddenAttributes?.sourceLoc)
@@ -1797,11 +1799,12 @@ open class KotlinFileExtractor(
17971799 ) ? : pluginContext.irBuiltIns.anyType
17981800
17991801 private fun getDefaultsMethodArgTypes (f : IrFunction ) =
1800- // The $default method has type ([extensionReceiver ], [dispatchReceiver ], paramTypes..., int, Object)
1802+ // The $default method has type ([dispatchReceiver ], [extensionReceiver ], paramTypes..., int, Object)
18011803 // All parameter types are erased. The trailing int is a mask indicating which parameter values are real
18021804 // and which should be replaced by defaults. The final Object parameter is apparently always null.
18031805 (
18041806 listOfNotNull(if (f.shouldExtractAsStatic) null else f.dispatchReceiverParameter?.type) +
1807+ listOfNotNull(f.extensionReceiverParameter?.type) +
18051808 f.valueParameters.map { it.type } +
18061809 listOf (pluginContext.irBuiltIns.intType, getDefaultsMethodLastArgType(f))
18071810 ).map { erase(it) }
@@ -1820,17 +1823,16 @@ open class KotlinFileExtractor(
18201823
18211824 private fun getDefaultsMethodLabel (f : IrFunction ): Label <out DbCallable > {
18221825 val defaultsMethodName = if (f is IrConstructor ) " <init>" else getDefaultsMethodName(f)
1823- val normalArgTypes = getDefaultsMethodArgTypes(f)
1824- val extensionParamType = f.extensionReceiverParameter?.let { erase(it.type) }
1826+ val argTypes = getDefaultsMethodArgTypes(f)
18251827
18261828 val defaultMethodLabelStr = getFunctionLabel(
18271829 f.parent,
18281830 maybeParentId = null ,
18291831 defaultsMethodName,
1830- normalArgTypes ,
1832+ argTypes ,
18311833 erase(f.returnType),
1832- extensionParamType,
1833- listOf (),
1834+ extensionParamType = null , // if there's any, that's included already in argTypes
1835+ functionTypeParameters = listOf (),
18341836 classTypeArgsIncludingOuterClasses = null ,
18351837 overridesCollectionsMethod = false ,
18361838 javaSignature = null ,
@@ -1890,13 +1892,14 @@ open class KotlinFileExtractor(
18901892 extensionReceiver : IrExpression ?
18911893 ) {
18921894 var nextIdx = 0
1893- if (extensionReceiver != null ) {
1894- extractExpressionExpr(extensionReceiver, enclosingCallable, id, nextIdx++ , enclosingStmt)
1895- }
18961895 if (dispatchReceiver != null && ! callTarget.shouldExtractAsStatic) {
18971896 extractExpressionExpr(dispatchReceiver, enclosingCallable, id, nextIdx++ , enclosingStmt)
18981897 }
18991898
1899+ if (extensionReceiver != null ) {
1900+ extractExpressionExpr(extensionReceiver, enclosingCallable, id, nextIdx++ , enclosingStmt)
1901+ }
1902+
19001903 val valueArgsWithDummies = valueArguments.zip(callTarget.valueParameters).map {
19011904 (expr, param) -> expr ? : IrConstImpl .defaultValueForType(0 , 0 , param.type)
19021905 }
@@ -4050,8 +4053,7 @@ open class KotlinFileExtractor(
40504053 // Use of 'this' in a function where the dispatch receiver is passed like an ordinary parameter,
40514054 // such as a `$default` static function that substitutes in default arguments as needed.
40524055 val paramDeclarerId = overriddenAttributes.id ? : useDeclarationParent(thisParamParent, false )
4053- val extensionParamOffset = if (thisParamParent.extensionReceiverParameter != null ) 1 else 0
4054- val replacementParamId = tw.getLabelFor<DbParam >(getValueParameterLabel(paramDeclarerId, replaceWithParamIdx + extensionParamOffset))
4056+ val replacementParamId = tw.getLabelFor<DbParam >(getValueParameterLabel(paramDeclarerId, replaceWithParamIdx))
40554057 extractVariableAccess(replacementParamId, e.type, locId, exprParent.parent, exprParent.idx, callable, exprParent.enclosingStmt)
40564058 return
40574059 }
0 commit comments