From a33f946c14354072ab6d7847ea626d60427c59f2 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 24 Jun 2016 18:08:58 +0300 Subject: [PATCH] Override/Implement Members: Implement Members: Fix base member detection when abstract and non-abstract members with matching signatures are inherited from an interface #KT-11115 Fixed (cherry picked from commit a3a2e57) --- ChangeLog.md | 6 ++++++ .../jetbrains/kotlin/resolve/OverrideResolver.java | 4 +++- .../abstractAndNonAbstractInheritedFromInterface.kt | 11 +++++++++++ ...actAndNonAbstractInheritedFromInterface.kt.after | 13 +++++++++++++ .../idea/codeInsight/OverrideImplementTest.kt | 4 ++++ 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 idea/testData/codeInsight/overrideImplement/abstractAndNonAbstractInheritedFromInterface.kt create mode 100644 idea/testData/codeInsight/overrideImplement/abstractAndNonAbstractInheritedFromInterface.kt.after diff --git a/ChangeLog.md b/ChangeLog.md index cf718dd4ed4..e0b4e991b26 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -113,6 +113,12 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-13037`](https://youtrack.jetbrains.com/issue/KT-13037) Fix possible deadlock in debugger in 2016.1 and exception in 2016.2 - [`KT-12651`](https://youtrack.jetbrains.com/issue/KT-12651) Fix exception in evaluate expression when bad identifier is used for marking object +#### Intention actions, inspections and quickfixes + +###### Issues fixed + +- [`KT-11115`](https://youtrack.jetbrains.com/issue/KT-11115) Implement Members: Fix base member detection when abstract and non-abstract members with matching signatures are inherited from an interface + #### Refactorings ###### Issues fixed diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java index 4686e7f9037..140373afde3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java @@ -334,7 +334,9 @@ public class OverrideResolver { @Override public void conflictingInterfaceMemberNotImplemented(CallableMemberDescriptor descriptor) { - // don't care + if (descriptor.getModality() == Modality.ABSTRACT) { + shouldImplement.add(descriptor); + } } @Override diff --git a/idea/testData/codeInsight/overrideImplement/abstractAndNonAbstractInheritedFromInterface.kt b/idea/testData/codeInsight/overrideImplement/abstractAndNonAbstractInheritedFromInterface.kt new file mode 100644 index 00000000000..084a486e855 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/abstractAndNonAbstractInheritedFromInterface.kt @@ -0,0 +1,11 @@ +interface T { + fun getFoo(): String = "" +} + +interface U { + fun getFoo(): String +} + +class C1 : T, U { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/abstractAndNonAbstractInheritedFromInterface.kt.after b/idea/testData/codeInsight/overrideImplement/abstractAndNonAbstractInheritedFromInterface.kt.after new file mode 100644 index 00000000000..8296de3a875 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/abstractAndNonAbstractInheritedFromInterface.kt.after @@ -0,0 +1,13 @@ +interface T { + fun getFoo(): String = "" +} + +interface U { + fun getFoo(): String +} + +class C1 : T, U { + override fun getFoo(): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt index 4556ebac337..4178cd2ee58 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt @@ -247,4 +247,8 @@ class OverrideImplementTest : AbstractOverrideImplementTest() { fun testPlatformTypes() { doOverrideDirectoryTest("foo") } + + fun testAbstractAndNonAbstractInheritedFromInterface() { + doImplementFileTest("getFoo") + } }