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:
Alexey Sedunov
2017-01-11 12:55:11 +03:00
parent 52e9117e9d
commit c9781f5014
5 changed files with 18 additions and 2 deletions
+1
View File
@@ -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-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-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
@@ -22,6 +22,7 @@ import com.intellij.refactoring.JavaRefactoringSettings
import com.intellij.refactoring.RefactoringBundle
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ExtractSuperInfo
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.extractClassMembers
import org.jetbrains.kotlin.idea.refactoring.pullUp.getInterfaceContainmentVerifier
@@ -68,11 +69,14 @@ class KotlinExtractInterfaceDialog(
if (!super.isAbstractEnabled(memberInfo)) return false
val member = memberInfo.member
if (member.isAbstractInInterface(originalClass)) return false
if (member.isConstructorDeclaredProperty()) return false
return member is KtNamedFunction || (member is KtProperty && !member.mustBeAbstractInInterface()) || member is KtParameter
}
override fun isAbstractWhenDisabled(member: KotlinMemberInfo) =
member.member is KtProperty || member.member.isAbstractInInterface(originalClass)
override fun isAbstractWhenDisabled(memberInfo: KotlinMemberInfo): Boolean {
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(
originalList: ListType,
newList: ListType,
@@ -27,6 +27,7 @@ import com.intellij.refactoring.classMembers.MemberInfoModel
import com.intellij.refactoring.memberPullUp.PullUpProcessor
import com.intellij.refactoring.util.DocCommentPolicy
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.isInterfaceClass
import org.jetbrains.kotlin.idea.refactoring.memberInfo.*
@@ -57,6 +58,10 @@ class KotlinPullUpDialog(
) {
private var lastSuperClass: PsiNamedElement? = null
private fun KtNamedDeclaration.isConstructorParameterWithInterfaceTarget(targetClass: PsiNamedElement): Boolean {
return targetClass is KtClass && targetClass.isInterface() && isConstructorDeclaredProperty()
}
// Abstract members remain abstract
override fun isFixedAbstract(memberInfo: KotlinMemberInfo?) = true
@@ -78,6 +83,7 @@ class KotlinPullUpDialog(
member.hasModifier(KtTokens.EXTERNAL_KEYWORD) ||
member.hasModifier(KtTokens.LATEINIT_KEYWORD)) return false
if (member.isAbstractInInterface(sourceClass)) return false
if (member.isConstructorParameterWithInterfaceTarget(superClass)) return false
if (member.isCompanionMemberOf(sourceClass)) return false
if (!superClass.isInterface()) return true
@@ -86,9 +92,11 @@ class KotlinPullUpDialog(
}
override fun isAbstractWhenDisabled(memberInfo: KotlinMemberInfo): Boolean {
val superClass = superClass
val member = memberInfo.member
if (member.isCompanionMemberOf(sourceClass)) return false
if (member.isAbstractInInterface(sourceClass)) return true
if (superClass != null && member.isConstructorParameterWithInterfaceTarget(superClass)) return true
return ((member is KtProperty || member is KtParameter) && 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.PsiMethod
import com.intellij.psi.PsiNamedElement
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor