Implement members: don't add 'actual' modifier for fake overrides

#KT-25044 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-08-08 12:46:30 +03:00
parent ed5791ed9e
commit db787c78d6
6 changed files with 42 additions and 2 deletions
@@ -122,8 +122,13 @@ fun OverrideMemberChooserObject.generateMember(targetClass: KtClassOrObject, cop
}
if (targetClass.hasActualModifier()) {
val expectClassDescriptors = targetClass.resolveToDescriptorIfAny()?.expectedDescriptors() ?: emptyList()
if (expectClassDescriptors.any { (it as? ClassDescriptor)?.findCallableMemberBySignature(immediateSuper)?.isExpect == true }) {
val expectClassDescriptors =
targetClass.resolveToDescriptorIfAny()?.expectedDescriptors()?.filterIsInstance<ClassDescriptor>().orEmpty()
if (expectClassDescriptors.any { expectClassDescriptor ->
val expectMemberDescriptor = expectClassDescriptor.findCallableMemberBySignature(immediateSuper)
expectMemberDescriptor?.isExpect == true && expectMemberDescriptor.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE
}
) {
newMember.addModifier(KtTokens.ACTUAL_KEYWORD)
}
} else {
@@ -0,0 +1,5 @@
expect interface ExpInterface {
fun first()
}
expect class ExpImpl : ExpInterface { }
@@ -0,0 +1,5 @@
expect interface ExpInterface {
fun first()
}
expect class ExpImpl : ExpInterface { }
@@ -0,0 +1,8 @@
// "Implement members" "true"
// ERROR: Class 'ExpImpl' is not abstract and does not implement abstract member public abstract actual fun first(): Unit defined in ExpInterface
actual interface ExpInterface {
actual fun first()
}
actual class ExpImpl<caret> : ExpInterface
@@ -0,0 +1,12 @@
// "Implement members" "true"
// ERROR: Class 'ExpImpl' is not abstract and does not implement abstract member public abstract actual fun first(): Unit defined in ExpInterface
actual interface ExpInterface {
actual fun first()
}
actual class ExpImpl : ExpInterface {
override fun first() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
@@ -229,6 +229,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
runTest("idea/testData/multiModuleQuickFix/implementAbstractExpectMemberInheritedFromInterface/");
}
@TestMetadata("implementMembersInActualClassNoExpectMember")
public void testImplementMembersInActualClassNoExpectMember() throws Exception {
runTest("idea/testData/multiModuleQuickFix/implementMembersInActualClassNoExpectMember/");
}
@TestMetadata("implementMembersInImplClassNonImplInheritor")
public void testImplementMembersInImplClassNonImplInheritor() throws Exception {
runTest("idea/testData/multiModuleQuickFix/implementMembersInImplClassNonImplInheritor/");