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.UnsupportedMethodException
|
||||||
import org.gradle.tooling.model.idea.IdeaContentRoot
|
import org.gradle.tooling.model.idea.IdeaContentRoot
|
||||||
import org.gradle.tooling.model.idea.IdeaModule
|
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.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.gradle.*
|
import org.jetbrains.kotlin.gradle.*
|
||||||
|
import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling
|
||||||
import org.jetbrains.plugins.gradle.model.*
|
import org.jetbrains.plugins.gradle.model.*
|
||||||
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
||||||
import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension
|
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 {
|
private fun createCompilerArguments(args: List<String>, platform: KotlinPlatform): CommonCompilerArguments {
|
||||||
return when (platform) {
|
val compilerArguments = IdePlatformKindTooling.getTooling(platform).kind.argumentsClass.newInstance()
|
||||||
KotlinPlatform.COMMON -> K2MetadataCompilerArguments()
|
parseCommandLineArguments(args, compilerArguments)
|
||||||
KotlinPlatform.JVM, KotlinPlatform.ANDROID -> K2JVMCompilerArguments()
|
return compilerArguments
|
||||||
KotlinPlatform.JS -> K2JSCompilerArguments()
|
|
||||||
}.also {
|
|
||||||
parseCommandLineArguments(args, it)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KotlinModule.fullName(simpleName: String = name) = when (this) {
|
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.facet.noVersionAutoAdvance
|
||||||
import org.jetbrains.kotlin.idea.inspections.gradle.findAll
|
import org.jetbrains.kotlin.idea.inspections.gradle.findAll
|
||||||
import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion
|
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.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.kotlin.platform.impl.JvmIdePlatformKind
|
||||||
import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData
|
import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData
|
||||||
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
||||||
@@ -82,20 +81,22 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
|
|||||||
.firstOrNull()
|
.firstOrNull()
|
||||||
?.data
|
?.data
|
||||||
?.let { findKotlinPluginVersion(it) } ?: return
|
?.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
|
val target = JvmTarget.fromString(sourceSetData.targetCompatibility ?: "") ?: JvmTarget.DEFAULT
|
||||||
JvmIdePlatformKind.Platform(target)
|
JvmIdePlatformKind.Platform(target)
|
||||||
}
|
}
|
||||||
KotlinPlatform.JS -> JsIdePlatformKind.Platform
|
else -> platformKind.defaultPlatform
|
||||||
KotlinPlatform.COMMON -> CommonIdePlatformKind.Platform
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val coroutinesProperty = CoroutineSupport.byCompilerArgument(
|
val coroutinesProperty = CoroutineSupport.byCompilerArgument(
|
||||||
mainModuleNode.coroutines ?: findKotlinCoroutinesProperty(ideModule.project)
|
mainModuleNode.coroutines ?: findKotlinCoroutinesProperty(ideModule.project)
|
||||||
)
|
)
|
||||||
|
|
||||||
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false)
|
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false)
|
||||||
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platformKind, modelsProvider)
|
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider)
|
||||||
|
|
||||||
val compilerArguments = kotlinSourceSet.compilerArguments
|
val compilerArguments = kotlinSourceSet.compilerArguments
|
||||||
val defaultCompilerArguments = kotlinSourceSet.defaultCompilerArguments
|
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.analyzer.common.CommonAnalyzerFacade
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
|
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
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.caches.project.implementingModules
|
||||||
import org.jetbrains.kotlin.idea.framework.CommonLibraryKind
|
import org.jetbrains.kotlin.idea.framework.CommonLibraryKind
|
||||||
import org.jetbrains.kotlin.idea.framework.CommonStandardLibraryDescription
|
import org.jetbrains.kotlin.idea.framework.CommonStandardLibraryDescription
|
||||||
@@ -35,6 +36,7 @@ object CommonIdePlatformKindTooling : IdePlatformKindTooling() {
|
|||||||
|
|
||||||
override val mavenLibraryIds = listOf(MAVEN_COMMON_STDLIB_ID)
|
override val mavenLibraryIds = listOf(MAVEN_COMMON_STDLIB_ID)
|
||||||
override val gradlePluginId = "kotlin-platform-common"
|
override val gradlePluginId = "kotlin-platform-common"
|
||||||
|
override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.COMMON)
|
||||||
|
|
||||||
override val libraryKind = CommonLibraryKind
|
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.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes
|
import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
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.caches.resolve.JsAnalyzerFacade
|
||||||
import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder
|
import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder
|
||||||
import org.jetbrains.kotlin.idea.framework.JSLibraryKind
|
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 mavenLibraryIds = listOf(PathUtil.JS_LIB_NAME, MAVEN_OLD_JS_STDLIB_ID)
|
||||||
override val gradlePluginId = "kotlin-platform-js"
|
override val gradlePluginId = "kotlin-platform-js"
|
||||||
|
override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.JS)
|
||||||
|
|
||||||
override val libraryKind = JSLibraryKind
|
override val libraryKind = JSLibraryKind
|
||||||
override fun getLibraryDescription(project: Project) = JSLibraryStdDescription(project)
|
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.toLightClass
|
||||||
import org.jetbrains.kotlin.asJava.toLightMethods
|
import org.jetbrains.kotlin.asJava.toLightMethods
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
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.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder
|
||||||
import org.jetbrains.kotlin.idea.framework.JavaRuntimeDetectionUtil
|
import org.jetbrains.kotlin.idea.framework.JavaRuntimeDetectionUtil
|
||||||
import org.jetbrains.kotlin.idea.framework.JavaRuntimeLibraryDescription
|
import org.jetbrains.kotlin.idea.framework.JavaRuntimeLibraryDescription
|
||||||
@@ -43,6 +44,7 @@ class JvmIdePlatformKindTooling : IdePlatformKindTooling() {
|
|||||||
)
|
)
|
||||||
|
|
||||||
override val gradlePluginId = "kotlin-platform-jvm"
|
override val gradlePluginId = "kotlin-platform-jvm"
|
||||||
|
override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.JVM, KotlinPlatform.ANDROID)
|
||||||
|
|
||||||
override val libraryKind: PersistentLibraryKind<*>? = null
|
override val libraryKind: PersistentLibraryKind<*>? = null
|
||||||
override fun getLibraryDescription(project: Project) = JavaRuntimeLibraryDescription(project)
|
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.analyzer.ResolverForModuleFactory
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
|
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
|
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
||||||
import org.jetbrains.kotlin.platform.IdePlatformKind
|
import org.jetbrains.kotlin.platform.IdePlatformKind
|
||||||
import org.jetbrains.kotlin.psi.KtFunction
|
import org.jetbrains.kotlin.psi.KtFunction
|
||||||
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
||||||
@@ -28,6 +29,8 @@ abstract class IdePlatformKindTooling {
|
|||||||
abstract val mavenLibraryIds: List<String>
|
abstract val mavenLibraryIds: List<String>
|
||||||
abstract val gradlePluginId: String
|
abstract val gradlePluginId: String
|
||||||
|
|
||||||
|
abstract val gradlePlatformIds: List<KotlinPlatform>
|
||||||
|
|
||||||
abstract val libraryKind: PersistentLibraryKind<*>?
|
abstract val libraryKind: PersistentLibraryKind<*>?
|
||||||
abstract fun getLibraryDescription(project: Project): CustomLibraryDescription
|
abstract fun getLibraryDescription(project: Project): CustomLibraryDescription
|
||||||
abstract fun getLibraryVersionProvider(project: Project): (Library) -> String?
|
abstract fun getLibraryVersionProvider(project: Project): (Library) -> String?
|
||||||
@@ -42,9 +45,11 @@ abstract class IdePlatformKindTooling {
|
|||||||
companion object : ApplicationExtensionDescriptor<IdePlatformKindTooling>(
|
companion object : ApplicationExtensionDescriptor<IdePlatformKindTooling>(
|
||||||
"org.jetbrains.kotlin.idePlatformKindTooling", IdePlatformKindTooling::class.java
|
"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 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) {
|
for (kind in allPlatformKinds) {
|
||||||
if (kind !in groupedTooling) {
|
if (kind !in groupedTooling) {
|
||||||
@@ -58,8 +63,16 @@ abstract class IdePlatformKindTooling {
|
|||||||
groupedTooling
|
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 {
|
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