Compare commits

...

3 Commits

Author SHA1 Message Date
Kirill Shmakov
8d407fa264 One more fix 2020-11-06 19:16:07 +03:00
Kirill Shmakov
8318d6a1f4 Undo extra changes 2020-11-06 18:53:38 +03:00
Kirill Shmakov
20aef55012 Make mpp tests gutters aware of different platforms run
Behaviour is similar to the test suite gutters:
- simple triangle when there is no history
- triangle + red circle if some runs failed
- triangle + green circle if all runs passed

#KMM-100 Fixed.
2020-11-06 11:49:59 +03:00
25 changed files with 334 additions and 97 deletions

View File

@@ -168,7 +168,9 @@ private fun ideaModelDependencies(
debugString?.appendLine("]")
// Some dependencies prohibited (e.g. common can not depend on a platform)
val correctedResult = result.filterNot { it is LibraryInfo && !platform.canDependOn(it, module.isHMPPEnabled) }
val correctedResult = result.filterNot {
it is LibraryInfo && !platform.canDependOn(it, module.isHMPPEnabled, module.isCommon)
}
debugString?.appendLine(" Corrected result: ${correctedResult.joinToString(prefix = "[", postfix = "]", separator = ";") { it.displayedName }}")
LOG.debug(debugString?.toString())
@@ -176,7 +178,7 @@ private fun ideaModelDependencies(
return correctedResult
}
private fun TargetPlatform.canDependOn(other: IdeaModuleInfo, isHmppEnabled: Boolean): Boolean {
private fun TargetPlatform.canDependOn(other: IdeaModuleInfo, isHmppEnabled: Boolean, isCommonModule: Boolean): Boolean {
if (isHmppEnabled) {
// HACK: allow depending on stdlib even if platforms do not match
if (isNative() && other is AbstractKlibLibraryInfo && other.libraryRoot.endsWith(KONAN_STDLIB_NAME)) return true
@@ -191,7 +193,7 @@ private fun TargetPlatform.canDependOn(other: IdeaModuleInfo, isHmppEnabled: Boo
return this.isJvm() && other.platform.isJvm() ||
this.isJs() && other.platform.isJs() ||
this.isNative() && other.platform.isNative() ||
this.isCommon() && other.platform.isCommon()
(this.isCommon() || isCommonModule) && other.platform.isCommon()
}
}

View File

@@ -1,17 +1,6 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Copyright 2010-2020 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.idea.project
@@ -262,6 +251,9 @@ val Module.platform: TargetPlatform?
val Module.isHMPPEnabled: Boolean
get() = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)?.isHmppEnabled ?: false
val Module.isCommon: Boolean
get() = KotlinFacetSettingsProvider.getInstance(project)?.getInitializedSettings(this)?.isCommonModule == true
// FIXME(dsavvinov): this logic is clearly wrong in MPP environment; review and fix
val Project.platform: TargetPlatform?
get() {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -31,10 +31,14 @@ import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion
import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling
import org.jetbrains.kotlin.idea.roots.migrateNonJvmSourceFolders
import org.jetbrains.kotlin.idea.roots.populateNonJvmSourceRootTypes
import org.jetbrains.kotlin.platform.SimplePlatform
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind
import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind
import org.jetbrains.kotlin.platform.js.JsPlatform
import org.jetbrains.kotlin.platform.jvm.JvmPlatform
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.platform.konan.NativePlatform
import org.jetbrains.kotlin.platform.konan.NativePlatforms
import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
@@ -43,12 +47,30 @@ import org.jetbrains.plugins.gradle.util.GradleConstants
class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetData, Void>() {
override fun getTargetDataKey() = GradleSourceSetData.KEY
private fun getProjectPlatforms(toImport: MutableCollection<DataNode<GradleSourceSetData>>): List<KotlinPlatform> {
val platforms = HashSet<KotlinPlatform>()
for (nodeToImport in toImport) {
nodeToImport.kotlinSourceSet?.also {
platforms += it.actualPlatforms.platforms
}
if (nodeToImport.parent?.children?.any { it.key.dataType.contains("Android") } == true) {
platforms += KotlinPlatform.ANDROID
}
}
return platforms.toList()
}
override fun postProcess(
toImport: MutableCollection<DataNode<GradleSourceSetData>>,
projectData: ProjectData?,
project: Project,
modelsProvider: IdeModifiableModelsProvider
) {
val projectPlatforms = getProjectPlatforms(toImport)
for (nodeToImport in toImport) {
val mainModuleData = ExternalSystemApiUtil.findParent(
nodeToImport,
@@ -65,7 +87,7 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
populateNonJvmSourceRootTypes(nodeToImport, ideModule)
}
configureFacet(sourceSetData, kotlinSourceSet, mainModuleData, ideModule, modelsProvider)?.let { facet ->
configureFacet(sourceSetData, kotlinSourceSet, mainModuleData, ideModule, modelsProvider, projectPlatforms)?.let { facet ->
GradleProjectImportHandler.getInstances(project).forEach { it.importBySourceSet(facet, nodeToImport) }
}
@@ -92,12 +114,38 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
else -> KotlinModuleKind.DEFAULT
}
private fun SimplePlatform.isRelevantFor(projectPlatforms: List<KotlinPlatform>): Boolean {
val jvmPlatforms = listOf(KotlinPlatform.ANDROID, KotlinPlatform.JVM, KotlinPlatform.COMMON)
return when (this) {
is JvmPlatform -> projectPlatforms.intersect(jvmPlatforms).isNotEmpty()
is JsPlatform -> KotlinPlatform.JS in projectPlatforms
is NativePlatform -> KotlinPlatform.NATIVE in projectPlatforms
else -> true
}
}
fun configureFacet(
moduleData: ModuleData,
kotlinSourceSet: KotlinSourceSetInfo,
mainModuleNode: DataNode<ModuleData>,
ideModule: Module,
modelsProvider: IdeModifiableModelsProvider
) = configureFacet(
moduleData,
kotlinSourceSet,
mainModuleNode,
ideModule,
modelsProvider,
enumValues<KotlinPlatform>().toList()
)
fun configureFacet(
moduleData: ModuleData,
kotlinSourceSet: KotlinSourceSetInfo,
mainModuleNode: DataNode<ModuleData>,
ideModule: Module,
modelsProvider: IdeModifiableModelsProvider,
projectPlatforms: List<KotlinPlatform>
): KotlinFacet? {
val compilerVersion = mainModuleNode
.findAll(BuildScriptClasspathData.KEY)
@@ -114,7 +162,7 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
JvmPlatforms.jvmPlatformByTargetVersion(jvmTarget).componentPlatforms
}
is NativeIdePlatformKind -> NativePlatforms.nativePlatformByTargetNames(moduleData.konanTargets)
else -> platformKind.defaultPlatform.componentPlatforms
else -> platformKind.defaultPlatform.filter { it.isRelevantFor(projectPlatforms) }
}
}
.distinct()
@@ -136,6 +184,7 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
platform,
modelsProvider,
mainModuleNode.isHmpp,
kotlinSourceSet.actualPlatforms.platforms.contains(KotlinPlatform.COMMON),
mainModuleNode.pureKotlinSourceFolders,
kotlinSourceSet.dependsOn
)

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/

View File

@@ -1,15 +1,16 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.idea.gradle.testing.common
import com.intellij.openapi.module.Module
import org.jetbrains.kotlin.idea.project.isCommon
import org.jetbrains.kotlin.idea.run.AbstractKotlinMultiplatformTestClassGradleConfigurationProducer
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.isCommon
class KotlinMultiplatformCommonTestClassGradleConfigurationProducer : AbstractKotlinMultiplatformTestClassGradleConfigurationProducer() {
override fun isApplicable(module: Module, platform: TargetPlatform) = platform.isCommon()
override fun isApplicable(module: Module, platform: TargetPlatform) = module.isCommon
}

View File

@@ -1,15 +1,16 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.idea.gradle.testing.common
import com.intellij.openapi.module.Module
import org.jetbrains.kotlin.idea.project.isCommon
import org.jetbrains.kotlin.idea.run.AbstractKotlinMultiplatformTestMethodGradleConfigurationProducer
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.isCommon
class KotlinMultiplatformCommonTestMethodGradleConfigurationProducer : AbstractKotlinMultiplatformTestMethodGradleConfigurationProducer() {
override fun isApplicable(module: Module, platform: TargetPlatform) = platform.isCommon()
override fun isApplicable(module: Module, platform: TargetPlatform) = module.isCommon
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.idea.codeInsight.gradle.MultiplePluginVersionGradleImportingTestCase
import org.jetbrains.kotlin.idea.codeInsight.gradle.mppImportTestMinVersionForMaster
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.platform.CommonPlatforms
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.js.JsPlatforms
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.test.KotlinTestUtils
@@ -24,6 +24,7 @@ import org.junit.Test
//ToDo: Need to remove RUNTIME dependencies when KT-40551 is resolved
class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportingTestCase() {
private fun TargetPlatform.with(other: TargetPlatform) = TargetPlatform(componentPlatforms + other.componentPlatforms)
@Before
fun saveSdksBeforeTest() {
@@ -43,6 +44,8 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
@Test
@PluginTargetVersions(pluginVersion = "1.3.10+", gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster)
fun testProjectDependency() {
val jvmAndJsPlatform = JsPlatforms.defaultJsPlatform.with(JvmPlatforms.jvm16)
configureByFiles()
importProject()
@@ -66,21 +69,23 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
module("project")
module("app")
module("app_commonMain") {
platform(CommonPlatforms.defaultCommonPlatform)
platform(jvmAndJsPlatform)
libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:${gradleKotlinPluginVersion}", DependencyScope.COMPILE)
moduleDependency("lib_commonMain", DependencyScope.COMPILE)
sourceFolder("app/src/commonMain/kotlin", SourceKotlinRootType)
sourceFolder("app/src/commonMain/resources", ResourceKotlinRootType)
inheritProjectOutput()
isCommon(true)
}
module("app_commonTest") {
platform(CommonPlatforms.defaultCommonPlatform)
platform(jvmAndJsPlatform)
libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:${gradleKotlinPluginVersion}", DependencyScope.TEST)
moduleDependency("lib_commonMain", DependencyScope.TEST)
moduleDependency("app_commonMain", DependencyScope.TEST)
sourceFolder("app/src/commonTest/kotlin", TestSourceKotlinRootType)
sourceFolder("app/src/commonTest/resources", TestResourceKotlinRootType)
inheritProjectOutput()
isCommon(true)
}
module("app_jsMain") {
platform(JsPlatforms.defaultJsPlatform)
@@ -92,6 +97,7 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
sourceFolder("app/src/jsMain/kotlin", SourceKotlinRootType)
sourceFolder("app/src/jsMain/resources", ResourceKotlinRootType)
outputPath("app/build/classes/kotlin/js/main", true)
isCommon(false)
}
module("app_jsTest") {
platform(JsPlatforms.defaultJsPlatform)
@@ -106,6 +112,7 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
sourceFolder("app/src/jsTest/kotlin", TestSourceKotlinRootType)
sourceFolder("app/src/jsTest/resources", TestResourceKotlinRootType)
outputPath("app/build/classes/kotlin/js/test", false)
isCommon(false)
}
module("app_jvmMain") {
platform(JvmPlatforms.jvm16)
@@ -119,6 +126,7 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
sourceFolder("app/src/jvmMain/kotlin", JavaSourceRootType.SOURCE)
sourceFolder("app/src/jvmMain/resources", JavaResourceRootType.RESOURCE)
outputPath("app/build/classes/kotlin/jvm/main", true)
isCommon(false)
}
module("app_jvmTest") {
platform(JvmPlatforms.jvm16)
@@ -134,6 +142,7 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
sourceFolder("app/src/jvmTest/kotlin", JavaSourceRootType.TEST_SOURCE)
sourceFolder("app/src/jvmTest/resources", JavaResourceRootType.TEST_RESOURCE)
outputPath("app/build/classes/kotlin/jvm/test", false)
isCommon(false)
}
module("app_main") {
platform(JvmPlatforms.jvm18)
@@ -160,19 +169,21 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
}
module("lib")
module("lib_commonMain") {
platform(CommonPlatforms.defaultCommonPlatform)
platform(jvmAndJsPlatform)
libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:${gradleKotlinPluginVersion}", DependencyScope.COMPILE)
sourceFolder("lib/src/commonMain/kotlin", SourceKotlinRootType)
sourceFolder("lib/src/commonMain/resources", ResourceKotlinRootType)
inheritProjectOutput()
isCommon(true)
}
module("lib_commonTest") {
platform(CommonPlatforms.defaultCommonPlatform)
platform(jvmAndJsPlatform)
libraryDependency("Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:${gradleKotlinPluginVersion}", DependencyScope.TEST)
moduleDependency("lib_commonMain", DependencyScope.TEST)
sourceFolder("lib/src/commonTest/kotlin", TestSourceKotlinRootType)
sourceFolder("lib/src/commonTest/resources", TestResourceKotlinRootType)
inheritProjectOutput()
isCommon(true)
}
module("lib_jsMain") {
platform(JsPlatforms.defaultJsPlatform)
@@ -182,6 +193,7 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
sourceFolder("lib/src/jsMain/kotlin", SourceKotlinRootType)
sourceFolder("lib/src/jsMain/resources", ResourceKotlinRootType)
outputPath("lib/build/classes/kotlin/js/main", true)
isCommon(false)
}
module("lib_jsTest") {
platform(JsPlatforms.defaultJsPlatform)
@@ -194,6 +206,7 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
sourceFolder("lib/src/jsTest/kotlin", TestSourceKotlinRootType)
sourceFolder("lib/src/jsTest/resources", TestResourceKotlinRootType)
outputPath("lib/build/classes/kotlin/js/test", false)
isCommon(false)
}
module("lib_jvmMain") {
platform(JvmPlatforms.jvm16)
@@ -204,6 +217,7 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
sourceFolder("lib/src/jvmMain/kotlin", JavaSourceRootType.SOURCE)
sourceFolder("lib/src/jvmMain/resources", JavaResourceRootType.RESOURCE)
outputPath("lib/build/classes/kotlin/jvm/main", true)
isCommon(false)
}
module("lib_jvmTest") {
platform(JvmPlatforms.jvm16)
@@ -217,6 +231,7 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
sourceFolder("lib/src/jvmTest/kotlin", JavaSourceRootType.TEST_SOURCE)
sourceFolder("lib/src/jvmTest/resources", JavaResourceRootType.TEST_RESOURCE)
outputPath("lib/build/classes/kotlin/jvm/test", false)
isCommon(false)
}
}
}
@@ -898,24 +913,67 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin
}
}
// Checks that common modules keep common flag even in one-target project.
@Test
@PluginTargetVersions(pluginVersion = "1.3.30+", gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster)
fun testCommonTestTargetPlatform() {
fun testCommonTestOnetargetPlatform() {
val jvmAndJsPlatform = JsPlatforms.defaultJsPlatform.with(JvmPlatforms.defaultJvmPlatform)
configureByFiles()
importProject(true)
checkProjectStructure(true, false, false) {
module("KotlinMPPL") {}
module("KotlinMPPL.commonMain") {
platform(CommonPlatforms.defaultCommonPlatform)
platform(jvmAndJsPlatform)
isCommon(true)
}
module("KotlinMPPL.commonTest") {
platform(CommonPlatforms.defaultCommonPlatform)
platform(jvmAndJsPlatform)
isCommon(true)
}
module("KotlinMPPL.jsMain") {
platform(JsPlatforms.defaultJsPlatform)
isCommon(false)
}
module("KotlinMPPL.jsTest") {
platform(JsPlatforms.defaultJsPlatform)
isCommon(false)
}
}
}
// Checks that platform is being assigned depending on existing targets.
@Test
@PluginTargetVersions(pluginVersion = "1.3.60+", gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster)
fun testCommonTestMultitargetPlatform() {
val jvmAndJsPlatform = JsPlatforms.defaultJsPlatform.with(JvmPlatforms.defaultJvmPlatform)
configureByFiles()
importProject(true)
checkProjectStructure(true, false, false) {
module("KotlinMPPL") {}
module("KotlinMPPL.commonMain") {
platform(jvmAndJsPlatform)
isCommon(true)
}
module("KotlinMPPL.commonTest") {
platform(jvmAndJsPlatform)
isCommon(true)
}
module("KotlinMPPL.jsMain") {
platform(JsPlatforms.defaultJsPlatform)
isCommon(false)
}
module("KotlinMPPL.jsTest") {
platform(JsPlatforms.defaultJsPlatform)
isCommon(false)
}
module("KotlinMPPL.jvmMain") {
platform(JvmPlatforms.defaultJvmPlatform)
isCommon(false)
}
module("KotlinMPPL.jvmTest") {
platform(JvmPlatforms.defaultJvmPlatform)
isCommon(false)
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -16,6 +16,7 @@ import org.jetbrains.jps.util.JpsPathUtil
import org.jetbrains.kotlin.config.ExternalSystemTestRunTask
import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.jetbrains.kotlin.idea.facet.externalSystemTestRunTasks
import org.jetbrains.kotlin.idea.project.isCommon
import org.jetbrains.kotlin.idea.project.isHMPPEnabled
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.project.platform
@@ -115,6 +116,13 @@ class ModuleInfo(
}
}
fun isCommon(value: Boolean) {
val actualValue = module.isCommon
if (actualValue != value) {
projectInfo.messageCollector.report("Module '${module.name}': expected isCommon '$value' but found '$actualValue'")
}
}
fun targetPlatform(vararg platforms: TargetPlatform) {
val expected = platforms.flatMap { it.componentPlatforms }.toSet()
val actual = module.platform?.componentPlatforms

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -305,6 +305,8 @@ class KotlinFacetSettings {
@Deprecated(message = "Use mppVersion.isHmppEnabled")
var isHmppEnabled: Boolean = false
var isCommonModule: Boolean = false
val mppVersion: KotlinMultiplatformVersion?
get() = when {
isHmppEnabled -> KotlinMultiplatformVersion.M3

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -160,6 +160,7 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings {
isTestModule = element.getAttributeValue("isTestModule")?.toBoolean() ?: false
externalProjectId = element.getAttributeValue("externalProjectId") ?: ""
isHmppEnabled = element.getAttribute("isHmppProject")?.booleanValue ?: false
isCommonModule = element.getAttribute("isCommonModule")?.booleanValue ?: false
pureKotlinSourceFolders = element.getAttributeValue("pureKotlinSourceFolders")?.split(";")?.toList() ?: emptyList()
element.getChild("compilerSettings")?.let {
compilerSettings = CompilerSettings()
@@ -333,6 +334,9 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) {
if (isHmppEnabled) {
element.setAttribute("isHmppProject", mppVersion.isHmpp.toString())
}
if (isCommonModule) {
element.setAttribute("isCommonModule", "true")
}
if (externalSystemRunTasks.isNotEmpty()) {
element.addContent(
Element("externalSystemTestTasks").apply {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -16,9 +16,12 @@ import org.jetbrains.kotlin.idea.framework.CommonLibraryKind
import org.jetbrains.kotlin.idea.framework.CommonStandardLibraryDescription
import org.jetbrains.kotlin.idea.framework.getCommonRuntimeLibraryVersion
import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling
import org.jetbrains.kotlin.idea.platform.isCompatibleWith
import org.jetbrains.kotlin.idea.platform.tooling
import org.jetbrains.kotlin.idea.project.platform
import org.jetbrains.kotlin.idea.util.module
import org.jetbrains.kotlin.platform.SimplePlatform
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.idePlatformKind
import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind
import org.jetbrains.kotlin.platform.impl.isCommon
@@ -45,9 +48,14 @@ object CommonIdePlatformKindTooling : IdePlatformKindTooling() {
return ::getCommonRuntimeLibraryVersion
}
override fun getTestIcon(declaration: KtNamedDeclaration, descriptor: DeclarationDescriptor): Icon? {
val icons = getInstances()
private fun getRelevantToolings(platform: TargetPlatform?): List<IdePlatformKindTooling> {
return getInstances()
.filter { it != this }
.filter { platform == null || it.kind.isCompatibleWith(platform) }
}
override fun getTestIcon(declaration: KtNamedDeclaration, descriptor: DeclarationDescriptor): Icon? {
val icons = getRelevantToolings(declaration.module?.platform)
.mapNotNull { it.getTestIcon(declaration, descriptor) }
.distinct()

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -9,6 +9,8 @@ import com.intellij.codeInsight.TestFrameworks
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.psi.PsiMethod
import com.intellij.testIntegration.TestFramework
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.toLightMethods
@@ -19,6 +21,7 @@ import org.jetbrains.kotlin.idea.framework.JavaRuntimeDetectionUtil
import org.jetbrains.kotlin.idea.framework.JavaRuntimeLibraryDescription
import org.jetbrains.kotlin.idea.highlighter.KotlinTestRunLineMarkerContributor.Companion.getTestStateIcon
import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling
import org.jetbrains.kotlin.idea.platform.isKotlinTestDeclaration
import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFunction
@@ -51,28 +54,41 @@ class JvmIdePlatformKindTooling : IdePlatformKindTooling() {
}
override fun getTestIcon(declaration: KtNamedDeclaration, descriptor: DeclarationDescriptor): Icon? {
val (url, framework) = when (declaration) {
val (urls, framework) = when (declaration) {
is KtClassOrObject -> {
val lightClass = declaration.toLightClass() ?: return null
val framework = TestFrameworks.detectFramework(lightClass) ?: return null
if (!framework.isTestClass(lightClass)) return null
val qualifiedName = lightClass.qualifiedName ?: return null
"java:suite://$qualifiedName" to framework
val framework = TestFrameworks.detectFramework(lightClass)
if (framework?.isTestClass(lightClass) == false) {
return null
}
listOf("java:suite://${lightClass.qualifiedName}") to framework
}
is KtNamedFunction -> {
val lightMethod = declaration.toLightMethods().firstOrNull() ?: return null
val lightClass = lightMethod.containingClass as? KtLightClass ?: return null
val framework = TestFrameworks.detectFramework(lightClass) ?: return null
if (!framework.isTestMethod(lightMethod, /*checkAbstract = */ false)) return null
"java:test://${lightClass.qualifiedName}/${lightMethod.name}" to framework
val framework = TestFrameworks.detectFramework(lightClass)
if (framework?.isTestMethod(lightMethod, false) == false) {
return null
}
listOf(
"java:test://${lightClass.qualifiedName}/${lightMethod.name}",
"java:test://${lightClass.qualifiedName}.${lightMethod.name}"
) to framework
}
else -> return null
}
return getTestStateIcon(url, declaration.project, strict = false) ?: framework.icon
if (framework != null) {
return getTestStateIcon(urls, declaration.project, strict = false, framework.icon)
}
if (!descriptor.isKotlinTestDeclaration()) {
return null
}
return getTestStateIcon(urls, declaration.project, strict = false)
}
override fun acceptsAsEntryPoint(function: KtFunction) = true

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -11,6 +11,16 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.highlighter.KotlinTestRunLineMarkerContributor.Companion.getTestStateIcon
import org.jetbrains.kotlin.idea.util.string.joinWithEscape
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.platform.IdePlatformKind
import org.jetbrains.kotlin.platform.SimplePlatform
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind
import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind
import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind
import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind
import org.jetbrains.kotlin.platform.js.JsPlatform
import org.jetbrains.kotlin.platform.jvm.JvmPlatform
import org.jetbrains.kotlin.platform.konan.NativePlatform
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -43,10 +53,8 @@ fun getGenericTestIcon(declaration: KtNamedDeclaration, descriptor: DeclarationD
val prefix = if (testName != null) "test://" else "suite://"
val url = prefix + locations.joinWithEscape('.')
val javaUrl = "java:$url"
val project = declaration.project
return getTestStateIcon(javaUrl, project, strict = true) ?: getTestStateIcon(url, project, strict = false)
return getTestStateIcon(listOf("java:$url", url), declaration.project, strict = false)
}
private tailrec fun DeclarationDescriptor.isIgnored(): Boolean {
@@ -69,4 +77,14 @@ fun DeclarationDescriptor.isKotlinTestDeclaration(): Boolean {
val classDescriptor = this as? ClassDescriptorWithResolutionScopes ?: return false
return classDescriptor.declaredCallableMembers.any { it.isKotlinTestDeclaration() }
}
internal fun IdePlatformKind<*>.isCompatibleWith(platform: TargetPlatform): Boolean {
return when (this) {
is JvmIdePlatformKind -> platform.componentPlatforms.any { it is JvmPlatform }
is NativeIdePlatformKind -> platform.componentPlatforms.any { it is NativePlatform }
is JsIdePlatformKind -> platform.componentPlatforms.any { it is JsPlatform }
is CommonIdePlatformKind -> true
else -> false
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/

View File

@@ -1,33 +1,40 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.ide.konan
import com.intellij.execution.TestStateStorage
import com.intellij.execution.actions.RunConfigurationProducer
import com.intellij.icons.AllIcons
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.libraries.DummyLibraryProperties
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription
import com.intellij.psi.util.parentOfType
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.toLightMethods
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.gradle.KotlinPlatform
import org.jetbrains.kotlin.idea.caches.project.isTestModule
import org.jetbrains.kotlin.idea.facet.externalSystemNativeMainRunTasks
import org.jetbrains.kotlin.idea.framework.KotlinLibraryKind
import org.jetbrains.kotlin.idea.highlighter.KotlinTestRunLineMarkerContributor.Companion.getTestStateIcon
import org.jetbrains.kotlin.idea.isMainFunction
import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling
import org.jetbrains.kotlin.idea.platform.getGenericTestIcon
import org.jetbrains.kotlin.idea.platform.isKotlinTestDeclaration
import org.jetbrains.kotlin.idea.util.module
import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind
import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.konan.NativePlatforms
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import javax.swing.Icon
class NativeIdePlatformKindTooling : IdePlatformKindTooling() {
@@ -45,19 +52,28 @@ class NativeIdePlatformKindTooling : IdePlatformKindTooling() {
override fun getLibraryVersionProvider(project: Project): (Library) -> String? = { null }
override fun getTestIcon(declaration: KtNamedDeclaration, descriptor: DeclarationDescriptor): Icon? {
return getGenericTestIcon(declaration, descriptor) {
val availableRunConfigurations = RunConfigurationProducer
.getProducers(declaration.project)
.asSequence()
.filterIsInstance<KotlinNativeRunConfigurationProvider>()
.filter { it.isForTests }
if (!descriptor.isKotlinTestDeclaration()) return null
if (availableRunConfigurations.firstOrNull() == null) {
return@getGenericTestIcon null
val moduleName = descriptor.module.stableName?.asString() ?: ""
val targetName = moduleName.substringAfterLast(".").removeSuffix("Test>")
val urls = when (declaration) {
is KtClassOrObject -> {
val lightClass = declaration.toLightClass() ?: return null
listOf("java:suite://${lightClass.qualifiedName}")
}
return@getGenericTestIcon emptyList()
is KtNamedFunction -> {
val lightMethod = declaration.toLightMethods().firstOrNull() ?: return null
val lightClass = lightMethod.containingClass as? KtLightClass ?: return null
val baseName = "java:test://${lightClass.qualifiedName}.${lightMethod.name}"
listOf("$baseName[${targetName}X64]", "$baseName[$targetName]", baseName)
}
else -> return null
}
return getTestStateIcon(urls, declaration.project, strict = false)
}
override fun acceptsAsEntryPoint(function: KtFunction): Boolean {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/

View File

@@ -1,17 +1,6 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Copyright 2010-2020 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.idea.actions.generate

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/
@@ -157,7 +157,7 @@ fun KotlinFacet.configureFacet(
platform: TargetPlatform?,
modelsProvider: IdeModifiableModelsProvider
) {
configureFacet(compilerVersion, coroutineSupport, platform, modelsProvider, false, emptyList(), emptyList())
configureFacet(compilerVersion, coroutineSupport, platform, modelsProvider, false, false, emptyList(), emptyList())
}
fun KotlinFacet.configureFacet(
@@ -166,6 +166,7 @@ fun KotlinFacet.configureFacet(
platform: TargetPlatform?, // if null, detect by module dependencies
modelsProvider: IdeModifiableModelsProvider,
hmppEnabled: Boolean,
commonModule: Boolean,
pureKotlinSourceFolders: List<String>,
dependsOnList: List<String>
) {
@@ -175,6 +176,7 @@ fun KotlinFacet.configureFacet(
targetPlatform = null
compilerSettings = null
isHmppEnabled = hmppEnabled
isCommonModule = commonModule
dependsOnModuleNames = dependsOnList
initializeIfNeeded(
module,

View File

@@ -34,18 +34,25 @@ import javax.swing.Icon
class KotlinTestRunLineMarkerContributor : RunLineMarkerContributor() {
companion object {
fun getTestStateIcon(url: String, project: Project, strict: Boolean): Icon? {
val defaultIcon = AllIcons.RunConfigurations.TestState.Run
val state = TestStateStorage.getInstance(project).getState(url)
?: return if (strict) null else defaultIcon
fun getTestStateIcon(
urls: List<String>,
project: Project,
strict: Boolean,
defaultIcon: Icon = AllIcons.RunConfigurations.TestState.Run
): Icon? {
for (url in urls) {
val state = TestStateStorage.getInstance(project).getState(url) ?: continue
return when (TestIconMapper.getMagnitude(state.magnitude)) {
TestStateInfo.Magnitude.ERROR_INDEX,
TestStateInfo.Magnitude.FAILED_INDEX -> AllIcons.RunConfigurations.TestState.Red2
TestStateInfo.Magnitude.PASSED_INDEX,
TestStateInfo.Magnitude.COMPLETE_INDEX -> AllIcons.RunConfigurations.TestState.Green2
else -> defaultIcon
return when (TestIconMapper.getMagnitude(state.magnitude)) {
TestStateInfo.Magnitude.ERROR_INDEX,
TestStateInfo.Magnitude.FAILED_INDEX -> AllIcons.RunConfigurations.TestState.Red2
TestStateInfo.Magnitude.PASSED_INDEX,
TestStateInfo.Magnitude.COMPLETE_INDEX -> AllIcons.RunConfigurations.TestState.Green2
else -> defaultIcon
}
}
return if (strict) null else defaultIcon
}
fun SimplePlatform.providesRunnableTests(): Boolean {

View File

@@ -0,0 +1,62 @@
buildscript {
repositories {
{{kotlin_plugin_repositories}}
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:{{kotlin_plugin_version}}")
}
}
repositories {
{{kotlin_plugin_repositories}}
}
apply plugin: 'kotlin-multiplatform'
group 'com.example'
version '0.0.1'
kotlin {
jvm {}
js {
browser {
}
nodejs {
}
}
sourceSets {
commonMain {
dependencies {
implementation kotlin('stdlib-common')
}
}
commonTest {
dependencies {
implementation kotlin('test-common')
implementation kotlin('test-annotations-common')
}
}
jsMain {
dependencies {
implementation kotlin('stdlib-js')
}
}
jsTest {
dependencies {
implementation kotlin('test-js')
}
}
jvmMain {
dependencies {
implementation kotlin('stdlib-jvm')
}
}
jvmTest {
dependencies {
implementation kotlin('test')
implementation kotlin('test-junit') }
}
}
}

View File

@@ -0,0 +1,2 @@
rootProject.name = 'KotlinMPPL'
enableFeaturePreview('GRADLE_METADATA')

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 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.
*/