Fix compiler exception during resolution of ambiguous callable references
Function return type can't and should not be used during overload resolution of callable references. Since it can be DeferredType, its substitution in CS caused exception.
This commit is contained in:
@@ -16,8 +16,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve.calls.results
|
package org.jetbrains.kotlin.resolve.calls.results
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.getAllParameterProjectionsFromCallableReflectionType
|
||||||
import org.jetbrains.kotlin.container.DefaultImplementation
|
import org.jetbrains.kotlin.container.DefaultImplementation
|
||||||
import org.jetbrains.kotlin.container.PlatformExtensionsClashResolver
|
|
||||||
import org.jetbrains.kotlin.container.PlatformSpecificExtension
|
import org.jetbrains.kotlin.container.PlatformSpecificExtension
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
||||||
@@ -62,7 +62,7 @@ class FlatSignature<out T> constructor(
|
|||||||
return FlatSignature(
|
return FlatSignature(
|
||||||
origin,
|
origin,
|
||||||
descriptor.typeParameters,
|
descriptor.typeParameters,
|
||||||
reflectionType.arguments.map { it.type }, // should we drop return type?
|
reflectionType.getAllParameterProjectionsFromCallableReflectionType().map { it.type },
|
||||||
hasExtensionReceiver = false,
|
hasExtensionReceiver = false,
|
||||||
hasVarargs = descriptor.valueParameters.any { it.varargElementType != null },
|
hasVarargs = descriptor.valueParameters.any { it.varargElementType != null },
|
||||||
numDefaults = numDefaults,
|
numDefaults = numDefaults,
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
// !WITH_NEW_INFERENCE
|
||||||
|
|
||||||
|
interface G<T> {
|
||||||
|
fun build(): G<T>
|
||||||
|
}
|
||||||
|
class V1<V>(val value: V)
|
||||||
|
class V2<V>(val value: V)
|
||||||
|
fun <V, T : V?> G<T>.foo(vararg values: V1<V>) = build()
|
||||||
|
fun <V, T : V?> G<T>.foo(vararg values: V2<V?>) = build()
|
||||||
|
|
||||||
|
fun forReference(ref: Any?) {}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
forReference(G<Int?>::<!NI;CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY, NI;DEBUG_INFO_MISSING_UNRESOLVED, OI;CANNOT_COMPLETE_RESOLVE!>foo<!>)
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun forReference(/*0*/ ref: kotlin.Any?): kotlin.Unit
|
||||||
|
public fun test(): kotlin.Unit
|
||||||
|
public fun </*0*/ V, /*1*/ T : V?> G<T>.foo(/*0*/ vararg values: V1<V> /*kotlin.Array<out V1<V>>*/): G<T>
|
||||||
|
public fun </*0*/ V, /*1*/ T : V?> G<T>.foo(/*0*/ vararg values: V2<V?> /*kotlin.Array<out V2<V?>>*/): G<T>
|
||||||
|
|
||||||
|
public interface G</*0*/ T> {
|
||||||
|
public abstract fun build(): G<T>
|
||||||
|
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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class V1</*0*/ V> {
|
||||||
|
public constructor V1</*0*/ V>(/*0*/ value: V)
|
||||||
|
public final val value: V
|
||||||
|
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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class V2</*0*/ V> {
|
||||||
|
public constructor V2</*0*/ V>(/*0*/ value: V)
|
||||||
|
public final val value: V
|
||||||
|
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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
// !WITH_NEW_INFERENCE
|
||||||
|
|
||||||
|
fun foo(s: String) {}
|
||||||
|
fun foo(i: Long) {}
|
||||||
|
|
||||||
|
fun bar(f: (Boolean) -> Unit) {}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
bar(::<!NI;CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY, NI;DEBUG_INFO_MISSING_UNRESOLVED, OI;NONE_APPLICABLE!>foo<!>)
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun bar(/*0*/ f: (kotlin.Boolean) -> kotlin.Unit): kotlin.Unit
|
||||||
|
public fun foo(/*0*/ i: kotlin.Long): kotlin.Unit
|
||||||
|
public fun foo(/*0*/ s: kotlin.String): kotlin.Unit
|
||||||
|
public fun test(): kotlin.Unit
|
||||||
@@ -112,7 +112,7 @@ class ReflectionTypes(module: ModuleDescriptor, private val notFoundClasses: Not
|
|||||||
fun isNumberedKPropertyOrKMutablePropertyType(type: KotlinType): Boolean =
|
fun isNumberedKPropertyOrKMutablePropertyType(type: KotlinType): Boolean =
|
||||||
isNumberedKPropertyType(type) || isNumberedKMutablePropertyType(type)
|
isNumberedKPropertyType(type) || isNumberedKMutablePropertyType(type)
|
||||||
|
|
||||||
private fun isKCallableType(type: KotlinType): Boolean =
|
fun isKCallableType(type: KotlinType): Boolean =
|
||||||
hasKCallableTypeFqName(type) || type.constructor.supertypes.any { isKCallableType(it) }
|
hasKCallableTypeFqName(type) || type.constructor.supertypes.any { isKCallableType(it) }
|
||||||
|
|
||||||
fun hasKCallableTypeFqName(type: KotlinType): Boolean =
|
fun hasKCallableTypeFqName(type: KotlinType): Boolean =
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.types.typeUtil.asTypeProjection
|
|||||||
import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations
|
import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations
|
||||||
import org.jetbrains.kotlin.utils.DFS
|
import org.jetbrains.kotlin.utils.DFS
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
private fun KotlinType.isTypeOrSubtypeOf(predicate: (KotlinType) -> Boolean): Boolean =
|
private fun KotlinType.isTypeOrSubtypeOf(predicate: (KotlinType) -> Boolean): Boolean =
|
||||||
@@ -58,6 +59,9 @@ val KotlinType.isFunctionType: Boolean
|
|||||||
val KotlinType.isSuspendFunctionType: Boolean
|
val KotlinType.isSuspendFunctionType: Boolean
|
||||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.SuspendFunction
|
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.SuspendFunction
|
||||||
|
|
||||||
|
val KotlinType.isCallableReflectionType: Boolean
|
||||||
|
get() = ReflectionTypes.isKCallableType(this)
|
||||||
|
|
||||||
val KotlinType.isKSuspendFunctionType: Boolean
|
val KotlinType.isKSuspendFunctionType: Boolean
|
||||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.KSuspendFunction
|
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.KSuspendFunction
|
||||||
|
|
||||||
@@ -139,6 +143,14 @@ fun KotlinType.getValueParameterTypesFromFunctionType(): List<TypeProjection> {
|
|||||||
return arguments.subList(first, last)
|
return arguments.subList(first, last)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun KotlinType.getAllParameterProjectionsFromCallableReflectionType(): List<TypeProjection> {
|
||||||
|
assert(isCallableReflectionType) { "Not a callable reflection type: $this" }
|
||||||
|
val arguments = arguments
|
||||||
|
val last = arguments.size - 1
|
||||||
|
assert(last >= 0) { "Unexpected number of type arguments in type: $this" }
|
||||||
|
return arguments.subList(0, last)
|
||||||
|
}
|
||||||
|
|
||||||
fun KotlinType.extractParameterNameFromFunctionTypeArgument(): Name? {
|
fun KotlinType.extractParameterNameFromFunctionTypeArgument(): Name? {
|
||||||
val annotation = annotations.findAnnotation(KotlinBuiltIns.FQ_NAMES.parameterName) ?: return null
|
val annotation = annotations.findAnnotation(KotlinBuiltIns.FQ_NAMES.parameterName) ?: return null
|
||||||
val name = (annotation.allValueArguments.values.singleOrNull() as? StringValue)
|
val name = (annotation.allValueArguments.values.singleOrNull() as? StringValue)
|
||||||
|
|||||||
Reference in New Issue
Block a user