From e3ce7999930d72adcf3124ab8394210456543276 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Wed, 4 Sep 2019 15:13:55 +0700 Subject: [PATCH] Refactoring: change signature should affected expect/actual #KT-33972 Fixed --- .../ConvertFunctionToPropertyIntention.kt | 2 +- .../idea/refactoring/CallableRefactoring.kt | 50 +++++--- .../KotlinChangeSignatureData.kt | 111 +++++++++++------- .../idea/refactoring/kotlinRefactoringUtil.kt | 2 +- .../changeSignature/actual/common/Some.kt | 1 + .../actual/common/Some.kt.after | 1 + .../changeSignature/actual/js/Some.kt | 2 + .../changeSignature/actual/js/Some.kt.after | 2 + .../changeSignature/actual/jvm/Some.kt | 2 + .../changeSignature/actual/jvm/Some.kt.after | 2 + .../changeSignature/expect/common/Some.kt | 2 + .../expect/common/Some.kt.after | 2 + .../changeSignature/expect/js/Some.kt | 2 + .../changeSignature/expect/js/Some.kt.after | 2 + .../changeSignature/expect/jvm/Some.kt | 1 + .../changeSignature/expect/jvm/Some.kt.after | 1 + .../changeSignature/override/common/Some.kt | 3 + .../override/common/Some.kt.after | 3 + .../changeSignature/override/js/Some.kt | 7 ++ .../changeSignature/override/js/Some.kt.after | 7 ++ .../changeSignature/override/jvm/Some.kt | 8 ++ .../override/jvm/Some.kt.after | 8 ++ .../changeSignature/override2/common/Some.kt | 3 + .../override2/common/Some.kt.after | 3 + .../changeSignature/override2/js/Some.kt | 8 ++ .../override2/js/Some.kt.after | 8 ++ .../changeSignature/override2/jvm/Some.kt | 8 ++ .../override2/jvm/Some.kt.after | 8 ++ .../changeSignature/override3/common/Some.kt | 4 + .../override3/common/Some.kt.after | 4 + .../changeSignature/override3/js/Some.kt | 8 ++ .../override3/js/Some.kt.after | 8 ++ .../changeSignature/override3/jvm/Some.kt | 7 ++ .../override3/jvm/Some.kt.after | 7 ++ .../changeSignature/override4/common/Some.kt | 8 ++ .../override4/common/Some.kt.after | 8 ++ .../changeSignature/override4/js/Some.kt | 8 ++ .../override4/js/Some.kt.after | 8 ++ .../changeSignature/override4/jvm/Some.kt | 7 ++ .../override4/jvm/Some.kt.after | 7 ++ .../changeSignature/override5/common/Some.kt | 8 ++ .../override5/common/Some.kt.after | 8 ++ .../changeSignature/override5/js/Some.kt | 8 ++ .../override5/js/Some.kt.after | 8 ++ .../changeSignature/override5/jvm/Some.kt | 7 ++ .../override5/jvm/Some.kt.after | 7 ++ .../changeSignature/override6/common/Some.kt | 11 ++ .../override6/common/Some.kt.after | 11 ++ .../changeSignature/override6/js/Some.kt | 18 +++ .../override6/js/Some.kt.after | 18 +++ .../changeSignature/override6/jvm/Some.kt | 18 +++ .../override6/jvm/Some.kt.after | 18 +++ .../QuickFixMultiModuleTestGenerated.java | 53 +++++++++ 53 files changed, 473 insertions(+), 63 deletions(-) create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/actual/common/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/actual/common/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/actual/js/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/actual/js/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/expect/js/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/expect/js/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/expect/jvm/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/expect/jvm/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override/common/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override/common/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override/js/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override/js/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override2/common/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override2/common/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override2/js/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override2/js/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override3/js/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override3/js/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override3/jvm/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override3/jvm/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override4/js/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override4/js/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override4/jvm/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override4/jvm/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override5/js/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override5/js/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override5/jvm/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override5/jvm/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override6/common/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override6/common/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override6/js/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override6/js/Some.kt.after create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt create mode 100644 idea/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertFunctionToPropertyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertFunctionToPropertyIntention.kt index d936000311c..1937c330266 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertFunctionToPropertyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertFunctionToPropertyIntention.kt @@ -188,7 +188,7 @@ class ConvertFunctionToPropertyIntention : } } - private fun findMainElement(callables: List): PsiElement? { + private fun findMainElement(callables: Collection): PsiElement? { if (editor == null) return null val offset = editor.caretModel.offset return callables.find { file == it.containingFile && offset in it.textRange } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/CallableRefactoring.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/CallableRefactoring.kt index fab0e5201f0..7b7d7078de3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/CallableRefactoring.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/CallableRefactoring.kt @@ -35,31 +35,24 @@ 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.search.declarationsSearch.forEachOverridingElement import org.jetbrains.kotlin.idea.util.actualsForExpected import org.jetbrains.kotlin.idea.util.getResolutionScope -import org.jetbrains.kotlin.idea.util.isExpectDeclaration import org.jetbrains.kotlin.idea.util.liftToExpected -import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtDeclarationWithBody -import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope -import java.util.* abstract class CallableRefactoring( val project: Project, - callableDescriptor: T, + val callableDescriptor: T, val commandName: String ) { private val LOG = Logger.getInstance(CallableRefactoring::class.java) - @Suppress("UNCHECKED_CAST") - val callableDescriptor = callableDescriptor.liftToExpected() as? T ?: callableDescriptor - private val kind = (callableDescriptor as? CallableMemberDescriptor)?.kind ?: DECLARATION protected open fun forcePerformForSelectedFunctionOnly(): Boolean { @@ -184,15 +177,34 @@ abstract class CallableRefactoring( } } -fun getAffectedCallables(project: Project, descriptorsForChange: Collection): List { - val baseCallables = descriptorsForChange.mapNotNull { DescriptorToSourceUtilsIde.getAnyDeclaration(project, it) } - return baseCallables + baseCallables.flatMapTo(HashSet()) { callable -> - if (callable is KtDeclaration && callable.isExpectDeclaration()) { - callable.actualsForExpected() - } else { - callable.toLightMethods().flatMap { psiMethod -> - val overrides = OverridingMethodsSearch.search(psiMethod).findAll() - overrides.map { method -> method.namedUnwrappedElement ?: method } +fun getAffectedCallables(project: Project, descriptorsForChange: Collection): Collection { + val results = hashSetOf() + for (descriptor in descriptorsForChange) { + val declaration = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) ?: continue + collectAffectedCallables(declaration, results) + } + + return results +} + +private fun collectAffectedCallables(declaration: PsiElement, results: MutableCollection) { + if (!results.add(declaration)) return + if (declaration is KtDeclaration) { + for (it in declaration.actualsForExpected()) { + collectAffectedCallables(it, results) + } + + declaration.liftToExpected()?.let { collectAffectedCallables(it, results) } + + if (declaration !is KtCallableDeclaration) return + declaration.forEachOverridingElement { _, overridingElement -> + results += overridingElement.namedUnwrappedElement ?: overridingElement + true + } + } else { + for (psiMethod in declaration.toLightMethods()) { + OverridingMethodsSearch.search(psiMethod).forEach { + results += it.namedUnwrappedElement ?: it } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureData.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureData.kt index 926d1f99c76..674aa709b5e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureData.kt @@ -28,17 +28,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallableDefinitionUsage 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.isExpectDeclaration +import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.utils.SmartList -import java.util.* class KotlinChangeSignatureData( override val baseDescriptor: CallableDescriptor, @@ -101,45 +97,76 @@ class KotlinChangeSignatureData( } override val affectedCallables: Collection by lazy { - primaryCallables + primaryCallables.flatMapTo(HashSet()) { primaryFunction -> - val primaryDeclaration = primaryFunction.declaration as? KtDeclaration ?: return@flatMapTo emptyList() + val results = hashSetOf() - if (primaryDeclaration.isExpectDeclaration()) { - return@flatMapTo primaryDeclaration.actualsForExpected().mapNotNull { - val callableDescriptor = when (val descriptor = it.unsafeResolveToDescriptor()) { - is CallableDescriptor -> descriptor - is ClassDescriptor -> descriptor.unsubstitutedPrimaryConstructor ?: return@mapNotNull null - else -> return@mapNotNull null - } - KotlinCallableDefinitionUsage(it, callableDescriptor, primaryFunction, null) - } - } - - if (primaryDeclaration !is KtCallableDeclaration) return@flatMapTo emptyList() - - val results = SmartList() - - primaryDeclaration.forEachOverridingElement { baseElement, overridingElement -> - val currentDeclaration = overridingElement.namedUnwrappedElement - results += when (currentDeclaration) { - is KtDeclaration -> { - val overridingDescriptor = currentDeclaration.unsafeResolveToDescriptor() as CallableDescriptor - KotlinCallableDefinitionUsage(currentDeclaration, overridingDescriptor, primaryFunction, null) - } - - is PsiMethod -> { - val baseMethod = baseElement as? PsiMethod ?: return@forEachOverridingElement true - OverriderUsageInfo(currentDeclaration, baseMethod, true, true, true) - } - - else -> return@forEachOverridingElement true - } - - true - } - - results + results += primaryCallables + for (primaryCallable in primaryCallables) { + val primaryDeclaration = primaryCallable.declaration as? KtDeclaration ?: continue + collectMembers(primaryDeclaration, primaryCallable, results) } + + results + } + + private fun collectMembers( + declaration: KtDeclaration, + primaryFunction: KotlinCallableDefinitionUsage, + results: MutableCollection + ) { + if (declaration.isEffectivelyActual()) { + declaration.liftToExpected()?.let { collectExpectActualMembers(it, primaryFunction, results) } + } + + if (declaration.isExpectDeclaration()) for (it in declaration.actualsForExpected()) collectExpectActualMembers(it, primaryFunction, results) + + if (declaration !is KtCallableDeclaration) return + + declaration.forEachOverridingElement { baseElement, overridingElement -> + val currentDeclaration = overridingElement.namedUnwrappedElement + results += when (currentDeclaration) { + is KtDeclaration -> { + val overridingDescriptor = currentDeclaration.unsafeResolveToDescriptor() as CallableDescriptor + KotlinCallableDefinitionUsage( + currentDeclaration, + overridingDescriptor, + primaryFunction, + null, + canDropOverride = false + ) + } + + is PsiMethod -> { + val baseMethod = baseElement as? PsiMethod ?: return@forEachOverridingElement true + OverriderUsageInfo(currentDeclaration, baseMethod, true, true, true) + } + + else -> return@forEachOverridingElement true + } + + true + } + } + + private fun collectExpectActualMembers( + it: KtDeclaration, + primaryFunction: KotlinCallableDefinitionUsage, + results: MutableCollection + ) { + val callableDescriptor = when (val descriptor = it.unsafeResolveToDescriptor()) { + is CallableDescriptor -> descriptor + is ClassDescriptor -> descriptor.unsubstitutedPrimaryConstructor ?: return + else -> return + } + + val usage = KotlinCallableDefinitionUsage( + it, + callableDescriptor, + primaryFunction, + null, + canDropOverride = false + ) + + if (results.add(usage)) collectMembers(it, primaryFunction, results) } override fun getParameters(): List = parameters diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt index e9e152def30..393aa715cef 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt @@ -994,7 +994,7 @@ fun DialogWrapper.showWithTransaction() { TransactionGuard.submitTransaction(disposable, Runnable { show() }) } -fun PsiMethod.checkDeclarationConflict(name: String, conflicts: MultiMap, callables: List) { +fun PsiMethod.checkDeclarationConflict(name: String, conflicts: MultiMap, callables: Collection) { containingClass ?.findMethodsByName(name, true) // as is necessary here: see KT-10386 diff --git a/idea/testData/multiModuleQuickFix/changeSignature/actual/common/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/actual/common/Some.kt new file mode 100644 index 00000000000..1383d90fb7c --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/actual/common/Some.kt @@ -0,0 +1 @@ +expect fun f1(i: Int, s: String) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/actual/common/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/actual/common/Some.kt.after new file mode 100644 index 00000000000..b7b31c7156d --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/actual/common/Some.kt.after @@ -0,0 +1 @@ +expect fun String.f1(i: Int) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/actual/js/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/actual/js/Some.kt new file mode 100644 index 00000000000..666149d3dbd --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/actual/js/Some.kt @@ -0,0 +1,2 @@ +// +actual fun f1(i: Int, s: String) {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/actual/js/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/actual/js/Some.kt.after new file mode 100644 index 00000000000..15491c9e2ec --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/actual/js/Some.kt.after @@ -0,0 +1,2 @@ +// +actual fun String.f1(i: Int) {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt new file mode 100644 index 00000000000..edce719ed45 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt @@ -0,0 +1,2 @@ +// "Convert parameter to receiver" "true" +actual fun f1(i: Int, s: String) {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt.after new file mode 100644 index 00000000000..a0144c910f1 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/actual/jvm/Some.kt.after @@ -0,0 +1,2 @@ +// "Convert parameter to receiver" "true" +actual fun String.f1(i: Int) {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt new file mode 100644 index 00000000000..c64a64ffc39 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt @@ -0,0 +1,2 @@ +// "Convert parameter to receiver" "true" +expect fun f1(i: Int, s: String) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt.after new file mode 100644 index 00000000000..de1f452584a --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/expect/common/Some.kt.after @@ -0,0 +1,2 @@ +// "Convert parameter to receiver" "true" +expect fun String.f1(i: Int) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/expect/js/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/expect/js/Some.kt new file mode 100644 index 00000000000..666149d3dbd --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/expect/js/Some.kt @@ -0,0 +1,2 @@ +// +actual fun f1(i: Int, s: String) {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/expect/js/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/expect/js/Some.kt.after new file mode 100644 index 00000000000..15491c9e2ec --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/expect/js/Some.kt.after @@ -0,0 +1,2 @@ +// +actual fun String.f1(i: Int) {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/expect/jvm/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/expect/jvm/Some.kt new file mode 100644 index 00000000000..def9307f333 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/expect/jvm/Some.kt @@ -0,0 +1 @@ +actual fun f1(i: Int, s: String) {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/expect/jvm/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/expect/jvm/Some.kt.after new file mode 100644 index 00000000000..8bb6793c3f3 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/expect/jvm/Some.kt.after @@ -0,0 +1 @@ +actual fun String.f1(i: Int) {} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override/common/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override/common/Some.kt new file mode 100644 index 00000000000..55eee22b3e9 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override/common/Some.kt @@ -0,0 +1,3 @@ +expect class A { + fun c(a: Int, b: String) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override/common/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override/common/Some.kt.after new file mode 100644 index 00000000000..1e037f76150 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override/common/Some.kt.after @@ -0,0 +1,3 @@ +expect class A { + fun String.c(a: Int) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override/js/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override/js/Some.kt new file mode 100644 index 00000000000..0ff60cc6662 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override/js/Some.kt @@ -0,0 +1,7 @@ +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override/js/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override/js/Some.kt.after new file mode 100644 index 00000000000..9b7c0a28494 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override/js/Some.kt.after @@ -0,0 +1,7 @@ +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt new file mode 100644 index 00000000000..39a9908d8d3 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt @@ -0,0 +1,8 @@ +// "Convert parameter to receiver" "true" +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt.after new file mode 100644 index 00000000000..7ecfb5b1a32 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override/jvm/Some.kt.after @@ -0,0 +1,8 @@ +// "Convert parameter to receiver" "true" +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override2/common/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override2/common/Some.kt new file mode 100644 index 00000000000..30796a797da --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override2/common/Some.kt @@ -0,0 +1,3 @@ +expect class A { + fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override2/common/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override2/common/Some.kt.after new file mode 100644 index 00000000000..75a12447cde --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override2/common/Some.kt.after @@ -0,0 +1,3 @@ +expect class A { + fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override2/js/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override2/js/Some.kt new file mode 100644 index 00000000000..1be56b02ed3 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override2/js/Some.kt @@ -0,0 +1,8 @@ +// +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override2/js/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override2/js/Some.kt.after new file mode 100644 index 00000000000..7c87d513d11 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override2/js/Some.kt.after @@ -0,0 +1,8 @@ +// +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt new file mode 100644 index 00000000000..dd14cda9223 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt @@ -0,0 +1,8 @@ +// "Convert parameter to receiver" "true" +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt.after new file mode 100644 index 00000000000..7c15ed819cd --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override2/jvm/Some.kt.after @@ -0,0 +1,8 @@ +// "Convert parameter to receiver" "true" +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt new file mode 100644 index 00000000000..1b18e61506a --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt @@ -0,0 +1,4 @@ +// "Convert parameter to receiver" "true" +expect class A { + fun c(a: Int, b: String) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt.after new file mode 100644 index 00000000000..fb1804a6cab --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override3/common/Some.kt.after @@ -0,0 +1,4 @@ +// "Convert parameter to receiver" "true" +expect class A { + fun String.c(a: Int) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override3/js/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override3/js/Some.kt new file mode 100644 index 00000000000..1be56b02ed3 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override3/js/Some.kt @@ -0,0 +1,8 @@ +// +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override3/js/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override3/js/Some.kt.after new file mode 100644 index 00000000000..7c87d513d11 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override3/js/Some.kt.after @@ -0,0 +1,8 @@ +// +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override3/jvm/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override3/jvm/Some.kt new file mode 100644 index 00000000000..0ff60cc6662 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override3/jvm/Some.kt @@ -0,0 +1,7 @@ +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override3/jvm/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override3/jvm/Some.kt.after new file mode 100644 index 00000000000..9b7c0a28494 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override3/jvm/Some.kt.after @@ -0,0 +1,7 @@ +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt new file mode 100644 index 00000000000..d46aa54a018 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt @@ -0,0 +1,8 @@ +// "Convert parameter to receiver" "true" +expect open class A() { + open fun c(a: Int, b: String) +} + +class C : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt.after new file mode 100644 index 00000000000..674179b81cf --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override4/common/Some.kt.after @@ -0,0 +1,8 @@ +// "Convert parameter to receiver" "true" +expect open class A() { + open fun String.c(a: Int) +} + +class C : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override4/js/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override4/js/Some.kt new file mode 100644 index 00000000000..1be56b02ed3 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override4/js/Some.kt @@ -0,0 +1,8 @@ +// +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override4/js/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override4/js/Some.kt.after new file mode 100644 index 00000000000..7c87d513d11 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override4/js/Some.kt.after @@ -0,0 +1,8 @@ +// +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override4/jvm/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override4/jvm/Some.kt new file mode 100644 index 00000000000..0ff60cc6662 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override4/jvm/Some.kt @@ -0,0 +1,7 @@ +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override4/jvm/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override4/jvm/Some.kt.after new file mode 100644 index 00000000000..9b7c0a28494 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override4/jvm/Some.kt.after @@ -0,0 +1,7 @@ +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt new file mode 100644 index 00000000000..b71edc39170 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt @@ -0,0 +1,8 @@ +// "Convert parameter to receiver" "true" +expect open class A() { + open fun c(a: Int, b: String) +} + +class C : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt.after new file mode 100644 index 00000000000..c683bb25548 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override5/common/Some.kt.after @@ -0,0 +1,8 @@ +// "Convert parameter to receiver" "true" +expect open class A() { + open fun String.c(a: Int) +} + +class C : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override5/js/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override5/js/Some.kt new file mode 100644 index 00000000000..1be56b02ed3 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override5/js/Some.kt @@ -0,0 +1,8 @@ +// +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override5/js/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override5/js/Some.kt.after new file mode 100644 index 00000000000..7c87d513d11 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override5/js/Some.kt.after @@ -0,0 +1,8 @@ +// +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override5/jvm/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override5/jvm/Some.kt new file mode 100644 index 00000000000..0ff60cc6662 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override5/jvm/Some.kt @@ -0,0 +1,7 @@ +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +class B : A() { + override fun c(a: Int, b: String) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override5/jvm/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override5/jvm/Some.kt.after new file mode 100644 index 00000000000..9b7c0a28494 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override5/jvm/Some.kt.after @@ -0,0 +1,7 @@ +actual open class A { + actual open fun String.c(a: Int) {} +} + +class B : A() { + override fun String.c(a: Int) {} +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override6/common/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override6/common/Some.kt new file mode 100644 index 00000000000..1ca4f010d45 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override6/common/Some.kt @@ -0,0 +1,11 @@ +expect open class A() { + open fun c(a: Int, b: String) +} + +class C : A() { + override fun c(a: Int, b: String) {} +} + +public inline fun with(receiver: T, block: T.() -> R): R { + return receiver.block() +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override6/common/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override6/common/Some.kt.after new file mode 100644 index 00000000000..61521a6ac98 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override6/common/Some.kt.after @@ -0,0 +1,11 @@ +expect open class A() { + open fun String.c(a: Int) +} + +class C : A() { + override fun String.c(a: Int) {} +} + +public inline fun with(receiver: T, block: T.() -> R): R { + return receiver.block() +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override6/js/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override6/js/Some.kt new file mode 100644 index 00000000000..a14a16bb5a4 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override6/js/Some.kt @@ -0,0 +1,18 @@ +// +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +open class B : A() { + override fun c(a: Int, b: String) {} +} + +open class D : B() { + override fun c(a: Int, b: String) {} +} + +fun test(a: Int, b: String) { + with(A()) { + c(a, b) + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override6/js/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override6/js/Some.kt.after new file mode 100644 index 00000000000..40a3fa31f67 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override6/js/Some.kt.after @@ -0,0 +1,18 @@ +// +actual open class A { + actual open fun String.c(a: Int) {} +} + +open class B : A() { + override fun String.c(a: Int) {} +} + +open class D : B() { + override fun String.c(a: Int) {} +} + +fun test(a: Int, b: String) { + with(A()) { + b.c(a) + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt b/idea/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt new file mode 100644 index 00000000000..dbef60e6f98 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt @@ -0,0 +1,18 @@ +// "Convert parameter to receiver" "true" +actual open class A { + actual open fun c(a: Int, b: String) {} +} + +open class B : A() { + override fun c(a: Int, b: String) {} +} + +open class D : B() { + override fun c(a: Int, b: String) {} +} + +fun test(a: Int, b: String) { + with(A()) { + c(a, b) + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt.after b/idea/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt.after new file mode 100644 index 00000000000..4db18395bdb --- /dev/null +++ b/idea/testData/multiModuleQuickFix/changeSignature/override6/jvm/Some.kt.after @@ -0,0 +1,18 @@ +// "Convert parameter to receiver" "true" +actual open class A { + actual open fun String.c(a: Int) {} +} + +open class B : A() { + override fun String.c(a: Int) {} +} + +open class D : B() { + override fun String.c(a: Int) {} +} + +fun test(a: Int, b: String) { + with(A()) { + b.c(a) + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index c0167d9ac41..710332e6cb5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -122,6 +122,59 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul } } + @TestMetadata("idea/testData/multiModuleQuickFix/changeSignature") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ChangeSignature extends AbstractQuickFixMultiModuleTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + @TestMetadata("actual") + public void testActual() throws Exception { + runTest("idea/testData/multiModuleQuickFix/changeSignature/actual/"); + } + + public void testAllFilesPresentInChangeSignature() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/multiModuleQuickFix/changeSignature"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, true); + } + + @TestMetadata("expect") + public void testExpect() throws Exception { + runTest("idea/testData/multiModuleQuickFix/changeSignature/expect/"); + } + + @TestMetadata("override") + public void testOverride() throws Exception { + runTest("idea/testData/multiModuleQuickFix/changeSignature/override/"); + } + + @TestMetadata("override2") + public void testOverride2() throws Exception { + runTest("idea/testData/multiModuleQuickFix/changeSignature/override2/"); + } + + @TestMetadata("override3") + public void testOverride3() throws Exception { + runTest("idea/testData/multiModuleQuickFix/changeSignature/override3/"); + } + + @TestMetadata("override4") + public void testOverride4() throws Exception { + runTest("idea/testData/multiModuleQuickFix/changeSignature/override4/"); + } + + @TestMetadata("override5") + public void testOverride5() throws Exception { + runTest("idea/testData/multiModuleQuickFix/changeSignature/override5/"); + } + + @TestMetadata("override6") + public void testOverride6() throws Exception { + runTest("idea/testData/multiModuleQuickFix/changeSignature/override6/"); + } + } + @TestMetadata("idea/testData/multiModuleQuickFix/createActual") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)