From 2665fff373b93c09902dac188cc7d0c84236d9d3 Mon Sep 17 00:00:00 2001 From: Andrey Uskov Date: Tue, 2 Jul 2019 22:36:16 +0300 Subject: [PATCH] Import package prefix from MPP projects --- .../KotlinMPPGradleProjectResolver.kt | 23 +++++++++-- .../src/KotlinGradleModelBuilder.kt | 2 + .../src/KotlinMPPGradleModel.kt | 1 + .../src/KotlinMPPGradleModelBuilder.kt | 12 +++++- .../src/KotlinMPPGradleModelImpl.kt | 6 ++- .../src/KotlinTasksPropertyUtils.kt | 41 +++++++++++++++---- 6 files changed, 70 insertions(+), 15 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 24d865a5d37..2bb90bf07ab 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 @@ -369,11 +369,26 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { resolverCtx: ProjectResolverContext ) { val mppModel = resolverCtx.getMppModel(gradleModule) ?: return + val sourceSetToPackagePrefix = mppModel.targets.flatMap { it.compilations } + .flatMap { compilation -> + compilation.sourceSets.map { sourceSet -> sourceSet.name to compilation.kotlinTaskProperties.packagePrefix } + } + .toMap() if (resolverCtx.getExtraProject(gradleModule, ExternalProject::class.java) == null) return processSourceSets(gradleModule, mppModel, ideModule, resolverCtx) { dataNode, sourceSet -> if (dataNode == null || sourceSet.actualPlatforms.supports(KotlinPlatform.ANDROID)) return@processSourceSets - createContentRootData(sourceSet.sourceDirs, sourceSet.sourceType, dataNode) - createContentRootData(sourceSet.resourceDirs, sourceSet.resourceType, dataNode) + createContentRootData( + sourceSet.sourceDirs, + sourceSet.sourceType, + sourceSetToPackagePrefix[sourceSet.name], + dataNode + ) + createContentRootData( + sourceSet.resourceDirs, + sourceSet.resourceType, + null, + dataNode + ) } for (gradleContentRoot in gradleModule.contentRoots ?: emptySet()) { @@ -529,10 +544,10 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { return ideModule.findChildModuleById(usedModuleId) } - private fun createContentRootData(sourceDirs: Set, sourceType: ExternalSystemSourceType, parentNode: DataNode<*>) { + private fun createContentRootData(sourceDirs: Set, sourceType: ExternalSystemSourceType, packagePrefix: String?, parentNode: DataNode<*>) { for (sourceDir in sourceDirs) { val contentRootData = ContentRootData(GradleConstants.SYSTEM_ID, sourceDir.absolutePath) - contentRootData.storePath(sourceType, sourceDir.absolutePath) + contentRootData.storePath(sourceType, sourceDir.absolutePath, packagePrefix) parentNode.createChild(ProjectKeys.CONTENT_ROOT, contentRootData) } } diff --git a/idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt b/idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt index f0ca8a2220d..9321919b57f 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt @@ -102,6 +102,8 @@ abstract class AbstractKotlinGradleModelBuilder : ModelBuilderService { val kotlinProjectExtensionClass = "org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension" val kotlinSourceSetClass = "org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet" + val kotlinPluginWrapper = "org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapperKt" + fun Task.getSourceSetName(): String { return try { javaClass.methods.firstOrNull { it.name.startsWith("getSourceSetName") && it.parameterTypes.isEmpty() }?.invoke(this) as? String diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt index 04a0953aaa7..2481cd7d79a 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt @@ -78,6 +78,7 @@ interface KotlinCompilation : KotlinModule { val dependencyClasspath: List val disambiguationClassifier: String? val platform: KotlinPlatform + val kotlinTaskProperties: KotlinTaskProperties companion object { diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt index 1f46538ad23..785d05a95ff 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt @@ -268,7 +268,17 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { val arguments = buildCompilationArguments(compileKotlinTask) ?: return null val dependencyClasspath = buildDependencyClasspath(compileKotlinTask) val dependencies = buildCompilationDependencies(gradleCompilation, classifier, sourceSetMap, dependencyResolver, project) - return KotlinCompilationImpl(gradleCompilation.name, kotlinSourceSets, dependencies, output, arguments, dependencyClasspath) + val kotlinTaskProperties = getKotlinTaskProperties(compileKotlinTask) + + return KotlinCompilationImpl( + gradleCompilation.name, + kotlinSourceSets, + dependencies, + output, + arguments, + dependencyClasspath, + kotlinTaskProperties + ) } private fun buildCompilationDependencies( diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt index ac4acf51215..1aeb88ba7c2 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt @@ -85,7 +85,8 @@ data class KotlinCompilationImpl( override val dependencies: Set, override val output: KotlinCompilationOutput, override val arguments: KotlinCompilationArguments, - override val dependencyClasspath: List + override val dependencyClasspath: List, + override val kotlinTaskProperties: KotlinTaskProperties ) : KotlinCompilation { // create deep copy @@ -99,7 +100,8 @@ data class KotlinCompilationImpl( kotlinCompilation.dependencies.map { it.deepCopy(cloningCache) }.toSet(), KotlinCompilationOutputImpl(kotlinCompilation.output), KotlinCompilationArgumentsImpl(kotlinCompilation.arguments), - ArrayList(kotlinCompilation.dependencyClasspath) + ArrayList(kotlinCompilation.dependencyClasspath), + KotlinTaskPropertiesImpl(kotlinCompilation.kotlinTaskProperties) ) { disambiguationClassifier = kotlinCompilation.disambiguationClassifier platform = kotlinCompilation.platform diff --git a/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt b/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt index dfb3b6efeae..75c0518ead7 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt @@ -9,6 +9,7 @@ import org.gradle.api.file.SourceDirectorySet import org.gradle.api.internal.FactoryNamedDomainObjectContainer import org.gradle.api.plugins.JavaPluginConvention import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder.Companion.getSourceSetName +import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder.Companion.kotlinPluginWrapper import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder.Companion.kotlinProjectExtensionClass import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder.Companion.kotlinSourceSetClass import java.io.File @@ -19,14 +20,22 @@ interface KotlinTaskProperties : Serializable { val incremental: Boolean? val packagePrefix: String? val pureKotlinSourceFolders: List? + val pluginVersion: String? } data class KotlinTaskPropertiesImpl( override val incremental: Boolean?, override val packagePrefix: String?, - override val pureKotlinSourceFolders: List? - -) : KotlinTaskProperties + override val pureKotlinSourceFolders: List?, + override val pluginVersion: String? +) : KotlinTaskProperties { + constructor(kotlinTaskProperties: KotlinTaskProperties) : this( + kotlinTaskProperties.incremental, + kotlinTaskProperties.packagePrefix, + kotlinTaskProperties.pureKotlinSourceFolders?.map { it }?.toList(), + kotlinTaskProperties.pluginVersion + ) +} typealias KotlinTaskPropertiesBySourceSet = MutableMap @@ -69,11 +78,27 @@ private fun Task.getPureKotlinSourceRoots(sourceSet: String): List? { return null } +private fun Task.getKotlinPluginVersion(): String? { + try { + val pluginWrapperClass = javaClass.classLoader.loadClass(kotlinPluginWrapper) + val getVersionMethod = + pluginWrapperClass.getMethod("getKotlinPluginVersion", javaClass.classLoader.loadClass("org.gradle.api.Project")) + return getVersionMethod.invoke(null, this.project) as String + } catch (e: Exception) { + } + return null +} + fun KotlinTaskPropertiesBySourceSet.acknowledgeTask(compileTask: Task) { this[compileTask.getSourceSetName()] = - KotlinTaskPropertiesImpl( - compileTask.getIsIncremental(), - compileTask.getPackagePrefix(), - compileTask.getPureKotlinSourceRoots(compileTask.getSourceSetName()) - ) + getKotlinTaskProperties(compileTask) +} + +fun getKotlinTaskProperties(compileTask: Task): KotlinTaskPropertiesImpl { + return KotlinTaskPropertiesImpl( + compileTask.getIsIncremental(), + compileTask.getPackagePrefix(), + compileTask.getPureKotlinSourceRoots(compileTask.getSourceSetName()), + compileTask.getKotlinPluginVersion() + ) }