MPP: recognize source sets from Gradle project model (refactoring)

This commit is contained in:
Dmitriy Dolovov
2018-09-03 20:08:41 +03:00
committed by Mikhail Glukhikh
parent 5e3fd189a4
commit d8937936a9
6 changed files with 38 additions and 18 deletions
@@ -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<String>, 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) {
@@ -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<GradleSourceSetDat
.firstOrNull()
?.data
?.let { findKotlinPluginVersion(it) } ?: return
val platformKind = when (kotlinSourceSet.platform) {
KotlinPlatform.JVM, KotlinPlatform.ANDROID -> {
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
@@ -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<KotlinPlatform> get() = listOf(KotlinPlatform.COMMON)
override val libraryKind = CommonLibraryKind
@@ -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<KotlinPlatform> get() = listOf(KotlinPlatform.JS)
override val libraryKind = JSLibraryKind
override fun getLibraryDescription(project: Project) = JSLibraryStdDescription(project)
@@ -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<KotlinPlatform> get() = listOf(KotlinPlatform.JVM, KotlinPlatform.ANDROID)
override val libraryKind: PersistentLibraryKind<*>? = null
override fun getLibraryDescription(project: Project) = JavaRuntimeLibraryDescription(project)
@@ -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<String>
abstract val gradlePluginId: String
abstract val gradlePlatformIds: List<KotlinPlatform>
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<IdePlatformKindTooling>(
"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")
}
}
}