From 298ee266c37c96460d2c17f0e54e1fe574deeac3 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 23 Mar 2017 21:07:34 +0300 Subject: [PATCH] Move: Fix conflict checking when switching between similar libraries #KT-17006 Fixed --- .../moveDeclarations/moveConflictUtils.kt | 79 ++++++++++++++++--- .../moveFromJsModuleToJvmModule/after/A/A.iml | 11 +++ .../after/A/src/packJvm/ClassUsageJs.kt | 14 ++++ .../after/A/src/packJvm/testJvm.kt | 17 ++++ .../moveFromJsModuleToJvmModule/after/B/B.iml | 11 +++ .../after/B/src/packJs/testJs.kt | 3 + .../before/A/A.iml | 11 +++ .../before/A/src/packJvm/testJvm.kt | 17 ++++ .../before/B/B.iml | 11 +++ .../before/B/src/packJs/testJs.kt | 16 ++++ .../moveFromJsModuleToJvmModule/conflicts.txt | 1 + .../moveFromJsModuleToJvmModule.test | 10 +++ .../moveFromJvmModuleToJsModule/after/A/A.iml | 11 +++ .../after/A/src/packJvm/testJvm.kt | 3 + .../moveFromJvmModuleToJsModule/after/B/B.iml | 11 +++ .../after/B/src/packJs/ClassUsageJvm.kt | 15 ++++ .../after/B/src/packJs/testJs.kt | 16 ++++ .../before/A/A.iml | 11 +++ .../before/A/src/packJvm/testJvm.kt | 17 ++++ .../before/B/B.iml | 11 +++ .../before/B/src/packJs/testJs.kt | 16 ++++ .../moveFromJvmModuleToJsModule/conflicts.txt | 1 + .../moveFromJvmModuleToJsModule.test | 10 +++ .../idea/refactoring/move/AbstractMoveTest.kt | 19 +++-- .../refactoring/move/MoveTestGenerated.java | 12 +++ 25 files changed, 338 insertions(+), 16 deletions(-) create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/A.iml create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/src/packJvm/ClassUsageJs.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/src/packJvm/testJvm.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/B/B.iml create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/B/src/packJs/testJs.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/A/A.iml create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/A/src/packJvm/testJvm.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/B/B.iml create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/B/src/packJs/testJs.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/conflicts.txt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/moveFromJsModuleToJvmModule.test create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/A/A.iml create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/A/src/packJvm/testJvm.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/B.iml create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/src/packJs/ClassUsageJvm.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/src/packJs/testJs.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/A/A.iml create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/A/src/packJvm/testJvm.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/B/B.iml create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/B/src/packJs/testJs.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/conflicts.txt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/moveFromJvmModuleToJsModule.test diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt index 12932a68a52..c55fc8c1618 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project -import com.intellij.openapi.roots.ModuleRootManager +import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiElement import com.intellij.psi.PsiMember import com.intellij.psi.PsiMethod @@ -35,13 +35,19 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor import org.jetbrains.kotlin.idea.caches.resolve.* import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde +import org.jetbrains.kotlin.idea.imports.importableFqName +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.refactoring.getUsageContext import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.renderer.ClassifierNamePolicy +import org.jetbrains.kotlin.renderer.DescriptorRenderer +import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.source.KotlinSourceElement @@ -67,6 +73,9 @@ class MoveConflictChecker( } } + private fun getModuleDescriptor(sourceFile: VirtualFile) = + resolutionFacade.findModuleDescriptor(getModuleInfoByVirtualFile(project, sourceFile)) + private fun KotlinMoveTarget.getContainerDescriptor(): DeclarationDescriptor? { return when (this) { is KotlinMoveTargetForExistingElement -> { @@ -87,14 +96,7 @@ class MoveConflictChecker( val packageFqName = targetContainerFqName ?: return null val targetDir = directory?.virtualFile ?: targetFile val targetModuleDescriptor = if (targetDir != null) { - val targetModule = ModuleUtilCore.findModuleForFile(targetDir, project) ?: return null - val moduleFileIndex = ModuleRootManager.getInstance(targetModule).fileIndex - val targetModuleInfo = when { - moduleFileIndex.isInSourceContent(targetDir) -> targetModule.productionSourceInfo() - moduleFileIndex.isInTestSourceContent(targetDir) -> targetModule.testSourceInfo() - else -> return null - } - resolutionFacade.findModuleDescriptor(targetModuleInfo) ?: return null + getModuleDescriptor(targetDir) ?: return null } else { resolutionFacade.moduleDescriptor @@ -156,6 +158,19 @@ class MoveConflictChecker( } } + companion object { + private val DESCRIPTOR_RENDERER_FOR_COMPARISON = DescriptorRenderer.withOptions { + withDefinedIn = true + classifierNamePolicy = ClassifierNamePolicy.FULLY_QUALIFIED + modifiers = emptySet() + withoutTypeParameters = true + parameterNameRenderingPolicy = ParameterNameRenderingPolicy.NONE + includeAdditionalModifiers = false + renderUnabbreviatedType = false + withoutSuperTypes = true + } + } + private fun checkModuleConflictsInDeclarations( internalUsages: MutableSet, conflicts: MultiMap @@ -163,6 +178,47 @@ class MoveConflictChecker( val sourceRoot = moveTarget.targetFile ?: return val targetModule = ModuleUtilCore.findModuleForFile(sourceRoot, project) ?: return val resolveScope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(targetModule) + + fun isInScope(targetElement: PsiElement, targetDescriptor: DeclarationDescriptor): Boolean { + if (targetElement in resolveScope) return true + if (targetElement.manager.isInProject(targetElement)) return false + + val fqName = targetDescriptor.importableFqName ?: return true + val importableDescriptor = targetDescriptor.getImportableDescriptor() + val renderedImportableTarget = DESCRIPTOR_RENDERER_FOR_COMPARISON.render(importableDescriptor) + val renderedTarget by lazy { DESCRIPTOR_RENDERER_FOR_COMPARISON.render(targetDescriptor) } + + val targetModuleInfo = getModuleInfoByVirtualFile(project, sourceRoot) + val dummyFile = KtPsiFactory(targetElement.project).createFile("dummy.kt", "").apply { + moduleInfo = targetModuleInfo + targetPlatform = TargetPlatformDetector.getPlatform(targetModule) + } + + val newTargetDescriptors = dummyFile.resolveImportReference(fqName) + + return newTargetDescriptors.any { + if (DESCRIPTOR_RENDERER_FOR_COMPARISON.render(it) != renderedImportableTarget) return@any false + if (importableDescriptor == targetDescriptor) return@any true + + val candidateDescriptors: Collection = when (targetDescriptor) { + is ConstructorDescriptor -> { + (it as? ClassDescriptor)?.constructors ?: emptyList() + } + + is PropertyAccessorDescriptor -> { + (it as? PropertyDescriptor) + ?.let { if (targetDescriptor is PropertyGetterDescriptor) it.getter else it.setter } + ?.let { listOf(it) } + ?: emptyList() + } + + else -> emptyList() + } + + candidateDescriptors.any { DESCRIPTOR_RENDERER_FOR_COMPARISON.render(it) == renderedTarget } + } + } + val referencesToSkip = HashSet() for (declaration in elementsToMove - doNotGoIn) { declaration.forEachDescendantOfType { refExpr -> @@ -173,12 +229,13 @@ class MoveConflictChecker( val target = DescriptorToSourceUtilsIde.getAnyDeclaration(project, targetDescriptor) ?: return@forEachDescendantOfType if (target.isInsideOf(elementsToMove)) return@forEachDescendantOfType - if (target in resolveScope) return@forEachDescendantOfType + + if (isInScope(target, targetDescriptor)) return@forEachDescendantOfType if (target is KtTypeParameter) return@forEachDescendantOfType val superMethods = SmartSet.create() target.toLightMethods().forEach { superMethods += it.findDeepestSuperMethods() } - if (superMethods.any { it in resolveScope }) return@forEachDescendantOfType + if (superMethods.any { isInScope(it, targetDescriptor) }) return@forEachDescendantOfType val refContainer = refExpr.getStrictParentOfType() ?: return@forEachDescendantOfType val scopeDescription = RefactoringUIUtil.getDescription(refContainer, true) diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/A.iml b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/A.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/A.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/src/packJvm/ClassUsageJs.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/src/packJvm/ClassUsageJs.kt new file mode 100644 index 00000000000..ecadfafbae1 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/src/packJvm/ClassUsageJs.kt @@ -0,0 +1,14 @@ +package packJvm + +class ClassUsageJs { + init { + listOf("example") + arrayOf("another") + Pair(1, "2") + } + + @JsName("bar") + fun foo() { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/src/packJvm/testJvm.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/src/packJvm/testJvm.kt new file mode 100644 index 00000000000..19dd7214c20 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/A/src/packJvm/testJvm.kt @@ -0,0 +1,17 @@ +package packJvm + +class ClassUsageJvm { + init { + listOf("example") + arrayOf("another") + Pair(1, "2") + } + + companion object { + @JvmStatic fun foo() { + + } + } +} + +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/B/B.iml b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/B/B.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/B/B.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/B/src/packJs/testJs.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/B/src/packJs/testJs.kt new file mode 100644 index 00000000000..a7314dd2e2b --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/after/B/src/packJs/testJs.kt @@ -0,0 +1,3 @@ +package packJs + +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/A/A.iml b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/A/A.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/A/A.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/A/src/packJvm/testJvm.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/A/src/packJvm/testJvm.kt new file mode 100644 index 00000000000..19dd7214c20 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/A/src/packJvm/testJvm.kt @@ -0,0 +1,17 @@ +package packJvm + +class ClassUsageJvm { + init { + listOf("example") + arrayOf("another") + Pair(1, "2") + } + + companion object { + @JvmStatic fun foo() { + + } + } +} + +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/B/B.iml b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/B/B.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/B/B.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/B/src/packJs/testJs.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/B/src/packJs/testJs.kt new file mode 100644 index 00000000000..50f35a276b2 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/before/B/src/packJs/testJs.kt @@ -0,0 +1,16 @@ +package packJs + +class ClassUsageJs { + init { + listOf("example") + arrayOf("another") + Pair(1, "2") + } + + @JsName("bar") + fun foo() { + + } +} + +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/conflicts.txt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/conflicts.txt new file mode 100644 index 00000000000..796c63826ee --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/conflicts.txt @@ -0,0 +1 @@ +Constructor JsName(String), referenced in function packJs.ClassUsageJs.foo(), will not be accessible in module A diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/moveFromJsModuleToJvmModule.test b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/moveFromJsModuleToJvmModule.test new file mode 100644 index 00000000000..e4e2080ef4b --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/moveFromJsModuleToJvmModule.test @@ -0,0 +1,10 @@ +{ + "mainFile": "B/src/packJs/testJs.kt", + "type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS", + "targetPackage": "packJvm", + "targetSourceRoot": "A/src", + "isMultiModule": "true", + "withRuntime": "true", + "modulesWithRuntime": ["A"], + "modulesWithJsRuntime": ["B"] +} diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/A/A.iml b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/A/A.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/A/A.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/A/src/packJvm/testJvm.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/A/src/packJvm/testJvm.kt new file mode 100644 index 00000000000..0530b3f5ef8 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/A/src/packJvm/testJvm.kt @@ -0,0 +1,3 @@ +package packJvm + +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/B.iml b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/B.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/B.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/src/packJs/ClassUsageJvm.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/src/packJs/ClassUsageJvm.kt new file mode 100644 index 00000000000..4a5ea9828a8 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/src/packJs/ClassUsageJvm.kt @@ -0,0 +1,15 @@ +package packJs + +class ClassUsageJvm { + init { + listOf("example") + arrayOf("another") + Pair(1, "2") + } + + companion object { + @JvmStatic fun foo() { + + } + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/src/packJs/testJs.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/src/packJs/testJs.kt new file mode 100644 index 00000000000..2c0ce732184 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/after/B/src/packJs/testJs.kt @@ -0,0 +1,16 @@ +package packJs + +class ClassUsageJs { + init { + listOf("example") + arrayOf("another") + Pair(1, "2") + } + + @JsName("bar") + fun foo() { + + } +} + +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/A/A.iml b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/A/A.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/A/A.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/A/src/packJvm/testJvm.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/A/src/packJvm/testJvm.kt new file mode 100644 index 00000000000..0447137ab45 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/A/src/packJvm/testJvm.kt @@ -0,0 +1,17 @@ +package packJvm + +class ClassUsageJvm { + init { + listOf("example") + arrayOf("another") + Pair(1, "2") + } + + companion object { + @JvmStatic fun foo() { + + } + } +} + +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/B/B.iml b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/B/B.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/B/B.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/B/src/packJs/testJs.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/B/src/packJs/testJs.kt new file mode 100644 index 00000000000..2c0ce732184 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/before/B/src/packJs/testJs.kt @@ -0,0 +1,16 @@ +package packJs + +class ClassUsageJs { + init { + listOf("example") + arrayOf("another") + Pair(1, "2") + } + + @JsName("bar") + fun foo() { + + } +} + +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/conflicts.txt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/conflicts.txt new file mode 100644 index 00000000000..b0c74b69e4d --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/conflicts.txt @@ -0,0 +1 @@ +Constructor JvmStatic(), referenced in function packJvm.ClassUsageJvm.Companion.foo(), will not be accessible in module B \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/moveFromJvmModuleToJsModule.test b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/moveFromJvmModuleToJsModule.test new file mode 100644 index 00000000000..59673baf30c --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/moveFromJvmModuleToJsModule.test @@ -0,0 +1,10 @@ +{ + "mainFile": "A/src/packJvm/testJvm.kt", + "type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS", + "targetPackage": "packJs", + "targetSourceRoot": "B/src", + "isMultiModule": "true", + "withRuntime": "true", + "modulesWithRuntime": ["A"], + "modulesWithJsRuntime": ["B"] +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt index becc8981079..21051cda2b8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt @@ -72,18 +72,24 @@ abstract class AbstractMoveTest : KotlinMultiFileTestCase() { isMultiModule = config["isMultiModule"]?.asBoolean ?: false doTest({ rootDir, _ -> - val modulesWithRuntime: List + val modulesWithJvmRuntime: List + val modulesWithJsRuntime: List val withRuntime = config["withRuntime"]?.asBoolean ?: false if (withRuntime) { val moduleManager = ModuleManager.getInstance(project) - modulesWithRuntime = + modulesWithJvmRuntime = (config["modulesWithRuntime"]?.asJsonArray?.map { moduleManager.findModuleByName(it.asString!!)!! } ?: moduleManager.modules.toList()) - modulesWithRuntime.forEach { ConfigLibraryUtil.configureKotlinRuntimeAndSdk(it, PluginTestCaseBase.mockJdk()) } + modulesWithJvmRuntime.forEach { ConfigLibraryUtil.configureKotlinRuntimeAndSdk(it, PluginTestCaseBase.mockJdk()) } + modulesWithJsRuntime = + (config["modulesWithJsRuntime"]?.asJsonArray?.map { moduleManager.findModuleByName(it.asString!!)!! } + ?: emptyList()) + modulesWithJsRuntime.forEach { ConfigLibraryUtil.configureKotlinJsRuntimeAndSdk(it, PluginTestCaseBase.mockJdk()) } } else { - modulesWithRuntime = emptyList() + modulesWithJvmRuntime = emptyList() + modulesWithJsRuntime = emptyList() } val mainFile = rootDir.findFileByRelativePath(mainFilePath)!! @@ -122,9 +128,12 @@ abstract class AbstractMoveTest : KotlinMultiFileTestCase() { EditorFactory.getInstance()!!.releaseEditor(editor) - modulesWithRuntime.forEach { + modulesWithJvmRuntime.forEach { ConfigLibraryUtil.unConfigureKotlinRuntimeAndSdk(it, PluginTestCaseBase.mockJdk()) } + modulesWithJsRuntime.forEach { + ConfigLibraryUtil.unConfigureKotlinJsRuntimeAndSdk(it, PluginTestCaseBase.mockJdk()) + } } }, getTestDirName(true)) diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java index 2501ddcfca7..bf10538effe 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java @@ -636,6 +636,18 @@ public class MoveTestGenerated extends AbstractMoveTest { doTest(fileName); } + @TestMetadata("kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/moveFromJsModuleToJvmModule.test") + public void testKotlin_moveTopLevelDeclarations_moveFromJsModuleToJvmModule_MoveFromJsModuleToJvmModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJsModuleToJvmModule/moveFromJsModuleToJvmModule.test"); + doTest(fileName); + } + + @TestMetadata("kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/moveFromJvmModuleToJsModule.test") + public void testKotlin_moveTopLevelDeclarations_moveFromJvmModuleToJsModule_MoveFromJvmModuleToJsModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFromJvmModuleToJsModule/moveFromJvmModuleToJsModule.test"); + doTest(fileName); + } + @TestMetadata("kotlin/moveTopLevelDeclarations/moveFunctionToFile/moveFunctionToFile.test") public void testKotlin_moveTopLevelDeclarations_moveFunctionToFile_MoveFunctionToFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/moveFunctionToFile/moveFunctionToFile.test");