Fix order of fixing type variables for callable references. KT-25433 Fixed
This commit is contained in:
+9
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.builtins.*
|
|||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
|
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.model.ArgumentConstraintPosition
|
import org.jetbrains.kotlin.resolve.calls.inference.model.ArgumentConstraintPosition
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.inference.model.LHSArgumentConstraintPosition
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableForLambdaReturnType
|
import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableForLambdaReturnType
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||||
import org.jetbrains.kotlin.types.UnwrappedType
|
import org.jetbrains.kotlin.types.UnwrappedType
|
||||||
@@ -141,6 +142,14 @@ private fun preprocessCallableReference(
|
|||||||
|
|
||||||
val notCallableTypeConstructor =
|
val notCallableTypeConstructor =
|
||||||
csBuilder.getProperSuperTypeConstructors(expectedType).firstOrNull { !ReflectionTypes.isPossibleExpectedCallableType(it) }
|
csBuilder.getProperSuperTypeConstructors(expectedType).firstOrNull { !ReflectionTypes.isPossibleExpectedCallableType(it) }
|
||||||
|
|
||||||
|
argument.lhsResult.safeAs<LHSResult.Type>()?.let {
|
||||||
|
val lhsType = it.unboundDetailedReceiver.stableType
|
||||||
|
if (ReflectionTypes.isNumberedTypeWithOneOrMoreNumber(expectedType)) {
|
||||||
|
val lhsTypeVariable = expectedType.arguments.first().type.unwrap()
|
||||||
|
csBuilder.addSubtypeConstraint(lhsType, lhsTypeVariable, LHSArgumentConstraintPosition(it.qualifier))
|
||||||
|
}
|
||||||
|
}
|
||||||
if (notCallableTypeConstructor != null) {
|
if (notCallableTypeConstructor != null) {
|
||||||
diagnosticsHolder.addDiagnostic(NotCallableExpectedType(argument, expectedType, notCallableTypeConstructor))
|
diagnosticsHolder.addDiagnostic(NotCallableExpectedType(argument, expectedType, notCallableTypeConstructor))
|
||||||
}
|
}
|
||||||
|
|||||||
+7
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.resolve.calls.model.*
|
|||||||
import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateApplicability
|
import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateApplicability
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateApplicability.INAPPLICABLE
|
import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateApplicability.INAPPLICABLE
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateApplicability.INAPPLICABLE_WRONG_RECEIVER
|
import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateApplicability.INAPPLICABLE_WRONG_RECEIVER
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.receivers.QualifierReceiver
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.UnwrappedType
|
import org.jetbrains.kotlin.types.UnwrappedType
|
||||||
|
|
||||||
@@ -55,6 +56,12 @@ class KnownTypeParameterConstraintPosition(val typeArgument: KotlinType) : Const
|
|||||||
override fun toString() = "TypeArgument $typeArgument"
|
override fun toString() = "TypeArgument $typeArgument"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LHSArgumentConstraintPosition(val receiver: QualifierReceiver) : ConstraintPosition() {
|
||||||
|
override fun toString(): String {
|
||||||
|
return "LHS receiver $receiver"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class LambdaArgumentConstraintPosition(val lambda: ResolvedLambdaAtom) : ConstraintPosition() {
|
class LambdaArgumentConstraintPosition(val lambda: ResolvedLambdaAtom) : ConstraintPosition() {
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return "LambdaArgument $lambda"
|
return "LambdaArgument $lambda"
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// !WITH_NEW_INFERENCE
|
||||||
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
// Issue: KT-25433
|
||||||
|
|
||||||
|
import kotlin.reflect.*
|
||||||
|
|
||||||
|
fun <T, R> hidden(nameProp: KProperty1<T, R>, value: R) {}
|
||||||
|
fun <T, R> hiddenFun(nameFunc: KFunction1<T, R>, value: R) {}
|
||||||
|
|
||||||
|
class App(val nullable: String?) {
|
||||||
|
fun nullableFun(): String? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
hidden(App::nullable, "foo")
|
||||||
|
hiddenFun(App::nullableFun, "foo")
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun </*0*/ T, /*1*/ R> hidden(/*0*/ nameProp: kotlin.reflect.KProperty1<T, R>, /*1*/ value: R): kotlin.Unit
|
||||||
|
public fun </*0*/ T, /*1*/ R> hiddenFun(/*0*/ nameFunc: kotlin.reflect.KFunction1<T, R>, /*1*/ value: R): kotlin.Unit
|
||||||
|
public fun test(): kotlin.Unit
|
||||||
|
|
||||||
|
public final class App {
|
||||||
|
public constructor App(/*0*/ nullable: kotlin.String?)
|
||||||
|
public final val nullable: kotlin.String?
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public final fun nullableFun(): kotlin.String?
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
@@ -1681,6 +1681,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt15439_completeCall.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt15439_completeCall.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt25433.kt")
|
||||||
|
public void testKt25433() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt25433.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
||||||
public void testKt7430_wrongClassOnLHS() throws Exception {
|
public void testKt7430_wrongClassOnLHS() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
||||||
|
|||||||
Generated
+5
@@ -1676,6 +1676,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt15439_completeCall.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt15439_completeCall.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt25433.kt")
|
||||||
|
public void testKt25433() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt25433.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
||||||
public void testKt7430_wrongClassOnLHS() throws Exception {
|
public void testKt7430_wrongClassOnLHS() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
||||||
|
|||||||
@@ -18,9 +18,13 @@ import org.jetbrains.kotlin.types.*
|
|||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
val KOTLIN_REFLECT_FQ_NAME = FqName("kotlin.reflect")
|
val KOTLIN_REFLECT_FQ_NAME = FqName("kotlin.reflect")
|
||||||
|
val K_PROPERTY_PREFIX = "KProperty"
|
||||||
|
val K_MUTABLE_PROPERTY_PREFIX = "KMutableProperty"
|
||||||
val K_FUNCTION_PREFIX = "KFunction"
|
val K_FUNCTION_PREFIX = "KFunction"
|
||||||
val K_SUSPEND_FUNCTION_PREFIX = "KSuspendFunction"
|
val K_SUSPEND_FUNCTION_PREFIX = "KSuspendFunction"
|
||||||
|
|
||||||
|
val PREFIXES = listOf(K_PROPERTY_PREFIX, K_MUTABLE_PROPERTY_PREFIX, K_FUNCTION_PREFIX, K_SUSPEND_FUNCTION_PREFIX)
|
||||||
|
|
||||||
class ReflectionTypes(module: ModuleDescriptor, private val notFoundClasses: NotFoundClasses) {
|
class ReflectionTypes(module: ModuleDescriptor, private val notFoundClasses: NotFoundClasses) {
|
||||||
private val kotlinReflectScope: MemberScope by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
private val kotlinReflectScope: MemberScope by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
module.getPackage(KOTLIN_REFLECT_FQ_NAME).memberScope
|
module.getPackage(KOTLIN_REFLECT_FQ_NAME).memberScope
|
||||||
@@ -122,6 +126,20 @@ class ReflectionTypes(module: ModuleDescriptor, private val notFoundClasses: Not
|
|||||||
hasFqName(descriptor, KotlinBuiltIns.FQ_NAMES.kMutableProperty2)
|
hasFqName(descriptor, KotlinBuiltIns.FQ_NAMES.kMutableProperty2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isNumberedTypeWithOneOrMoreNumber(type: KotlinType): Boolean {
|
||||||
|
val descriptor = type.constructor.declarationDescriptor as? ClassDescriptor ?: return false
|
||||||
|
if (DescriptorUtils.getFqName(descriptor).parent().toSafe() != KOTLIN_REFLECT_FQ_NAME) return false
|
||||||
|
val shortName = descriptor.name.asString()
|
||||||
|
|
||||||
|
for (prefix in PREFIXES) {
|
||||||
|
if (shortName.startsWith(prefix)) {
|
||||||
|
val number = shortName.removePrefix(prefix)
|
||||||
|
return number.isNotEmpty() && number != "0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
fun hasKPropertyTypeFqName(type: KotlinType): Boolean =
|
fun hasKPropertyTypeFqName(type: KotlinType): Boolean =
|
||||||
hasFqName(type.constructor, KotlinBuiltIns.FQ_NAMES.kPropertyFqName)
|
hasFqName(type.constructor, KotlinBuiltIns.FQ_NAMES.kPropertyFqName)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user