From 2cf437c0e2a43e920dd3eb3351979a60bb79f439 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 14 Oct 2015 17:29:26 +0300 Subject: [PATCH] Fix type of callable reference to fake override --- .../CallableReferencesResolutionUtils.kt | 9 +++++++-- .../function/fakeOverrideType.kt | 17 +++++++++++++++++ .../function/fakeOverrideType.txt | 19 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.kt create mode 100644 compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/callableReferences/CallableReferencesResolutionUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/callableReferences/CallableReferencesResolutionUtils.kt index 6e8fdccc235..6d720f734c1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/callableReferences/CallableReferencesResolutionUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/callableReferences/CallableReferencesResolutionUtils.kt @@ -205,8 +205,13 @@ private fun createReflectionTypeForCallableDescriptor( trace: BindingTrace?, reportOn: JetExpression? ): JetType? { - val extensionReceiver = descriptor.getExtensionReceiverParameter() - val dispatchReceiver = descriptor.getDispatchReceiverParameter() + val extensionReceiver = descriptor.extensionReceiverParameter + val dispatchReceiver = descriptor.dispatchReceiverParameter?.let { dispatchReceiver -> + // See CallableDescriptor#getOwnerForEffectiveDispatchReceiverParameter + if ((descriptor as? CallableMemberDescriptor)?.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) + DescriptorUtils.getDispatchReceiverParameterIfNeeded(descriptor.containingDeclaration) + else dispatchReceiver + } if (extensionReceiver != null && dispatchReceiver != null && descriptor is CallableMemberDescriptor) { if (reportOn != null) { diff --git a/compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.kt b/compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.kt new file mode 100644 index 00000000000..84c7c20d83f --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.kt @@ -0,0 +1,17 @@ +// !CHECK_TYPE + +import kotlin.reflect.KFunction2 + +open class A { + fun foo(s: String): String = s +} + +class B : A() { +} + + +fun test() { + B::foo checkType { _>() } + + (B::hashCode)("No.") +} diff --git a/compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.txt b/compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.txt new file mode 100644 index 00000000000..a3177ee8292 --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.txt @@ -0,0 +1,19 @@ +package + +public fun test(): kotlin.Unit + +public open class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(/*0*/ s: kotlin.String): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class B : A { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun foo(/*0*/ s: kotlin.String): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index f6ec2c63bca..3b3066b3770 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1721,6 +1721,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("fakeOverrideType.kt") + public void testFakeOverrideType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/callableReference/function/fakeOverrideType.kt"); + doTest(fileName); + } + @TestMetadata("genericClassFromTopLevel.kt") public void testGenericClassFromTopLevel() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/callableReference/function/genericClassFromTopLevel.kt");