diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt index a8c063afa51..3d69381d6b1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt @@ -213,6 +213,9 @@ private fun Module.computeLanguageVersionSettings(): LanguageVersionSettings { val Module.platform: TargetPlatform? get() = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this).targetPlatform ?: project.platform +val Module.isHMPPEnabled: Boolean + get() = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this).isHmppEnabled + // FIXME(dsavvinov): this logic is clearly wrong in MPP environment; review and fix val Project.platform: TargetPlatform? get() { diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt new file mode 100644 index 00000000000..df52b27ebaa --- /dev/null +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle + +import org.jetbrains.kotlin.idea.codeInsight.gradle.MultiplePluginVersionGradleImportingTestCase +import org.junit.After +import org.junit.Before +import org.junit.Test + +class HierarchicalMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportingTestCase() { + //TODO support testing multiple gradle plugins versions + + override fun isApplicableTest(): Boolean { + return !gradleVersion.startsWith("3.") + } + + @Before + fun saveSdksBeforeTest() { + val kotlinSdks = sdkCreationChecker?.getKotlinSdks() ?: emptyList() + if (kotlinSdks.isNotEmpty()) { + fail("Found Kotlin SDK before importing test. Sdk list: $kotlinSdks") + } + } + + @After + fun checkSdkCreated() { + if (sdkCreationChecker?.isKotlinSdkCreated() == false) { + fail("Kotlin SDK was not created during import of HMPP Project.") + } + } + + @Test + fun testImportHMPPFlag() { + configureByFiles() + importProject() + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + allModules { + isHMPP(true) + } + module("project.my-app.commonMain") + module("project.my-app.jvmAndJsMain") + } + } + + private fun checkProjectStructure( + exhaustiveModuleList: Boolean = true, + exhaustiveSourceSourceRootList: Boolean = true, + exhaustiveDependencyList: Boolean = true, + body: ProjectInfo.() -> Unit = {} + ) { + checkProjectStructure( + myProject, + projectPath, + exhaustiveModuleList, + exhaustiveSourceSourceRootList, + exhaustiveDependencyList, + body) + } + + override fun importProject() { + val isUseQualifiedModuleNames = currentExternalProjectSettings.isUseQualifiedModuleNames + currentExternalProjectSettings.isUseQualifiedModuleNames = true + val isCreateEmptyContentRootDirectories = currentExternalProjectSettings.isCreateEmptyContentRootDirectories + currentExternalProjectSettings.isCreateEmptyContentRootDirectories = true + try { + super.importProject() + } finally { + currentExternalProjectSettings.isCreateEmptyContentRootDirectories = isCreateEmptyContentRootDirectories + currentExternalProjectSettings.isUseQualifiedModuleNames = isUseQualifiedModuleNames + } + } + + override fun testDataDirName(): String { + return "hierarchicalMultiplatformImport" + } +} \ No newline at end of file diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt.183 b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt.183 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt index 4e347ab54bc..291a2569067 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt @@ -15,6 +15,7 @@ import com.intellij.openapi.util.io.FileUtil import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.kotlin.idea.facet.KotlinFacet +import org.jetbrains.kotlin.idea.project.isHMPPEnabled import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.platform import org.jetbrains.kotlin.platform.TargetPlatform @@ -103,6 +104,13 @@ class ModuleInfo( } } + fun isHMPP(value: Boolean) { + val actualValue = module.isHMPPEnabled + if (actualValue != value) { + projectInfo.messageCollector.report("Module '${module.name}': expected isHMPP '$value' but found '$actualValue'") + } + } + fun apiVersion(version: String) { val actualVersion = module.languageVersionSettings.apiVersion.versionString if (actualVersion != version) { diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/build.gradle.kts new file mode 100644 index 00000000000..52b83e91513 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/build.gradle.kts @@ -0,0 +1,56 @@ +plugins { + // TODO parametrization + kotlin("multiplatform").version("1.3.40-dev-1840") +} + +repositories { + maven("https://kotlin.bintray.com/kotlin-dev") + jcenter() +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + linuxX64() + + sourceSets { + val commonMain by getting { + } + + val commonTest by getting { + } + + val jvmAndJsMain by creating { + } + + val jvmAndJsTest by creating { + } + + val linuxAndJsMain by creating { + } + + val linuxAndJsTest by creating { + } + + jvm().compilations["main"].defaultSourceSet { + } + + jvm().compilations["test"].defaultSourceSet { + } + + js().compilations["main"].defaultSourceSet { + } + + js().compilations["test"].defaultSourceSet { + } + + linuxX64().compilations["main"].defaultSourceSet { + } + + linuxX64().compilations["test"].defaultSourceSet { + } + } +} diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/settings.gradle.kts new file mode 100644 index 00000000000..53bf7c7541d --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/importHMPPFlag/settings.gradle.kts @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven("https://dl.bintray.com/kotlin/kotlin-dev") + gradlePluginPortal() + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file