MPP: recognize source sets from Gradle project model (refactoring)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
5e3fd189a4
commit
d8937936a9
+8
-8
@@ -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) {
|
||||
|
||||
+8
-7
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user