Add list of modules available via dependsOn in FacetSettings

This commit is contained in:
Andrey Uskov
2019-08-22 19:08:51 +03:00
parent 4642127c28
commit 106452b5f0
13 changed files with 68 additions and 37 deletions
@@ -292,9 +292,7 @@ fun configureFacetByGradleModule(
compilerVersion, compilerVersion,
coroutinesProperty, coroutinesProperty,
platform, platform,
modelsProvider, modelsProvider
moduleNode.isHmpp,
moduleNode.pureKotlinSourceFolders
) )
if (sourceSetNode == null) { if (sourceSetNode == null) {
@@ -43,6 +43,7 @@ class KotlinSourceSetInfo(val kotlinModule: KotlinModule) : Serializable {
var dependencyClasspath: List<String> = emptyList() var dependencyClasspath: List<String> = emptyList()
var isTestModule: Boolean = false var isTestModule: Boolean = false
var sourceSetIdsByName: MutableMap<String, String> = LinkedHashMap() var sourceSetIdsByName: MutableMap<String, String> = LinkedHashMap()
var dependsOn: List<String> = emptyList()
} }
class KotlinAndroidSourceSetData( class KotlinAndroidSourceSetData(
@@ -44,6 +44,7 @@ class KotlinSourceSetInfo @PropertyMapping("kotlinModule") constructor(val kotli
var dependencyClasspath: List<String> = emptyList() var dependencyClasspath: List<String> = emptyList()
var isTestModule: Boolean = false var isTestModule: Boolean = false
var sourceSetIdsByName: MutableMap<String, String> = LinkedHashMap() var sourceSetIdsByName: MutableMap<String, String> = LinkedHashMap()
var dependsOn: List<String> = emptyList()
} }
class KotlinAndroidSourceSetData @PropertyMapping("sourceSetInfos") constructor(val sourceSetInfos: List<KotlinSourceSetInfo> class KotlinAndroidSourceSetData @PropertyMapping("sourceSetInfos") constructor(val sourceSetInfos: List<KotlinSourceSetInfo>
@@ -724,6 +724,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
info.gradleModuleId = getModuleId(resolverCtx, gradleModule) info.gradleModuleId = getModuleId(resolverCtx, gradleModule)
info.actualPlatforms.addSimplePlatforms(sourceSet.actualPlatforms.platforms) info.actualPlatforms.addSimplePlatforms(sourceSet.actualPlatforms.platforms)
info.isTestModule = sourceSet.isTestModule info.isTestModule = sourceSet.isTestModule
info.dependsOn = sourceSet.dependsOnSourceSets.toList()
//TODO(auskov): target flours are lost here //TODO(auskov): target flours are lost here
info.compilerArguments = createCompilerArguments(emptyList(), sourceSet.actualPlatforms.getSinglePlatform()).also { info.compilerArguments = createCompilerArguments(emptyList(), sourceSet.actualPlatforms.getSinglePlatform()).also {
it.multiPlatform = true it.multiPlatform = true
@@ -754,6 +755,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
sourceSetInfo.gradleModuleId = getModuleId(resolverCtx, gradleModule) sourceSetInfo.gradleModuleId = getModuleId(resolverCtx, gradleModule)
sourceSetInfo.actualPlatforms.addSimplePlatforms(listOf(compilation.platform)) sourceSetInfo.actualPlatforms.addSimplePlatforms(listOf(compilation.platform))
sourceSetInfo.isTestModule = compilation.isTestModule sourceSetInfo.isTestModule = compilation.isTestModule
sourceSetInfo.dependsOn = compilation.sourceSets.flatMap { it.dependsOnSourceSets }.distinct().toList()
sourceSetInfo.compilerArguments = sourceSetInfo.compilerArguments =
createCompilerArguments(compilation.arguments.currentArguments.toList(), compilation.platform).also { createCompilerArguments(compilation.arguments.currentArguments.toList(), compilation.platform).also {
it.multiPlatform = true it.multiPlatform = true
@@ -127,7 +127,8 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
platform, platform,
modelsProvider, modelsProvider,
mainModuleNode.isHmpp, mainModuleNode.isHmpp,
mainModuleNode.pureKotlinSourceFolders mainModuleNode.pureKotlinSourceFolders,
kotlinSourceSet.dependsOn
) )
val compilerArguments = kotlinSourceSet.compilerArguments val compilerArguments = kotlinSourceSet.compilerArguments
@@ -245,7 +245,8 @@ class KotlinFacetSettings {
} }
} }
var implementedModuleNames: List<String> = emptyList() var implementedModuleNames: List<String> = emptyList() // used for first implementation of MPP, aka 'old' MPP
var dependsOnModuleNames: List<String> = emptyList() // used for New MPP and later implementations
var productionOutputPath: String? = null var productionOutputPath: String? = null
var testOutputPath: String? = null var testOutputPath: String? = null
@@ -136,14 +136,9 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings {
element.getAttributeValue("useProjectSettings")?.let { useProjectSettings = it.toBoolean() } element.getAttributeValue("useProjectSettings")?.let { useProjectSettings = it.toBoolean() }
val targetPlatform = element.getFacetPlatformByConfigurationElement() val targetPlatform = element.getFacetPlatformByConfigurationElement()
this.targetPlatform = targetPlatform this.targetPlatform = targetPlatform
element.getChild("implements")?.let { readModulesList(element, "implements", "implement")?.let { implementedModuleNames = it }
val items = it.getChildren("implement") readModulesList(element, "dependsOnModuleNames", "dependsOn")?.let { dependsOnModuleNames = it }
implementedModuleNames = if (items.isNotEmpty()) {
items.mapNotNull { (it.content.firstOrNull() as? Text)?.textTrim }
} else {
listOfNotNull((it.content.firstOrNull() as? Text)?.textTrim)
}
}
element.getChild("sourceSets")?.let { element.getChild("sourceSets")?.let {
val items = it.getChildren("sourceSet") val items = it.getChildren("sourceSet")
sourceSetNames = items.mapNotNull { (it.content.firstOrNull() as? Text)?.textTrim } 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<String>? {
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 { private fun readV2Config(element: Element): KotlinFacetSettings {
return readV2AndLaterConfig(element).apply { return readV2AndLaterConfig(element).apply {
element.getChild("compilerArguments")?.children?.let { args -> element.getChild("compilerArguments")?.children?.let { args ->
@@ -303,18 +310,9 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) {
if (!useProjectSettings) { if (!useProjectSettings) {
element.setAttribute("useProjectSettings", useProjectSettings.toString()) element.setAttribute("useProjectSettings", useProjectSettings.toString())
} }
if (implementedModuleNames.isNotEmpty()) { saveModulesList(element, implementedModuleNames, "implements", "implement")
element.addContent( saveModulesList(element, dependsOnModuleNames, "dependsOnModuleNames", "dependsOn")
Element("implements").apply {
val singleModule = implementedModuleNames.singleOrNull()
if (singleModule != null) {
addContent(singleModule)
} else {
implementedModuleNames.map { addContent(Element("implement").apply { addContent(it) }) }
}
}
)
}
if (sourceSetNames.isNotEmpty()) { if (sourceSetNames.isNotEmpty()) {
element.addContent( element.addContent(
Element("sourceSets").apply { Element("sourceSets").apply {
@@ -356,6 +354,21 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) {
} }
} }
private fun saveModulesList(element: Element, moduleList: List<String>, 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() { fun CommonCompilerArguments.detectVersionAutoAdvance() {
autoAdvanceLanguageVersion = languageVersion == null autoAdvanceLanguageVersion = languageVersion == null
autoAdvanceApiVersion = apiVersion == null autoAdvanceApiVersion = apiVersion == null
@@ -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) { private fun scheduleDownloadStdlibSources(mavenProject: MavenProject, module: Module) {
@@ -243,7 +243,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_
PomFile.KotlinGoals.MetaData 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 mavenPlugin = mavenProject.findPlugin(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID) ?: return
val compilerVersion = mavenPlugin.version ?: LanguageVersion.LATEST_STABLE.versionString val compilerVersion = mavenPlugin.version ?: LanguageVersion.LATEST_STABLE.versionString
val kotlinFacet = module.getOrCreateFacet( val kotlinFacet = module.getOrCreateFacet(
@@ -259,9 +259,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_
compilerVersion, compilerVersion,
LanguageFeature.Coroutines.defaultState, LanguageFeature.Coroutines.defaultState,
platform, platform,
modifiableModelsProvider, modifiableModelsProvider
hmppEnabled = isHmppModule,
pureKotlinSourceFolders = emptyList()
) )
val facetSettings = kotlinFacet.configuration.settings val facetSettings = kotlinFacet.configuration.settings
val configuredPlatform = kotlinFacet.configuration.settings.targetPlatform!! val configuredPlatform = kotlinFacet.configuration.settings.targetPlatform!!
@@ -282,7 +282,7 @@ fun configureLanguageAndApiVersion(
WriteAction.run<Throwable> { WriteAction.run<Throwable> {
val modelsProvider = IdeModifiableModelsProviderImpl(project) val modelsProvider = IdeModifiableModelsProviderImpl(project)
val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) 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) { if (apiVersion != null) {
facet.configuration.settings.apiLevel = LanguageVersion.fromVersionString(apiVersion) facet.configuration.settings.apiLevel = LanguageVersion.fromVersionString(apiVersion)
} }
@@ -85,6 +85,7 @@ class KotlinFacetEditorGeneralTab(
// UI components related to MPP target platforms // UI components related to MPP target platforms
lateinit var targetPlatformSelectSingleCombobox: ComboBox<TargetPlatformWrapper> lateinit var targetPlatformSelectSingleCombobox: ComboBox<TargetPlatformWrapper>
lateinit var dependsOnLabel: JLabel
lateinit var targetPlatformWrappers: List<TargetPlatformWrapper> lateinit var targetPlatformWrappers: List<TargetPlatformWrapper>
lateinit var targetPlatformLabel: JLabel //JTextField? lateinit var targetPlatformLabel: JLabel //JTextField?
var targetPlatformsCurrentlySelected: TargetPlatform? = null var targetPlatformsCurrentlySelected: TargetPlatform? = null
@@ -143,6 +144,7 @@ class KotlinFacetEditorGeneralTab(
) )
useProjectSettingsCheckBox = ThreeStateCheckBox("Use project settings").apply { isThirdStateEnabled = isMultiEditor } useProjectSettingsCheckBox = ThreeStateCheckBox("Use project settings").apply { isThirdStateEnabled = isMultiEditor }
dependsOnLabel = JLabel()
targetPlatformWrappers = targetPlatformWrappers =
CommonPlatforms.allDefaultTargetPlatforms.sortedBy { unifyJvmVersion(it.oldFashionedDescription) }.map { TargetPlatformWrapper(it) } CommonPlatforms.allDefaultTargetPlatforms.sortedBy { unifyJvmVersion(it.oldFashionedDescription) }.map { TargetPlatformWrapper(it) }
@@ -182,6 +184,7 @@ class KotlinFacetEditorGeneralTab(
add(useProjectSettingsCheckBox, BorderLayout.WEST) add(useProjectSettingsCheckBox, BorderLayout.WEST)
add(projectSettingsLink, BorderLayout.EAST) add(projectSettingsLink, BorderLayout.EAST)
}).addTargetPlatformComponents() }).addTargetPlatformComponents()
.addComponent(dependsOnLabel)
.addComponent(compilerConfigurable.createComponent()!!.apply { .addComponent(compilerConfigurable.createComponent()!!.apply {
border = null border = null
}) })
@@ -387,6 +390,9 @@ class KotlinFacetEditorGeneralTab(
editor.targetPlatformLabel.text = editor.targetPlatformLabel.text =
editor.targetPlatformsCurrentlySelected?.componentPlatforms?.map { it.oldFashionedDescription }?.joinToString(", ") editor.targetPlatformsCurrentlySelected?.componentPlatforms?.map { it.oldFashionedDescription }?.joinToString(", ")
?: "<none>" ?: "<none>"
editor.dependsOnLabel.isVisible = configuration.settings.dependsOnModuleNames.isNotEmpty()
editor.dependsOnLabel.text = configuration.settings.dependsOnModuleNames.joinToString(",","Depends on: ", ".")
editor.targetPlatformSelectSingleCombobox.selectedItem = configuration.settings.targetPlatform?.let { editor.targetPlatformSelectSingleCombobox.selectedItem = configuration.settings.targetPlatform?.let {
val index = editor.targetPlatformWrappers.indexOf(TargetPlatformWrapper(it)) val index = editor.targetPlatformWrappers.indexOf(TargetPlatformWrapper(it))
if (index >= 0) { if (index >= 0) {
@@ -144,13 +144,24 @@ fun Module.getOrCreateFacet(
return facet 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( fun KotlinFacet.configureFacet(
compilerVersion: String?, compilerVersion: String?,
coroutineSupport: LanguageFeature.State, coroutineSupport: LanguageFeature.State,
platform: TargetPlatform?, // if null, detect by module dependencies platform: TargetPlatform?, // if null, detect by module dependencies
modelsProvider: IdeModifiableModelsProvider, modelsProvider: IdeModifiableModelsProvider,
hmppEnabled: Boolean, hmppEnabled: Boolean,
pureKotlinSourceFolders: List<String> pureKotlinSourceFolders: List<String>,
dependsOnList: List<String>
) { ) {
val module = module val module = module
with(configuration.settings) { with(configuration.settings) {
@@ -158,6 +169,7 @@ fun KotlinFacet.configureFacet(
targetPlatform = null targetPlatform = null
compilerSettings = null compilerSettings = null
isHmppEnabled = hmppEnabled isHmppEnabled = hmppEnabled
dependsOnModuleNames = dependsOnList
initializeIfNeeded( initializeIfNeeded(
module, module,
modelsProvider.getModifiableRootModel(module), modelsProvider.getModifiableRootModel(module),
@@ -187,7 +199,7 @@ fun KotlinFacet.configureFacet(
platform: IdePlatform<*, *>, platform: IdePlatform<*, *>,
modelsProvider: IdeModifiableModelsProvider modelsProvider: IdeModifiableModelsProvider
) { ) {
configureFacet(compilerVersion, coroutineSupport, platform.toNewPlatform(), modelsProvider, false, emptyList()) //TODO(auskov): passed isHmpp = false configureFacet(compilerVersion, coroutineSupport, platform.toNewPlatform(), modelsProvider)
} }
@@ -782,7 +782,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
WriteAction.run<Throwable> { WriteAction.run<Throwable> {
val modelsProvider = IdeModifiableModelsProviderImpl(project) val modelsProvider = IdeModifiableModelsProviderImpl(project)
val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) 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() modelsProvider.commit()
} }
} }
@@ -350,9 +350,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
"1.1", "1.1",
LanguageFeature.State.ENABLED, LanguageFeature.State.ENABLED,
platform, platform,
modelsProvider, modelsProvider
false,
emptyList()
); );
assertEquals(platform, facet.getConfiguration().getSettings().getTargetPlatform()); assertEquals(platform, facet.getConfiguration().getSettings().getTargetPlatform());
assertEquals(jvmTarget.getDescription(), assertEquals(jvmTarget.getDescription(),