Pull Up: Minor: Use property access syntax
This commit is contained in:
@@ -40,34 +40,34 @@ public class KotlinMemberInfo(member: JetNamedDeclaration, val isSuperClass: Boo
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
val memberDescriptor = member.resolveToDescriptor()
|
val memberDescriptor = member.resolveToDescriptor()
|
||||||
isStatic = member.getParent() is JetFile
|
isStatic = member.parent is JetFile
|
||||||
|
|
||||||
if (member is JetClass && isSuperClass) {
|
if (member is JetClass && isSuperClass) {
|
||||||
if (member.isInterface()) {
|
if (member.isInterface()) {
|
||||||
displayName = RefactoringBundle.message("member.info.implements.0", member.getName())
|
displayName = RefactoringBundle.message("member.info.implements.0", member.name)
|
||||||
overrides = false
|
overrides = false
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
displayName = RefactoringBundle.message("member.info.extends.0", member.getName())
|
displayName = RefactoringBundle.message("member.info.extends.0", member.name)
|
||||||
overrides = true
|
overrides = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
displayName = RENDERER.render(memberDescriptor)
|
displayName = RENDERER.render(memberDescriptor)
|
||||||
if (memberDescriptor is MemberDescriptor && memberDescriptor.getModality() == Modality.ABSTRACT) {
|
if (memberDescriptor is MemberDescriptor && memberDescriptor.modality == Modality.ABSTRACT) {
|
||||||
displayName = "abstract $displayName"
|
displayName = "abstract $displayName"
|
||||||
}
|
}
|
||||||
|
|
||||||
val overriddenDescriptors = (memberDescriptor as? CallableMemberDescriptor)?.getOverriddenDescriptors() ?: emptySet()
|
val overriddenDescriptors = (memberDescriptor as? CallableMemberDescriptor)?.overriddenDescriptors ?: emptySet()
|
||||||
if (overriddenDescriptors.isNotEmpty()) {
|
if (overriddenDescriptors.isNotEmpty()) {
|
||||||
overrides = overriddenDescriptors.any { it.getModality() != Modality.ABSTRACT }
|
overrides = overriddenDescriptors.any { it.modality != Modality.ABSTRACT }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun KotlinMemberInfo.toJavaMemberInfo(): MemberInfo? {
|
public fun KotlinMemberInfo.toJavaMemberInfo(): MemberInfo? {
|
||||||
val declaration = getMember()
|
val declaration = member
|
||||||
val psiMember: PsiMember? = when (declaration) {
|
val psiMember: PsiMember? = when (declaration) {
|
||||||
is JetNamedFunction, is JetProperty -> declaration.getRepresentativeLightMethod()
|
is JetNamedFunction, is JetProperty -> declaration.getRepresentativeLightMethod()
|
||||||
is JetClassOrObject -> declaration.toLightClass()
|
is JetClassOrObject -> declaration.toLightClass()
|
||||||
@@ -76,6 +76,6 @@ public fun KotlinMemberInfo.toJavaMemberInfo(): MemberInfo? {
|
|||||||
if (psiMember == null) return null
|
if (psiMember == null) return null
|
||||||
|
|
||||||
val info = MemberInfo(psiMember, isSuperClass, null)
|
val info = MemberInfo(psiMember, isSuperClass, null)
|
||||||
info.setToAbstract(isToAbstract())
|
info.isToAbstract = isToAbstract
|
||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
+8
-10
@@ -18,12 +18,10 @@ package org.jetbrains.kotlin.idea.refactoring.memberInfo
|
|||||||
|
|
||||||
import com.intellij.refactoring.classMembers.AbstractMemberInfoStorage
|
import com.intellij.refactoring.classMembers.AbstractMemberInfoStorage
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
@@ -39,11 +37,11 @@ public class KotlinMemberInfoStorage(
|
|||||||
override fun memberConflict(member1: JetNamedDeclaration, member: JetNamedDeclaration): Boolean {
|
override fun memberConflict(member1: JetNamedDeclaration, member: JetNamedDeclaration): Boolean {
|
||||||
val descriptor1 = member1.resolveToDescriptor()
|
val descriptor1 = member1.resolveToDescriptor()
|
||||||
val descriptor = member.resolveToDescriptor()
|
val descriptor = member.resolveToDescriptor()
|
||||||
if (descriptor1.getName() != descriptor.getName()) return false
|
if (descriptor1.name != descriptor.name) return false
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
descriptor1 is FunctionDescriptor && descriptor is FunctionDescriptor -> {
|
descriptor1 is FunctionDescriptor && descriptor is FunctionDescriptor -> {
|
||||||
!OverloadUtil.isOverloadable(descriptor1, descriptor).isSuccess()
|
!OverloadUtil.isOverloadable(descriptor1, descriptor).isSuccess
|
||||||
}
|
}
|
||||||
descriptor1 is PropertyDescriptor && descriptor is PropertyDescriptor,
|
descriptor1 is PropertyDescriptor && descriptor is PropertyDescriptor,
|
||||||
descriptor1 is ClassDescriptor && descriptor is ClassDescriptor -> true
|
descriptor1 is ClassDescriptor && descriptor is ClassDescriptor -> true
|
||||||
@@ -53,9 +51,9 @@ public class KotlinMemberInfoStorage(
|
|||||||
|
|
||||||
override fun buildSubClassesMap(aClass: JetClassOrObject) {
|
override fun buildSubClassesMap(aClass: JetClassOrObject) {
|
||||||
val classDescriptor = aClass.resolveToDescriptor() as ClassDescriptor
|
val classDescriptor = aClass.resolveToDescriptor() as ClassDescriptor
|
||||||
val classType = classDescriptor.getDefaultType()
|
val classType = classDescriptor.defaultType
|
||||||
for (supertype in classType.immediateSupertypes()) {
|
for (supertype in classType.immediateSupertypes()) {
|
||||||
val superClass = supertype.getConstructor().getDeclarationDescriptor()?.getSource()?.getPsi() as? JetClassOrObject
|
val superClass = supertype.constructor.declarationDescriptor?.source?.getPsi() as? JetClassOrObject
|
||||||
?: continue
|
?: continue
|
||||||
getSubclasses(superClass).add(aClass)
|
getSubclasses(superClass).add(aClass)
|
||||||
buildSubClassesMap(superClass)
|
buildSubClassesMap(superClass)
|
||||||
@@ -70,7 +68,7 @@ public class KotlinMemberInfoStorage(
|
|||||||
|
|
||||||
override fun extractClassMembers(aClass: JetClassOrObject, temp: ArrayList<KotlinMemberInfo>) {
|
override fun extractClassMembers(aClass: JetClassOrObject, temp: ArrayList<KotlinMemberInfo>) {
|
||||||
val context = aClass.analyze()
|
val context = aClass.analyze()
|
||||||
aClass.getDeclarations()
|
aClass.declarations
|
||||||
.filter { it is JetNamedDeclaration
|
.filter { it is JetNamedDeclaration
|
||||||
&& it !is JetConstructor<*>
|
&& it !is JetConstructor<*>
|
||||||
&& !(it is JetObjectDeclaration && it.isCompanion())
|
&& !(it is JetObjectDeclaration && it.isCompanion())
|
||||||
@@ -79,9 +77,9 @@ public class KotlinMemberInfoStorage(
|
|||||||
aClass.getDelegationSpecifiers()
|
aClass.getDelegationSpecifiers()
|
||||||
.filterIsInstance<JetDelegatorToSuperClass>()
|
.filterIsInstance<JetDelegatorToSuperClass>()
|
||||||
.map {
|
.map {
|
||||||
val type = context[BindingContext.TYPE, it.getTypeReference()]
|
val type = context[BindingContext.TYPE, it.typeReference]
|
||||||
val classDescriptor = type?.getConstructor()?.getDeclarationDescriptor() as? ClassDescriptor
|
val classDescriptor = type?.constructor?.declarationDescriptor as? ClassDescriptor
|
||||||
classDescriptor?.getSource()?.getPsi() as? JetClass
|
classDescriptor?.source?.getPsi() as? JetClass
|
||||||
}
|
}
|
||||||
.filter { it != null && it.isInterface() }
|
.filter { it != null && it.isInterface() }
|
||||||
.mapTo(temp) { KotlinMemberInfo(it!!, true) }
|
.mapTo(temp) { KotlinMemberInfo(it!!, true) }
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ public class KotlinMemberSelectionPanel(title: String,
|
|||||||
private val table = createMemberSelectionTable(memberInfo, abstractColumnHeader)
|
private val table = createMemberSelectionTable(memberInfo, abstractColumnHeader)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
setLayout(BorderLayout())
|
layout = BorderLayout()
|
||||||
|
|
||||||
val scrollPane = ScrollPaneFactory.createScrollPane(table)
|
val scrollPane = ScrollPaneFactory.createScrollPane(table)
|
||||||
add(SeparatorFactory.createSeparator(title, table), BorderLayout.NORTH)
|
add(SeparatorFactory.createSeparator(title, table), BorderLayout.NORTH)
|
||||||
|
|||||||
+6
-9
@@ -17,11 +17,8 @@
|
|||||||
package org.jetbrains.kotlin.idea.refactoring.memberInfo
|
package org.jetbrains.kotlin.idea.refactoring.memberInfo
|
||||||
|
|
||||||
import com.intellij.icons.AllIcons
|
import com.intellij.icons.AllIcons
|
||||||
import com.intellij.psi.PsiMethod
|
|
||||||
import com.intellij.psi.PsiModifier
|
|
||||||
import com.intellij.refactoring.classMembers.MemberInfoModel
|
import com.intellij.refactoring.classMembers.MemberInfoModel
|
||||||
import com.intellij.refactoring.ui.AbstractMemberSelectionTable
|
import com.intellij.refactoring.ui.AbstractMemberSelectionTable
|
||||||
import com.intellij.refactoring.ui.MemberSelectionTable
|
|
||||||
import com.intellij.ui.RowIcon
|
import com.intellij.ui.RowIcon
|
||||||
import org.jetbrains.kotlin.idea.JetIconProvider
|
import org.jetbrains.kotlin.idea.JetIconProvider
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
@@ -38,13 +35,13 @@ public class KotlinMemberSelectionTable(
|
|||||||
override fun getAbstractColumnValue(memberInfo: KotlinMemberInfo): Any? {
|
override fun getAbstractColumnValue(memberInfo: KotlinMemberInfo): Any? {
|
||||||
if (memberInfo.isStatic()) return null
|
if (memberInfo.isStatic()) return null
|
||||||
|
|
||||||
val member = memberInfo.getMember()
|
val member = memberInfo.member
|
||||||
if (member !is JetNamedFunction && member !is JetProperty) return null
|
if (member !is JetNamedFunction && member !is JetProperty) return null
|
||||||
|
|
||||||
if (member.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
if (member.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
||||||
myMemberInfoModel.isFixedAbstract(memberInfo)?.let { return it }
|
myMemberInfoModel.isFixedAbstract(memberInfo)?.let { return it }
|
||||||
}
|
}
|
||||||
if (myMemberInfoModel.isAbstractEnabled(memberInfo)) return memberInfo.isToAbstract()
|
if (myMemberInfoModel.isAbstractEnabled(memberInfo)) return memberInfo.isToAbstract
|
||||||
return myMemberInfoModel.isAbstractWhenDisabled(memberInfo)
|
return myMemberInfoModel.isAbstractWhenDisabled(memberInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,24 +50,24 @@ public class KotlinMemberSelectionTable(
|
|||||||
|
|
||||||
if (memberInfo.isStatic()) return false
|
if (memberInfo.isStatic()) return false
|
||||||
|
|
||||||
val member = memberInfo.getMember()
|
val member = memberInfo.member
|
||||||
if (member !is JetNamedFunction && member !is JetProperty) return false
|
if (member !is JetNamedFunction && member !is JetProperty) return false
|
||||||
|
|
||||||
if (member.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
if (member.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
||||||
myMemberInfoModel.isFixedAbstract(memberInfo)?.let { return false }
|
myMemberInfoModel.isFixedAbstract(memberInfo)?.let { return false }
|
||||||
}
|
}
|
||||||
|
|
||||||
return memberInfo.isChecked() && myMemberInfoModel.isAbstractEnabled(memberInfo)
|
return memberInfo.isChecked && myMemberInfoModel.isAbstractEnabled(memberInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setVisibilityIcon(memberInfo: KotlinMemberInfo, icon: RowIcon) {
|
override fun setVisibilityIcon(memberInfo: KotlinMemberInfo, icon: RowIcon) {
|
||||||
icon.setIcon(JetIconProvider.getVisibilityIcon(memberInfo.getMember().getModifierList()), 1);
|
icon.setIcon(JetIconProvider.getVisibilityIcon(memberInfo.member.modifierList), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getOverrideIcon(memberInfo: KotlinMemberInfo): Icon? {
|
override fun getOverrideIcon(memberInfo: KotlinMemberInfo): Icon? {
|
||||||
val defaultIcon = AbstractMemberSelectionTable.EMPTY_OVERRIDE_ICON
|
val defaultIcon = AbstractMemberSelectionTable.EMPTY_OVERRIDE_ICON
|
||||||
|
|
||||||
val member = memberInfo.getMember()
|
val member = memberInfo.member
|
||||||
if (member !is JetNamedFunction && member !is JetProperty) return defaultIcon
|
if (member !is JetNamedFunction && member !is JetProperty) return defaultIcon
|
||||||
|
|
||||||
return when (memberInfo.getOverrides()) {
|
return when (memberInfo.getOverrides()) {
|
||||||
|
|||||||
@@ -18,4 +18,4 @@ package org.jetbrains.kotlin.idea.refactoring.memberInfo
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.psi.JetClassOrObject
|
import org.jetbrains.kotlin.psi.JetClassOrObject
|
||||||
|
|
||||||
public fun JetClassOrObject.qualifiedNameForRendering(): String = getFqName()?.asString() ?: getName() ?: "[Anonymous]"
|
public fun JetClassOrObject.qualifiedNameForRendering(): String = fqName?.asString() ?: name ?: "[Anonymous]"
|
||||||
@@ -21,17 +21,7 @@ import com.intellij.psi.PsiField
|
|||||||
import com.intellij.psi.PsiMember
|
import com.intellij.psi.PsiMember
|
||||||
import com.intellij.psi.PsiSubstitutor
|
import com.intellij.psi.PsiSubstitutor
|
||||||
import com.intellij.refactoring.classMembers.MemberInfoBase
|
import com.intellij.refactoring.classMembers.MemberInfoBase
|
||||||
import com.intellij.refactoring.memberPullUp.PullUpData
|
|
||||||
import com.intellij.refactoring.memberPullUp.PullUpHelper
|
import com.intellij.refactoring.memberPullUp.PullUpHelper
|
||||||
import com.intellij.refactoring.memberPullUp.PullUpHelperFactory
|
|
||||||
import org.jetbrains.kotlin.asJava.namedUnwrappedElement
|
|
||||||
import org.jetbrains.kotlin.asJava.unwrapped
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
|
||||||
import org.jetbrains.kotlin.psi.JetClassOrObject
|
|
||||||
import org.jetbrains.kotlin.psi.JetNamedDeclaration
|
|
||||||
import org.jetbrains.kotlin.types.TypeSubstitutor
|
|
||||||
import org.jetbrains.kotlin.types.substitutions.getTypeSubstitutor
|
|
||||||
import java.util.LinkedHashSet
|
import java.util.LinkedHashSet
|
||||||
|
|
||||||
object EmptyPullUpHelper : PullUpHelper<MemberInfoBase<PsiMember>> {
|
object EmptyPullUpHelper : PullUpHelper<MemberInfoBase<PsiMember>> {
|
||||||
|
|||||||
@@ -16,21 +16,22 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.refactoring.pullUp
|
package org.jetbrains.kotlin.idea.refactoring.pullUp
|
||||||
|
|
||||||
import com.intellij.refactoring.memberPullUp.PullUpData
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.core.getResolutionScope
|
import org.jetbrains.kotlin.idea.core.getResolutionScope
|
||||||
import org.jetbrains.kotlin.psi.JetClass
|
import org.jetbrains.kotlin.psi.JetClass
|
||||||
import org.jetbrains.kotlin.psi.JetClassOrObject
|
import org.jetbrains.kotlin.psi.JetClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.JetNamedDeclaration
|
import org.jetbrains.kotlin.psi.JetNamedDeclaration
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.TypeConstructor
|
||||||
|
import org.jetbrains.kotlin.types.TypeProjection
|
||||||
|
import org.jetbrains.kotlin.types.TypeProjectionImpl
|
||||||
|
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||||
import org.jetbrains.kotlin.types.substitutions.getTypeSubstitution
|
import org.jetbrains.kotlin.types.substitutions.getTypeSubstitution
|
||||||
import org.jetbrains.kotlin.utils.keysToMap
|
import org.jetbrains.kotlin.utils.keysToMap
|
||||||
import java.util.*
|
import java.util.LinkedHashMap
|
||||||
|
|
||||||
class KotlinPullUpData(val sourceClass: JetClassOrObject,
|
class KotlinPullUpData(val sourceClass: JetClassOrObject,
|
||||||
val targetClass: JetClass,
|
val targetClass: JetClass,
|
||||||
@@ -46,7 +47,7 @@ class KotlinPullUpData(val sourceClass: JetClassOrObject,
|
|||||||
val targetClassDescriptor = resolutionFacade.resolveToDescriptor(targetClass) as ClassDescriptor
|
val targetClassDescriptor = resolutionFacade.resolveToDescriptor(targetClass) as ClassDescriptor
|
||||||
|
|
||||||
val typeParametersInSourceClassContext by lazy {
|
val typeParametersInSourceClassContext by lazy {
|
||||||
sourceClassDescriptor.getTypeConstructor().getParameters() + sourceClass.getResolutionScope(sourceClassContext, resolutionFacade)
|
sourceClassDescriptor.typeConstructor.parameters + sourceClass.getResolutionScope(sourceClassContext, resolutionFacade)
|
||||||
.getDescriptors(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS)
|
.getDescriptors(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS)
|
||||||
.filterIsInstance<TypeParameterDescriptor>()
|
.filterIsInstance<TypeParameterDescriptor>()
|
||||||
}
|
}
|
||||||
@@ -55,17 +56,17 @@ class KotlinPullUpData(val sourceClass: JetClassOrObject,
|
|||||||
val substitution = LinkedHashMap<TypeConstructor, TypeProjection>()
|
val substitution = LinkedHashMap<TypeConstructor, TypeProjection>()
|
||||||
|
|
||||||
typeParametersInSourceClassContext.forEach {
|
typeParametersInSourceClassContext.forEach {
|
||||||
substitution[it.getTypeConstructor()] = TypeProjectionImpl(it.getUpperBoundsAsType())
|
substitution[it.typeConstructor] = TypeProjectionImpl(it.upperBoundsAsType)
|
||||||
}
|
}
|
||||||
|
|
||||||
val superClassSubstitution = getTypeSubstitution(targetClassDescriptor.getDefaultType(), sourceClassDescriptor.getDefaultType())
|
val superClassSubstitution = getTypeSubstitution(targetClassDescriptor.defaultType, sourceClassDescriptor.defaultType)
|
||||||
?: emptyMap<TypeConstructor, TypeProjection>()
|
?: emptyMap<TypeConstructor, TypeProjection>()
|
||||||
for ((typeConstructor, typeProjection) in superClassSubstitution) {
|
for ((typeConstructor, typeProjection) in superClassSubstitution) {
|
||||||
val subClassTypeParameter = typeProjection.getType().getConstructor().getDeclarationDescriptor() as? TypeParameterDescriptor
|
val subClassTypeParameter = typeProjection.type.constructor.declarationDescriptor as? TypeParameterDescriptor
|
||||||
?: continue
|
?: continue
|
||||||
val superClassTypeParameter = typeConstructor.getDeclarationDescriptor()
|
val superClassTypeParameter = typeConstructor.declarationDescriptor
|
||||||
?: continue
|
?: continue
|
||||||
substitution[subClassTypeParameter.getTypeConstructor()] = TypeProjectionImpl(superClassTypeParameter.getDefaultType())
|
substitution[subClassTypeParameter.typeConstructor] = TypeProjectionImpl(superClassTypeParameter.defaultType)
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeSubstitutor.create(substitution)
|
TypeSubstitutor.create(substitution)
|
||||||
|
|||||||
@@ -52,21 +52,21 @@ public class KotlinPullUpDialog(
|
|||||||
* Classes do not have abstractness
|
* Classes do not have abstractness
|
||||||
*/
|
*/
|
||||||
override fun isAbstractEnabled(memberInfo: KotlinMemberInfo): Boolean {
|
override fun isAbstractEnabled(memberInfo: KotlinMemberInfo): Boolean {
|
||||||
val superClass = getSuperClass() ?: return false
|
val superClass = superClass ?: return false
|
||||||
if (!superClass.isInterface()) return true
|
if (!superClass.isInterface()) return true
|
||||||
|
|
||||||
val member = memberInfo.getMember()
|
val member = memberInfo.member
|
||||||
return member is JetNamedFunction || (member is JetProperty && !member.mustBeAbstractInInterface())
|
return member is JetNamedFunction || (member is JetProperty && !member.mustBeAbstractInInterface())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun isAbstractWhenDisabled(memberInfo: KotlinMemberInfo): Boolean {
|
override fun isAbstractWhenDisabled(memberInfo: KotlinMemberInfo): Boolean {
|
||||||
return memberInfo.getMember() is JetProperty
|
return memberInfo.member is JetProperty
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun isMemberEnabled(memberInfo: KotlinMemberInfo): Boolean {
|
override fun isMemberEnabled(memberInfo: KotlinMemberInfo): Boolean {
|
||||||
val superClass = getSuperClass() ?: return false
|
val superClass = superClass ?: return false
|
||||||
if (memberInfo in memberInfoStorage.getDuplicatedMemberInfos(superClass)) return false
|
if (memberInfo in memberInfoStorage.getDuplicatedMemberInfos(superClass)) return false
|
||||||
if (memberInfo.getMember() in memberInfoStorage.getExtending(superClass)) return false
|
if (memberInfo.member in memberInfoStorage.getExtending(superClass)) return false
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,7 @@ public class KotlinPullUpDialog(
|
|||||||
|
|
||||||
protected val sourceClass: JetClassOrObject get() = myClass
|
protected val sourceClass: JetClassOrObject get() = myClass
|
||||||
|
|
||||||
override fun getDimensionServiceKey() = "#" + javaClass.getName()
|
override fun getDimensionServiceKey() = "#" + javaClass.name
|
||||||
|
|
||||||
override fun getSuperClass() = super.getSuperClass() as? JetClass
|
override fun getSuperClass() = super.getSuperClass() as? JetClass
|
||||||
|
|
||||||
@@ -87,8 +87,8 @@ public class KotlinPullUpDialog(
|
|||||||
KotlinMemberSelectionTable(infos, null, "Make abstract")
|
KotlinMemberSelectionTable(infos, null, "Make abstract")
|
||||||
|
|
||||||
override fun doAction() {
|
override fun doAction() {
|
||||||
val selectedMembers = getSelectedMemberInfos()
|
val selectedMembers = selectedMemberInfos
|
||||||
val targetClass = getSuperClass()!!
|
val targetClass = superClass!!
|
||||||
checkConflicts(getProject(), sourceClass, targetClass, selectedMembers, { close(DialogWrapper.OK_EXIT_CODE) }) {
|
checkConflicts(getProject(), sourceClass, targetClass, selectedMembers, { close(DialogWrapper.OK_EXIT_CODE) }) {
|
||||||
invokeRefactoring(createProcessor(sourceClass, targetClass, selectedMembers))
|
invokeRefactoring(createProcessor(sourceClass, targetClass, selectedMembers))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,11 +75,11 @@ public class KotlinPullUpHandler : RefactoringActionHandler, ElementsHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun invoke(project: Project, editor: Editor, file: PsiFile, dataContext: DataContext?) {
|
override fun invoke(project: Project, editor: Editor, file: PsiFile, dataContext: DataContext?) {
|
||||||
val offset = editor.getCaretModel().getOffset()
|
val offset = editor.caretModel.offset
|
||||||
editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE)
|
editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
|
||||||
|
|
||||||
val target = (file.findElementAt(offset) ?: return).parentsWithSelf.firstOrNull {
|
val target = (file.findElementAt(offset) ?: return).parentsWithSelf.firstOrNull {
|
||||||
it is JetClassOrObject || ((it is JetNamedFunction || it is JetProperty) && it.getParent() is JetClassBody)
|
it is JetClassOrObject || ((it is JetNamedFunction || it is JetProperty) && it.parent is JetClassBody)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
@@ -119,11 +119,11 @@ public class KotlinPullUpHandler : RefactoringActionHandler, ElementsHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val classDescriptor = classOrObject.resolveToDescriptor() as ClassDescriptor
|
val classDescriptor = classOrObject.resolveToDescriptor() as ClassDescriptor
|
||||||
val superClasses = classDescriptor.getDefaultType()
|
val superClasses = classDescriptor.defaultType
|
||||||
.supertypes()
|
.supertypes()
|
||||||
.asSequence()
|
.asSequence()
|
||||||
.map {
|
.map {
|
||||||
val descriptor = it.getConstructor().getDeclarationDescriptor()
|
val descriptor = it.constructor.declarationDescriptor
|
||||||
val declaration = descriptor?.let { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) }
|
val declaration = descriptor?.let { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) }
|
||||||
if (declaration is JetClass && declaration.canRefactor()) declaration else null
|
if (declaration is JetClass && declaration.canRefactor()) declaration else null
|
||||||
}
|
}
|
||||||
@@ -144,7 +144,7 @@ public class KotlinPullUpHandler : RefactoringActionHandler, ElementsHandler {
|
|||||||
val memberInfoStorage = KotlinMemberInfoStorage(classOrObject)
|
val memberInfoStorage = KotlinMemberInfoStorage(classOrObject)
|
||||||
val members = memberInfoStorage.getClassMemberInfos(classOrObject)
|
val members = memberInfoStorage.getClassMemberInfos(classOrObject)
|
||||||
|
|
||||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
if (ApplicationManager.getApplication().isUnitTestMode) {
|
||||||
val helper = dataContext?.getData(PULLUP_TEST_HELPER_KEY) as TestHelper
|
val helper = dataContext?.getData(PULLUP_TEST_HELPER_KEY) as TestHelper
|
||||||
val selectedMembers = helper.adjustMembers(members)
|
val selectedMembers = helper.adjustMembers(members)
|
||||||
val targetClass = helper.chooseSuperClass(superClasses)
|
val targetClass = helper.chooseSuperClass(superClasses)
|
||||||
@@ -153,8 +153,8 @@ public class KotlinPullUpHandler : RefactoringActionHandler, ElementsHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val manager = classOrObject.getManager()
|
val manager = classOrObject.manager
|
||||||
members.filter { manager.areElementsEquivalent(it.getMember(), member) }.forEach { it.setChecked(true) }
|
members.filter { manager.areElementsEquivalent(it.member, member) }.forEach { it.isChecked = true }
|
||||||
|
|
||||||
KotlinPullUpDialog(project, classOrObject, superClasses, memberInfoStorage).show()
|
KotlinPullUpDialog(project, classOrObject, superClasses, memberInfoStorage).show()
|
||||||
}
|
}
|
||||||
@@ -164,7 +164,7 @@ public class KotlinPullUpHandler : RefactoringActionHandler, ElementsHandler {
|
|||||||
return elements.mapTo(HashSet<PsiElement>()) {
|
return elements.mapTo(HashSet<PsiElement>()) {
|
||||||
when (it) {
|
when (it) {
|
||||||
is JetNamedFunction, is JetProperty ->
|
is JetNamedFunction, is JetProperty ->
|
||||||
(it.getParent() as? JetClassBody)?.getParent() as? JetClassOrObject
|
(it.parent as? JetClassBody)?.parent as? JetClassOrObject
|
||||||
is JetClassOrObject -> it
|
is JetClassOrObject -> it
|
||||||
else -> null
|
else -> null
|
||||||
} ?: return false
|
} ?: return false
|
||||||
|
|||||||
@@ -78,19 +78,19 @@ class KotlinPullUpHelper(
|
|||||||
|
|
||||||
override fun visitSimpleNameExpression(expression: JetSimpleNameExpression, arg: Nothing?): Boolean {
|
override fun visitSimpleNameExpression(expression: JetSimpleNameExpression, arg: Nothing?): Boolean {
|
||||||
val resolvedCall = expression.getResolvedCall(data.resolutionFacade.analyze(expression)) ?: return true
|
val resolvedCall = expression.getResolvedCall(data.resolutionFacade.analyze(expression)) ?: return true
|
||||||
val receiver = (resolvedCall.getExplicitReceiverValue() as? ExpressionReceiver)?.getExpression()
|
val receiver = (resolvedCall.getExplicitReceiverValue() as? ExpressionReceiver)?.expression
|
||||||
if (receiver != null && receiver !is JetThisExpression && receiver !is JetSuperExpression) return true
|
if (receiver != null && receiver !is JetThisExpression && receiver !is JetSuperExpression) return true
|
||||||
|
|
||||||
var descriptor: DeclarationDescriptor = resolvedCall.getResultingDescriptor()
|
var descriptor: DeclarationDescriptor = resolvedCall.resultingDescriptor
|
||||||
if (descriptor is ConstructorDescriptor) {
|
if (descriptor is ConstructorDescriptor) {
|
||||||
descriptor = descriptor.getContainingDeclaration()
|
descriptor = descriptor.containingDeclaration
|
||||||
}
|
}
|
||||||
// todo: local functions
|
// todo: local functions
|
||||||
if (descriptor is ValueParameterDescriptor) return true
|
if (descriptor is ValueParameterDescriptor) return true
|
||||||
if (descriptor is ClassDescriptor && !descriptor.isInner()) return true
|
if (descriptor is ClassDescriptor && !descriptor.isInner) return true
|
||||||
if (descriptor is MemberDescriptor) {
|
if (descriptor is MemberDescriptor) {
|
||||||
if (descriptor.getSource().getPsi() in propertiesToMoveInitializers) return true
|
if (descriptor.source.getPsi() in propertiesToMoveInitializers) return true
|
||||||
descriptor = descriptor.getContainingDeclaration()
|
descriptor = descriptor.containingDeclaration
|
||||||
}
|
}
|
||||||
return descriptor is PackageFragmentDescriptor
|
return descriptor is PackageFragmentDescriptor
|
||||||
|| (descriptor is ClassDescriptor && DescriptorUtils.isSubclass(data.targetClassDescriptor, descriptor))
|
|| (descriptor is ClassDescriptor && DescriptorUtils.isSubclass(data.targetClassDescriptor, descriptor))
|
||||||
@@ -109,14 +109,14 @@ class KotlinPullUpHelper(
|
|||||||
|
|
||||||
var initializerCandidate: JetExpression? = null
|
var initializerCandidate: JetExpression? = null
|
||||||
|
|
||||||
for (statement in scope.getStatements()) {
|
for (statement in scope.statements) {
|
||||||
statement.asAssignment()?.let body@ {
|
statement.asAssignment()?.let body@ {
|
||||||
val lhs = JetPsiUtil.safeDeparenthesize(it.getLeft() ?: return@body)
|
val lhs = JetPsiUtil.safeDeparenthesize(it.left ?: return@body)
|
||||||
val receiver = (lhs as? JetQualifiedExpression)?.getReceiverExpression()
|
val receiver = (lhs as? JetQualifiedExpression)?.receiverExpression
|
||||||
if (receiver != null && receiver !is JetThisExpression) return@body
|
if (receiver != null && receiver !is JetThisExpression) return@body
|
||||||
|
|
||||||
val resolvedCall = lhs.getResolvedCall(data.resolutionFacade.analyze(it)) ?: return@body
|
val resolvedCall = lhs.getResolvedCall(data.resolutionFacade.analyze(it)) ?: return@body
|
||||||
if (resolvedCall.getResultingDescriptor() != propertyDescriptor) return@body
|
if (resolvedCall.resultingDescriptor != propertyDescriptor) return@body
|
||||||
|
|
||||||
if (initializerCandidate == null) {
|
if (initializerCandidate == null) {
|
||||||
if (currentInitializer == null) {
|
if (currentInitializer == null) {
|
||||||
@@ -152,7 +152,7 @@ class KotlinPullUpHelper(
|
|||||||
val sourceConstructors = targetToSourceConstructors[targetConstructor] ?: return null
|
val sourceConstructors = targetToSourceConstructors[targetConstructor] ?: return null
|
||||||
val elementsToRemove = LinkedHashSet<JetElement>()
|
val elementsToRemove = LinkedHashSet<JetElement>()
|
||||||
val commonInitializer = sourceConstructors.fold(null as JetExpression?) { commonInitializer, constructor ->
|
val commonInitializer = sourceConstructors.fold(null as JetExpression?) { commonInitializer, constructor ->
|
||||||
val body = (constructor as? JetSecondaryConstructor)?.getBodyExpression()
|
val body = (constructor as? JetSecondaryConstructor)?.bodyExpression
|
||||||
getCommonInitializer(commonInitializer, body, propertyDescriptor, elementsToRemove)
|
getCommonInitializer(commonInitializer, body, propertyDescriptor, elementsToRemove)
|
||||||
}
|
}
|
||||||
if (commonInitializer == null) {
|
if (commonInitializer == null) {
|
||||||
@@ -165,9 +165,9 @@ class KotlinPullUpHelper(
|
|||||||
override fun visitSimpleNameExpression(expression: JetSimpleNameExpression) {
|
override fun visitSimpleNameExpression(expression: JetSimpleNameExpression) {
|
||||||
val context = data.resolutionFacade.analyze(expression)
|
val context = data.resolutionFacade.analyze(expression)
|
||||||
val resolvedCall = expression.getResolvedCall(context) ?: return
|
val resolvedCall = expression.getResolvedCall(context) ?: return
|
||||||
val receiver = (resolvedCall.getExplicitReceiverValue() as? ExpressionReceiver)?.getExpression()
|
val receiver = (resolvedCall.getExplicitReceiverValue() as? ExpressionReceiver)?.expression
|
||||||
if (receiver != null && receiver !is JetThisExpression) return
|
if (receiver != null && receiver !is JetThisExpression) return
|
||||||
val target = (resolvedCall.getResultingDescriptor() as? DeclarationDescriptorWithSource)?.getSource()?.getPsi()
|
val target = (resolvedCall.resultingDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi()
|
||||||
when (target) {
|
when (target) {
|
||||||
is JetParameter -> usedParameters.add(target)
|
is JetParameter -> usedParameters.add(target)
|
||||||
is JetProperty -> usedProperties.add(target)
|
is JetProperty -> usedProperties.add(target)
|
||||||
@@ -176,7 +176,7 @@ class KotlinPullUpHelper(
|
|||||||
}
|
}
|
||||||
commonInitializer?.accept(visitor)
|
commonInitializer?.accept(visitor)
|
||||||
if (targetConstructor == data.targetClass.getPrimaryConstructor() ?: data.targetClass) {
|
if (targetConstructor == data.targetClass.getPrimaryConstructor() ?: data.targetClass) {
|
||||||
property.getInitializer()?.accept(visitor)
|
property.initializer?.accept(visitor)
|
||||||
}
|
}
|
||||||
|
|
||||||
return InitializerInfo(commonInitializer, usedProperties, usedParameters, elementsToRemove)
|
return InitializerInfo(commonInitializer, usedProperties, usedParameters, elementsToRemove)
|
||||||
@@ -198,7 +198,7 @@ class KotlinPullUpHelper(
|
|||||||
object : JetTreeVisitorVoid() {
|
object : JetTreeVisitorVoid() {
|
||||||
private fun processConstructorReference(expression: JetReferenceExpression, callingConstructorElement: JetElement) {
|
private fun processConstructorReference(expression: JetReferenceExpression, callingConstructorElement: JetElement) {
|
||||||
val descriptor = data.resolutionFacade.analyze(expression)[BindingContext.REFERENCE_TARGET, expression]
|
val descriptor = data.resolutionFacade.analyze(expression)[BindingContext.REFERENCE_TARGET, expression]
|
||||||
val constructorElement = (descriptor as? DeclarationDescriptorWithSource)?.getSource()?.getPsi() ?: return
|
val constructorElement = (descriptor as? DeclarationDescriptorWithSource)?.source?.getPsi() ?: return
|
||||||
if (constructorElement == data.targetClass
|
if (constructorElement == data.targetClass
|
||||||
|| (constructorElement as? JetConstructor<*>)?.getContainingClassOrObject() == data.targetClass) {
|
|| (constructorElement as? JetConstructor<*>)?.getContainingClassOrObject() == data.targetClass) {
|
||||||
result.getOrPut(constructorElement as JetElement, { ArrayList() }).add(callingConstructorElement)
|
result.getOrPut(constructorElement as JetElement, { ArrayList() }).add(callingConstructorElement)
|
||||||
@@ -206,14 +206,14 @@ class KotlinPullUpHelper(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitDelegationToSuperCallSpecifier(specifier: JetDelegatorToSuperCall) {
|
override fun visitDelegationToSuperCallSpecifier(specifier: JetDelegatorToSuperCall) {
|
||||||
val constructorRef = specifier.getCalleeExpression().getConstructorReferenceExpression() ?: return
|
val constructorRef = specifier.calleeExpression.constructorReferenceExpression ?: return
|
||||||
val containingClass = specifier.getStrictParentOfType<JetClassOrObject>() ?: return
|
val containingClass = specifier.getStrictParentOfType<JetClassOrObject>() ?: return
|
||||||
val callingConstructorElement = containingClass.getPrimaryConstructor() ?: containingClass
|
val callingConstructorElement = containingClass.getPrimaryConstructor() ?: containingClass
|
||||||
processConstructorReference(constructorRef, callingConstructorElement)
|
processConstructorReference(constructorRef, callingConstructorElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitSecondaryConstructor(constructor: JetSecondaryConstructor) {
|
override fun visitSecondaryConstructor(constructor: JetSecondaryConstructor) {
|
||||||
val constructorRef = constructor.getDelegationCall().getCalleeExpression() ?: return
|
val constructorRef = constructor.getDelegationCall().calleeExpression ?: return
|
||||||
processConstructorReference(constructorRef, constructor)
|
processConstructorReference(constructorRef, constructor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -250,25 +250,25 @@ class KotlinPullUpHelper(
|
|||||||
if (newMember is JetProperty) {
|
if (newMember is JetProperty) {
|
||||||
// Add dummy light field since PullUpProcessor won't invoke moveFieldInitializations() if no PsiFields are present
|
// Add dummy light field since PullUpProcessor won't invoke moveFieldInitializations() if no PsiFields are present
|
||||||
if (dummyField == null) {
|
if (dummyField == null) {
|
||||||
val factory = JavaPsiFacade.getElementFactory(newMember.getProject())
|
val factory = JavaPsiFacade.getElementFactory(newMember.project)
|
||||||
val dummyField = object: LightField(
|
val dummyField = object: LightField(
|
||||||
newMember.getManager(),
|
newMember.manager,
|
||||||
factory.createField("dummy", PsiType.BOOLEAN),
|
factory.createField("dummy", PsiType.BOOLEAN),
|
||||||
factory.createClass("Dummy")
|
factory.createClass("Dummy")
|
||||||
) {
|
) {
|
||||||
// Prevent processing by JavaPullUpHelper
|
// Prevent processing by JavaPullUpHelper
|
||||||
override fun getLanguage() = JetLanguage.INSTANCE
|
override fun getLanguage() = JetLanguage.INSTANCE
|
||||||
}
|
}
|
||||||
javaData.getMovedMembers().add(dummyField)
|
javaData.movedMembers.add(dummyField)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
when (newMember) {
|
when (newMember) {
|
||||||
is JetProperty, is JetNamedFunction -> {
|
is JetProperty, is JetNamedFunction -> {
|
||||||
newMember.getRepresentativeLightMethod()?.let { javaData.getMovedMembers().add(it) }
|
newMember.getRepresentativeLightMethod()?.let { javaData.movedMembers.add(it) }
|
||||||
}
|
}
|
||||||
is JetClassOrObject -> {
|
is JetClassOrObject -> {
|
||||||
newMember.toLightClass()?.let { javaData.getMovedMembers().add(it) }
|
newMember.toLightClass()?.let { javaData.movedMembers.add(it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -276,7 +276,7 @@ class KotlinPullUpHelper(
|
|||||||
private fun willBeUsedInSourceClass(member: PsiElement): Boolean {
|
private fun willBeUsedInSourceClass(member: PsiElement): Boolean {
|
||||||
return !ReferencesSearch
|
return !ReferencesSearch
|
||||||
.search(member, LocalSearchScope(data.sourceClass), false)
|
.search(member, LocalSearchScope(data.sourceClass), false)
|
||||||
.all { it.getElement().parentsWithSelf.any { it in data.membersToMove } }
|
.all { it.element.parentsWithSelf.any { it in data.membersToMove } }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun liftToProtected(declaration: JetNamedDeclaration, ignoreUsages: Boolean = false) {
|
private fun liftToProtected(declaration: JetNamedDeclaration, ignoreUsages: Boolean = false) {
|
||||||
@@ -285,7 +285,7 @@ class KotlinPullUpHelper(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun setCorrectVisibility(info: MemberInfoBase<PsiMember>) {
|
override fun setCorrectVisibility(info: MemberInfoBase<PsiMember>) {
|
||||||
val member = info.getMember().namedUnwrappedElement as? JetNamedDeclaration ?: return
|
val member = info.member.namedUnwrappedElement as? JetNamedDeclaration ?: return
|
||||||
|
|
||||||
if (data.targetClass.isInterface()) {
|
if (data.targetClass.isInterface()) {
|
||||||
member.removeModifier(JetTokens.PUBLIC_KEYWORD)
|
member.removeModifier(JetTokens.PUBLIC_KEYWORD)
|
||||||
@@ -299,10 +299,10 @@ class KotlinPullUpHelper(
|
|||||||
when (declaration) {
|
when (declaration) {
|
||||||
is JetClass -> {
|
is JetClass -> {
|
||||||
liftToProtected(declaration)
|
liftToProtected(declaration)
|
||||||
declaration.getDeclarations().forEach { it.accept(this) }
|
declaration.declarations.forEach { it.accept(this) }
|
||||||
}
|
}
|
||||||
is JetNamedFunction, is JetProperty -> {
|
is JetNamedFunction, is JetProperty -> {
|
||||||
liftToProtected(declaration, declaration == member && info.isToAbstract())
|
liftToProtected(declaration, declaration == member && info.isToAbstract)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -319,16 +319,16 @@ class KotlinPullUpHelper(
|
|||||||
targetMember: JetCallableDeclaration): JetCallableDeclaration? {
|
targetMember: JetCallableDeclaration): JetCallableDeclaration? {
|
||||||
val memberDescriptor = data.memberDescriptors[sourceMember] as CallableMemberDescriptor
|
val memberDescriptor = data.memberDescriptors[sourceMember] as CallableMemberDescriptor
|
||||||
|
|
||||||
if (memberDescriptor.getOverriddenDescriptors().isEmpty()) {
|
if (memberDescriptor.overriddenDescriptors.isEmpty()) {
|
||||||
targetMember.removeOverrideModifier()
|
targetMember.removeOverrideModifier()
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
val clashingSuperDescriptor = data.getClashingMemberInTargetClass(memberDescriptor) ?: return null
|
val clashingSuperDescriptor = data.getClashingMemberInTargetClass(memberDescriptor) ?: return null
|
||||||
if (clashingSuperDescriptor.getOverriddenDescriptors().isEmpty()) {
|
if (clashingSuperDescriptor.overriddenDescriptors.isEmpty()) {
|
||||||
targetMember.removeOverrideModifier()
|
targetMember.removeOverrideModifier()
|
||||||
}
|
}
|
||||||
return clashingSuperDescriptor.getSource().getPsi() as? JetCallableDeclaration
|
return clashingSuperDescriptor.source.getPsi() as? JetCallableDeclaration
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun makeAbstract(sourceMember: JetCallableDeclaration, targetMember: JetCallableDeclaration) {
|
private fun makeAbstract(sourceMember: JetCallableDeclaration, targetMember: JetCallableDeclaration) {
|
||||||
@@ -336,14 +336,14 @@ class KotlinPullUpHelper(
|
|||||||
targetMember.addModifierWithSpace(JetTokens.ABSTRACT_KEYWORD)
|
targetMember.addModifierWithSpace(JetTokens.ABSTRACT_KEYWORD)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sourceMember.getTypeReference() == null) {
|
if (sourceMember.typeReference == null) {
|
||||||
var type = (data.memberDescriptors[sourceMember] as CallableMemberDescriptor).getReturnType()
|
var type = (data.memberDescriptors[sourceMember] as CallableMemberDescriptor).returnType
|
||||||
if (type == null || type.isError()) {
|
if (type == null || type.isError) {
|
||||||
type = KotlinBuiltIns.getInstance().getNullableAnyType()
|
type = KotlinBuiltIns.getInstance().nullableAnyType
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
type = data.sourceToTargetClassSubstitutor.substitute(type, Variance.INVARIANT)
|
type = data.sourceToTargetClassSubstitutor.substitute(type, Variance.INVARIANT)
|
||||||
?: KotlinBuiltIns.getInstance().getNullableAnyType()
|
?: KotlinBuiltIns.getInstance().nullableAnyType
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sourceMember is JetProperty || !type.isUnit()) {
|
if (sourceMember is JetProperty || !type.isUnit()) {
|
||||||
@@ -355,25 +355,25 @@ class KotlinPullUpHelper(
|
|||||||
val deleteFrom = when (sourceMember) {
|
val deleteFrom = when (sourceMember) {
|
||||||
is JetProperty -> {
|
is JetProperty -> {
|
||||||
targetMember as JetProperty
|
targetMember as JetProperty
|
||||||
val accessors = targetMember.getAccessors()
|
val accessors = targetMember.accessors
|
||||||
targetMember.getEqualsToken() ?: targetMember.getDelegate() ?: accessors.firstOrNull()
|
targetMember.equalsToken ?: targetMember.delegate ?: accessors.firstOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
is JetNamedFunction -> {
|
is JetNamedFunction -> {
|
||||||
targetMember as JetNamedFunction
|
targetMember as JetNamedFunction
|
||||||
targetMember.getEqualsToken() ?: targetMember.getBodyExpression()
|
targetMember.equalsToken ?: targetMember.bodyExpression
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deleteFrom != null) {
|
if (deleteFrom != null) {
|
||||||
targetMember.deleteChildRange(deleteFrom, targetMember.getLastChild())
|
targetMember.deleteChildRange(deleteFrom, targetMember.lastChild)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addMemberToTarget(targetMember: JetNamedDeclaration): JetNamedDeclaration {
|
private fun addMemberToTarget(targetMember: JetNamedDeclaration): JetNamedDeclaration {
|
||||||
val anchor = data.targetClass.getDeclarations().filterIsInstance(targetMember.javaClass).lastOrNull()
|
val anchor = data.targetClass.declarations.filterIsInstance(targetMember.javaClass).lastOrNull()
|
||||||
val movedMember = when {
|
val movedMember = when {
|
||||||
anchor == null && targetMember is JetProperty -> data.targetClass.addDeclarationBefore(targetMember, null)
|
anchor == null && targetMember is JetProperty -> data.targetClass.addDeclarationBefore(targetMember, null)
|
||||||
else -> data.targetClass.addDeclarationAfter(targetMember, anchor)
|
else -> data.targetClass.addDeclarationAfter(targetMember, anchor)
|
||||||
@@ -394,7 +394,7 @@ class KotlinPullUpHelper(
|
|||||||
member.accept(
|
member.accept(
|
||||||
object: JetVisitorVoid() {
|
object: JetVisitorVoid() {
|
||||||
private fun visitSuperOrThis(expression: JetInstanceExpressionWithLabel) {
|
private fun visitSuperOrThis(expression: JetInstanceExpressionWithLabel) {
|
||||||
val referenceTarget = data.sourceClassContext[BindingContext.REFERENCE_TARGET, expression.getInstanceReference()]
|
val referenceTarget = data.sourceClassContext[BindingContext.REFERENCE_TARGET, expression.instanceReference]
|
||||||
if (referenceTarget == data.targetClassDescriptor) {
|
if (referenceTarget == data.targetClassDescriptor) {
|
||||||
expression.replaceWithTargetThis = true
|
expression.replaceWithTargetThis = true
|
||||||
affectedElements.add(expression)
|
affectedElements.add(expression)
|
||||||
@@ -409,15 +409,15 @@ class KotlinPullUpHelper(
|
|||||||
val resolvedCall = expression.getResolvedCall(data.sourceClassContext) ?: return
|
val resolvedCall = expression.getResolvedCall(data.sourceClassContext) ?: return
|
||||||
var receiver = resolvedCall.getExplicitReceiverValue()
|
var receiver = resolvedCall.getExplicitReceiverValue()
|
||||||
if (!receiver.exists()) {
|
if (!receiver.exists()) {
|
||||||
receiver = resolvedCall.getExtensionReceiver()
|
receiver = resolvedCall.extensionReceiver
|
||||||
}
|
}
|
||||||
if (!receiver.exists()) {
|
if (!receiver.exists()) {
|
||||||
receiver = resolvedCall.getDispatchReceiver()
|
receiver = resolvedCall.dispatchReceiver
|
||||||
}
|
}
|
||||||
if (!receiver.exists()) return
|
if (!receiver.exists()) return
|
||||||
|
|
||||||
val implicitThis = receiver.getType().getConstructor().getDeclarationDescriptor() as? ClassDescriptor ?: return
|
val implicitThis = receiver.type.constructor.declarationDescriptor as? ClassDescriptor ?: return
|
||||||
if (implicitThis.isCompanionObject()
|
if (implicitThis.isCompanionObject
|
||||||
&& DescriptorUtils.isAncestor(data.sourceClassDescriptor, implicitThis, true)) {
|
&& DescriptorUtils.isAncestor(data.sourceClassDescriptor, implicitThis, true)) {
|
||||||
val qualifierFqName = implicitThis.importableFqName ?: return
|
val qualifierFqName = implicitThis.importableFqName ?: return
|
||||||
|
|
||||||
@@ -448,7 +448,7 @@ class KotlinPullUpHelper(
|
|||||||
|
|
||||||
private fun processMarkedElements(member: JetNamedDeclaration) {
|
private fun processMarkedElements(member: JetNamedDeclaration) {
|
||||||
val psiFactory = JetPsiFactory(member)
|
val psiFactory = JetPsiFactory(member)
|
||||||
val targetThis = psiFactory.createExpression("this@${data.targetClassDescriptor.getName().asString()}")
|
val targetThis = psiFactory.createExpression("this@${data.targetClassDescriptor.name.asString()}")
|
||||||
val shorteningOptionsForThis = ShortenReferences.Options(removeThisLabels = true, removeThis = true)
|
val shorteningOptionsForThis = ShortenReferences.Options(removeThisLabels = true, removeThis = true)
|
||||||
|
|
||||||
member.accept(
|
member.accept(
|
||||||
@@ -506,7 +506,7 @@ class KotlinPullUpHelper(
|
|||||||
// TODO: Formatting rules don't apply here for some reason
|
// TODO: Formatting rules don't apply here for some reason
|
||||||
private fun JetNamedDeclaration.addModifierWithSpace(modifier: JetModifierKeywordToken) {
|
private fun JetNamedDeclaration.addModifierWithSpace(modifier: JetModifierKeywordToken) {
|
||||||
addModifier(modifier)
|
addModifier(modifier)
|
||||||
addAfter(JetPsiFactory(this).createWhiteSpace(), getModifierList())
|
addAfter(JetPsiFactory(this).createWhiteSpace(), modifierList)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun moveSuperInterface(member: JetClass) {
|
private fun moveSuperInterface(member: JetClass) {
|
||||||
@@ -518,13 +518,13 @@ class KotlinPullUpHelper(
|
|||||||
data.sourceClass.getDelegationSpecifiers()
|
data.sourceClass.getDelegationSpecifiers()
|
||||||
.filterIsInstance<JetDelegatorToSuperClass>()
|
.filterIsInstance<JetDelegatorToSuperClass>()
|
||||||
.firstOrNull {
|
.firstOrNull {
|
||||||
val referencedType = data.sourceClassContext[BindingContext.TYPE, it.getTypeReference()]
|
val referencedType = data.sourceClassContext[BindingContext.TYPE, it.typeReference]
|
||||||
referencedType?.getConstructor()?.getDeclarationDescriptor() == classDescriptor
|
referencedType?.constructor?.declarationDescriptor == classDescriptor
|
||||||
} ?: return
|
} ?: return
|
||||||
data.sourceClass.removeDelegationSpecifier(currentSpecifier)
|
data.sourceClass.removeDelegationSpecifier(currentSpecifier)
|
||||||
|
|
||||||
if (!DescriptorUtils.isSubclass(data.targetClassDescriptor, classDescriptor)) {
|
if (!DescriptorUtils.isSubclass(data.targetClassDescriptor, classDescriptor)) {
|
||||||
val referencedType = data.sourceClassContext[BindingContext.TYPE, currentSpecifier.getTypeReference()]!!
|
val referencedType = data.sourceClassContext[BindingContext.TYPE, currentSpecifier.typeReference]!!
|
||||||
val typeInTargetClass = data.sourceToTargetClassSubstitutor.substitute(referencedType, Variance.INVARIANT)
|
val typeInTargetClass = data.sourceToTargetClassSubstitutor.substitute(referencedType, Variance.INVARIANT)
|
||||||
if (typeInTargetClass != null && !typeInTargetClass.isError) {
|
if (typeInTargetClass != null && !typeInTargetClass.isError) {
|
||||||
val renderedType = IdeDescriptorRenderers.SOURCE_CODE.renderType(typeInTargetClass)
|
val renderedType = IdeDescriptorRenderers.SOURCE_CODE.renderType(typeInTargetClass)
|
||||||
@@ -536,9 +536,9 @@ class KotlinPullUpHelper(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun move(info: MemberInfoBase<PsiMember>, substitutor: PsiSubstitutor) {
|
override fun move(info: MemberInfoBase<PsiMember>, substitutor: PsiSubstitutor) {
|
||||||
val member = info.getMember().namedUnwrappedElement as? JetNamedDeclaration ?: return
|
val member = info.member.namedUnwrappedElement as? JetNamedDeclaration ?: return
|
||||||
|
|
||||||
if (member is JetClass && info.getOverrides() != null) {
|
if (member is JetClass && info.overrides != null) {
|
||||||
moveSuperInterface(member)
|
moveSuperInterface(member)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -561,7 +561,7 @@ class KotlinPullUpHelper(
|
|||||||
|
|
||||||
val originalIsAbstract = member.hasModifier(JetTokens.ABSTRACT_KEYWORD)
|
val originalIsAbstract = member.hasModifier(JetTokens.ABSTRACT_KEYWORD)
|
||||||
val toAbstract = when {
|
val toAbstract = when {
|
||||||
info.isToAbstract() -> true
|
info.isToAbstract -> true
|
||||||
!data.targetClass.isInterface() -> false
|
!data.targetClass.isInterface() -> false
|
||||||
member is JetProperty -> member.mustBeAbstractInInterface()
|
member is JetProperty -> member.mustBeAbstractInInterface()
|
||||||
else -> false
|
else -> false
|
||||||
@@ -572,8 +572,8 @@ class KotlinPullUpHelper(
|
|||||||
}
|
}
|
||||||
|
|
||||||
movedMember = doAddCallableMember(memberCopy, clashingSuper)
|
movedMember = doAddCallableMember(memberCopy, clashingSuper)
|
||||||
if (member.getTypeReference() == null) {
|
if (member.typeReference == null) {
|
||||||
movedMember.getTypeReference()?.addToShorteningWaitSet()
|
movedMember.typeReference?.addToShorteningWaitSet()
|
||||||
}
|
}
|
||||||
if (originalIsAbstract) {
|
if (originalIsAbstract) {
|
||||||
member.delete()
|
member.delete()
|
||||||
@@ -622,20 +622,20 @@ class KotlinPullUpHelper(
|
|||||||
val psiFactory = JetPsiFactory(data.sourceClass)
|
val psiFactory = JetPsiFactory(data.sourceClass)
|
||||||
|
|
||||||
fun JetClassOrObject.getOrCreateClassInitializer(): JetClassInitializer {
|
fun JetClassOrObject.getOrCreateClassInitializer(): JetClassInitializer {
|
||||||
getOrCreateBody().getDeclarations().lastOrNull { it is JetClassInitializer }?.let { return it as JetClassInitializer }
|
getOrCreateBody().declarations.lastOrNull { it is JetClassInitializer }?.let { return it as JetClassInitializer }
|
||||||
return addDeclaration(psiFactory.createAnonymousInitializer()) as JetClassInitializer
|
return addDeclaration(psiFactory.createAnonymousInitializer()) as JetClassInitializer
|
||||||
}
|
}
|
||||||
|
|
||||||
fun JetElement.getConstructorBodyBlock(): JetBlockExpression? {
|
fun JetElement.getConstructorBodyBlock(): JetBlockExpression? {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is JetClassOrObject -> {
|
is JetClassOrObject -> {
|
||||||
getOrCreateClassInitializer().getBody()
|
getOrCreateClassInitializer().body
|
||||||
}
|
}
|
||||||
is JetPrimaryConstructor -> {
|
is JetPrimaryConstructor -> {
|
||||||
getContainingClassOrObject().getOrCreateClassInitializer().getBody()
|
getContainingClassOrObject().getOrCreateClassInitializer().body
|
||||||
}
|
}
|
||||||
is JetSecondaryConstructor -> {
|
is JetSecondaryConstructor -> {
|
||||||
getBodyExpression() ?: add(psiFactory.createEmptyBody())
|
bodyExpression ?: add(psiFactory.createEmptyBody())
|
||||||
}
|
}
|
||||||
else -> null
|
else -> null
|
||||||
} as? JetBlockExpression
|
} as? JetBlockExpression
|
||||||
@@ -670,9 +670,9 @@ class KotlinPullUpHelper(
|
|||||||
}
|
}
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
superCall?.getValueArgumentList()?.let { args ->
|
superCall?.valueArgumentList?.let { args ->
|
||||||
info.usedParameters.forEach {
|
info.usedParameters.forEach {
|
||||||
args.addArgument(psiFactory.createArgument(psiFactory.createExpression(it.getName() ?: "_")))
|
args.addArgument(psiFactory.createArgument(psiFactory.createExpression(it.name ?: "_")))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -700,7 +700,7 @@ class KotlinPullUpHelper(
|
|||||||
|
|
||||||
info.initializer?.let {
|
info.initializer?.let {
|
||||||
val body = constructorElement.getConstructorBodyBlock()
|
val body = constructorElement.getConstructorBodyBlock()
|
||||||
body?.addAfter(it, body.getStatements().lastOrNull() ?: body.getLBrace()!!)
|
body?.addAfter(it, body.statements.lastOrNull() ?: body.lBrace!!)
|
||||||
}
|
}
|
||||||
info.elementsToRemove.forEach { it.delete() }
|
info.elementsToRemove.forEach { it.delete() }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
|||||||
|
|
||||||
public class KotlinPullUpHelperFactory : PullUpHelperFactory {
|
public class KotlinPullUpHelperFactory : PullUpHelperFactory {
|
||||||
private fun PullUpData.toKotlinPullUpData(): KotlinPullUpData? {
|
private fun PullUpData.toKotlinPullUpData(): KotlinPullUpData? {
|
||||||
if (!getSourceClass().isInheritor(getTargetClass(), true)) return null
|
if (!sourceClass.isInheritor(targetClass, true)) return null
|
||||||
val sourceClass = getSourceClass().unwrapped as? JetClassOrObject ?: return null
|
val sourceClass = sourceClass.unwrapped as? JetClassOrObject ?: return null
|
||||||
val targetClass = getTargetClass().unwrapped as? JetClass ?: return null
|
val targetClass = targetClass.unwrapped as? JetClass ?: return null
|
||||||
val membersToMove = getMembersToMove()
|
val membersToMove = membersToMove
|
||||||
.map { it.namedUnwrappedElement as? JetNamedDeclaration }
|
.map { it.namedUnwrappedElement as? JetNamedDeclaration }
|
||||||
.filterNotNull()
|
.filterNotNull()
|
||||||
.sortBy { it.startOffset }
|
.sortBy { it.startOffset }
|
||||||
|
|||||||
@@ -19,10 +19,7 @@ package org.jetbrains.kotlin.idea.refactoring.pullUp
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.refactoring.RefactoringBundle
|
import com.intellij.refactoring.RefactoringBundle
|
||||||
import com.intellij.refactoring.util.CommonRefactoringUtil
|
|
||||||
import com.intellij.refactoring.util.RefactoringUIUtil
|
|
||||||
import com.intellij.util.containers.MultiMap
|
import com.intellij.util.containers.MultiMap
|
||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
|
||||||
import org.jetbrains.kotlin.asJava.unwrapped
|
import org.jetbrains.kotlin.asJava.unwrapped
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.idea.core.refactoring.checkConflictsInteractively
|
import org.jetbrains.kotlin.idea.core.refactoring.checkConflictsInteractively
|
||||||
@@ -30,18 +27,12 @@ import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
|||||||
import org.jetbrains.kotlin.idea.references.JetReference
|
import org.jetbrains.kotlin.idea.references.JetReference
|
||||||
import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest
|
import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest
|
||||||
import org.jetbrains.kotlin.idea.search.declarationsSearch.searchInheritors
|
import org.jetbrains.kotlin.idea.search.declarationsSearch.searchInheritors
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.DefaultSearchHelper
|
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchTarget
|
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.search
|
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.allChildren
|
import org.jetbrains.kotlin.psi.psiUtil.allChildren
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
|
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
import org.jetbrains.kotlin.types.TypeSubstitutor
|
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||||
@@ -57,11 +48,11 @@ fun checkConflicts(project: Project,
|
|||||||
onAccept: () -> Unit) {
|
onAccept: () -> Unit) {
|
||||||
val conflicts = MultiMap<PsiElement, String>()
|
val conflicts = MultiMap<PsiElement, String>()
|
||||||
|
|
||||||
val pullUpData = KotlinPullUpData(sourceClass, targetClass, memberInfos.map { it.getMember() })
|
val pullUpData = KotlinPullUpData(sourceClass, targetClass, memberInfos.map { it.member })
|
||||||
|
|
||||||
with(pullUpData) {
|
with(pullUpData) {
|
||||||
for (memberInfo in memberInfos) {
|
for (memberInfo in memberInfos) {
|
||||||
val member = memberInfo.getMember()
|
val member = memberInfo.member
|
||||||
val memberDescriptor = resolutionFacade.resolveToDescriptor(member)
|
val memberDescriptor = resolutionFacade.resolveToDescriptor(member)
|
||||||
|
|
||||||
checkClashWithSuperDeclaration(member, memberDescriptor, conflicts)
|
checkClashWithSuperDeclaration(member, memberDescriptor, conflicts)
|
||||||
@@ -101,7 +92,7 @@ private fun KotlinPullUpData.checkClashWithSuperDeclaration(
|
|||||||
conflicts: MultiMap<PsiElement, String>) {
|
conflicts: MultiMap<PsiElement, String>) {
|
||||||
if (memberDescriptor is CallableMemberDescriptor) {
|
if (memberDescriptor is CallableMemberDescriptor) {
|
||||||
val clashingSuper = getClashingMemberInTargetClass(memberDescriptor)
|
val clashingSuper = getClashingMemberInTargetClass(memberDescriptor)
|
||||||
if (clashingSuper != null && clashingSuper.getModality() != Modality.ABSTRACT) {
|
if (clashingSuper != null && clashingSuper.modality != Modality.ABSTRACT) {
|
||||||
val message = "${targetClassDescriptor.renderForConflicts()} already contains ${memberDescriptor.renderForConflicts()}"
|
val message = "${targetClassDescriptor.renderForConflicts()} already contains ${memberDescriptor.renderForConflicts()}"
|
||||||
conflicts.putValue(member, message.capitalize())
|
conflicts.putValue(member, message.capitalize())
|
||||||
}
|
}
|
||||||
@@ -115,7 +106,7 @@ private fun KotlinPullUpData.checkAccidentalOverrides(
|
|||||||
if (memberDescriptor is CallableDescriptor && !member.hasModifier(JetTokens.PRIVATE_KEYWORD)) {
|
if (memberDescriptor is CallableDescriptor && !member.hasModifier(JetTokens.PRIVATE_KEYWORD)) {
|
||||||
val memberDescriptorInTargetClass = memberDescriptor.substitute(sourceToTargetClassSubstitutor)
|
val memberDescriptorInTargetClass = memberDescriptor.substitute(sourceToTargetClassSubstitutor)
|
||||||
if (memberDescriptorInTargetClass != null) {
|
if (memberDescriptorInTargetClass != null) {
|
||||||
HierarchySearchRequest<PsiElement>(targetClass, targetClass.getUseScope())
|
HierarchySearchRequest<PsiElement>(targetClass, targetClass.useScope)
|
||||||
.searchInheritors()
|
.searchInheritors()
|
||||||
.asSequence()
|
.asSequence()
|
||||||
.filterNot { it.unwrapped == sourceClass || it.unwrapped == targetClass }
|
.filterNot { it.unwrapped == sourceClass || it.unwrapped == targetClass }
|
||||||
@@ -123,13 +114,13 @@ private fun KotlinPullUpData.checkAccidentalOverrides(
|
|||||||
.filterNotNull()
|
.filterNotNull()
|
||||||
.forEach {
|
.forEach {
|
||||||
val subClassDescriptor = resolutionFacade.resolveToDescriptor(it) as ClassDescriptor
|
val subClassDescriptor = resolutionFacade.resolveToDescriptor(it) as ClassDescriptor
|
||||||
val substitutor = getTypeSubstitutor(targetClassDescriptor.getDefaultType(),
|
val substitutor = getTypeSubstitutor(targetClassDescriptor.defaultType,
|
||||||
subClassDescriptor.getDefaultType()) ?: TypeSubstitutor.EMPTY
|
subClassDescriptor.defaultType) ?: TypeSubstitutor.EMPTY
|
||||||
val memberDescriptorInSubClass =
|
val memberDescriptorInSubClass =
|
||||||
memberDescriptorInTargetClass.substitute(substitutor) as? CallableMemberDescriptor
|
memberDescriptorInTargetClass.substitute(substitutor) as? CallableMemberDescriptor
|
||||||
val clashingMemberDescriptor =
|
val clashingMemberDescriptor =
|
||||||
memberDescriptorInSubClass?.let { subClassDescriptor.findCallableMemberBySignature(it) } ?: return
|
memberDescriptorInSubClass?.let { subClassDescriptor.findCallableMemberBySignature(it) } ?: return
|
||||||
val clashingMember = clashingMemberDescriptor.getSource().getPsi() ?: return
|
val clashingMember = clashingMemberDescriptor.source.getPsi() ?: return
|
||||||
|
|
||||||
val message = memberDescriptor.renderForConflicts() +
|
val message = memberDescriptor.renderForConflicts() +
|
||||||
" in super class would clash with existing member of " +
|
" in super class would clash with existing member of " +
|
||||||
@@ -144,7 +135,7 @@ private fun KotlinPullUpData.checkInnerClassToInterface(
|
|||||||
member: JetNamedDeclaration,
|
member: JetNamedDeclaration,
|
||||||
memberDescriptor: DeclarationDescriptor,
|
memberDescriptor: DeclarationDescriptor,
|
||||||
conflicts: MultiMap<PsiElement, String>) {
|
conflicts: MultiMap<PsiElement, String>) {
|
||||||
if (targetClass.isInterface() && memberDescriptor is ClassDescriptor && memberDescriptor.isInner()) {
|
if (targetClass.isInterface() && memberDescriptor is ClassDescriptor && memberDescriptor.isInner) {
|
||||||
val message = "${memberDescriptor.renderForConflicts()} is an inner class. It can not be moved to the interface"
|
val message = "${memberDescriptor.renderForConflicts()} is an inner class. It can not be moved to the interface"
|
||||||
conflicts.putValue(member, message.capitalize())
|
conflicts.putValue(member, message.capitalize())
|
||||||
}
|
}
|
||||||
@@ -156,7 +147,7 @@ private fun KotlinPullUpData.checkVisibility(
|
|||||||
conflicts: MultiMap<PsiElement, String>
|
conflicts: MultiMap<PsiElement, String>
|
||||||
) {
|
) {
|
||||||
fun reportConflictIfAny(targetDescriptor: DeclarationDescriptor) {
|
fun reportConflictIfAny(targetDescriptor: DeclarationDescriptor) {
|
||||||
val target = (targetDescriptor as? DeclarationDescriptorWithSource)?.getSource()?.getPsi() ?: return
|
val target = (targetDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi() ?: return
|
||||||
if (targetDescriptor is DeclarationDescriptorWithVisibility
|
if (targetDescriptor is DeclarationDescriptorWithVisibility
|
||||||
&& !Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, targetDescriptor, targetClassDescriptor)) {
|
&& !Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, targetDescriptor, targetClassDescriptor)) {
|
||||||
val message = RefactoringBundle.message(
|
val message = RefactoringBundle.message(
|
||||||
@@ -168,22 +159,22 @@ private fun KotlinPullUpData.checkVisibility(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val member = memberInfo.getMember()
|
val member = memberInfo.member
|
||||||
val childrenToCheck = member.allChildren.toArrayList()
|
val childrenToCheck = member.allChildren.toArrayList()
|
||||||
if (memberInfo.isToAbstract() && member is JetCallableDeclaration) {
|
if (memberInfo.isToAbstract && member is JetCallableDeclaration) {
|
||||||
when (member) {
|
when (member) {
|
||||||
is JetNamedFunction -> childrenToCheck.remove(member.getBodyExpression())
|
is JetNamedFunction -> childrenToCheck.remove(member.bodyExpression)
|
||||||
is JetProperty -> {
|
is JetProperty -> {
|
||||||
childrenToCheck.remove(member.getInitializer())
|
childrenToCheck.remove(member.initializer)
|
||||||
childrenToCheck.remove(member.getDelegateExpression())
|
childrenToCheck.remove(member.delegateExpression)
|
||||||
childrenToCheck.removeAll(member.getAccessors())
|
childrenToCheck.removeAll(member.accessors)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (member.getTypeReference() == null) {
|
if (member.typeReference == null) {
|
||||||
(memberDescriptor as CallableDescriptor).getReturnType()?.let { returnType ->
|
(memberDescriptor as CallableDescriptor).returnType?.let { returnType ->
|
||||||
val typeInTargetClass = sourceToTargetClassSubstitutor.substitute(returnType, Variance.INVARIANT)
|
val typeInTargetClass = sourceToTargetClassSubstitutor.substitute(returnType, Variance.INVARIANT)
|
||||||
val descriptorToCheck = typeInTargetClass?.getConstructor()?.getDeclarationDescriptor() as? ClassDescriptor
|
val descriptorToCheck = typeInTargetClass?.constructor?.declarationDescriptor as? ClassDescriptor
|
||||||
if (descriptorToCheck != null) {
|
if (descriptorToCheck != null) {
|
||||||
reportConflictIfAny(descriptorToCheck)
|
reportConflictIfAny(descriptorToCheck)
|
||||||
}
|
}
|
||||||
@@ -198,7 +189,7 @@ private fun KotlinPullUpData.checkVisibility(
|
|||||||
super.visitReferenceExpression(expression)
|
super.visitReferenceExpression(expression)
|
||||||
|
|
||||||
val context = resolutionFacade.analyze(expression)
|
val context = resolutionFacade.analyze(expression)
|
||||||
expression.getReferences()
|
expression.references
|
||||||
.flatMap { (it as? JetReference)?.resolveToDescriptors(context) ?: emptyList() }
|
.flatMap { (it as? JetReference)?.resolveToDescriptors(context) ?: emptyList() }
|
||||||
.forEach(::reportConflictIfAny)
|
.forEach(::reportConflictIfAny)
|
||||||
|
|
||||||
|
|||||||
@@ -19,4 +19,4 @@ package org.jetbrains.kotlin.idea.refactoring.pullUp
|
|||||||
import org.jetbrains.kotlin.psi.JetProperty
|
import org.jetbrains.kotlin.psi.JetProperty
|
||||||
|
|
||||||
fun JetProperty.mustBeAbstractInInterface() =
|
fun JetProperty.mustBeAbstractInInterface() =
|
||||||
hasInitializer() || hasDelegate() || (!hasInitializer() && !hasDelegate() && getAccessors().isEmpty())
|
hasInitializer() || hasDelegate() || (!hasInitializer() && !hasDelegate() && accessors.isEmpty())
|
||||||
|
|||||||
@@ -17,23 +17,21 @@
|
|||||||
package org.jetbrains.kotlin.idea.refactoring.pullUp
|
package org.jetbrains.kotlin.idea.refactoring.pullUp
|
||||||
|
|
||||||
import com.google.gson.JsonParser
|
import com.google.gson.JsonParser
|
||||||
import com.intellij.openapi.actionSystem.DataContext
|
|
||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
|
||||||
import com.intellij.refactoring.BaseRefactoringProcessor
|
import com.intellij.refactoring.BaseRefactoringProcessor
|
||||||
import com.intellij.refactoring.util.CommonRefactoringUtil
|
import com.intellij.refactoring.util.CommonRefactoringUtil
|
||||||
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
||||||
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
||||||
import org.jetbrains.kotlin.idea.stubindex.JetFullClassNameIndex
|
|
||||||
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
|
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
|
||||||
import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase
|
import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase
|
||||||
import org.jetbrains.kotlin.idea.test.KotlinMultiFileTestCase
|
|
||||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.JetClass
|
||||||
|
import org.jetbrains.kotlin.psi.JetElement
|
||||||
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
|
import org.jetbrains.kotlin.psi.NotNullableUserDataProperty
|
||||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||||
import org.jetbrains.kotlin.test.JetTestUtils
|
import org.jetbrains.kotlin.test.JetTestUtils
|
||||||
import org.jetbrains.kotlin.test.util.findElementByCommentPrefix
|
|
||||||
import org.jetbrains.kotlin.test.util.findElementsByCommentPrefix
|
import org.jetbrains.kotlin.test.util.findElementsByCommentPrefix
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -56,37 +54,37 @@ public abstract class AbstractPullUpTest : JetLightCodeInsightFixtureTestCase()
|
|||||||
val afterFile = File("$path.after")
|
val afterFile = File("$path.after")
|
||||||
val conflictFile = File("$path.messages")
|
val conflictFile = File("$path.messages")
|
||||||
|
|
||||||
fixture.setTestDataPath("${JetTestUtils.getHomeDirectory()}/${mainFile.getParent()}")
|
fixture.testDataPath = "${JetTestUtils.getHomeDirectory()}/${mainFile.getParent()}"
|
||||||
|
|
||||||
val mainFileName = mainFile.getName()
|
val mainFileName = mainFile.getName()
|
||||||
val file = fixture.configureByFile(mainFileName) as JetFile
|
val file = fixture.configureByFile(mainFileName) as JetFile
|
||||||
|
|
||||||
val addKotlinRuntime = InTextDirectivesUtils.findStringWithPrefixes(file.getText(), "// WITH_RUNTIME") != null
|
val addKotlinRuntime = InTextDirectivesUtils.findStringWithPrefixes(file.text, "// WITH_RUNTIME") != null
|
||||||
if (addKotlinRuntime) {
|
if (addKotlinRuntime) {
|
||||||
ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
|
ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for ((element, info) in file.findElementsByCommentPrefix("// INFO: ")) {
|
for ((element, info) in file.findElementsByCommentPrefix("// INFO: ")) {
|
||||||
val parsedInfo = JsonParser().parse(info).getAsJsonObject()
|
val parsedInfo = JsonParser().parse(info).asJsonObject
|
||||||
element.elementInfo = ElementInfo(parsedInfo["checked"]?.getAsBoolean() ?: false,
|
element.elementInfo = ElementInfo(parsedInfo["checked"]?.asBoolean ?: false,
|
||||||
parsedInfo["toAbstract"]?.getAsBoolean() ?: false)
|
parsedInfo["toAbstract"]?.asBoolean ?: false)
|
||||||
}
|
}
|
||||||
val targetClassName = InTextDirectivesUtils.findStringWithPrefixes(file.getText(), "// TARGET_CLASS: ")
|
val targetClassName = InTextDirectivesUtils.findStringWithPrefixes(file.text, "// TARGET_CLASS: ")
|
||||||
|
|
||||||
val helper = object: KotlinPullUpHandler.TestHelper {
|
val helper = object: KotlinPullUpHandler.TestHelper {
|
||||||
override fun adjustMembers(members: List<KotlinMemberInfo>): List<KotlinMemberInfo> {
|
override fun adjustMembers(members: List<KotlinMemberInfo>): List<KotlinMemberInfo> {
|
||||||
members.forEach {
|
members.forEach {
|
||||||
val info = it.getMember().elementInfo
|
val info = it.member.elementInfo
|
||||||
it.setChecked(info.checked)
|
it.isChecked = info.checked
|
||||||
it.setToAbstract(info.toAbstract)
|
it.isToAbstract = info.toAbstract
|
||||||
}
|
}
|
||||||
return members.filter { it.isChecked() }
|
return members.filter { it.isChecked }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun chooseSuperClass(superClasses: List<JetClass>): JetClass {
|
override fun chooseSuperClass(superClasses: List<JetClass>): JetClass {
|
||||||
if (targetClassName != null) {
|
if (targetClassName != null) {
|
||||||
return superClasses.single { it.getFqName()?.asString() ?: it.getName() == targetClassName }
|
return superClasses.single { it.fqName?.asString() ?: it.name == targetClassName }
|
||||||
}
|
}
|
||||||
return superClasses.first()
|
return superClasses.first()
|
||||||
}
|
}
|
||||||
@@ -96,11 +94,11 @@ public abstract class AbstractPullUpTest : JetLightCodeInsightFixtureTestCase()
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert(!conflictFile.exists()) { "Conflict file $conflictFile should not exist" }
|
assert(!conflictFile.exists()) { "Conflict file $conflictFile should not exist" }
|
||||||
JetTestUtils.assertEqualsToFile(afterFile, file.getText()!!)
|
JetTestUtils.assertEqualsToFile(afterFile, file.text!!)
|
||||||
}
|
}
|
||||||
catch(e: Exception) {
|
catch(e: Exception) {
|
||||||
val message = when (e) {
|
val message = when (e) {
|
||||||
is BaseRefactoringProcessor.ConflictsInTestsException -> e.getMessages().sort().joinToString("\n")
|
is BaseRefactoringProcessor.ConflictsInTestsException -> e.messages.sort().joinToString("\n")
|
||||||
is CommonRefactoringUtil.RefactoringErrorHintException -> e.getMessage()!!
|
is CommonRefactoringUtil.RefactoringErrorHintException -> e.getMessage()!!
|
||||||
else -> throw e
|
else -> throw e
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user