From d8937936a98661c55447072bec49f2b7eca5ce84 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Mon, 3 Sep 2018 20:08:41 +0300 Subject: [PATCH] MPP: recognize source sets from Gradle project model (refactoring) --- .../KotlinMPPGradleProjectResolver.kt | 16 ++++++++-------- .../KotlinSourceSetDataService.kt | 15 ++++++++------- .../platform/CommonIdePlatformKindTooling.kt | 2 ++ .../idea/platform/JsIdePlatformKindTooling.kt | 2 ++ .../platform/JvmIdePlatformKindTooling.kt | 2 ++ .../idea/platform/IdePlatformKindTooling.kt | 19 ++++++++++++++++--- 6 files changed, 38 insertions(+), 18 deletions(-) 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 c7e0bad36e1..bf6127a9c8d 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 @@ -24,9 +24,13 @@ import com.intellij.util.text.VersionComparatorUtil import org.gradle.tooling.model.UnsupportedMethodException import org.gradle.tooling.model.idea.IdeaContentRoot import org.gradle.tooling.model.idea.IdeaModule -import org.jetbrains.kotlin.cli.common.arguments.* +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.ManualLanguageFeatureSetting +import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.gradle.* +import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling import org.jetbrains.plugins.gradle.model.* import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension @@ -618,13 +622,9 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { } private fun createCompilerArguments(args: List, platform: KotlinPlatform): CommonCompilerArguments { - return when (platform) { - KotlinPlatform.COMMON -> K2MetadataCompilerArguments() - KotlinPlatform.JVM, KotlinPlatform.ANDROID -> K2JVMCompilerArguments() - KotlinPlatform.JS -> K2JSCompilerArguments() - }.also { - parseCommandLineArguments(args, it) - } + val compilerArguments = IdePlatformKindTooling.getTooling(platform).kind.argumentsClass.newInstance() + parseCommandLineArguments(args, compilerArguments) + return compilerArguments } private fun KotlinModule.fullName(simpleName: String = name) = when (this) { 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 d694986a6fc..0acad008f72 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 @@ -28,9 +28,8 @@ import org.jetbrains.kotlin.idea.facet.getOrCreateFacet import org.jetbrains.kotlin.idea.facet.noVersionAutoAdvance import org.jetbrains.kotlin.idea.inspections.gradle.findAll 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.platform.impl.CommonIdePlatformKind -import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData @@ -82,20 +81,22 @@ class KotlinSourceSetDataService : AbstractProjectDataService { + + val platformKind = IdePlatformKindTooling.getTooling(kotlinSourceSet.platform).kind + val platform = when (platformKind) { + is JvmIdePlatformKind -> { val target = JvmTarget.fromString(sourceSetData.targetCompatibility ?: "") ?: JvmTarget.DEFAULT JvmIdePlatformKind.Platform(target) } - KotlinPlatform.JS -> JsIdePlatformKind.Platform - KotlinPlatform.COMMON -> CommonIdePlatformKind.Platform + else -> platformKind.defaultPlatform } + val coroutinesProperty = CoroutineSupport.byCompilerArgument( mainModuleNode.coroutines ?: findKotlinCoroutinesProperty(ideModule.project) ) val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false) - kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platformKind, modelsProvider) + kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider) val compilerArguments = kotlinSourceSet.compilerArguments val defaultCompilerArguments = kotlinSourceSet.defaultCompilerArguments diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/CommonIdePlatformKindTooling.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/CommonIdePlatformKindTooling.kt index ee1f6f586d5..7015cf4cc7d 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/CommonIdePlatformKindTooling.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/CommonIdePlatformKindTooling.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.roots.libraries.Library import org.jetbrains.kotlin.analyzer.common.CommonAnalyzerFacade import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.caches.project.implementingModules import org.jetbrains.kotlin.idea.framework.CommonLibraryKind import org.jetbrains.kotlin.idea.framework.CommonStandardLibraryDescription @@ -35,6 +36,7 @@ object CommonIdePlatformKindTooling : IdePlatformKindTooling() { override val mavenLibraryIds = listOf(MAVEN_COMMON_STDLIB_ID) override val gradlePluginId = "kotlin-platform-common" + override val gradlePlatformIds: List get() = listOf(KotlinPlatform.COMMON) override val libraryKind = CommonLibraryKind diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/JsIdePlatformKindTooling.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/JsIdePlatformKindTooling.kt index 36aad535893..e1ecc95e87b 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/JsIdePlatformKindTooling.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/JsIdePlatformKindTooling.kt @@ -12,6 +12,7 @@ import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.caches.resolve.JsAnalyzerFacade import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder import org.jetbrains.kotlin.idea.framework.JSLibraryKind @@ -48,6 +49,7 @@ class JsIdePlatformKindTooling : IdePlatformKindTooling() { override val mavenLibraryIds = listOf(PathUtil.JS_LIB_NAME, MAVEN_OLD_JS_STDLIB_ID) override val gradlePluginId = "kotlin-platform-js" + override val gradlePlatformIds: List get() = listOf(KotlinPlatform.JS) override val libraryKind = JSLibraryKind override fun getLibraryDescription(project: Project) = JSLibraryStdDescription(project) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/JvmIdePlatformKindTooling.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/JvmIdePlatformKindTooling.kt index bc9ca7adeeb..ef1b71d4944 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/JvmIdePlatformKindTooling.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/platform/JvmIdePlatformKindTooling.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightMethods import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder import org.jetbrains.kotlin.idea.framework.JavaRuntimeDetectionUtil import org.jetbrains.kotlin.idea.framework.JavaRuntimeLibraryDescription @@ -43,6 +44,7 @@ class JvmIdePlatformKindTooling : IdePlatformKindTooling() { ) override val gradlePluginId = "kotlin-platform-jvm" + override val gradlePlatformIds: List get() = listOf(KotlinPlatform.JVM, KotlinPlatform.ANDROID) override val libraryKind: PersistentLibraryKind<*>? = null override fun getLibraryDescription(project: Project) = JavaRuntimeLibraryDescription(project) diff --git a/idea/src/org/jetbrains/kotlin/idea/platform/IdePlatformKindTooling.kt b/idea/src/org/jetbrains/kotlin/idea/platform/IdePlatformKindTooling.kt index 68153a63629..af081ed88c6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/platform/IdePlatformKindTooling.kt +++ b/idea/src/org/jetbrains/kotlin/idea/platform/IdePlatformKindTooling.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.extensions.ApplicationExtensionDescriptor import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.platform.IdePlatformKind import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtNamedDeclaration @@ -28,6 +29,8 @@ abstract class IdePlatformKindTooling { abstract val mavenLibraryIds: List abstract val gradlePluginId: String + abstract val gradlePlatformIds: List + abstract val libraryKind: PersistentLibraryKind<*>? abstract fun getLibraryDescription(project: Project): CustomLibraryDescription abstract fun getLibraryVersionProvider(project: Project): (Library) -> String? @@ -42,9 +45,11 @@ abstract class IdePlatformKindTooling { companion object : ApplicationExtensionDescriptor( "org.jetbrains.kotlin.idePlatformKindTooling", IdePlatformKindTooling::class.java ) { - private val CACHED_TOOLING_SUPPORT by lazy { + private val ALL_TOOLING_SUPPORT by lazy { getInstances() } + + private val TOOLING_SUPPORT_BY_KIND by lazy { val allPlatformKinds = IdePlatformKind.ALL_KINDS - val groupedTooling = IdePlatformKindTooling.getInstances().groupBy { it.kind }.mapValues { it.value.single() } + val groupedTooling = ALL_TOOLING_SUPPORT.groupBy { it.kind }.mapValues { it.value.single() } for (kind in allPlatformKinds) { if (kind !in groupedTooling) { @@ -58,8 +63,16 @@ abstract class IdePlatformKindTooling { groupedTooling } + private val TOOLING_SUPPORT_BY_PLATFORM_ID by lazy { + ALL_TOOLING_SUPPORT.flatMap { tooling -> tooling.gradlePlatformIds.map { it to tooling } }.toMap() + } + fun getTooling(kind: IdePlatformKind<*>): IdePlatformKindTooling { - return CACHED_TOOLING_SUPPORT[kind] ?: error("Unknown platform $this") + return TOOLING_SUPPORT_BY_KIND[kind] ?: error("Unknown platform $kind") + } + + fun getTooling(platformId: KotlinPlatform): IdePlatformKindTooling { + return TOOLING_SUPPORT_BY_PLATFORM_ID[platformId] ?: error("Unknown Gradle platform $platformId") } } }