From b8ec50f38c8975fbbd0b4943cf72b4110a62cd6d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 5 Feb 2014 20:03:59 +0400 Subject: [PATCH] Handle fake overrides of members of Any in BuiltInsReferenceResolver --- .../references/BuiltInsReferenceResolver.java | 14 +++++++--- .../complexMultiOverride.kt.after | 6 ++++ .../inheritVisibilities.kt.after | 6 ++++ .../overrideImplement/multiOverride.kt.after | 6 ++++ .../overrideRespectCaretPosition.kt.after | 6 ++++ .../AbstractOverrideImplementTest.java | 28 ++++++++++++++----- 6 files changed, 55 insertions(+), 11 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java index c0c2541dccd..78543864bed 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java @@ -176,6 +176,15 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { @Nullable private DeclarationDescriptor findCurrentDescriptorForMember(@NotNull MemberDescriptor originalDescriptor) { + if (originalDescriptor instanceof CallableMemberDescriptor && + ((CallableMemberDescriptor) originalDescriptor).getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + CallableMemberDescriptor descriptor = (CallableMemberDescriptor) originalDescriptor; + while (descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + descriptor = descriptor.getOverriddenDescriptors().iterator().next(); + } + return findCurrentDescriptorForMember(descriptor.getOriginal()); + } + DeclarationDescriptor containingDeclaration = findCurrentDescriptor(originalDescriptor.getContainingDeclaration()); JetScope memberScope = getMemberScope(containingDeclaration); if (memberScope == null) return null; @@ -220,10 +229,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { return Collections.emptyList(); } - DeclarationDescriptor descriptor = declarationDescriptor; - - descriptor = descriptor.getOriginal(); - descriptor = findCurrentDescriptor(descriptor); + DeclarationDescriptor descriptor = findCurrentDescriptor(declarationDescriptor.getOriginal()); if (descriptor != null) { return BindingContextUtils.descriptorToDeclarations(bindingContext, descriptor); } diff --git a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after index 9849037d6fc..336e46a593f 100644 --- a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after @@ -9,8 +9,14 @@ class C : Base() { override fun bar(value: () -> Unit): (String) -> Unit { return super.bar(value) } + override fun equals(other: Any?): Boolean { + return super.equals(other) + } override fun foo(value: C): C { return super.foo(value) } + override fun hashCode(): Int { + return super.hashCode() + } override val method: (String?) -> String = ? } diff --git a/idea/testData/codeInsight/overrideImplement/inheritVisibilities.kt.after b/idea/testData/codeInsight/overrideImplement/inheritVisibilities.kt.after index b33052db5ba..f9eff471be9 100644 --- a/idea/testData/codeInsight/overrideImplement/inheritVisibilities.kt.after +++ b/idea/testData/codeInsight/overrideImplement/inheritVisibilities.kt.after @@ -12,6 +12,12 @@ trait B { class C : A(), B { + override fun equals(other: Any?): Boolean { + return super.equals(other) + } + override fun hashCode(): Int { + return super.hashCode() + } override fun internalFun() { super.internalFun() } diff --git a/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after index b15a1ed1e88..ba0184c87f9 100644 --- a/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after @@ -8,7 +8,13 @@ class C : A { override fun bar(): String { return super.bar() } + override fun equals(other: Any?): Boolean { + return super.equals(other) + } override fun foo(value: String): Int { return super.foo(value) } + override fun hashCode(): Int { + return super.hashCode() + } } diff --git a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after index 0fda0b47711..0d9057949af 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after @@ -7,9 +7,15 @@ class C : A() { val constant = 42 // Some comment override val bar: Int = 0 + override fun equals(other: Any?): Boolean { + return super.equals(other) + } override fun foo(value: Int) { super.foo(value) } + override fun hashCode(): Int { + return super.hashCode() + } /* Some another comment diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java index e049f49f460..6acb047a0e0 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.plugin.codeInsight; import com.intellij.codeInsight.generation.OverrideImplementUtil; import com.intellij.codeInsight.generation.PsiMethodMember; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.project.Project; @@ -29,21 +28,23 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import com.intellij.util.SmartList; +import jet.Function1; import junit.framework.Assert; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.OverridingUtil; +import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.plugin.JetLightProjectDescriptor; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.project.ResolveSessionForBodies; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Set; +import java.util.*; public abstract class AbstractOverrideImplementTest extends LightCodeInsightFixtureTestCase { @NotNull @@ -128,8 +129,21 @@ public abstract class AbstractOverrideImplementTest extends LightCodeInsightFixt final CallableMemberDescriptor singleToOverride; if (memberToOverride == null) { - assertEquals("Invalid number of available descriptors for override", 1, descriptors.size()); - singleToOverride = descriptors.iterator().next(); + // Filter out fake overrides of members of Any (equals, hashCode, toString) + List filtered = KotlinPackage.filter(descriptors, new Function1() { + @Override + public Boolean invoke(CallableMemberDescriptor descriptor) { + ClassDescriptor any = KotlinBuiltIns.getInstance().getAny(); + for (CallableMemberDescriptor overridden : OverridingUtil.getOverriddenDeclarations(descriptor)) { + if (overridden.getContainingDeclaration().equals(any)) { + return false; + } + } + return true; + } + }); + assertEquals("Invalid number of available descriptors for override", 1, filtered.size()); + singleToOverride = filtered.iterator().next(); } else { CallableMemberDescriptor candidateToOverride = null;