Refactor: merge synonymous utils

This commit is contained in:
Pavel V. Talanov
2018-03-14 18:54:27 +01:00
parent 784936eb00
commit 36d23e4501
6 changed files with 26 additions and 32 deletions
@@ -16,8 +16,8 @@ import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.psi.KtClassOrObject
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.hasActualModifier
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.module
@@ -35,17 +35,6 @@ fun KtDeclaration.expectedDeclarationIfAny(): 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? {
if (this is MemberDescriptor) {
return when {
@@ -114,8 +103,19 @@ fun KtDeclaration.actualsForExpected(module: Module? = null): Set<KtDeclaration>
} ?: emptySet()
fun KtNamedDeclaration.isExpectDeclaration(): Boolean =
(toDescriptor() as? MemberDescriptor)?.isExpect == true
fun KtDeclaration.isExpectDeclaration(): Boolean {
if (hasExpectModifier()) return true
if (this is KtClassOrObject) return this.isExpected()
fun KtNamedDeclaration.isActualDeclaration(): Boolean =
(toDescriptor() as? MemberDescriptor)?.isActual == true
return containingClassOrObject?.isExpected() == 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
}
@@ -20,7 +20,7 @@ import com.intellij.codeInspection.CleanupLocalInspectionTool
import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.openapi.editor.Editor
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.psiUtil.containingClass
@@ -40,7 +40,7 @@ class RemoveEmptyPrimaryConstructorIntention :
element.annotations.isNotEmpty() -> false
element.modifierList?.text?.isBlank() == false -> false
element.containingClass()?.secondaryConstructors?.isNotEmpty() == true -> false
element.isExpectedOrExpectedClassMember() -> false
element.isExpectDeclaration() -> false
else -> true
}
}
@@ -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.refactoring.withExpectedActuals
import org.jetbrains.kotlin.idea.references.KtReference
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.actualsForExpected
import org.jetbrains.kotlin.idea.util.*
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.psi.*
import org.jetbrains.kotlin.psi.psiUtil.*
@@ -111,7 +108,7 @@ class ConvertMemberToExtensionIntention : SelfTargetingRangeIntention<KtCallable
val descriptor = element.unsafeResolveToDescriptor()
val containingClass = descriptor.containingDeclaration as ClassDescriptor
val isEffectivelyExpected = allowExpected && element.isExpectedOrExpectedClassMember()
val isEffectivelyExpected = allowExpected && element.isExpectDeclaration()
val file = element.containingKtFile
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.core.getDeepestSuperDeclarations
import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations
import org.jetbrains.kotlin.idea.util.actualsForExpected
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.idea.util.*
import org.jetbrains.kotlin.psi.KtBlockExpression
import org.jetbrains.kotlin.psi.KtDeclaration
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> {
val baseCallables = descriptorsForChange.mapNotNull { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) }
return baseCallables + baseCallables.flatMapTo(HashSet<PsiElement>()) { callable ->
if (callable is KtDeclaration && callable.isExpectedOrExpectedClassMember()) {
if (callable is KtDeclaration && callable.isExpectDeclaration()) {
callable.actualsForExpected()
}
else {
@@ -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.util.IdeDescriptorRenderers
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.KtClass
import org.jetbrains.kotlin.psi.KtDeclaration
@@ -101,7 +101,7 @@ class KotlinChangeSignatureData(
primaryCallables + primaryCallables.flatMapTo(HashSet<UsageInfo>()) { primaryFunction ->
val primaryDeclaration = primaryFunction.declaration as? KtDeclaration ?: return@flatMapTo emptyList()
if (primaryDeclaration.isExpectedOrExpectedClassMember()) {
if (primaryDeclaration.isExpectDeclaration()) {
return@flatMapTo primaryDeclaration.actualsForExpected().mapNotNull {
val descriptor = it.unsafeResolveToDescriptor()
val callableDescriptor = when (descriptor) {
@@ -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.util.actualsForExpected
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.psiUtil.contains
import java.util.*
@@ -140,7 +140,7 @@ class KotlinDefinitionsSearcher : QueryExecutor<PsiElement, DefinitionsScopedSea
private fun processActualDeclarations(declaration: KtDeclaration, consumer: Processor<PsiElement>): Boolean {
return runReadAction {
if (!declaration.isExpectedOrExpectedClassMember()) true
if (!declaration.isExpectDeclaration()) true
else declaration.actualsForExpected().all(consumer::process)
}
}