diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt index e0ce5eac8ec..2a408134edc 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt @@ -292,9 +292,7 @@ fun configureFacetByGradleModule( compilerVersion, coroutinesProperty, platform, - modelsProvider, - moduleNode.isHmpp, - moduleNode.pureKotlinSourceFolders + modelsProvider ) if (sourceSetNode == null) { diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt index 716aa447e74..461d1ddaf1c 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt @@ -43,6 +43,7 @@ class KotlinSourceSetInfo(val kotlinModule: KotlinModule) : Serializable { var dependencyClasspath: List = emptyList() var isTestModule: Boolean = false var sourceSetIdsByName: MutableMap = LinkedHashMap() + var dependsOn: List = emptyList() } class KotlinAndroidSourceSetData( diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt.192 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt.192 index a23d207e874..4e5104918dd 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt.192 +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPDataNodes.kt.192 @@ -44,6 +44,7 @@ class KotlinSourceSetInfo @PropertyMapping("kotlinModule") constructor(val kotli var dependencyClasspath: List = emptyList() var isTestModule: Boolean = false var sourceSetIdsByName: MutableMap = LinkedHashMap() + var dependsOn: List = emptyList() } class KotlinAndroidSourceSetData @PropertyMapping("sourceSetInfos") constructor(val sourceSetInfos: List diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt index c3f495fdb4f..4cc0bcd7ebe 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt @@ -724,6 +724,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { info.gradleModuleId = getModuleId(resolverCtx, gradleModule) info.actualPlatforms.addSimplePlatforms(sourceSet.actualPlatforms.platforms) info.isTestModule = sourceSet.isTestModule + info.dependsOn = sourceSet.dependsOnSourceSets.toList() //TODO(auskov): target flours are lost here info.compilerArguments = createCompilerArguments(emptyList(), sourceSet.actualPlatforms.getSinglePlatform()).also { it.multiPlatform = true @@ -754,6 +755,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { sourceSetInfo.gradleModuleId = getModuleId(resolverCtx, gradleModule) sourceSetInfo.actualPlatforms.addSimplePlatforms(listOf(compilation.platform)) sourceSetInfo.isTestModule = compilation.isTestModule + sourceSetInfo.dependsOn = compilation.sourceSets.flatMap { it.dependsOnSourceSets }.distinct().toList() sourceSetInfo.compilerArguments = createCompilerArguments(compilation.arguments.currentArguments.toList(), compilation.platform).also { it.multiPlatform = true diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt index 3f9edd52616..9bc8e240c2e 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt @@ -127,7 +127,8 @@ class KotlinSourceSetDataService : AbstractProjectDataService = emptyList() + var implementedModuleNames: List = emptyList() // used for first implementation of MPP, aka 'old' MPP + var dependsOnModuleNames: List = emptyList() // used for New MPP and later implementations var productionOutputPath: String? = null var testOutputPath: String? = null diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt index 900c1ad90fc..479d86a1402 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt @@ -136,14 +136,9 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings { element.getAttributeValue("useProjectSettings")?.let { useProjectSettings = it.toBoolean() } val targetPlatform = element.getFacetPlatformByConfigurationElement() this.targetPlatform = targetPlatform - element.getChild("implements")?.let { - val items = it.getChildren("implement") - implementedModuleNames = if (items.isNotEmpty()) { - items.mapNotNull { (it.content.firstOrNull() as? Text)?.textTrim } - } else { - listOfNotNull((it.content.firstOrNull() as? Text)?.textTrim) - } - } + readModulesList(element, "implements", "implement")?.let { implementedModuleNames = it } + readModulesList(element, "dependsOnModuleNames", "dependsOn")?.let { dependsOnModuleNames = it } + element.getChild("sourceSets")?.let { val items = it.getChildren("sourceSet") sourceSetNames = items.mapNotNull { (it.content.firstOrNull() as? Text)?.textTrim } @@ -183,6 +178,18 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings { } } +private fun readModulesList(element: Element, rootElementName: String, elementName: String): List? { + element.getChild(rootElementName)?.let { + val items = it.getChildren(elementName) + return if (items.isNotEmpty()) { + items.mapNotNull { (it.content.firstOrNull() as? Text)?.textTrim } + } else { + listOfNotNull((it.content.firstOrNull() as? Text)?.textTrim) + } + } + return null +} + private fun readV2Config(element: Element): KotlinFacetSettings { return readV2AndLaterConfig(element).apply { element.getChild("compilerArguments")?.children?.let { args -> @@ -303,18 +310,9 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) { if (!useProjectSettings) { element.setAttribute("useProjectSettings", useProjectSettings.toString()) } - if (implementedModuleNames.isNotEmpty()) { - element.addContent( - Element("implements").apply { - val singleModule = implementedModuleNames.singleOrNull() - if (singleModule != null) { - addContent(singleModule) - } else { - implementedModuleNames.map { addContent(Element("implement").apply { addContent(it) }) } - } - } - ) - } + saveModulesList(element, implementedModuleNames, "implements", "implement") + saveModulesList(element, dependsOnModuleNames, "dependsOnModuleNames", "dependsOn") + if (sourceSetNames.isNotEmpty()) { element.addContent( Element("sourceSets").apply { @@ -356,6 +354,21 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) { } } +private fun saveModulesList(element: Element, moduleList: List, rootElementName: String, elementName: String) { + if (moduleList.isNotEmpty()) { + element.addContent( + Element(rootElementName).apply { + val singleModule = moduleList.singleOrNull() + if (singleModule != null) { + addContent(singleModule) + } else { + moduleList.map { addContent(Element(elementName).apply { addContent(it) }) } + } + } + ) + } +} + fun CommonCompilerArguments.detectVersionAutoAdvance() { autoAdvanceLanguageVersion = languageVersion == null autoAdvanceApiVersion = apiVersion == null diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt index 4ef7f6ad625..cb03a1362d3 100644 --- a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt @@ -121,7 +121,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_ } } - configureFacet(mavenProject, modifiableModelsProvider, module, false) //HMPP is not supported currently for maven + configureFacet(mavenProject, modifiableModelsProvider, module) } private fun scheduleDownloadStdlibSources(mavenProject: MavenProject, module: Module) { @@ -243,7 +243,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_ PomFile.KotlinGoals.MetaData ) - private fun configureFacet(mavenProject: MavenProject, modifiableModelsProvider: IdeModifiableModelsProvider, module: Module, isHmppModule: Boolean) { + private fun configureFacet(mavenProject: MavenProject, modifiableModelsProvider: IdeModifiableModelsProvider, module: Module) { val mavenPlugin = mavenProject.findPlugin(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID) ?: return val compilerVersion = mavenPlugin.version ?: LanguageVersion.LATEST_STABLE.versionString val kotlinFacet = module.getOrCreateFacet( @@ -259,9 +259,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_ compilerVersion, LanguageFeature.Coroutines.defaultState, platform, - modifiableModelsProvider, - hmppEnabled = isHmppModule, - pureKotlinSourceFolders = emptyList() + modifiableModelsProvider ) val facetSettings = kotlinFacet.configuration.settings val configuredPlatform = kotlinFacet.configuration.settings.targetPlatform!! diff --git a/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt index 7a4b61f36d8..3ef66c19f07 100644 --- a/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt +++ b/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt @@ -282,7 +282,7 @@ fun configureLanguageAndApiVersion( WriteAction.run { val modelsProvider = IdeModifiableModelsProviderImpl(project) val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) - facet.configureFacet(languageVersion, LanguageFeature.State.DISABLED, null, modelsProvider, false, emptyList()) + facet.configureFacet(languageVersion, LanguageFeature.State.DISABLED, null, modelsProvider) if (apiVersion != null) { facet.configuration.settings.apiLevel = LanguageVersion.fromVersionString(apiVersion) } diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt index 086c490b882..91287fe86e9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt @@ -85,6 +85,7 @@ class KotlinFacetEditorGeneralTab( // UI components related to MPP target platforms lateinit var targetPlatformSelectSingleCombobox: ComboBox + lateinit var dependsOnLabel: JLabel lateinit var targetPlatformWrappers: List lateinit var targetPlatformLabel: JLabel //JTextField? var targetPlatformsCurrentlySelected: TargetPlatform? = null @@ -143,6 +144,7 @@ class KotlinFacetEditorGeneralTab( ) useProjectSettingsCheckBox = ThreeStateCheckBox("Use project settings").apply { isThirdStateEnabled = isMultiEditor } + dependsOnLabel = JLabel() targetPlatformWrappers = CommonPlatforms.allDefaultTargetPlatforms.sortedBy { unifyJvmVersion(it.oldFashionedDescription) }.map { TargetPlatformWrapper(it) } @@ -182,6 +184,7 @@ class KotlinFacetEditorGeneralTab( add(useProjectSettingsCheckBox, BorderLayout.WEST) add(projectSettingsLink, BorderLayout.EAST) }).addTargetPlatformComponents() + .addComponent(dependsOnLabel) .addComponent(compilerConfigurable.createComponent()!!.apply { border = null }) @@ -387,6 +390,9 @@ class KotlinFacetEditorGeneralTab( editor.targetPlatformLabel.text = editor.targetPlatformsCurrentlySelected?.componentPlatforms?.map { it.oldFashionedDescription }?.joinToString(", ") ?: "" + editor.dependsOnLabel.isVisible = configuration.settings.dependsOnModuleNames.isNotEmpty() + editor.dependsOnLabel.text = configuration.settings.dependsOnModuleNames.joinToString(",","Depends on: ", ".") + editor.targetPlatformSelectSingleCombobox.selectedItem = configuration.settings.targetPlatform?.let { val index = editor.targetPlatformWrappers.indexOf(TargetPlatformWrapper(it)) if (index >= 0) { diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index 45a4eb51433..5a83013df2a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -144,13 +144,24 @@ fun Module.getOrCreateFacet( return facet } +//method used for non-mpp modules +fun KotlinFacet.configureFacet( + compilerVersion: String?, + coroutineSupport: LanguageFeature.State, + platform: TargetPlatform?, + modelsProvider: IdeModifiableModelsProvider +) { + configureFacet(compilerVersion, coroutineSupport, platform, modelsProvider, false, emptyList(), emptyList()) +} + fun KotlinFacet.configureFacet( compilerVersion: String?, coroutineSupport: LanguageFeature.State, platform: TargetPlatform?, // if null, detect by module dependencies modelsProvider: IdeModifiableModelsProvider, hmppEnabled: Boolean, - pureKotlinSourceFolders: List + pureKotlinSourceFolders: List, + dependsOnList: List ) { val module = module with(configuration.settings) { @@ -158,6 +169,7 @@ fun KotlinFacet.configureFacet( targetPlatform = null compilerSettings = null isHmppEnabled = hmppEnabled + dependsOnModuleNames = dependsOnList initializeIfNeeded( module, modelsProvider.getModifiableRootModel(module), @@ -187,7 +199,7 @@ fun KotlinFacet.configureFacet( platform: IdePlatform<*, *>, modelsProvider: IdeModifiableModelsProvider ) { - configureFacet(compilerVersion, coroutineSupport, platform.toNewPlatform(), modelsProvider, false, emptyList()) //TODO(auskov): passed isHmpp = false + configureFacet(compilerVersion, coroutineSupport, platform.toNewPlatform(), modelsProvider) } diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt index 95981fd8ab2..07958ac1b41 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt @@ -782,7 +782,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() { WriteAction.run { val modelsProvider = IdeModifiableModelsProviderImpl(project) val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) - facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider, false, emptyList()) + facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider) modelsProvider.commit() } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java index 7c302e917a9..c7d645df9ff 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java @@ -350,9 +350,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { "1.1", LanguageFeature.State.ENABLED, platform, - modelsProvider, - false, - emptyList() + modelsProvider ); assertEquals(platform, facet.getConfiguration().getSettings().getTargetPlatform()); assertEquals(jvmTarget.getDescription(),