From 4bc019736b59b7ec35d28e1f5ceb3c563fb7e10b Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Tue, 2 Mar 2021 19:25:04 +0300 Subject: [PATCH] [MPP] Add KotlinSDK to the set of predefined test SDKs ^KT-45145 Fixed --- .../builtinsAndStdlib/dependencies.txt | 4 +- .../multiplatformLibrary/dependencies.txt | 4 +- .../dependencies.txt | 4 +- .../useCorrectBuiltIns/dependencies.txt | 2 + .../useCorrectBuiltIns/jvmNoSdk/jvmNoSdk.kt | 2 +- .../idea/multiplatform/multiPlatformSetup.kt | 47 ++++++++++++++----- .../jetbrains/kotlin/projectModel/Model.kt | 12 ++++- .../jetbrains/kotlin/projectModel/Parser.kt | 1 + 8 files changed, 56 insertions(+), 20 deletions(-) diff --git a/idea/testData/multiplatform/builtinsAndStdlib/dependencies.txt b/idea/testData/multiplatform/builtinsAndStdlib/dependencies.txt index a59401d4b5e..8908c6cafbe 100644 --- a/idea/testData/multiplatform/builtinsAndStdlib/dependencies.txt +++ b/idea/testData/multiplatform/builtinsAndStdlib/dependencies.txt @@ -5,6 +5,6 @@ MODULE js { platform=[JS] } jvm -> common { kind=DEPENDS_ON } js -> common { kind=DEPENDS_ON } -common -> STDLIB_COMMON { kind=DEPENDENCY } +common -> STDLIB_COMMON, KOTLIN_SDK { kind=DEPENDENCY } jvm -> STDLIB_JVM, KOTLIN_TEST, KOTLIN_TEST_JVM, JUNIT, MOCK_JDK { kind=DEPENDENCY } -js -> STDLIB_JS { kind=DEPENDENCY } +js -> STDLIB_JS, KOTLIN_SDK { kind=DEPENDENCY } diff --git a/idea/testData/multiplatform/multiplatformLibrary/dependencies.txt b/idea/testData/multiplatform/multiplatformLibrary/dependencies.txt index 043dae49965..4dc01b02c13 100644 --- a/idea/testData/multiplatform/multiplatformLibrary/dependencies.txt +++ b/idea/testData/multiplatform/multiplatformLibrary/dependencies.txt @@ -2,7 +2,7 @@ MODULE common { platform=[JVM, JS, Native]; root=common } MODULE jvm { platform=[JVM]; root=jvm; testRoot=jvmTest} MODULE js { platform=[JS]; root=js } -common -> STDLIB_COMMON { kind=DEPENDENCY } +common -> STDLIB_COMMON, KOTLIN_SDK { kind=DEPENDENCY } jvm -> common { kind=DEPENDS_ON } jvm -> STDLIB_JVM, KOTLIN_TEST, KOTLIN_TEST_JVM, JUNIT, MOCK_JDK { kind=DEPENDENCY } -js -> common { kind=DEPENDS_ON } \ No newline at end of file +js -> common, KOTLIN_SDK { kind=DEPENDS_ON } \ No newline at end of file diff --git a/idea/testData/multiplatform/platformDependencyInCommon/dependencies.txt b/idea/testData/multiplatform/platformDependencyInCommon/dependencies.txt index 1051b81e248..600eff92a49 100644 --- a/idea/testData/multiplatform/platformDependencyInCommon/dependencies.txt +++ b/idea/testData/multiplatform/platformDependencyInCommon/dependencies.txt @@ -5,6 +5,6 @@ MODULE js { platform=[JS] } MODULE common { platform=[JVM, JS] } jvm -> STDLIB_JVM, MOCK_JDK { kind=DEPENDENCY } -js -> STDLIB_JS { kind=DEPENDENCY } -common -> STDLIB_COMMON, STDLIB_JVM { kind=DEPENDENCY } +js -> STDLIB_JS, KOTLIN_SDK { kind=DEPENDENCY } +common -> STDLIB_COMMON, STDLIB_JVM, KOTLIN_SDK { kind=DEPENDENCY } jvm -> common { kind=DEPENDS_ON } diff --git a/idea/testData/multiplatform/useCorrectBuiltIns/dependencies.txt b/idea/testData/multiplatform/useCorrectBuiltIns/dependencies.txt index 05c951fbbf9..f35d85bdccd 100644 --- a/idea/testData/multiplatform/useCorrectBuiltIns/dependencies.txt +++ b/idea/testData/multiplatform/useCorrectBuiltIns/dependencies.txt @@ -5,9 +5,11 @@ MODULE jvmWithSdk { platform=[JVM] } MODULE native { platform=[Native] } common -> STDLIB_COMMON { kind=DEPENDENCY } +common -> KOTLIN_SDK { kind=DEPENDENCY } js -> common { kind=DEPENDS_ON } js -> STDLIB_JS { kind=DEPENDENCY } +js -> KOTLIN_SDK { kind=DEPENDENCY } jvmNoSdk -> common { kind=DEPENDS_ON } jvmNoSdk -> STDLIB_JVM { kind=DEPENDENCY } diff --git a/idea/testData/multiplatform/useCorrectBuiltIns/jvmNoSdk/jvmNoSdk.kt b/idea/testData/multiplatform/useCorrectBuiltIns/jvmNoSdk/jvmNoSdk.kt index 3ef4775c191..c0961e1f53c 100644 --- a/idea/testData/multiplatform/useCorrectBuiltIns/jvmNoSdk/jvmNoSdk.kt +++ b/idea/testData/multiplatform/useCorrectBuiltIns/jvmNoSdk/jvmNoSdk.kt @@ -5,7 +5,7 @@ // fun jvmSpecific(args: Array) { val x: Cloneable? = null - args.clone() + args.clone() } //fun nativeSpecific() { diff --git a/idea/tests/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt b/idea/tests/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt index 07163181d11..45a690fea5a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt @@ -15,13 +15,14 @@ import org.jetbrains.kotlin.checkers.utils.clearFileFromDiagnosticMarkup import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.idea.framework.CommonLibraryKind import org.jetbrains.kotlin.idea.framework.JSLibraryKind +import org.jetbrains.kotlin.idea.framework.KotlinSdkType import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest import org.jetbrains.kotlin.idea.stubs.createMultiplatformFacetM1 import org.jetbrains.kotlin.idea.stubs.createMultiplatformFacetM3 import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.util.application.executeWriteCommand -import org.jetbrains.kotlin.idea.util.projectStructure.getModuleDir +import org.jetbrains.kotlin.idea.util.getProjectJdkTableSafe import org.jetbrains.kotlin.idea.util.sourceRoots import org.jetbrains.kotlin.platform.CommonPlatforms import org.jetbrains.kotlin.platform.TargetPlatform @@ -93,19 +94,21 @@ fun AbstractMultiModuleTest.doSetup(projectModel: ProjectResolveModel) { }.toMap() for ((resolveModule, ideaModule) in resolveModulesToIdeaModules.entries) { + val directDependencies: Set = resolveModule.dependencies.mapTo(mutableSetOf()) { it.to } + resolveModule.dependencies.closure(preserveOrder = true) { it.to.dependencies }.forEach { - when (val to = it.to) { - FullJdk -> ConfigLibraryUtil.configureSdk(ideaModule, PluginTestCaseBase.addJdk(testRootDisposable) { - PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK) - }) + when (val dependency = it.to) { + is ResolveSdk -> { + // Only set module SDK if it is specified in module's dependencies explicitly. + // Otherwise the last transitive SDK dependency will be written as Module's SDK, which doesn't happen in the real IDE + // This check is not lifted to capture an SDK dependency and avoid configuring it as a library or module one + if (dependency in directDependencies) + setUpSdkForModule(ideaModule, dependency) + } - MockJdk -> ConfigLibraryUtil.configureSdk(ideaModule, PluginTestCaseBase.addJdk(testRootDisposable) { - PluginTestCaseBase.jdk(TestJdkKind.MOCK_JDK) - }) + is ResolveLibrary -> ideaModule.addLibrary(dependency.root, dependency.name, dependency.kind) - is ResolveLibrary -> ideaModule.addLibrary(to.root, to.name, to.kind) - - else -> ideaModule.addDependency(resolveModulesToIdeaModules[to]!!) + else -> ideaModule.addDependency(resolveModulesToIdeaModules[dependency]!!) } } } @@ -123,6 +126,28 @@ fun AbstractMultiModuleTest.doSetup(projectModel: ProjectResolveModel) { } } +private fun AbstractMultiModuleTest.setUpSdkForModule(ideaModule: Module, sdk: ResolveSdk) { + when (sdk) { + FullJdk -> ConfigLibraryUtil.configureSdk(ideaModule, PluginTestCaseBase.addJdk(testRootDisposable) { + PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK) + }) + + MockJdk -> ConfigLibraryUtil.configureSdk(ideaModule, PluginTestCaseBase.addJdk(testRootDisposable) { + PluginTestCaseBase.jdk(TestJdkKind.MOCK_JDK) + }) + + KotlinSdk -> { + KotlinSdkType.setUpIfNeeded(testRootDisposable) + ConfigLibraryUtil.configureSdk( + ideaModule, + getProjectJdkTableSafe().findMostRecentSdkOfType(KotlinSdkType.INSTANCE) ?: error("Kotlin SDK wasn't created") + ) + } + + else -> error("Don't know how to set up SDK of type: ${sdk::class}") + } +} + private fun Module.collectSourceFolders(): List = sourceRoots.map { it.path } private fun AbstractMultiModuleTest.doSetupProject(rootInfos: List) { diff --git a/idea/tests/org/jetbrains/kotlin/projectModel/Model.kt b/idea/tests/org/jetbrains/kotlin/projectModel/Model.kt index e06c1296f47..ec0224bc0d8 100644 --- a/idea/tests/org/jetbrains/kotlin/projectModel/Model.kt +++ b/idea/tests/org/jetbrains/kotlin/projectModel/Model.kt @@ -171,20 +171,28 @@ sealed class KotlinTest( ) } +interface ResolveSdk object FullJdk : ResolveLibrary( "full-jdk", File("fake file for full jdk"), JvmPlatforms.defaultJvmPlatform, null -) +), ResolveSdk object MockJdk : ResolveLibrary( "mock-jdk", File("fake file for mock jdk"), JvmPlatforms.defaultJvmPlatform, null -) +), ResolveSdk + +object KotlinSdk : ResolveLibrary( + "kotlin-sdk", + File("fake file for kotlin sdk"), + CommonPlatforms.defaultCommonPlatform, + null, +), ResolveSdk open class ResolveDependency(val to: ResolveModule, val kind: Kind) { open class Builder { diff --git a/idea/tests/org/jetbrains/kotlin/projectModel/Parser.kt b/idea/tests/org/jetbrains/kotlin/projectModel/Parser.kt index 16e30f74ed0..7276ec2e913 100644 --- a/idea/tests/org/jetbrains/kotlin/projectModel/Parser.kt +++ b/idea/tests/org/jetbrains/kotlin/projectModel/Parser.kt @@ -22,6 +22,7 @@ open class ProjectStructureParser(private val projectRoot: File) { "STDLIB_COMMON" to ResolveLibrary.Builder(Stdlib.CommonStdlib), "FULL_JDK" to ResolveLibrary.Builder(FullJdk), "MOCK_JDK" to ResolveLibrary.Builder(MockJdk), + "KOTLIN_SDK" to ResolveLibrary.Builder(KotlinSdk), "KOTLIN_TEST_JS" to ResolveLibrary.Builder(KotlinTest.JsKotlinTest), "KOTLIN_TEST_JVM" to ResolveLibrary.Builder(KotlinTest.JvmKotlinTest), "KOTLIN_TEST" to ResolveLibrary.Builder(KotlinTest.JustKotlinTest),