Refactor: merge synonymous utils
This commit is contained in:
@@ -16,8 +16,8 @@ import org.jetbrains.kotlin.idea.core.toDescriptor
|
|||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
|
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
|
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
@@ -35,17 +35,6 @@ fun KtDeclaration.expectedDeclarationIfAny(): KtDeclaration? {
|
|||||||
return DescriptorToSourceUtils.descriptorToDeclaration(expectedDescriptor) as? KtDeclaration
|
return DescriptorToSourceUtils.descriptorToDeclaration(expectedDescriptor) as? KtDeclaration
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KtDeclaration.isExpectedOrExpectedClassMember(): Boolean {
|
|
||||||
if (hasExpectModifier()) return true
|
|
||||||
if (this is KtClassOrObject) return this.isExpected()
|
|
||||||
|
|
||||||
return containingClassOrObject?.isExpected() == true
|
|
||||||
}
|
|
||||||
|
|
||||||
fun KtClassOrObject.isExpected(): Boolean {
|
|
||||||
return this.hasExpectModifier() || this.descriptor.safeAs<ClassDescriptor>()?.isExpect == true
|
|
||||||
}
|
|
||||||
|
|
||||||
fun DeclarationDescriptor.liftToExpected(): DeclarationDescriptor? {
|
fun DeclarationDescriptor.liftToExpected(): DeclarationDescriptor? {
|
||||||
if (this is MemberDescriptor) {
|
if (this is MemberDescriptor) {
|
||||||
return when {
|
return when {
|
||||||
@@ -114,8 +103,19 @@ fun KtDeclaration.actualsForExpected(module: Module? = null): Set<KtDeclaration>
|
|||||||
} ?: emptySet()
|
} ?: emptySet()
|
||||||
|
|
||||||
|
|
||||||
fun KtNamedDeclaration.isExpectDeclaration(): Boolean =
|
fun KtDeclaration.isExpectDeclaration(): Boolean {
|
||||||
(toDescriptor() as? MemberDescriptor)?.isExpect == true
|
if (hasExpectModifier()) return true
|
||||||
|
if (this is KtClassOrObject) return this.isExpected()
|
||||||
|
|
||||||
fun KtNamedDeclaration.isActualDeclaration(): Boolean =
|
return containingClassOrObject?.isExpected() == true
|
||||||
(toDescriptor() as? MemberDescriptor)?.isActual == true
|
}
|
||||||
|
|
||||||
|
private fun KtClassOrObject.isExpected(): Boolean {
|
||||||
|
return this.hasExpectModifier() || this.descriptor.safeAs<ClassDescriptor>()?.isExpect == true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KtDeclaration.isActualDeclaration(): Boolean {
|
||||||
|
if (hasActualModifier()) return true
|
||||||
|
|
||||||
|
return (toDescriptor() as? MemberDescriptor)?.isActual == true
|
||||||
|
}
|
||||||
|
|||||||
+2
-2
@@ -20,7 +20,7 @@ import com.intellij.codeInspection.CleanupLocalInspectionTool
|
|||||||
import com.intellij.codeInspection.ProblemHighlightType
|
import com.intellij.codeInspection.ProblemHighlightType
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
|
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
|
||||||
import org.jetbrains.kotlin.idea.util.isExpectedOrExpectedClassMember
|
import org.jetbrains.kotlin.idea.util.isExpectDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
|
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ class RemoveEmptyPrimaryConstructorIntention :
|
|||||||
element.annotations.isNotEmpty() -> false
|
element.annotations.isNotEmpty() -> false
|
||||||
element.modifierList?.text?.isBlank() == false -> false
|
element.modifierList?.text?.isBlank() == false -> false
|
||||||
element.containingClass()?.secondaryConstructors?.isNotEmpty() == true -> false
|
element.containingClass()?.secondaryConstructors?.isNotEmpty() == true -> false
|
||||||
element.isExpectedOrExpectedClassMember() -> false
|
element.isExpectDeclaration() -> false
|
||||||
else -> true
|
else -> true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-5
@@ -37,11 +37,8 @@ import org.jetbrains.kotlin.idea.intentions.SelfTargetingRangeIntention
|
|||||||
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.getReturnTypeReference
|
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.getReturnTypeReference
|
||||||
import org.jetbrains.kotlin.idea.refactoring.withExpectedActuals
|
import org.jetbrains.kotlin.idea.refactoring.withExpectedActuals
|
||||||
import org.jetbrains.kotlin.idea.references.KtReference
|
import org.jetbrains.kotlin.idea.references.KtReference
|
||||||
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
import org.jetbrains.kotlin.idea.util.*
|
||||||
import org.jetbrains.kotlin.idea.util.actualsForExpected
|
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.idea.util.isExpectedOrExpectedClassMember
|
|
||||||
import org.jetbrains.kotlin.idea.util.liftToExpected
|
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
@@ -111,7 +108,7 @@ class ConvertMemberToExtensionIntention : SelfTargetingRangeIntention<KtCallable
|
|||||||
val descriptor = element.unsafeResolveToDescriptor()
|
val descriptor = element.unsafeResolveToDescriptor()
|
||||||
val containingClass = descriptor.containingDeclaration as ClassDescriptor
|
val containingClass = descriptor.containingDeclaration as ClassDescriptor
|
||||||
|
|
||||||
val isEffectivelyExpected = allowExpected && element.isExpectedOrExpectedClassMember()
|
val isEffectivelyExpected = allowExpected && element.isExpectDeclaration()
|
||||||
|
|
||||||
val file = element.containingKtFile
|
val file = element.containingKtFile
|
||||||
val project = file.project
|
val project = file.project
|
||||||
|
|||||||
@@ -35,10 +35,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
|||||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||||
import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations
|
import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations
|
||||||
import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations
|
import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations
|
||||||
import org.jetbrains.kotlin.idea.util.actualsForExpected
|
import org.jetbrains.kotlin.idea.util.*
|
||||||
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
|
||||||
import org.jetbrains.kotlin.idea.util.isExpectedOrExpectedClassMember
|
|
||||||
import org.jetbrains.kotlin.idea.util.liftToExpected
|
|
||||||
import org.jetbrains.kotlin.psi.KtBlockExpression
|
import org.jetbrains.kotlin.psi.KtBlockExpression
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtDeclarationWithBody
|
import org.jetbrains.kotlin.psi.KtDeclarationWithBody
|
||||||
@@ -184,7 +181,7 @@ abstract class CallableRefactoring<out T: CallableDescriptor>(
|
|||||||
fun getAffectedCallables(project: Project, descriptorsForChange: Collection<CallableDescriptor>): List<PsiElement> {
|
fun getAffectedCallables(project: Project, descriptorsForChange: Collection<CallableDescriptor>): List<PsiElement> {
|
||||||
val baseCallables = descriptorsForChange.mapNotNull { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) }
|
val baseCallables = descriptorsForChange.mapNotNull { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) }
|
||||||
return baseCallables + baseCallables.flatMapTo(HashSet<PsiElement>()) { callable ->
|
return baseCallables + baseCallables.flatMapTo(HashSet<PsiElement>()) { callable ->
|
||||||
if (callable is KtDeclaration && callable.isExpectedOrExpectedClassMember()) {
|
if (callable is KtDeclaration && callable.isExpectDeclaration()) {
|
||||||
callable.actualsForExpected()
|
callable.actualsForExpected()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
+2
-2
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallab
|
|||||||
import org.jetbrains.kotlin.idea.search.declarationsSearch.forEachOverridingElement
|
import org.jetbrains.kotlin.idea.search.declarationsSearch.forEachOverridingElement
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.kotlin.idea.util.actualsForExpected
|
import org.jetbrains.kotlin.idea.util.actualsForExpected
|
||||||
import org.jetbrains.kotlin.idea.util.isExpectedOrExpectedClassMember
|
import org.jetbrains.kotlin.idea.util.isExpectDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
@@ -101,7 +101,7 @@ class KotlinChangeSignatureData(
|
|||||||
primaryCallables + primaryCallables.flatMapTo(HashSet<UsageInfo>()) { primaryFunction ->
|
primaryCallables + primaryCallables.flatMapTo(HashSet<UsageInfo>()) { primaryFunction ->
|
||||||
val primaryDeclaration = primaryFunction.declaration as? KtDeclaration ?: return@flatMapTo emptyList()
|
val primaryDeclaration = primaryFunction.declaration as? KtDeclaration ?: return@flatMapTo emptyList()
|
||||||
|
|
||||||
if (primaryDeclaration.isExpectedOrExpectedClassMember()) {
|
if (primaryDeclaration.isExpectDeclaration()) {
|
||||||
return@flatMapTo primaryDeclaration.actualsForExpected().mapNotNull {
|
return@flatMapTo primaryDeclaration.actualsForExpected().mapNotNull {
|
||||||
val descriptor = it.unsafeResolveToDescriptor()
|
val descriptor = it.unsafeResolveToDescriptor()
|
||||||
val callableDescriptor = when (descriptor) {
|
val callableDescriptor = when (descriptor) {
|
||||||
|
|||||||
+2
-2
@@ -37,7 +37,7 @@ import org.jetbrains.kotlin.idea.search.declarationsSearch.forEachOverridingMeth
|
|||||||
import org.jetbrains.kotlin.idea.search.declarationsSearch.toPossiblyFakeLightMethods
|
import org.jetbrains.kotlin.idea.search.declarationsSearch.toPossiblyFakeLightMethods
|
||||||
import org.jetbrains.kotlin.idea.util.actualsForExpected
|
import org.jetbrains.kotlin.idea.util.actualsForExpected
|
||||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||||
import org.jetbrains.kotlin.idea.util.isExpectedOrExpectedClassMember
|
import org.jetbrains.kotlin.idea.util.isExpectDeclaration
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.contains
|
import org.jetbrains.kotlin.psi.psiUtil.contains
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -140,7 +140,7 @@ class KotlinDefinitionsSearcher : QueryExecutor<PsiElement, DefinitionsScopedSea
|
|||||||
|
|
||||||
private fun processActualDeclarations(declaration: KtDeclaration, consumer: Processor<PsiElement>): Boolean {
|
private fun processActualDeclarations(declaration: KtDeclaration, consumer: Processor<PsiElement>): Boolean {
|
||||||
return runReadAction {
|
return runReadAction {
|
||||||
if (!declaration.isExpectedOrExpectedClassMember()) true
|
if (!declaration.isExpectDeclaration()) true
|
||||||
else declaration.actualsForExpected().all(consumer::process)
|
else declaration.actualsForExpected().all(consumer::process)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user