@@ -5,6 +5,8 @@ import org.gradle.tooling.provider.model.ToolingModelBuilder
55import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
66import org.jetbrains.kotlin.gradle.model.GradleProjectForEclipse
77import org.jetbrains.kotlin.gradle.model.GradleProjectForEclipseImpl
8+ import org.jetbrains.kotlin.gradle.model.GradleMultiProjectForEclipse
9+ import org.jetbrains.kotlin.gradle.model.GradleMultiProjectForEclipseImpl
810import org.jetbrains.kotlin.gradle.model.NoKotlinProject
911import org.jetbrains.kotlin.gradle.model.CompilerPluginConfig
1012import org.jetbrains.kotlin.gradle.model.AllOpen
@@ -27,28 +29,36 @@ allprojects {
2729 apply<GradleProjectForEclipseInstaller >()
2830}
2931
30- class GradleProjectForEclipseInstaller @Inject constructor(val registry : ToolingModelBuilderRegistry ) : Plugin<Project> {
32+ class GradleProjectForEclipseInstaller @Inject constructor(val registry : ToolingModelBuilderRegistry ) :
33+ Plugin <Project > {
3134 override fun apply (project : Project ) {
3235 registry.register(GradleProjectForEclipseBuilder ())
3336 }
3437}
3538
3639class GradleProjectForEclipseBuilder () : ToolingModelBuilder {
37- override fun canBuild (modelName : String ) = (modelName == GradleProjectForEclipse ::class .qualifiedName)
38-
39- override fun buildAll (modelName : String , project : Project ): Any {
40- val task = project.tasks.findByName(" compileKotlin" )
41-
42- return task?.dynamicCall(" kotlinOptions" )?.run {
43- GradleProjectForEclipseImpl (
44- project.findProperty(" kotlin.code.style" ) as ? String ,
45- property(" apiVersion" ),
46- property(" languageVersion" ),
47- property(" jvmTarget" ),
48- collectPlugins(project)
49- )
50- } ? : return NoKotlinProject
51- }
40+
41+ override fun canBuild (modelName : String ) = (modelName == GradleMultiProjectForEclipse ::class .qualifiedName)
42+
43+ override fun buildAll (modelName : String , project : Project ): Any =
44+ GradleMultiProjectForEclipseImpl (process(project).toMap())
45+
46+ private fun process (project : Project ): List <Pair <String , GradleProjectForEclipse >> =
47+ project.childProjects.values.flatMap(::process) +
48+ (project.name to buildForSubproject(project))
49+
50+ private fun buildForSubproject (project : Project ): GradleProjectForEclipse =
51+ project.tasks.findByName(" compileKotlin" )
52+ ?.dynamicCall(" kotlinOptions" )
53+ ?.run {
54+ GradleProjectForEclipseImpl (
55+ project.findProperty(" kotlin.code.style" ) as ? String ,
56+ property(" apiVersion" ),
57+ property(" languageVersion" ),
58+ property(" jvmTarget" ),
59+ collectPlugins(project)
60+ )
61+ } ? : NoKotlinProject
5262
5363 private fun collectPlugins (project : Project ): List <CompilerPluginConfig > {
5464 val result = arrayListOf<CompilerPluginConfig >()
@@ -74,16 +84,16 @@ class GradleProjectForEclipseBuilder() : ToolingModelBuilder {
7484 it.dynamicCall(" myPresets" ) as List <String >
7585 )
7686 }?.also { result + = it }
77-
87+
7888 return result
7989 }
80-
90+
8191 // We need this method, because there is no way for us to get here classes that are added to classpath alongside
82- // the kotlin gradle plugin. Even if we add them to the classpath of this initscript, they will have different
83- // classloader.
92+ // the kotlin gradle plugin. Even if we add them to the classpath of this initscript, they will have different
93+ // classloader.
8494 fun Any.dynamicCall (name : String , vararg args : Any? ): Any? =
8595 this ::class .members.first { it.name == name && it.parameters.size == args.size + 1 }
86- .call(this , * args)
87-
96+ .call(this , * args)
97+
8898 fun Any.property (name : String ): String? = dynamicCall(name) as ? String
8999}
0 commit comments