FIR: Fix overload resolution with defaults
This commit is contained in:
+2
-2
@@ -129,7 +129,7 @@ abstract class AbstractConeCallConflictResolver(
|
|||||||
//constructor.receiverTypeRef != null,
|
//constructor.receiverTypeRef != null,
|
||||||
false,
|
false,
|
||||||
constructor.valueParameters.any { it.isVararg },
|
constructor.valueParameters.any { it.isVararg },
|
||||||
constructor.valueParameters.count { it.defaultValue != null },
|
call.numDefaults,
|
||||||
constructor.isExpect,
|
constructor.isExpect,
|
||||||
false // TODO
|
false // TODO
|
||||||
)
|
)
|
||||||
@@ -142,7 +142,7 @@ abstract class AbstractConeCallConflictResolver(
|
|||||||
computeParameterTypes(call, function),
|
computeParameterTypes(call, function),
|
||||||
function.receiverTypeRef != null,
|
function.receiverTypeRef != null,
|
||||||
function.valueParameters.any { it.isVararg },
|
function.valueParameters.any { it.isVararg },
|
||||||
function.valueParameters.count { it.defaultValue != null },
|
call.numDefaults,
|
||||||
function.isExpect,
|
function.isExpect,
|
||||||
false // TODO
|
false // TODO
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ class Candidate(
|
|||||||
var usesSuspendConversion: Boolean = false
|
var usesSuspendConversion: Boolean = false
|
||||||
|
|
||||||
var argumentMapping: Map<FirExpression, FirValueParameter>? = null
|
var argumentMapping: Map<FirExpression, FirValueParameter>? = null
|
||||||
|
var numDefaults: Int = 0
|
||||||
lateinit var typeArgumentMapping: TypeArgumentMapping
|
lateinit var typeArgumentMapping: TypeArgumentMapping
|
||||||
val postponedAtoms = mutableListOf<PostponedResolvedAtom>()
|
val postponedAtoms = mutableListOf<PostponedResolvedAtom>()
|
||||||
|
|
||||||
|
|||||||
+4
@@ -44,6 +44,10 @@ data class ArgumentMapping(
|
|||||||
}
|
}
|
||||||
return argumentToParameterMapping
|
return argumentToParameterMapping
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun numDefaults(): Int {
|
||||||
|
return parameterToCallArgumentMap.values.count { it == ResolvedCallArgument.DefaultArgument }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val EmptyArgumentMapping = ArgumentMapping(emptyMap(), emptyList())
|
private val EmptyArgumentMapping = ArgumentMapping(emptyMap(), emptyList())
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ internal object MapArguments : ResolutionStage() {
|
|||||||
|
|
||||||
val mapping = context.bodyResolveComponents.mapArguments(callInfo.arguments, function, candidate.originScope)
|
val mapping = context.bodyResolveComponents.mapArguments(callInfo.arguments, function, candidate.originScope)
|
||||||
candidate.argumentMapping = mapping.toArgumentToParameterMapping()
|
candidate.argumentMapping = mapping.toArgumentToParameterMapping()
|
||||||
|
candidate.numDefaults = mapping.numDefaults()
|
||||||
|
|
||||||
mapping.diagnostics.forEach(sink::reportDiagnostic)
|
mapping.diagnostics.forEach(sink::reportDiagnostic)
|
||||||
sink.yieldIfNeed()
|
sink.yieldIfNeed()
|
||||||
|
|||||||
+6
-6
@@ -1,9 +1,9 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
class A(x: String = "", y: String = "") {
|
class A(x: String = "", y: String = "") {
|
||||||
constructor(x: String, y: String): <!CYCLIC_CONSTRUCTOR_DELEGATION_CALL!>this<!>(x, y)
|
constructor(x: String, y: String): <!AMBIGUITY!>this<!>(x, y)
|
||||||
constructor(): <!CYCLIC_CONSTRUCTOR_DELEGATION_CALL!>this<!>("", "")
|
constructor(): <!AMBIGUITY!>this<!>("", "")
|
||||||
constructor(): <!CYCLIC_CONSTRUCTOR_DELEGATION_CALL!>this<!>("", "")
|
constructor(): <!AMBIGUITY!>this<!>("", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
class B {
|
class B {
|
||||||
@@ -14,9 +14,9 @@ fun B(x: Int) {}
|
|||||||
|
|
||||||
class Outer {
|
class Outer {
|
||||||
class A(x: String = "", y: String = "") {
|
class A(x: String = "", y: String = "") {
|
||||||
constructor(x: String, y: String): <!CYCLIC_CONSTRUCTOR_DELEGATION_CALL!>this<!>(x, y)
|
constructor(x: String, y: String): <!AMBIGUITY!>this<!>(x, y)
|
||||||
constructor(): <!CYCLIC_CONSTRUCTOR_DELEGATION_CALL!>this<!>("", "")
|
constructor(): <!AMBIGUITY!>this<!>("", "")
|
||||||
constructor(): <!CYCLIC_CONSTRUCTOR_DELEGATION_CALL!>this<!>("", "")
|
constructor(): <!AMBIGUITY!>this<!>("", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
class B {
|
class B {
|
||||||
|
|||||||
Reference in New Issue
Block a user