Override/Implement: Add 'actual' modifier to overrides of 'expect'
#KT-23106 Fixed
This commit is contained in:
+9
-1
@@ -24,6 +24,7 @@ import com.intellij.psi.PsiDocCommentOwner
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.idea.core.TemplateKind
|
||||
import org.jetbrains.kotlin.idea.core.getFunctionBodyTextFromTemplate
|
||||
@@ -32,6 +33,7 @@ import org.jetbrains.kotlin.idea.j2k.IdeaDocCommentConverter
|
||||
import org.jetbrains.kotlin.idea.kdoc.KDocElementFactory
|
||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||
import org.jetbrains.kotlin.idea.util.approximateFlexibleTypes
|
||||
import org.jetbrains.kotlin.idea.util.expectedDescriptors
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.findDocComment.findDocComment
|
||||
@@ -40,6 +42,7 @@ import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
|
||||
import org.jetbrains.kotlin.renderer.*
|
||||
import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden
|
||||
import org.jetbrains.kotlin.util.findCallableMemberBySignature
|
||||
|
||||
interface OverrideMemberChooserObject : ClassMember {
|
||||
sealed class BodyType {
|
||||
@@ -118,7 +121,12 @@ fun OverrideMemberChooserObject.generateMember(targetClass: KtClassOrObject, cop
|
||||
else -> error("Unknown member to override: $descriptor")
|
||||
}
|
||||
|
||||
if (!targetClass.hasActualModifier()) {
|
||||
if (targetClass.hasActualModifier()) {
|
||||
val expectClassDescriptors = targetClass.resolveToDescriptorIfAny()?.expectedDescriptors() ?: emptyList()
|
||||
if (expectClassDescriptors.any { (it as? ClassDescriptor)?.findCallableMemberBySignature(immediateSuper)?.isExpect == true }) {
|
||||
newMember.addModifier(KtTokens.ACTUAL_KEYWORD)
|
||||
}
|
||||
} else {
|
||||
newMember.removeModifier(KtTokens.IMPL_KEYWORD)
|
||||
newMember.removeModifier(KtTokens.ACTUAL_KEYWORD)
|
||||
}
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
interface I {
|
||||
fun f()
|
||||
}
|
||||
|
||||
expect class C : I {
|
||||
override fun f()
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
interface I {
|
||||
fun f()
|
||||
}
|
||||
|
||||
expect class C : I {
|
||||
override fun f()
|
||||
}
|
||||
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
// "Implement members" "true"
|
||||
// DISABLE-ERRORS
|
||||
|
||||
actual class <caret>C : I
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
// "Implement members" "true"
|
||||
// DISABLE-ERRORS
|
||||
|
||||
actual class C : I {
|
||||
actual override fun f() {
|
||||
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||
}
|
||||
}
|
||||
+5
@@ -184,6 +184,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
|
||||
runTest("idea/testData/multiModuleQuickFix/functionTypeReceiverToParameterByImpl/");
|
||||
}
|
||||
|
||||
@TestMetadata("implementAbstractExpectMemberInheritedFromInterface")
|
||||
public void testImplementAbstractExpectMemberInheritedFromInterface() throws Exception {
|
||||
runTest("idea/testData/multiModuleQuickFix/implementAbstractExpectMemberInheritedFromInterface/");
|
||||
}
|
||||
|
||||
@TestMetadata("implementMembersInImplClassNonImplInheritor")
|
||||
public void testImplementMembersInImplClassNonImplInheritor() throws Exception {
|
||||
runTest("idea/testData/multiModuleQuickFix/implementMembersInImplClassNonImplInheritor/");
|
||||
|
||||
Reference in New Issue
Block a user