gradle.kts importing: add support for included builds and fix sub projects

This commit is contained in:
Sergey Rostov
2019-12-13 09:39:57 +03:00
parent fef193be63
commit 6e3e65c490
14 changed files with 53 additions and 9 deletions
@@ -19,9 +19,13 @@ class KotlinDslScriptModelProvider : ProjectImportModelProvider {
buildModel: GradleBuild,
consumer: ProjectImportModelProvider.BuildModelConsumer
) {
val model = controller.findModel(kotlinDslScriptModelClass)
if (model != null) {
consumer.consume(buildModel, model, kotlinDslScriptModelClass)
project.modules.forEach { module ->
if (module.gradleProject.parent == null) {
val model = controller.findModel(module.gradleProject, kotlinDslScriptModelClass)
if (model != null) {
consumer.consume(module, model, kotlinDslScriptModelClass)
}
}
}
}
@@ -52,7 +52,9 @@ class KotlinGradleBuildScriptsDataService : AbstractProjectDataService<ProjectDa
super.onSuccessImport(imported, projectData, project, modelsProvider)
val projectDataNode = imported.singleOrNull() ?: return
val buildScripts = projectDataNode.gradleKotlinBuildScripts ?: return
val gradleKotlinBuildScripts = projectDataNode.gradleKotlinBuildScripts
val buildScripts = gradleKotlinBuildScripts.toList()
gradleKotlinBuildScripts.clear()
val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID)
val projectSettings = gradleSettings.getLinkedProjectSettings(projectData?.linkedExternalProjectPath ?: return) ?: return
@@ -45,9 +45,24 @@ class KotlinGradleBuildScriptsResolver : AbstractProjectResolverExtension() {
super.populateProjectExtraModels(gradleProject, ideProject)
if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) {
resolverCtx.getExtraProject(null, KotlinDslScriptsModel::class.java)?.let { model ->
// we need a copy to avoid memory leak, as model is java rmi proxy object
ideProject.gradleKotlinBuildScripts = copy(model)
pupulateBuildModels(gradleProject, ideProject)
resolverCtx.models.includedBuilds.forEach { includedRoot ->
pupulateBuildModels(includedRoot, ideProject)
}
}
}
private fun pupulateBuildModels(
root: IdeaProject,
ideProject: DataNode<ProjectData>
) {
root.modules.forEach {
if (it.gradleProject.parent == null) {
resolverCtx.getExtraProject(it, KotlinDslScriptsModel::class.java)?.let { model ->
// we need a copy to avoid memory leak, as model is java rmi proxy object
ideProject.gradleKotlinBuildScripts.addAll(copy(model))
}
}
}
}
@@ -15,10 +15,10 @@ import org.jetbrains.kotlin.idea.util.NotNullableCopyableDataNodeUserDataPropert
var DataNode<out ProjectData>.gradleKotlinBuildScripts
by NotNullableCopyableDataNodeUserDataProperty(
Key.create<List<GradleKotlinBuildScriptData>>(
Key.create<MutableList<GradleKotlinBuildScriptData>>(
"GRADLE_KOTLIN_BUILD_SCRIPTS"
),
emptyList()
mutableListOf()
)
data class GradleKotlinBuildScriptData(
@@ -37,6 +37,25 @@ class GradleKtsImportTest : GradleImportingTestCase() {
checkConfiguration("build.gradle.kts")
}
@Test
@TargetVersions("6.0.1+")
fun testCompositeBuild() {
configureByFiles()
importProject()
checkConfiguration(
"settings.gradle.kts",
"build.gradle.kts",
"subProject/build.gradle.kts",
"subBuild/settings.gradle.kts",
"subBuild/build.gradle.kts",
"subBuild/subProject/build.gradle.kts",
"buildSrc/settings.gradle.kts",
"buildSrc/build.gradle.kts",
"buildSrc/subProject/build.gradle.kts"
)
}
private fun checkConfiguration(vararg files: String) {
val scripts = files.map {
KtsFixture(it).also { kts ->
@@ -0,0 +1 @@
include("subProject")
@@ -0,0 +1,2 @@
includeBuild("subBuild")
include("subProject")
@@ -0,0 +1 @@
include("subProject")