@@ -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 {
@@ -975,6 +975,11 @@ open class KotlinFileExtractor(
975975 val methodId = id.cast<DbMethod >()
976976 extractMethod(methodId, locId, shortName, erase(f.returnType), paramsSignature, parentId, methodId, origin = null , extractTypeAccess = extractMethodAndParameterTypeAccesses)
977977 addModifiers(id, " static" )
978+ if (extReceiver != null ) {
979+ val idx = if (dispatchReceiver != null ) 1 else 0
980+ val extendedType = allParamTypeResults[idx]
981+ tw.writeKtExtensionFunctions(methodId, extendedType.javaResult.id, extendedType.kotlinResult.id)
982+ }
978983 }
979984 tw.writeHasLocation(id, locId)
980985 if (f.visibility != DescriptorVisibilities .PRIVATE && f.visibility != DescriptorVisibilities .PRIVATE_TO_THIS ) {
@@ -1040,8 +1045,8 @@ open class KotlinFileExtractor(
10401045 val realFnIdxOffset = if (f.extensionReceiverParameter != null ) 1 else 0
10411046 val paramMappings = f.valueParameters.mapIndexed { idx, param -> Triple (param.type, idx + paramIdxOffset, idx + realFnIdxOffset) } +
10421047 listOfNotNull(
1043- dispatchReceiver?.let { Triple (it.type, realFnIdxOffset , - 1 ) },
1044- 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 ) }
10451050 )
10461051 paramMappings.forEach { (type, fromIdx, toIdx) ->
10471052 extractVariableAccess(tw.getLabelFor<DbParam >(getValueParameterLabel(id, fromIdx)), type, locId, thisCallId, toIdx, id, returnId)
@@ -1184,6 +1189,7 @@ open class KotlinFileExtractor(
11841189 id
11851190
11861191 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
11871193 val fParameters = listOfNotNull(extReceiver) + (overriddenAttributes?.valueParameters ? : f.valueParameters)
11881194 val paramTypes = fParameters.mapIndexed { i, vp ->
11891195 extractValueParameter(vp, id, i, typeSubstitution, sourceDeclaration, classTypeArgsIncludingOuterClasses, extractTypeAccess = extractMethodAndParameterTypeAccesses, overriddenAttributes?.sourceLoc)
@@ -1793,11 +1799,12 @@ open class KotlinFileExtractor(
17931799 ) ? : pluginContext.irBuiltIns.anyType
17941800
17951801 private fun getDefaultsMethodArgTypes (f : IrFunction ) =
1796- // The $default method has type ([extensionReceiver ], [dispatchReceiver ], paramTypes..., int, Object)
1802+ // The $default method has type ([dispatchReceiver ], [extensionReceiver ], paramTypes..., int, Object)
17971803 // All parameter types are erased. The trailing int is a mask indicating which parameter values are real
17981804 // and which should be replaced by defaults. The final Object parameter is apparently always null.
17991805 (
18001806 listOfNotNull(if (f.shouldExtractAsStatic) null else f.dispatchReceiverParameter?.type) +
1807+ listOfNotNull(f.extensionReceiverParameter?.type) +
18011808 f.valueParameters.map { it.type } +
18021809 listOf (pluginContext.irBuiltIns.intType, getDefaultsMethodLastArgType(f))
18031810 ).map { erase(it) }
@@ -1816,17 +1823,16 @@ open class KotlinFileExtractor(
18161823
18171824 private fun getDefaultsMethodLabel (f : IrFunction ): Label <out DbCallable > {
18181825 val defaultsMethodName = if (f is IrConstructor ) " <init>" else getDefaultsMethodName(f)
1819- val normalArgTypes = getDefaultsMethodArgTypes(f)
1820- val extensionParamType = f.extensionReceiverParameter?.let { erase(it.type) }
1826+ val argTypes = getDefaultsMethodArgTypes(f)
18211827
18221828 val defaultMethodLabelStr = getFunctionLabel(
18231829 f.parent,
18241830 maybeParentId = null ,
18251831 defaultsMethodName,
1826- normalArgTypes ,
1832+ argTypes ,
18271833 erase(f.returnType),
1828- extensionParamType,
1829- listOf (),
1834+ extensionParamType = null , // if there's any, that's included already in argTypes
1835+ functionTypeParameters = listOf (),
18301836 classTypeArgsIncludingOuterClasses = null ,
18311837 overridesCollectionsMethod = false ,
18321838 javaSignature = null ,
@@ -1886,13 +1892,14 @@ open class KotlinFileExtractor(
18861892 extensionReceiver : IrExpression ?
18871893 ) {
18881894 var nextIdx = 0
1889- if (extensionReceiver != null ) {
1890- extractExpressionExpr(extensionReceiver, enclosingCallable, id, nextIdx++ , enclosingStmt)
1891- }
18921895 if (dispatchReceiver != null && ! callTarget.shouldExtractAsStatic) {
18931896 extractExpressionExpr(dispatchReceiver, enclosingCallable, id, nextIdx++ , enclosingStmt)
18941897 }
18951898
1899+ if (extensionReceiver != null ) {
1900+ extractExpressionExpr(extensionReceiver, enclosingCallable, id, nextIdx++ , enclosingStmt)
1901+ }
1902+
18961903 val valueArgsWithDummies = valueArguments.zip(callTarget.valueParameters).map {
18971904 (expr, param) -> expr ? : IrConstImpl .defaultValueForType(0 , 0 , param.type)
18981905 }
@@ -4046,8 +4053,7 @@ open class KotlinFileExtractor(
40464053 // Use of 'this' in a function where the dispatch receiver is passed like an ordinary parameter,
40474054 // such as a `$default` static function that substitutes in default arguments as needed.
40484055 val paramDeclarerId = overriddenAttributes.id ? : useDeclarationParent(thisParamParent, false )
4049- val extensionParamOffset = if (thisParamParent.extensionReceiverParameter != null ) 1 else 0
4050- val replacementParamId = tw.getLabelFor<DbParam >(getValueParameterLabel(paramDeclarerId, replaceWithParamIdx + extensionParamOffset))
4056+ val replacementParamId = tw.getLabelFor<DbParam >(getValueParameterLabel(paramDeclarerId, replaceWithParamIdx))
40514057 extractVariableAccess(replacementParamId, e.type, locId, exprParent.parent, exprParent.idx, callable, exprParent.enclosingStmt)
40524058 return
40534059 }
0 commit comments