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 5e29e77807e..4d47137ec2a 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 @@ -16,12 +16,16 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations +import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleUtilCore +import com.intellij.openapi.module.impl.scopes.JdkScope import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.JdkOrderEntry import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.search.SearchScope import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.util.PsiTreeUtil import com.intellij.refactoring.RefactoringBundle @@ -42,6 +46,8 @@ 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.idea.refactoring.move.KotlinMoveUsage +import org.jetbrains.kotlin.idea.search.and +import org.jetbrains.kotlin.idea.search.not import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.contains @@ -55,6 +61,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.source.KotlinSourceElement import org.jetbrains.kotlin.resolve.source.getPsi @@ -219,13 +226,25 @@ class MoveConflictChecker( } } + private fun Module.getScopeWithPlatformAwareDependencies(): SearchScope { + val baseScope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(this) + + val targetPlatform = TargetPlatformDetector.getPlatform(this) + if (targetPlatform is JvmPlatform) return baseScope + + return ModuleRootManager.getInstance(this) + .orderEntries + .filterIsInstance() + .fold(baseScope as SearchScope) { scope, jdkEntry -> scope and !JdkScope(project, jdkEntry) } + } + fun checkModuleConflictsInDeclarations( internalUsages: MutableSet, conflicts: MultiMap ) { val sourceRoot = moveTarget.targetFile ?: return val targetModule = ModuleUtilCore.findModuleForFile(sourceRoot, project) ?: return - val resolveScope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(targetModule) + val resolveScope = targetModule.getScopeWithPlatformAwareDependencies() fun isInScope(targetElement: PsiElement, targetDescriptor: DeclarationDescriptor): Boolean { if (targetElement in resolveScope) return true diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/A.iml b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/A.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/A.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/src/packJvm/dummy.txt b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/src/packJvm/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/src/packJvm/testJvm.kt b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/src/packJvm/testJvm.kt new file mode 100644 index 00000000000..2a0628c8beb --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/src/packJvm/testJvm.kt @@ -0,0 +1,4 @@ +package packJvm + +import java.util.Properties + diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/B/B.iml b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/B/B.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/B/B.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/B/src/packJs/testJs.kt b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/B/src/packJs/testJs.kt new file mode 100644 index 00000000000..375f50157b1 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/B/src/packJs/testJs.kt @@ -0,0 +1,3 @@ +package packJs + +val user: Properties? = null \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/A.iml b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/A.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/A.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/src/packJvm/dummy.txt b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/src/packJvm/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/src/packJvm/testJvm.kt b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/src/packJvm/testJvm.kt new file mode 100644 index 00000000000..f7b201554aa --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/src/packJvm/testJvm.kt @@ -0,0 +1,5 @@ +package packJvm + +import java.util.Properties + +val user: Properties? = null \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/B/B.iml b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/B/B.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/B/B.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/B/src/packJs/testJs.kt b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/B/src/packJs/testJs.kt new file mode 100644 index 00000000000..1fceb7ddc32 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/B/src/packJs/testJs.kt @@ -0,0 +1,2 @@ +package packJs + diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/conflicts.txt b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/conflicts.txt new file mode 100644 index 00000000000..b47eb02e746 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/conflicts.txt @@ -0,0 +1 @@ +Class java.util.Properties, referenced in property packJvm.user, will not be accessible in module B \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/moveJdkDependentToJsModule.test b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/moveJdkDependentToJsModule.test new file mode 100644 index 00000000000..df81ad933d8 --- /dev/null +++ b/idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/moveJdkDependentToJsModule.test @@ -0,0 +1,8 @@ +{ + "mainFile": "A/src/packJvm/testJvm.kt", + "type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS", + "targetFile": "B/src/packJs/testJs.kt", + "withRuntime": "true", + "modulesWithRuntime": ["A"], + "modulesWithJsRuntime": ["B"] +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java index 7be9f39ada8..4830e987156 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java @@ -78,6 +78,12 @@ public class MultiModuleMoveTestGenerated extends AbstractMultiModuleMoveTest { doTest(fileName); } + @TestMetadata("moveJdkDependentToJsModule/moveJdkDependentToJsModule.test") + public void testMoveJdkDependentToJsModule_MoveJdkDependentToJsModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/moveJdkDependentToJsModule.test"); + doTest(fileName); + } + @TestMetadata("moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test") public void testMoveMultipleFilesToUnrelatedModuleConflict_MoveMultipleFilesToUnrelatedModuleConflict() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test");