Extract Interface: Red-highlight members inherited from a super-interface when that interface reference itself is not extracted

#KT-15598 Fixed
This commit is contained in:
Alexey Sedunov
2017-01-12 18:33:09 +03:00
parent 57d364e7d4
commit ea7bf6b7c1
2 changed files with 23 additions and 0 deletions
@@ -16,15 +16,19 @@
package org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ui
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.intellij.refactoring.HelpID
import com.intellij.refactoring.JavaRefactoringSettings
import com.intellij.refactoring.RefactoringBundle
import com.intellij.refactoring.classMembers.MemberInfoModel
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.memberInfo.lightElementForMemberInfo
import org.jetbrains.kotlin.idea.refactoring.pullUp.getInterfaceContainmentVerifier
import org.jetbrains.kotlin.idea.refactoring.pullUp.isAbstractInInterface
import org.jetbrains.kotlin.idea.refactoring.pullUp.mustBeAbstractInInterface
@@ -79,6 +83,24 @@ class KotlinExtractInterfaceDialog(
val member = memberInfo.member
return member is KtProperty || member.isAbstractInInterface(originalClass) || member.isConstructorDeclaredProperty()
}
override fun checkForProblems(memberInfo: KotlinMemberInfo): Int {
val result = super.checkForProblems(memberInfo)
if (result != MemberInfoModel.OK) return result
if (!memberInfo.isSuperClass || memberInfo.overrides != false || memberInfo.isChecked) return result
val psiSuperInterface = lightElementForMemberInfo(memberInfo.member) as? PsiClass ?: return result
for (info in memberInfos) {
if (!info.isChecked || info.isToAbstract) continue
val member = info.member ?: continue
val psiMethodToCheck = lightElementForMemberInfo(member) as? PsiMethod ?: continue
if (psiSuperInterface.findMethodBySignature(psiMethodToCheck, true) != null) return MemberInfoModel.ERROR
}
return result
}
}
}