Skip to content

Commit 423fb9d

Browse files
committed
Move/Copy: Warn about usages of JDK when moving to non-JVM module
#KT-18135 Fixed
1 parent 1d36c49 commit 423fb9d

File tree

14 files changed

+93
-1
lines changed

14 files changed

+93
-1
lines changed

idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/moveConflictUtils.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@
1616

1717
package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations
1818

19+
import com.intellij.openapi.module.Module
1920
import com.intellij.openapi.module.ModuleUtilCore
21+
import com.intellij.openapi.module.impl.scopes.JdkScope
2022
import com.intellij.openapi.project.Project
23+
import com.intellij.openapi.roots.JdkOrderEntry
2124
import com.intellij.openapi.roots.ModuleRootManager
2225
import com.intellij.openapi.vfs.VirtualFile
2326
import com.intellij.psi.*
2427
import com.intellij.psi.search.GlobalSearchScope
28+
import com.intellij.psi.search.SearchScope
2529
import com.intellij.psi.search.searches.ReferencesSearch
2630
import com.intellij.psi.util.PsiTreeUtil
2731
import com.intellij.refactoring.RefactoringBundle
@@ -42,6 +46,8 @@ import org.jetbrains.kotlin.idea.imports.importableFqName
4246
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
4347
import org.jetbrains.kotlin.idea.refactoring.getUsageContext
4448
import org.jetbrains.kotlin.idea.refactoring.move.KotlinMoveUsage
49+
import org.jetbrains.kotlin.idea.search.and
50+
import org.jetbrains.kotlin.idea.search.not
4551
import org.jetbrains.kotlin.lexer.KtTokens
4652
import org.jetbrains.kotlin.psi.*
4753
import org.jetbrains.kotlin.psi.psiUtil.contains
@@ -55,6 +61,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
5561
import org.jetbrains.kotlin.resolve.DescriptorUtils
5662
import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
5763
import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf
64+
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
5865
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
5966
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
6067
import org.jetbrains.kotlin.resolve.source.getPsi
@@ -219,13 +226,25 @@ class MoveConflictChecker(
219226
}
220227
}
221228

229+
private fun Module.getScopeWithPlatformAwareDependencies(): SearchScope {
230+
val baseScope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(this)
231+
232+
val targetPlatform = TargetPlatformDetector.getPlatform(this)
233+
if (targetPlatform is JvmPlatform) return baseScope
234+
235+
return ModuleRootManager.getInstance(this)
236+
.orderEntries
237+
.filterIsInstance<JdkOrderEntry>()
238+
.fold(baseScope as SearchScope) { scope, jdkEntry -> scope and !JdkScope(project, jdkEntry) }
239+
}
240+
222241
fun checkModuleConflictsInDeclarations(
223242
internalUsages: MutableSet<UsageInfo>,
224243
conflicts: MultiMap<PsiElement, String>
225244
) {
226245
val sourceRoot = moveTarget.targetFile ?: return
227246
val targetModule = ModuleUtilCore.findModuleForFile(sourceRoot, project) ?: return
228-
val resolveScope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(targetModule)
247+
val resolveScope = targetModule.getScopeWithPlatformAwareDependencies()
229248

230249
fun isInScope(targetElement: PsiElement, targetDescriptor: DeclarationDescriptor): Boolean {
231250
if (targetElement in resolveScope) return true
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
</component>
11+
</module>

idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/after/A/src/packJvm/dummy.txt

Whitespace-only changes.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package packJvm
2+
3+
import java.util.Properties
4+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
</component>
11+
</module>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package packJs
2+
3+
val user: Properties? = null
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
</component>
11+
</module>

idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/before/A/src/packJvm/dummy.txt

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package packJvm
2+
3+
import java.util.Properties
4+
5+
val <caret>user: Properties? = null
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
</component>
11+
</module>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
package packJs
2+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Class java.util.Properties, referenced in property packJvm.user, will not be accessible in module B
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"mainFile": "A/src/packJvm/testJvm.kt",
3+
"type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS",
4+
"targetFile": "B/src/packJs/testJs.kt",
5+
"withRuntime": "true",
6+
"modulesWithRuntime": ["A"],
7+
"modulesWithJsRuntime": ["B"]
8+
}

idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MultiModuleMoveTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ public void testMoveInternalToAnotherModule_MoveInternalToAnotherModule() throws
7878
doTest(fileName);
7979
}
8080

81+
@TestMetadata("moveJdkDependentToJsModule/moveJdkDependentToJsModule.test")
82+
public void testMoveJdkDependentToJsModule_MoveJdkDependentToJsModule() throws Exception {
83+
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/moveMultiModule/moveJdkDependentToJsModule/moveJdkDependentToJsModule.test");
84+
doTest(fileName);
85+
}
86+
8187
@TestMetadata("moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test")
8288
public void testMoveMultipleFilesToUnrelatedModuleConflict_MoveMultipleFilesToUnrelatedModuleConflict() throws Exception {
8389
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/moveMultiModule/moveMultipleFilesToUnrelatedModuleConflict/moveMultipleFilesToUnrelatedModuleConflict.test");

0 commit comments

Comments
 (0)