Extract Interface/Pull Up: Disable "Make abstract" and assume it to be true for primary constructor parameter when moving to an interface
#KT-15643 Fixed
This commit is contained in:
@@ -477,6 +477,7 @@ These artifacts include extensions for the types available in the latter JDKs, s
|
|||||||
- [`KT-15563`](https://youtrack.jetbrains.com/issue/KT-15563) Override Members: Allow overriding virtual synthetic members (e.g. equals(), hashCode(), toString(), etc.) in data classes
|
- [`KT-15563`](https://youtrack.jetbrains.com/issue/KT-15563) Override Members: Allow overriding virtual synthetic members (e.g. equals(), hashCode(), toString(), etc.) in data classes
|
||||||
- [`KT-15355`](https://youtrack.jetbrains.com/issue/KT-15355) Extract Interface: Disable "Make abstract" and assume it to be true for abstract members of an interface
|
- [`KT-15355`](https://youtrack.jetbrains.com/issue/KT-15355) Extract Interface: Disable "Make abstract" and assume it to be true for abstract members of an interface
|
||||||
- [`KT-15353`](https://youtrack.jetbrains.com/issue/KT-15353) Extract Superclass/Interface: Allow extracting class with special name (and quotes)
|
- [`KT-15353`](https://youtrack.jetbrains.com/issue/KT-15353) Extract Superclass/Interface: Allow extracting class with special name (and quotes)
|
||||||
|
- [`KT-15643`](https://youtrack.jetbrains.com/issue/KT-15643) Extract Interface/Pull Up: Disable "Make abstract" and assume it to be true for primary constructor parameter when moving to an interface
|
||||||
|
|
||||||
#### Intention actions, inspections and quickfixes
|
#### Intention actions, inspections and quickfixes
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -22,6 +22,7 @@ import com.intellij.refactoring.JavaRefactoringSettings
|
|||||||
import com.intellij.refactoring.RefactoringBundle
|
import com.intellij.refactoring.RefactoringBundle
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ExtractSuperInfo
|
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ExtractSuperInfo
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.KotlinExtractInterfaceHandler
|
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.KotlinExtractInterfaceHandler
|
||||||
|
import org.jetbrains.kotlin.idea.refactoring.isConstructorDeclaredProperty
|
||||||
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
||||||
import org.jetbrains.kotlin.idea.refactoring.memberInfo.extractClassMembers
|
import org.jetbrains.kotlin.idea.refactoring.memberInfo.extractClassMembers
|
||||||
import org.jetbrains.kotlin.idea.refactoring.pullUp.getInterfaceContainmentVerifier
|
import org.jetbrains.kotlin.idea.refactoring.pullUp.getInterfaceContainmentVerifier
|
||||||
@@ -68,11 +69,14 @@ class KotlinExtractInterfaceDialog(
|
|||||||
if (!super.isAbstractEnabled(memberInfo)) return false
|
if (!super.isAbstractEnabled(memberInfo)) return false
|
||||||
val member = memberInfo.member
|
val member = memberInfo.member
|
||||||
if (member.isAbstractInInterface(originalClass)) return false
|
if (member.isAbstractInInterface(originalClass)) return false
|
||||||
|
if (member.isConstructorDeclaredProperty()) return false
|
||||||
return member is KtNamedFunction || (member is KtProperty && !member.mustBeAbstractInInterface()) || member is KtParameter
|
return member is KtNamedFunction || (member is KtProperty && !member.mustBeAbstractInInterface()) || member is KtParameter
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun isAbstractWhenDisabled(member: KotlinMemberInfo) =
|
override fun isAbstractWhenDisabled(memberInfo: KotlinMemberInfo): Boolean {
|
||||||
member.member is KtProperty || member.member.isAbstractInInterface(originalClass)
|
val member = memberInfo.member
|
||||||
|
return member is KtProperty || member.isAbstractInInterface(originalClass) || member.isConstructorDeclaredProperty()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -726,6 +726,8 @@ fun KtNamedDeclaration.isAbstract(): Boolean {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun KtNamedDeclaration.isConstructorDeclaredProperty() = this is KtParameter && ownerFunction is KtPrimaryConstructor && hasValOrVar()
|
||||||
|
|
||||||
fun <ListType : KtElement> replaceListPsiAndKeepDelimiters(
|
fun <ListType : KtElement> replaceListPsiAndKeepDelimiters(
|
||||||
originalList: ListType,
|
originalList: ListType,
|
||||||
newList: ListType,
|
newList: ListType,
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import com.intellij.refactoring.classMembers.MemberInfoModel
|
|||||||
import com.intellij.refactoring.memberPullUp.PullUpProcessor
|
import com.intellij.refactoring.memberPullUp.PullUpProcessor
|
||||||
import com.intellij.refactoring.util.DocCommentPolicy
|
import com.intellij.refactoring.util.DocCommentPolicy
|
||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
|
import org.jetbrains.kotlin.idea.refactoring.isConstructorDeclaredProperty
|
||||||
import org.jetbrains.kotlin.idea.refactoring.isCompanionMemberOf
|
import org.jetbrains.kotlin.idea.refactoring.isCompanionMemberOf
|
||||||
import org.jetbrains.kotlin.idea.refactoring.isInterfaceClass
|
import org.jetbrains.kotlin.idea.refactoring.isInterfaceClass
|
||||||
import org.jetbrains.kotlin.idea.refactoring.memberInfo.*
|
import org.jetbrains.kotlin.idea.refactoring.memberInfo.*
|
||||||
@@ -57,6 +58,10 @@ class KotlinPullUpDialog(
|
|||||||
) {
|
) {
|
||||||
private var lastSuperClass: PsiNamedElement? = null
|
private var lastSuperClass: PsiNamedElement? = null
|
||||||
|
|
||||||
|
private fun KtNamedDeclaration.isConstructorParameterWithInterfaceTarget(targetClass: PsiNamedElement): Boolean {
|
||||||
|
return targetClass is KtClass && targetClass.isInterface() && isConstructorDeclaredProperty()
|
||||||
|
}
|
||||||
|
|
||||||
// Abstract members remain abstract
|
// Abstract members remain abstract
|
||||||
override fun isFixedAbstract(memberInfo: KotlinMemberInfo?) = true
|
override fun isFixedAbstract(memberInfo: KotlinMemberInfo?) = true
|
||||||
|
|
||||||
@@ -78,6 +83,7 @@ class KotlinPullUpDialog(
|
|||||||
member.hasModifier(KtTokens.EXTERNAL_KEYWORD) ||
|
member.hasModifier(KtTokens.EXTERNAL_KEYWORD) ||
|
||||||
member.hasModifier(KtTokens.LATEINIT_KEYWORD)) return false
|
member.hasModifier(KtTokens.LATEINIT_KEYWORD)) return false
|
||||||
if (member.isAbstractInInterface(sourceClass)) return false
|
if (member.isAbstractInInterface(sourceClass)) return false
|
||||||
|
if (member.isConstructorParameterWithInterfaceTarget(superClass)) return false
|
||||||
if (member.isCompanionMemberOf(sourceClass)) return false
|
if (member.isCompanionMemberOf(sourceClass)) return false
|
||||||
|
|
||||||
if (!superClass.isInterface()) return true
|
if (!superClass.isInterface()) return true
|
||||||
@@ -86,9 +92,11 @@ class KotlinPullUpDialog(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun isAbstractWhenDisabled(memberInfo: KotlinMemberInfo): Boolean {
|
override fun isAbstractWhenDisabled(memberInfo: KotlinMemberInfo): Boolean {
|
||||||
|
val superClass = superClass
|
||||||
val member = memberInfo.member
|
val member = memberInfo.member
|
||||||
if (member.isCompanionMemberOf(sourceClass)) return false
|
if (member.isCompanionMemberOf(sourceClass)) return false
|
||||||
if (member.isAbstractInInterface(sourceClass)) return true
|
if (member.isAbstractInInterface(sourceClass)) return true
|
||||||
|
if (superClass != null && member.isConstructorParameterWithInterfaceTarget(superClass)) return true
|
||||||
return ((member is KtProperty || member is KtParameter) && superClass !is PsiClass)
|
return ((member is KtProperty || member is KtParameter) && superClass !is PsiClass)
|
||||||
|| (member is KtNamedFunction && superClass is PsiClass)
|
|| (member is KtNamedFunction && superClass is PsiClass)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.refactoring.pullUp
|
|||||||
|
|
||||||
import com.intellij.psi.PsiClass
|
import com.intellij.psi.PsiClass
|
||||||
import com.intellij.psi.PsiMethod
|
import com.intellij.psi.PsiMethod
|
||||||
|
import com.intellij.psi.PsiNamedElement
|
||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
|||||||
Reference in New Issue
Block a user