From 3fdfb49ac6c2e1ade004dedbf3ef2270868c35fb Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Mon, 18 Jun 2018 13:01:42 +0300 Subject: [PATCH] Minor: reformat and clean-up facetUtils.kt --- .../jetbrains/kotlin/idea/facet/facetUtils.kt | 117 ++++++++-------- .../kotlin/idea/facet/facetUtils.kt.as31 | 131 ++++++++++-------- .../kotlin/idea/facet/facetUtils.kt.as32 | 131 ++++++++++-------- 3 files changed, 203 insertions(+), 176 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index f52c1520267..e5f9304e988 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.facet import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider -import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.JavaSdk @@ -25,24 +24,17 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModel -import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.util.CachedValueProvider -import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.cli.common.arguments.* import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.caches.project.* import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings import org.jetbrains.kotlin.idea.framework.KotlinSdkType import org.jetbrains.kotlin.idea.util.application.runWriteAction -import org.jetbrains.kotlin.idea.util.projectStructure.sdk import org.jetbrains.kotlin.idea.versions.* import kotlin.reflect.KProperty1 @@ -62,10 +54,10 @@ private fun getDefaultTargetPlatform(module: Module, rootModel: ModuleRootModel? } fun KotlinFacetSettings.initializeIfNeeded( - module: Module, - rootModel: ModuleRootModel?, - platformKind: TargetPlatformKind<*>? = null, // if null, detect by module dependencies - languageVersion: String? = null + module: Module, + rootModel: ModuleRootModel?, + platformKind: TargetPlatformKind<*>? = null, // if null, detect by module dependencies + languageVersion: String? = null ) { val project = module.project @@ -88,14 +80,13 @@ fun KotlinFacetSettings.initializeIfNeeded( if (shouldInferLanguageLevel) { languageLevel = (if (useProjectSettings) LanguageVersion.fromVersionString(commonArguments.languageVersion) else null) - ?: getDefaultLanguageLevel(module, languageVersion) + ?: getDefaultLanguageLevel(module, languageVersion) } if (shouldInferAPILevel) { apiLevel = if (useProjectSettings) { LanguageVersion.fromVersionString(commonArguments.apiVersion) ?: languageLevel - } - else { + } else { languageLevel!!.coerceAtMost(getLibraryLanguageLevel(module, rootModel, targetPlatformKind)) } } @@ -111,26 +102,34 @@ fun TargetPlatformKind<*>.getPlatformCompilerArgumentsByProject(project: Project val TargetPlatformKind<*>.mavenLibraryIds: List get() = when (this) { - is TargetPlatformKind.Jvm -> listOf(MAVEN_STDLIB_ID, MAVEN_STDLIB_ID_JRE7, MAVEN_STDLIB_ID_JDK7, MAVEN_STDLIB_ID_JRE8, MAVEN_STDLIB_ID_JDK8) + is TargetPlatformKind.Jvm -> listOf( + MAVEN_STDLIB_ID, + MAVEN_STDLIB_ID_JRE7, + MAVEN_STDLIB_ID_JDK7, + MAVEN_STDLIB_ID_JRE8, + MAVEN_STDLIB_ID_JDK8 + ) is TargetPlatformKind.JavaScript -> listOf(MAVEN_JS_STDLIB_ID, MAVEN_OLD_JS_STDLIB_ID) is TargetPlatformKind.Common -> listOf(MAVEN_COMMON_STDLIB_ID) } val mavenLibraryIdToPlatform: Map> by lazy { TargetPlatformKind.ALL_PLATFORMS - .flatMap { platform -> platform.mavenLibraryIds.map { it to platform } } - .sortedByDescending { it.first.length } - .toMap() + .flatMap { platform -> platform.mavenLibraryIds.map { it to platform } } + .sortedByDescending { it.first.length } + .toMap() } -fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, - useProjectSettings: Boolean, - commitModel: Boolean = false): KotlinFacet { +fun Module.getOrCreateFacet( + modelsProvider: IdeModifiableModelsProvider, + useProjectSettings: Boolean, + commitModel: Boolean = false +): KotlinFacet { val facetModel = modelsProvider.getModifiableFacetModel(this) val facet = facetModel.findFacet(KotlinFacetType.TYPE_ID, KotlinFacetType.INSTANCE.defaultFacetName) - ?: with(KotlinFacetType.INSTANCE) { createFacet(this@getOrCreateFacet, defaultFacetName, createDefaultConfiguration(), null) } - .apply { facetModel.addFacet(this) } + ?: with(KotlinFacetType.INSTANCE) { createFacet(this@getOrCreateFacet, defaultFacetName, createDefaultConfiguration(), null) } + .apply { facetModel.addFacet(this) } facet.configuration.settings.useProjectSettings = useProjectSettings if (commitModel) { runWriteAction { @@ -141,20 +140,20 @@ fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, } fun KotlinFacet.configureFacet( - compilerVersion: String, - coroutineSupport: LanguageFeature.State, - platformKind: TargetPlatformKind<*>?, // if null, detect by module dependencies - modelsProvider: IdeModifiableModelsProvider + compilerVersion: String, + coroutineSupport: LanguageFeature.State, + platformKind: TargetPlatformKind<*>?, // if null, detect by module dependencies + modelsProvider: IdeModifiableModelsProvider ) { val module = module with(configuration.settings) { compilerArguments = null compilerSettings = null initializeIfNeeded( - module, - modelsProvider.getModifiableRootModel(module), - platformKind, - compilerVersion + module, + modelsProvider.getModifiableRootModel(module), + platformKind, + compilerVersion ) val apiLevel = apiLevel val languageLevel = languageLevel @@ -174,31 +173,41 @@ fun KotlinFacet.noVersionAutoAdvance() { // "Primary" fields are written to argument beans directly and thus not presented in the "additional arguments" string // Update these lists when facet/project settings UI changes -val commonUIExposedFields = listOf(CommonCompilerArguments::languageVersion.name, - CommonCompilerArguments::apiVersion.name, - CommonCompilerArguments::suppressWarnings.name, - CommonCompilerArguments::coroutinesState.name) -private val commonUIHiddenFields = listOf(CommonCompilerArguments::pluginClasspaths.name, - CommonCompilerArguments::pluginOptions.name) +val commonUIExposedFields = listOf( + CommonCompilerArguments::languageVersion.name, + CommonCompilerArguments::apiVersion.name, + CommonCompilerArguments::suppressWarnings.name, + CommonCompilerArguments::coroutinesState.name +) +private val commonUIHiddenFields = listOf( + CommonCompilerArguments::pluginClasspaths.name, + CommonCompilerArguments::pluginOptions.name +) private val commonPrimaryFields = commonUIExposedFields + commonUIHiddenFields -private val jvmSpecificUIExposedFields = listOf(K2JVMCompilerArguments::jvmTarget.name, - K2JVMCompilerArguments::destination.name, - K2JVMCompilerArguments::classpath.name) +private val jvmSpecificUIExposedFields = listOf( + K2JVMCompilerArguments::jvmTarget.name, + K2JVMCompilerArguments::destination.name, + K2JVMCompilerArguments::classpath.name +) val jvmUIExposedFields = commonUIExposedFields + jvmSpecificUIExposedFields private val jvmPrimaryFields = commonPrimaryFields + jvmSpecificUIExposedFields -private val jsSpecificUIExposedFields = listOf(K2JSCompilerArguments::sourceMap.name, - K2JSCompilerArguments::sourceMapPrefix.name, - K2JSCompilerArguments::sourceMapEmbedSources.name, - K2JSCompilerArguments::outputPrefix.name, - K2JSCompilerArguments::outputPostfix.name, - K2JSCompilerArguments::moduleKind.name) +private val jsSpecificUIExposedFields = listOf( + K2JSCompilerArguments::sourceMap.name, + K2JSCompilerArguments::sourceMapPrefix.name, + K2JSCompilerArguments::sourceMapEmbedSources.name, + K2JSCompilerArguments::outputPrefix.name, + K2JSCompilerArguments::outputPostfix.name, + K2JSCompilerArguments::moduleKind.name +) val jsUIExposedFields = commonUIExposedFields + jsSpecificUIExposedFields private val jsPrimaryFields = commonPrimaryFields + jsSpecificUIExposedFields -private val metadataSpecificUIExposedFields = listOf(K2MetadataCompilerArguments::destination.name, - K2MetadataCompilerArguments::classpath.name) +private val metadataSpecificUIExposedFields = listOf( + K2MetadataCompilerArguments::destination.name, + K2MetadataCompilerArguments::classpath.name +) val metadataUIExposedFields = commonUIExposedFields + metadataSpecificUIExposedFields private val metadataPrimaryFields = commonPrimaryFields + metadataSpecificUIExposedFields @@ -236,10 +245,10 @@ private fun Module.configureSdkIfPossible(compilerArguments: CommonCompilerArgum } fun parseCompilerArgumentsToFacet( - arguments: List, - defaultArguments: List, - kotlinFacet: KotlinFacet, - modelsProvider: IdeModifiableModelsProvider + arguments: List, + defaultArguments: List, + kotlinFacet: KotlinFacet, + modelsProvider: IdeModifiableModelsProvider ) { with(kotlinFacet.configuration.settings) { val compilerArguments = this.compilerArguments ?: return @@ -261,7 +270,7 @@ fun parseCompilerArgumentsToFacet( val ignoredFields = compilerArguments.ignoredFields fun exposeAsAdditionalArgument(property: KProperty1) = - property.name !in primaryFields && property.get(compilerArguments) != property.get(defaultCompilerArguments) + property.name !in primaryFields && property.get(compilerArguments) != property.get(defaultCompilerArguments) val additionalArgumentsString = with(compilerArguments::class.java.newInstance()) { copyFieldsSatisfying(compilerArguments, this) { exposeAsAdditionalArgument(it) && it.name !in ignoredFields } diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt.as31 b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt.as31 index c1e44fd5117..a45334f80db 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt.as31 +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt.as31 @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.facet import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider -import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.JavaSdk @@ -25,24 +24,17 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModel -import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.util.CachedValueProvider -import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.cli.common.arguments.* import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.caches.project.* import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings import org.jetbrains.kotlin.idea.framework.KotlinSdkType import org.jetbrains.kotlin.idea.util.application.runWriteAction -import org.jetbrains.kotlin.idea.util.projectStructure.sdk import org.jetbrains.kotlin.idea.versions.* import kotlin.reflect.KProperty1 @@ -62,10 +54,10 @@ private fun getDefaultTargetPlatform(module: Module, rootModel: ModuleRootModel? } fun KotlinFacetSettings.initializeIfNeeded( - module: Module, - rootModel: ModuleRootModel?, - platformKind: TargetPlatformKind<*>? = null, // if null, detect by module dependencies - languageVersion: String? = null + module: Module, + rootModel: ModuleRootModel?, + platformKind: TargetPlatformKind<*>? = null, // if null, detect by module dependencies + languageVersion: String? = null ) { val project = module.project @@ -88,14 +80,13 @@ fun KotlinFacetSettings.initializeIfNeeded( if (shouldInferLanguageLevel) { languageLevel = (if (useProjectSettings) LanguageVersion.fromVersionString(commonArguments.languageVersion) else null) - ?: getDefaultLanguageLevel(module, languageVersion) + ?: getDefaultLanguageLevel(module, languageVersion) } if (shouldInferAPILevel) { apiLevel = if (useProjectSettings) { LanguageVersion.fromVersionString(commonArguments.apiVersion) ?: languageLevel - } - else { + } else { languageLevel!!.coerceAtMost(getLibraryLanguageLevel(module, rootModel, targetPlatformKind)) } } @@ -111,26 +102,34 @@ fun TargetPlatformKind<*>.getPlatformCompilerArgumentsByProject(project: Project val TargetPlatformKind<*>.mavenLibraryIds: List get() = when (this) { - is TargetPlatformKind.Jvm -> listOf(MAVEN_STDLIB_ID, MAVEN_STDLIB_ID_JRE7, MAVEN_STDLIB_ID_JDK7, MAVEN_STDLIB_ID_JRE8, MAVEN_STDLIB_ID_JDK8) + is TargetPlatformKind.Jvm -> listOf( + MAVEN_STDLIB_ID, + MAVEN_STDLIB_ID_JRE7, + MAVEN_STDLIB_ID_JDK7, + MAVEN_STDLIB_ID_JRE8, + MAVEN_STDLIB_ID_JDK8 + ) is TargetPlatformKind.JavaScript -> listOf(MAVEN_JS_STDLIB_ID, MAVEN_OLD_JS_STDLIB_ID) is TargetPlatformKind.Common -> listOf(MAVEN_COMMON_STDLIB_ID) } val mavenLibraryIdToPlatform: Map> by lazy { TargetPlatformKind.ALL_PLATFORMS - .flatMap { platform -> platform.mavenLibraryIds.map { it to platform } } - .sortedByDescending { it.first.length } - .toMap() + .flatMap { platform -> platform.mavenLibraryIds.map { it to platform } } + .sortedByDescending { it.first.length } + .toMap() } -fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, - useProjectSettings: Boolean, - commitModel: Boolean = false): KotlinFacet { +fun Module.getOrCreateFacet( + modelsProvider: IdeModifiableModelsProvider, + useProjectSettings: Boolean, + commitModel: Boolean = false +): KotlinFacet { val facetModel = modelsProvider.getModifiableFacetModel(this) val facet = facetModel.findFacet(KotlinFacetType.TYPE_ID, KotlinFacetType.INSTANCE.defaultFacetName) - ?: with(KotlinFacetType.INSTANCE) { createFacet(this@getOrCreateFacet, defaultFacetName, createDefaultConfiguration(), null) } - .apply { facetModel.addFacet(this) } + ?: with(KotlinFacetType.INSTANCE) { createFacet(this@getOrCreateFacet, defaultFacetName, createDefaultConfiguration(), null) } + .apply { facetModel.addFacet(this) } facet.configuration.settings.useProjectSettings = useProjectSettings if (commitModel) { runWriteAction { @@ -141,20 +140,20 @@ fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, } fun KotlinFacet.configureFacet( - compilerVersion: String, - coroutineSupport: LanguageFeature.State, - platformKind: TargetPlatformKind<*>?, // if null, detect by module dependencies - modelsProvider: IdeModifiableModelsProvider + compilerVersion: String, + coroutineSupport: LanguageFeature.State, + platformKind: TargetPlatformKind<*>?, // if null, detect by module dependencies + modelsProvider: IdeModifiableModelsProvider ) { val module = module with(configuration.settings) { compilerArguments = null compilerSettings = null initializeIfNeeded( - module, - modelsProvider.getModifiableRootModel(module), - platformKind, - compilerVersion + module, + modelsProvider.getModifiableRootModel(module), + platformKind, + compilerVersion ) val apiLevel = apiLevel val languageLevel = languageLevel @@ -174,31 +173,41 @@ fun KotlinFacet.noVersionAutoAdvance() { // "Primary" fields are written to argument beans directly and thus not presented in the "additional arguments" string // Update these lists when facet/project settings UI changes -val commonUIExposedFields = listOf(CommonCompilerArguments::languageVersion.name, - CommonCompilerArguments::apiVersion.name, - CommonCompilerArguments::suppressWarnings.name, - CommonCompilerArguments::coroutinesState.name) -private val commonUIHiddenFields = listOf(CommonCompilerArguments::pluginClasspaths.name, - CommonCompilerArguments::pluginOptions.name) +val commonUIExposedFields = listOf( + CommonCompilerArguments::languageVersion.name, + CommonCompilerArguments::apiVersion.name, + CommonCompilerArguments::suppressWarnings.name, + CommonCompilerArguments::coroutinesState.name +) +private val commonUIHiddenFields = listOf( + CommonCompilerArguments::pluginClasspaths.name, + CommonCompilerArguments::pluginOptions.name +) private val commonPrimaryFields = commonUIExposedFields + commonUIHiddenFields -private val jvmSpecificUIExposedFields = listOf(K2JVMCompilerArguments::jvmTarget.name, - K2JVMCompilerArguments::destination.name, - K2JVMCompilerArguments::classpath.name) +private val jvmSpecificUIExposedFields = listOf( + K2JVMCompilerArguments::jvmTarget.name, + K2JVMCompilerArguments::destination.name, + K2JVMCompilerArguments::classpath.name +) val jvmUIExposedFields = commonUIExposedFields + jvmSpecificUIExposedFields private val jvmPrimaryFields = commonPrimaryFields + jvmSpecificUIExposedFields -private val jsSpecificUIExposedFields = listOf(K2JSCompilerArguments::sourceMap.name, - K2JSCompilerArguments::sourceMapPrefix.name, - K2JSCompilerArguments::sourceMapEmbedSources.name, - K2JSCompilerArguments::outputPrefix.name, - K2JSCompilerArguments::outputPostfix.name, - K2JSCompilerArguments::moduleKind.name) +private val jsSpecificUIExposedFields = listOf( + K2JSCompilerArguments::sourceMap.name, + K2JSCompilerArguments::sourceMapPrefix.name, + K2JSCompilerArguments::sourceMapEmbedSources.name, + K2JSCompilerArguments::outputPrefix.name, + K2JSCompilerArguments::outputPostfix.name, + K2JSCompilerArguments::moduleKind.name +) val jsUIExposedFields = commonUIExposedFields + jsSpecificUIExposedFields private val jsPrimaryFields = commonPrimaryFields + jsSpecificUIExposedFields -private val metadataSpecificUIExposedFields = listOf(K2MetadataCompilerArguments::destination.name, - K2MetadataCompilerArguments::classpath.name) +private val metadataSpecificUIExposedFields = listOf( + K2MetadataCompilerArguments::destination.name, + K2MetadataCompilerArguments::classpath.name +) val metadataUIExposedFields = commonUIExposedFields + metadataSpecificUIExposedFields private val metadataPrimaryFields = commonPrimaryFields + metadataSpecificUIExposedFields @@ -223,23 +232,23 @@ private fun Module.configureSdkIfPossible(compilerArguments: CommonCompilerArgum allSdks.firstOrNull { it.sdkType is JavaSdk && FileUtil.comparePaths(it.homePath, jdkHome) == 0 } ?: return } else { allSdks.firstOrNull { it.sdkType is KotlinSdkType } - ?: modelsProvider - .modifiableModuleModel - .modules - .asSequence() - .mapNotNull { modelsProvider.getModifiableRootModel(it).sdk } - .firstOrNull { it.sdkType is KotlinSdkType } - ?: KotlinSdkType.INSTANCE.createSdkWithUniqueName(allSdks.toList()) + ?: modelsProvider + .modifiableModuleModel + .modules + .asSequence() + .mapNotNull { modelsProvider.getModifiableRootModel(it).sdk } + .firstOrNull { it.sdkType is KotlinSdkType } + ?: KotlinSdkType.INSTANCE.createSdkWithUniqueName(allSdks.toList()) } modelsProvider.getModifiableRootModel(this).sdk = sdk } fun parseCompilerArgumentsToFacet( - arguments: List, - defaultArguments: List, - kotlinFacet: KotlinFacet, - modelsProvider: IdeModifiableModelsProvider? + arguments: List, + defaultArguments: List, + kotlinFacet: KotlinFacet, + modelsProvider: IdeModifiableModelsProvider? ) { with(kotlinFacet.configuration.settings) { val compilerArguments = this.compilerArguments ?: return @@ -262,7 +271,7 @@ fun parseCompilerArgumentsToFacet( val ignoredFields = compilerArguments.ignoredFields fun exposeAsAdditionalArgument(property: KProperty1) = - property.name !in primaryFields && property.get(compilerArguments) != property.get(defaultCompilerArguments) + property.name !in primaryFields && property.get(compilerArguments) != property.get(defaultCompilerArguments) val additionalArgumentsString = with(compilerArguments::class.java.newInstance()) { copyFieldsSatisfying(compilerArguments, this) { exposeAsAdditionalArgument(it) && it.name !in ignoredFields } diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt.as32 b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt.as32 index d99ec128a14..a45334f80db 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt.as32 +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt.as32 @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.facet import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider -import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.JavaSdk @@ -25,24 +24,17 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModel -import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.util.CachedValueProvider -import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.cli.common.arguments.* import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.caches.project.* import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings import org.jetbrains.kotlin.idea.framework.KotlinSdkType import org.jetbrains.kotlin.idea.util.application.runWriteAction -import org.jetbrains.kotlin.idea.util.projectStructure.sdk import org.jetbrains.kotlin.idea.versions.* import kotlin.reflect.KProperty1 @@ -62,10 +54,10 @@ private fun getDefaultTargetPlatform(module: Module, rootModel: ModuleRootModel? } fun KotlinFacetSettings.initializeIfNeeded( - module: Module, - rootModel: ModuleRootModel?, - platformKind: TargetPlatformKind<*>? = null, // if null, detect by module dependencies - languageVersion: String? = null + module: Module, + rootModel: ModuleRootModel?, + platformKind: TargetPlatformKind<*>? = null, // if null, detect by module dependencies + languageVersion: String? = null ) { val project = module.project @@ -88,14 +80,13 @@ fun KotlinFacetSettings.initializeIfNeeded( if (shouldInferLanguageLevel) { languageLevel = (if (useProjectSettings) LanguageVersion.fromVersionString(commonArguments.languageVersion) else null) - ?: getDefaultLanguageLevel(module, languageVersion) + ?: getDefaultLanguageLevel(module, languageVersion) } if (shouldInferAPILevel) { apiLevel = if (useProjectSettings) { LanguageVersion.fromVersionString(commonArguments.apiVersion) ?: languageLevel - } - else { + } else { languageLevel!!.coerceAtMost(getLibraryLanguageLevel(module, rootModel, targetPlatformKind)) } } @@ -111,26 +102,34 @@ fun TargetPlatformKind<*>.getPlatformCompilerArgumentsByProject(project: Project val TargetPlatformKind<*>.mavenLibraryIds: List get() = when (this) { - is TargetPlatformKind.Jvm -> listOf(MAVEN_STDLIB_ID, MAVEN_STDLIB_ID_JRE7, MAVEN_STDLIB_ID_JDK7, MAVEN_STDLIB_ID_JRE8, MAVEN_STDLIB_ID_JDK8) + is TargetPlatformKind.Jvm -> listOf( + MAVEN_STDLIB_ID, + MAVEN_STDLIB_ID_JRE7, + MAVEN_STDLIB_ID_JDK7, + MAVEN_STDLIB_ID_JRE8, + MAVEN_STDLIB_ID_JDK8 + ) is TargetPlatformKind.JavaScript -> listOf(MAVEN_JS_STDLIB_ID, MAVEN_OLD_JS_STDLIB_ID) is TargetPlatformKind.Common -> listOf(MAVEN_COMMON_STDLIB_ID) } val mavenLibraryIdToPlatform: Map> by lazy { TargetPlatformKind.ALL_PLATFORMS - .flatMap { platform -> platform.mavenLibraryIds.map { it to platform } } - .sortedByDescending { it.first.length } - .toMap() + .flatMap { platform -> platform.mavenLibraryIds.map { it to platform } } + .sortedByDescending { it.first.length } + .toMap() } -fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, - useProjectSettings: Boolean, - commitModel: Boolean = false): KotlinFacet { +fun Module.getOrCreateFacet( + modelsProvider: IdeModifiableModelsProvider, + useProjectSettings: Boolean, + commitModel: Boolean = false +): KotlinFacet { val facetModel = modelsProvider.getModifiableFacetModel(this) val facet = facetModel.findFacet(KotlinFacetType.TYPE_ID, KotlinFacetType.INSTANCE.defaultFacetName) - ?: with(KotlinFacetType.INSTANCE) { createFacet(this@getOrCreateFacet, defaultFacetName, createDefaultConfiguration(), null) } - .apply { facetModel.addFacet(this) } + ?: with(KotlinFacetType.INSTANCE) { createFacet(this@getOrCreateFacet, defaultFacetName, createDefaultConfiguration(), null) } + .apply { facetModel.addFacet(this) } facet.configuration.settings.useProjectSettings = useProjectSettings if (commitModel) { runWriteAction { @@ -141,20 +140,20 @@ fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider, } fun KotlinFacet.configureFacet( - compilerVersion: String, - coroutineSupport: LanguageFeature.State, - platformKind: TargetPlatformKind<*>?, // if null, detect by module dependencies - modelsProvider: IdeModifiableModelsProvider + compilerVersion: String, + coroutineSupport: LanguageFeature.State, + platformKind: TargetPlatformKind<*>?, // if null, detect by module dependencies + modelsProvider: IdeModifiableModelsProvider ) { val module = module with(configuration.settings) { compilerArguments = null compilerSettings = null initializeIfNeeded( - module, - modelsProvider.getModifiableRootModel(module), - platformKind, - compilerVersion + module, + modelsProvider.getModifiableRootModel(module), + platformKind, + compilerVersion ) val apiLevel = apiLevel val languageLevel = languageLevel @@ -174,31 +173,41 @@ fun KotlinFacet.noVersionAutoAdvance() { // "Primary" fields are written to argument beans directly and thus not presented in the "additional arguments" string // Update these lists when facet/project settings UI changes -val commonUIExposedFields = listOf(CommonCompilerArguments::languageVersion.name, - CommonCompilerArguments::apiVersion.name, - CommonCompilerArguments::suppressWarnings.name, - CommonCompilerArguments::coroutinesState.name) -private val commonUIHiddenFields = listOf(CommonCompilerArguments::pluginClasspaths.name, - CommonCompilerArguments::pluginOptions.name) +val commonUIExposedFields = listOf( + CommonCompilerArguments::languageVersion.name, + CommonCompilerArguments::apiVersion.name, + CommonCompilerArguments::suppressWarnings.name, + CommonCompilerArguments::coroutinesState.name +) +private val commonUIHiddenFields = listOf( + CommonCompilerArguments::pluginClasspaths.name, + CommonCompilerArguments::pluginOptions.name +) private val commonPrimaryFields = commonUIExposedFields + commonUIHiddenFields -private val jvmSpecificUIExposedFields = listOf(K2JVMCompilerArguments::jvmTarget.name, - K2JVMCompilerArguments::destination.name, - K2JVMCompilerArguments::classpath.name) +private val jvmSpecificUIExposedFields = listOf( + K2JVMCompilerArguments::jvmTarget.name, + K2JVMCompilerArguments::destination.name, + K2JVMCompilerArguments::classpath.name +) val jvmUIExposedFields = commonUIExposedFields + jvmSpecificUIExposedFields private val jvmPrimaryFields = commonPrimaryFields + jvmSpecificUIExposedFields -private val jsSpecificUIExposedFields = listOf(K2JSCompilerArguments::sourceMap.name, - K2JSCompilerArguments::sourceMapPrefix.name, - K2JSCompilerArguments::sourceMapEmbedSources.name, - K2JSCompilerArguments::outputPrefix.name, - K2JSCompilerArguments::outputPostfix.name, - K2JSCompilerArguments::moduleKind.name) +private val jsSpecificUIExposedFields = listOf( + K2JSCompilerArguments::sourceMap.name, + K2JSCompilerArguments::sourceMapPrefix.name, + K2JSCompilerArguments::sourceMapEmbedSources.name, + K2JSCompilerArguments::outputPrefix.name, + K2JSCompilerArguments::outputPostfix.name, + K2JSCompilerArguments::moduleKind.name +) val jsUIExposedFields = commonUIExposedFields + jsSpecificUIExposedFields private val jsPrimaryFields = commonPrimaryFields + jsSpecificUIExposedFields -private val metadataSpecificUIExposedFields = listOf(K2MetadataCompilerArguments::destination.name, - K2MetadataCompilerArguments::classpath.name) +private val metadataSpecificUIExposedFields = listOf( + K2MetadataCompilerArguments::destination.name, + K2MetadataCompilerArguments::classpath.name +) val metadataUIExposedFields = commonUIExposedFields + metadataSpecificUIExposedFields private val metadataPrimaryFields = commonPrimaryFields + metadataSpecificUIExposedFields @@ -223,23 +232,23 @@ private fun Module.configureSdkIfPossible(compilerArguments: CommonCompilerArgum allSdks.firstOrNull { it.sdkType is JavaSdk && FileUtil.comparePaths(it.homePath, jdkHome) == 0 } ?: return } else { allSdks.firstOrNull { it.sdkType is KotlinSdkType } - ?: modelsProvider - .modifiableModuleModel - .modules - .asSequence() - .mapNotNull { modelsProvider.getModifiableRootModel(it).sdk } - .firstOrNull { it.sdkType is KotlinSdkType } - ?: KotlinSdkType.INSTANCE.createSdkWithUniqueName(allSdks.toList()) + ?: modelsProvider + .modifiableModuleModel + .modules + .asSequence() + .mapNotNull { modelsProvider.getModifiableRootModel(it).sdk } + .firstOrNull { it.sdkType is KotlinSdkType } + ?: KotlinSdkType.INSTANCE.createSdkWithUniqueName(allSdks.toList()) } modelsProvider.getModifiableRootModel(this).sdk = sdk } fun parseCompilerArgumentsToFacet( - arguments: List, - defaultArguments: List, - kotlinFacet: KotlinFacet, - modelsProvider: IdeModifiableModelsProvider? + arguments: List, + defaultArguments: List, + kotlinFacet: KotlinFacet, + modelsProvider: IdeModifiableModelsProvider? ) { with(kotlinFacet.configuration.settings) { val compilerArguments = this.compilerArguments ?: return @@ -262,7 +271,7 @@ fun parseCompilerArgumentsToFacet( val ignoredFields = compilerArguments.ignoredFields fun exposeAsAdditionalArgument(property: KProperty1) = - property.name !in primaryFields && property.get(compilerArguments) != property.get(defaultCompilerArguments) + property.name !in primaryFields && property.get(compilerArguments) != property.get(defaultCompilerArguments) val additionalArgumentsString = with(compilerArguments::class.java.newInstance()) { copyFieldsSatisfying(compilerArguments, this) { exposeAsAdditionalArgument(it) && it.name !in ignoredFields }