[KPM] Implement initial IdeaKotlinProjectModelBuilder
- Introduce `kotlin-gradle-plugin-idea` module that allows to share models between the IDE and KGP - Add `kotlin-gradle-plugin-idea` to the RuntimePublicAPITest to ensure binary compatibility ^KT-51262
This commit is contained in:
committed by
Space
parent
faf0cbea5d
commit
e91785ba39
Generated
+6
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="KotlinScriptingSettings">
|
||||||
|
<option name="suppressDefinitionsCheck" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@@ -362,6 +362,7 @@ val projectsWithDisabledFirBootstrap = coreLibProjects + listOf(
|
|||||||
val gradlePluginProjects = listOf(
|
val gradlePluginProjects = listOf(
|
||||||
":kotlin-gradle-plugin",
|
":kotlin-gradle-plugin",
|
||||||
":kotlin-gradle-plugin-api",
|
":kotlin-gradle-plugin-api",
|
||||||
|
":kotlin-gradle-plugin-idea",
|
||||||
":kotlin-gradle-plugin-kpm-android",
|
":kotlin-gradle-plugin-kpm-android",
|
||||||
":kotlin-allopen",
|
":kotlin-allopen",
|
||||||
":kotlin-annotation-processing-gradle",
|
":kotlin-annotation-processing-gradle",
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ val kotlinGradlePluginAndItsRequired = arrayOf(
|
|||||||
":kotlin-daemon-client",
|
":kotlin-daemon-client",
|
||||||
":kotlin-project-model",
|
":kotlin-project-model",
|
||||||
":kotlin-gradle-plugin-api",
|
":kotlin-gradle-plugin-api",
|
||||||
|
":kotlin-gradle-plugin-idea",
|
||||||
":kotlin-gradle-plugin",
|
":kotlin-gradle-plugin",
|
||||||
":kotlin-gradle-plugin-model",
|
":kotlin-gradle-plugin-model",
|
||||||
":kotlin-tooling-metadata",
|
":kotlin-tooling-metadata",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ and ensure that the public binary API wasn't changed in a way that make this cha
|
|||||||
|
|
||||||
Compile and run tests. `CasesPublicAPITest` verifies the tool itself,
|
Compile and run tests. `CasesPublicAPITest` verifies the tool itself,
|
||||||
and `RuntimePublicAPITest` dumps the public API of `kotlin-stdlib`,
|
and `RuntimePublicAPITest` dumps the public API of `kotlin-stdlib`,
|
||||||
`kotlin-stdlib-jdk7/8`, and `kotlin-reflect` jars,
|
`kotlin-stdlib-jdk7/8`, `kotlin-reflect` and `kotlin-gradle-plugin-idea` jars,
|
||||||
which must be built beforehand with gradle. Use `clean assemble` tasks,
|
which must be built beforehand with gradle. Use `clean assemble` tasks,
|
||||||
since the incremental compilation currently doesn't produce all the required output.
|
since the incremental compilation currently doesn't produce all the required output.
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ dependencies {
|
|||||||
testArtifacts project(':kotlin-stdlib-jdk7')
|
testArtifacts project(':kotlin-stdlib-jdk7')
|
||||||
testArtifacts project(':kotlin-stdlib-jdk8')
|
testArtifacts project(':kotlin-stdlib-jdk8')
|
||||||
testArtifacts project(':kotlin-reflect')
|
testArtifacts project(':kotlin-reflect')
|
||||||
|
testArtifacts project(':kotlin-gradle-plugin-idea')
|
||||||
}
|
}
|
||||||
|
|
||||||
pill {
|
pill {
|
||||||
|
|||||||
+4
@@ -33,6 +33,10 @@ class RuntimePublicAPITest {
|
|||||||
snapshotAPIAndCompare("../../reflect/api/build/libs", "kotlin-reflect-api(?!-[-a-z]+)", nonPublicPackages = listOf("kotlin.reflect.jvm.internal"))
|
snapshotAPIAndCompare("../../reflect/api/build/libs", "kotlin-reflect-api(?!-[-a-z]+)", nonPublicPackages = listOf("kotlin.reflect.jvm.internal"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test fun kotlinGradlePluginIdea() {
|
||||||
|
snapshotAPIAndCompare("../kotlin-gradle-plugin-idea/build/libs", "kotlin-gradle-plugin-idea(?!-[-a-z]+)")
|
||||||
|
}
|
||||||
|
|
||||||
private fun snapshotAPIAndCompare(
|
private fun snapshotAPIAndCompare(
|
||||||
basePath: String,
|
basePath: String,
|
||||||
jarPattern: String,
|
jarPattern: String,
|
||||||
|
|||||||
+1
-1
@@ -40,7 +40,7 @@ interface ExperimentalExtensionConfig {
|
|||||||
/**
|
/**
|
||||||
* Different modes that can be used to set the level of issue reporting for [KotlinTopLevelExtensionConfig.explicitApi] option.
|
* Different modes that can be used to set the level of issue reporting for [KotlinTopLevelExtensionConfig.explicitApi] option.
|
||||||
*/
|
*/
|
||||||
enum class ExplicitApiMode(private val cliOption: String) {
|
enum class ExplicitApiMode(val cliOption: String) {
|
||||||
/** Report issues as errors. */
|
/** Report issues as errors. */
|
||||||
Strict("strict"),
|
Strict("strict"),
|
||||||
|
|
||||||
|
|||||||
+2
@@ -31,6 +31,8 @@ interface KotlinGradleFragment : KotlinModuleFragment, HasKotlinDependencies, Ko
|
|||||||
|
|
||||||
fun refines(other: NamedDomainObjectProvider<KotlinGradleFragment>)
|
fun refines(other: NamedDomainObjectProvider<KotlinGradleFragment>)
|
||||||
|
|
||||||
|
override val directRefinesDependencies: Iterable<KotlinGradleFragment>
|
||||||
|
|
||||||
override fun dependencies(configureClosure: Closure<Any?>) =
|
override fun dependencies(configureClosure: Closure<Any?>) =
|
||||||
dependencies f@{ project.configure(this@f, configureClosure) }
|
dependencies f@{ project.configure(this@f, configureClosure) }
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Kotlin Gradle Plugin Models shared between IDEA import and KGP
|
||||||
|
The classes defined in this module will be available inside the Kotlin Gradle Plugin (KGP)
|
||||||
|
as well as in the IDE import (GradleProject).
|
||||||
|
|
||||||
|
## Binary Compatibility:
|
||||||
|
Binary compatibility can be tested by
|
||||||
|
`./gradlew :tools:binary-compatibility-validator:clean :tools:binary-compatibility-validator:test`
|
||||||
|
|
||||||
|
Binary incompatible changes have to go through a proper deprecation cycle after releases
|
||||||
|
|
||||||
|
### Unstable APIs / KotlinGradlePluginApi
|
||||||
|
Some APIs are marked with 'KotlinGradlePluginApi' which means, that those are not kept binary compatible and are considered 'unstable'
|
||||||
|
from the IDEA perspective. Typically constructors for models are marked like this
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
plugins {
|
||||||
|
kotlin("jvm")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(":kotlin-stdlib"))
|
||||||
|
}
|
||||||
|
|
||||||
|
publish()
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
interface IdeaKotlinFragment : Serializable {
|
||||||
|
val name: String
|
||||||
|
val languageSettings: IdeaKotlinLanguageSettings?
|
||||||
|
val dependencies: Collection<IdeaKotlinFragmentDependency>
|
||||||
|
val directRefinesDependencies: Collection<IdeaKotlinFragment>
|
||||||
|
val sourceDirectories: Collection<IdeaKotlinSourceDirectory>
|
||||||
|
val resourceDirectories: Collection<IdeaKotlinResourceDirectory>
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdeaKotlinFragmentImpl @KotlinGradlePluginApi constructor(
|
||||||
|
override val name: String,
|
||||||
|
override val languageSettings: IdeaKotlinLanguageSettings?,
|
||||||
|
override val dependencies: Collection<IdeaKotlinFragmentDependency>,
|
||||||
|
override val directRefinesDependencies: Collection<IdeaKotlinFragment>,
|
||||||
|
override val sourceDirectories: Collection<IdeaKotlinSourceDirectory>,
|
||||||
|
override val resourceDirectories: Collection<IdeaKotlinResourceDirectory>
|
||||||
|
) : IdeaKotlinFragment
|
||||||
|
|
||||||
|
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
interface IdeaKotlinFragmentDependency
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
interface IdeaKotlinLanguageSettings {
|
||||||
|
val languageVersion: String?
|
||||||
|
val apiVersion: String?
|
||||||
|
val isProgressiveMode: Boolean
|
||||||
|
val enabledLanguageFeatures: Collection<String>
|
||||||
|
val optInAnnotationsInUse: Collection<String>
|
||||||
|
val compilerPluginArguments: Collection<String>
|
||||||
|
val compilerPluginClasspath: Collection<File>
|
||||||
|
val freeCompilerArgs: Collection<String>
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdeaKotlinLanguageSettingsImpl @KotlinGradlePluginApi constructor(
|
||||||
|
override val languageVersion: String?,
|
||||||
|
override val apiVersion: String?,
|
||||||
|
override val isProgressiveMode: Boolean,
|
||||||
|
override val enabledLanguageFeatures: Collection<String>,
|
||||||
|
override val optInAnnotationsInUse: Collection<String>,
|
||||||
|
override val compilerPluginArguments: Collection<String>,
|
||||||
|
override val compilerPluginClasspath: Collection<File>,
|
||||||
|
override val freeCompilerArgs: Collection<String>
|
||||||
|
) : IdeaKotlinLanguageSettings
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
interface IdeaKotlinModule : Serializable {
|
||||||
|
val moduleIdentifier: IdeaKotlinModuleIdentifier
|
||||||
|
val fragments: Collection<IdeaKotlinFragment>
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdeaKotlinModuleImpl @KotlinGradlePluginApi constructor(
|
||||||
|
override val moduleIdentifier: IdeaKotlinModuleIdentifier,
|
||||||
|
override val fragments: Collection<IdeaKotlinFragment>
|
||||||
|
) : IdeaKotlinModule
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
sealed interface IdeaKotlinModuleIdentifier : Serializable {
|
||||||
|
val moduleClassifier: String?
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IdeaKotlinLocalModuleIdentifier : IdeaKotlinModuleIdentifier {
|
||||||
|
val buildId: String
|
||||||
|
val projectId: String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IdeaKotlinMavenModuleIdentifier : IdeaKotlinModuleIdentifier {
|
||||||
|
val group: String
|
||||||
|
val name: String
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdeaKotlinLocalModuleIdentifierImpl @KotlinGradlePluginApi constructor(
|
||||||
|
override val moduleClassifier: String?,
|
||||||
|
override val buildId: String,
|
||||||
|
override val projectId: String
|
||||||
|
) : IdeaKotlinLocalModuleIdentifier
|
||||||
|
|
||||||
|
class IdeaKotlinMavenModuleIdentifierImpl @KotlinGradlePluginApi constructor(
|
||||||
|
override val moduleClassifier: String?,
|
||||||
|
override val group: String,
|
||||||
|
override val name: String
|
||||||
|
) : IdeaKotlinMavenModuleIdentifier
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
interface IdeaKotlinProjectModel : Serializable {
|
||||||
|
val coreLibrariesVersion: String
|
||||||
|
val explicitApiModeCliOption: String?
|
||||||
|
val kotlinNativeHome: File
|
||||||
|
val modules: List<IdeaKotlinModule>
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdeaKotlinProjectModelImpl @KotlinGradlePluginApi constructor(
|
||||||
|
override val coreLibrariesVersion: String,
|
||||||
|
override val explicitApiModeCliOption: String?,
|
||||||
|
override val kotlinNativeHome: File,
|
||||||
|
override val modules: List<IdeaKotlinModule>
|
||||||
|
) : IdeaKotlinProjectModel
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
interface IdeaKotlinResourceDirectory : Serializable {
|
||||||
|
val file: File
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdeaKotlinResourceDirectoryImpl @KotlinGradlePluginApi constructor(
|
||||||
|
override val file: File
|
||||||
|
) : IdeaKotlinResourceDirectory
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
interface IdeaKotlinSourceDirectory : Serializable {
|
||||||
|
val file: File
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdeaKotlinSourceDirectoryImpl @KotlinGradlePluginApi constructor(
|
||||||
|
override val file: File,
|
||||||
|
) : IdeaKotlinSourceDirectory
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
@RequiresOptIn(
|
||||||
|
level = RequiresOptIn.Level.ERROR,
|
||||||
|
message = "This API can only be used by the Kotlin Gradle Plugin and is not kept stable for access inside the IDE process"
|
||||||
|
)
|
||||||
|
annotation class KotlinGradlePluginApi
|
||||||
@@ -30,6 +30,7 @@ kotlin.sourceSets.all {
|
|||||||
languageSettings.optIn("kotlin.RequiresOptIn")
|
languageSettings.optIn("kotlin.RequiresOptIn")
|
||||||
languageSettings.optIn("org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalVariantApi")
|
languageSettings.optIn("org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalVariantApi")
|
||||||
languageSettings.optIn("org.jetbrains.kotlin.gradle.plugin.mpp.external.AdvancedExternalVariantApi")
|
languageSettings.optIn("org.jetbrains.kotlin.gradle.plugin.mpp.external.AdvancedExternalVariantApi")
|
||||||
|
languageSettings.optIn("org.jetbrains.kotlin.gradle.kpm.idea.KotlinGradlePluginApi")
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -56,6 +57,7 @@ dependencies {
|
|||||||
embedded(project(":kotlin-gradle-statistics"))
|
embedded(project(":kotlin-gradle-statistics"))
|
||||||
compileOnly(project(":kotlin-gradle-build-metrics"))
|
compileOnly(project(":kotlin-gradle-build-metrics"))
|
||||||
embedded(project(":kotlin-gradle-build-metrics"))
|
embedded(project(":kotlin-gradle-build-metrics"))
|
||||||
|
implementation(project(":kotlin-gradle-plugin-idea"))
|
||||||
|
|
||||||
implementation(commonDependency("com.google.code.gson:gson"))
|
implementation(commonDependency("com.google.code.gson:gson"))
|
||||||
implementation(commonDependency("com.google.guava:guava"))
|
implementation(commonDependency("com.google.guava:guava"))
|
||||||
|
|||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragment
|
||||||
|
|
||||||
|
internal fun KotlinGradleFragment.toIdeaKotlinFragment(
|
||||||
|
cache: MutableMap<KotlinGradleFragment, IdeaKotlinFragment> = mutableMapOf()
|
||||||
|
): IdeaKotlinFragment {
|
||||||
|
return cache.getOrPut(this) {
|
||||||
|
IdeaKotlinFragmentImpl(
|
||||||
|
name = name,
|
||||||
|
languageSettings = languageSettings.toIdeaKotlinLanguageSettings(),
|
||||||
|
dependencies = emptyList(),
|
||||||
|
directRefinesDependencies = directRefinesDependencies.map { refinesFragment ->
|
||||||
|
refinesFragment.toIdeaKotlinFragment(cache)
|
||||||
|
},
|
||||||
|
sourceDirectories = kotlinSourceRoots.sourceDirectories.files.toList().map { file ->
|
||||||
|
IdeaKotlinSourceDirectoryImpl(file)
|
||||||
|
},
|
||||||
|
resourceDirectories = emptyList()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
|
||||||
|
import org.jetbrains.kotlin.project.model.LanguageSettings
|
||||||
|
|
||||||
|
internal fun LanguageSettings.toIdeaKotlinLanguageSettings(): IdeaKotlinLanguageSettings {
|
||||||
|
return IdeaKotlinLanguageSettingsImpl(
|
||||||
|
languageVersion = languageVersion,
|
||||||
|
apiVersion = apiVersion,
|
||||||
|
isProgressiveMode = progressiveMode,
|
||||||
|
enabledLanguageFeatures = enabledLanguageFeatures.toSet(),
|
||||||
|
optInAnnotationsInUse = optInAnnotationsInUse.toSet(),
|
||||||
|
compilerPluginArguments = (this as? DefaultLanguageSettingsBuilder)?.compilerPluginArguments?.toList().orEmpty(),
|
||||||
|
compilerPluginClasspath = (this as? DefaultLanguageSettingsBuilder)?.compilerPluginClasspath?.toList().orEmpty(),
|
||||||
|
freeCompilerArgs = (this as? DefaultLanguageSettingsBuilder)?.freeCompilerArgs?.toList().orEmpty()
|
||||||
|
)
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragment
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule
|
||||||
|
|
||||||
|
internal fun KotlinGradleModule.toIdeaKotlinModule(): IdeaKotlinModule {
|
||||||
|
val fragmentsCache = mutableMapOf<KotlinGradleFragment, IdeaKotlinFragment>()
|
||||||
|
return IdeaKotlinModuleImpl(
|
||||||
|
moduleIdentifier = moduleIdentifier.toIdeaKotlinModuleIdentifier(),
|
||||||
|
fragments = fragments.toList().map { fragment -> fragment.toIdeaKotlinFragment(fragmentsCache) }
|
||||||
|
)
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.project.model.KotlinModuleIdentifier
|
||||||
|
import org.jetbrains.kotlin.project.model.LocalModuleIdentifier
|
||||||
|
import org.jetbrains.kotlin.project.model.MavenModuleIdentifier
|
||||||
|
|
||||||
|
internal fun KotlinModuleIdentifier.toIdeaKotlinModuleIdentifier(): IdeaKotlinModuleIdentifier {
|
||||||
|
return when (this) {
|
||||||
|
is LocalModuleIdentifier -> IdeaKotlinLocalModuleIdentifierImpl(
|
||||||
|
moduleClassifier, buildId = buildId, projectId = projectId
|
||||||
|
)
|
||||||
|
is MavenModuleIdentifier -> IdeaKotlinMavenModuleIdentifierImpl(
|
||||||
|
moduleClassifier, group = group, name = name
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package org.jetbrains.kotlin.gradle.kpm.idea
|
||||||
|
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.tooling.provider.model.ToolingModelBuilder
|
||||||
|
import org.jetbrains.kotlin.compilerRunner.konanHome
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.pm20Extension
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class IdeaKotlinProjectModelBuilder : ToolingModelBuilder {
|
||||||
|
override fun canBuild(modelName: String): Boolean = modelName == IdeaKotlinProjectModel::class.java.name
|
||||||
|
override fun buildAll(modelName: String, project: Project): IdeaKotlinProjectModel {
|
||||||
|
return project.pm20Extension.toIdeaKotlinProjectModel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun KotlinPm20ProjectExtension.toIdeaKotlinProjectModel(): IdeaKotlinProjectModel {
|
||||||
|
return IdeaKotlinProjectModelImpl(
|
||||||
|
coreLibrariesVersion = coreLibrariesVersion,
|
||||||
|
explicitApiModeCliOption = explicitApi?.cliOption,
|
||||||
|
kotlinNativeHome = File(project.konanHome).absoluteFile,
|
||||||
|
modules = modules.map { module -> module.toIdeaKotlinModule() }
|
||||||
|
)
|
||||||
|
}
|
||||||
+9
-1
@@ -13,18 +13,21 @@ import org.gradle.api.component.SoftwareComponentFactory
|
|||||||
import org.gradle.api.plugins.JavaBasePlugin
|
import org.gradle.api.plugins.JavaBasePlugin
|
||||||
import org.gradle.api.publish.PublishingExtension
|
import org.gradle.api.publish.PublishingExtension
|
||||||
import org.gradle.api.publish.maven.MavenPublication
|
import org.gradle.api.publish.maven.MavenPublication
|
||||||
|
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
|
||||||
import org.gradle.util.GradleVersion
|
import org.gradle.util.GradleVersion
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.pm20Extension
|
import org.jetbrains.kotlin.gradle.dsl.pm20Extension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
|
import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
|
||||||
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
|
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
|
||||||
|
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder
|
||||||
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
|
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
|
||||||
import org.jetbrains.kotlin.project.model.KotlinModuleIdentifier
|
import org.jetbrains.kotlin.project.model.KotlinModuleIdentifier
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
abstract class KotlinPm20GradlePlugin @Inject constructor(
|
abstract class KotlinPm20GradlePlugin @Inject constructor(
|
||||||
@Inject private val softwareComponentFactory: SoftwareComponentFactory
|
@Inject private val softwareComponentFactory: SoftwareComponentFactory,
|
||||||
|
@Inject private val toolingModelBuilderRegistry: ToolingModelBuilderRegistry
|
||||||
) : Plugin<Project> {
|
) : Plugin<Project> {
|
||||||
override fun apply(project: Project) {
|
override fun apply(project: Project) {
|
||||||
checkGradleCompatibility("the Kotlin Multiplatform plugin", GradleVersion.version("6.1"))
|
checkGradleCompatibility("the Kotlin Multiplatform plugin", GradleVersion.version("6.1"))
|
||||||
@@ -37,6 +40,7 @@ abstract class KotlinPm20GradlePlugin @Inject constructor(
|
|||||||
registerDefaultVariantFactories(project)
|
registerDefaultVariantFactories(project)
|
||||||
setupFragmentsMetadataForKpmModules(project)
|
setupFragmentsMetadataForKpmModules(project)
|
||||||
setupKpmModulesPublication(project)
|
setupKpmModulesPublication(project)
|
||||||
|
setupToolingModelBuilder()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createDefaultModules(project: Project) {
|
private fun createDefaultModules(project: Project) {
|
||||||
@@ -77,6 +81,10 @@ abstract class KotlinPm20GradlePlugin @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setupToolingModelBuilder() {
|
||||||
|
toolingModelBuilderRegistry.register(IdeaKotlinProjectModelBuilder())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun rootPublicationComponentName(module: KotlinGradleModule) =
|
fun rootPublicationComponentName(module: KotlinGradleModule) =
|
||||||
|
|||||||
+2
-2
@@ -102,7 +102,7 @@ internal open class LegacyMappedVariant(
|
|||||||
override val fragmentName: String
|
override val fragmentName: String
|
||||||
get() = fragmentForDefaultSourceSet.fragmentName + "Variant"
|
get() = fragmentForDefaultSourceSet.fragmentName + "Variant"
|
||||||
|
|
||||||
override val directRefinesDependencies: Iterable<KotlinModuleFragment>
|
override val directRefinesDependencies: Iterable<KotlinGradleFragment>
|
||||||
get() = fragmentForDefaultSourceSet.directRefinesDependencies
|
get() = fragmentForDefaultSourceSet.directRefinesDependencies
|
||||||
|
|
||||||
override val declaredModuleDependencies: Iterable<KotlinModuleDependency>
|
override val declaredModuleDependencies: Iterable<KotlinModuleDependency>
|
||||||
@@ -239,4 +239,4 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu
|
|||||||
VariantPublishingConfigurator.get(target.project).configurePublishing(request)
|
VariantPublishingConfigurator.get(target.project).configurePublishing(request)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ package org.jetbrains.kotlin.project.model
|
|||||||
|
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
||||||
// TODO sealed with an abstract subclass? this will make exhaustive checks work
|
sealed class KotlinModuleIdentifier(open val moduleClassifier: String?): Serializable
|
||||||
open class KotlinModuleIdentifier(open val moduleClassifier: String?): Serializable
|
|
||||||
|
|
||||||
// TODO consider id: Any, to allow IDs with custom equality?
|
// TODO consider id: Any, to allow IDs with custom equality?
|
||||||
data class LocalModuleIdentifier(
|
data class LocalModuleIdentifier(
|
||||||
|
|||||||
@@ -227,6 +227,7 @@ include ":benchmarks",
|
|||||||
":tools:kotlinp",
|
":tools:kotlinp",
|
||||||
":kotlin-project-model",
|
":kotlin-project-model",
|
||||||
":kotlin-gradle-plugin-api",
|
":kotlin-gradle-plugin-api",
|
||||||
|
":kotlin-gradle-plugin-idea",
|
||||||
":kotlin-gradle-plugin-dsl-codegen",
|
":kotlin-gradle-plugin-dsl-codegen",
|
||||||
":kotlin-gradle-plugin-npm-versions-codegen",
|
":kotlin-gradle-plugin-npm-versions-codegen",
|
||||||
":kotlin-gradle-statistics",
|
":kotlin-gradle-statistics",
|
||||||
@@ -631,6 +632,7 @@ project(':kotlin-sam-with-receiver-compiler-plugin').projectDir = "$rootDir/plug
|
|||||||
project(':tools:kotlinp').projectDir = "$rootDir/libraries/tools/kotlinp" as File
|
project(':tools:kotlinp').projectDir = "$rootDir/libraries/tools/kotlinp" as File
|
||||||
project(':kotlin-project-model').projectDir = "$rootDir/libraries/tools/kotlin-project-model" as File
|
project(':kotlin-project-model').projectDir = "$rootDir/libraries/tools/kotlin-project-model" as File
|
||||||
project(':kotlin-gradle-plugin-api').projectDir = "$rootDir/libraries/tools/kotlin-gradle-plugin-api" as File
|
project(':kotlin-gradle-plugin-api').projectDir = "$rootDir/libraries/tools/kotlin-gradle-plugin-api" as File
|
||||||
|
project(':kotlin-gradle-plugin-idea').projectDir = "$rootDir/libraries/tools/kotlin-gradle-plugin-idea" as File
|
||||||
project(':kotlin-gradle-plugin-dsl-codegen').projectDir = "$rootDir/libraries/tools/kotlin-gradle-plugin-dsl-codegen" as File
|
project(':kotlin-gradle-plugin-dsl-codegen').projectDir = "$rootDir/libraries/tools/kotlin-gradle-plugin-dsl-codegen" as File
|
||||||
project(':kotlin-gradle-plugin-npm-versions-codegen').projectDir = "$rootDir/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen" as File
|
project(':kotlin-gradle-plugin-npm-versions-codegen').projectDir = "$rootDir/libraries/tools/kotlin-gradle-plugin-npm-versions-codegen" as File
|
||||||
project(':kotlin-gradle-statistics').projectDir = "$rootDir/libraries/tools/kotlin-gradle-statistics" as File
|
project(':kotlin-gradle-statistics').projectDir = "$rootDir/libraries/tools/kotlin-gradle-statistics" as File
|
||||||
|
|||||||
Reference in New Issue
Block a user