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, buildModel: GradleBuild,
consumer: ProjectImportModelProvider.BuildModelConsumer consumer: ProjectImportModelProvider.BuildModelConsumer
) { ) {
val model = controller.findModel(kotlinDslScriptModelClass) project.modules.forEach { module ->
if (model != null) { if (module.gradleProject.parent == null) {
consumer.consume(buildModel, model, kotlinDslScriptModelClass) 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) super.onSuccessImport(imported, projectData, project, modelsProvider)
val projectDataNode = imported.singleOrNull() ?: return 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 gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID)
val projectSettings = gradleSettings.getLinkedProjectSettings(projectData?.linkedExternalProjectPath ?: return) ?: return val projectSettings = gradleSettings.getLinkedProjectSettings(projectData?.linkedExternalProjectPath ?: return) ?: return
@@ -45,9 +45,24 @@ class KotlinGradleBuildScriptsResolver : AbstractProjectResolverExtension() {
super.populateProjectExtraModels(gradleProject, ideProject) super.populateProjectExtraModels(gradleProject, ideProject)
if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) { if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) {
resolverCtx.getExtraProject(null, KotlinDslScriptsModel::class.java)?.let { model -> pupulateBuildModels(gradleProject, ideProject)
// we need a copy to avoid memory leak, as model is java rmi proxy object
ideProject.gradleKotlinBuildScripts = copy(model) 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 var DataNode<out ProjectData>.gradleKotlinBuildScripts
by NotNullableCopyableDataNodeUserDataProperty( by NotNullableCopyableDataNodeUserDataProperty(
Key.create<List<GradleKotlinBuildScriptData>>( Key.create<MutableList<GradleKotlinBuildScriptData>>(
"GRADLE_KOTLIN_BUILD_SCRIPTS" "GRADLE_KOTLIN_BUILD_SCRIPTS"
), ),
emptyList() mutableListOf()
) )
data class GradleKotlinBuildScriptData( data class GradleKotlinBuildScriptData(
@@ -37,6 +37,25 @@ class GradleKtsImportTest : GradleImportingTestCase() {
checkConfiguration("build.gradle.kts") 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) { private fun checkConfiguration(vararg files: String) {
val scripts = files.map { val scripts = files.map {
KtsFixture(it).also { kts -> KtsFixture(it).also { kts ->
@@ -0,0 +1 @@
include("subProject")
@@ -0,0 +1,2 @@
includeBuild("subBuild")
include("subProject")
@@ -0,0 +1 @@
include("subProject")