Skip to content

Commit 1facff9

Browse files
wip
1 parent 8903bf9 commit 1facff9

File tree

4 files changed

+79
-105
lines changed

4 files changed

+79
-105
lines changed

src/main/kotlin/com/autonomousapps/internal/analyzer/JvmSourceSet.kt

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package com.autonomousapps.internal.analyzer
44

5+
import com.autonomousapps.model.source.KmpSourceKind
56
import com.autonomousapps.model.source.SourceKind
67
import org.gradle.api.Project
78
import org.gradle.api.file.FileCollection
@@ -10,6 +11,7 @@ import org.gradle.api.file.SourceDirectorySet
1011
import org.gradle.api.provider.Provider
1112
import org.gradle.api.tasks.GroovySourceDirectorySet
1213
import org.gradle.api.tasks.SourceSet
14+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmCompilation
1315
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet as JbKotlinSourceSet
1416

1517
internal interface JvmSourceSet {
@@ -65,33 +67,24 @@ internal class KotlinSourceSet(
6567

6668
// TODO: not certain about any of this
6769
internal class KmpSourceSet(
68-
sourceSet: JbKotlinSourceSet,
69-
override val sourceKind: SourceKind,
70+
private val compilation: KotlinJvmCompilation,
7071
) : JvmSourceSet {
71-
override val name: String = sourceSet.name
7272

73-
// TODO: pretty sure this is wrong!
74-
override val jarTaskName: String = "jar"
73+
override val name: String = compilation.name
74+
75+
override val jarTaskName: String = compilation.target.artifactsTaskName
76+
77+
override val sourceKind: SourceKind = KmpSourceKind.of(compilation)
78+
79+
override val sourceCode: SourceDirectorySet
80+
get() = compilation.defaultSourceSet.kotlin
81+
82+
override val compileClasspathConfigurationName: String = compilation.compileDependencyConfigurationName
83+
84+
override val runtimeClasspathConfigurationName: String = compilation.runtimeDependencyConfigurationName
7585

76-
override val sourceCode: SourceDirectorySet = sourceSet.kotlin
77-
78-
// jvmCompileClasspath
79-
// jvmRuntimeClasspath
80-
// jvmTestCompileClasspath
81-
// jvmTestRuntimeClasspath
82-
// jvmMainCompileClasspath
83-
// jvmMainRuntimeClasspath
84-
// jvmIntegrationTestCompileClasspath
85-
// jvmIntegrationTestRuntimeClasspath
86-
override val compileClasspathConfigurationName: String = sourceKind.compileClasspathName
87-
// if (name != "main") "${name}CompileClasspath"
88-
// else "compileClasspath"
89-
90-
override val runtimeClasspathConfigurationName: String = sourceKind.runtimeClasspathName
91-
// if (name != "main") "${name}RuntimeClasspath"
92-
// else "runtimeClasspath"
93-
94-
override val classesDirs: Provider<FileCollection> = sourceSet.kotlin.classesDirectory.map { dir -> dir.asFileTree }
86+
override val classesDirs: Provider<FileCollection>
87+
get() = compilation.defaultSourceSet.kotlin.classesDirectory.map { dir -> dir.asFileTree }
9588
}
9689

9790
internal fun SourceSet.java(): FileTree {

src/main/kotlin/com/autonomousapps/internal/analyzer/KmpProjectAnalyzer.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,7 @@ import com.autonomousapps.internal.artifactsFor
88
import com.autonomousapps.internal.utils.capitalizeSafely
99
import com.autonomousapps.model.source.SourceKind
1010
import com.autonomousapps.services.InMemoryCache
11-
import com.autonomousapps.tasks.AbiAnalysisTask
12-
import com.autonomousapps.tasks.ClassListExploderTask
13-
import com.autonomousapps.tasks.CodeSourceExploderTask
14-
import com.autonomousapps.tasks.FindDeclarationsTask
15-
import com.autonomousapps.tasks.FindDeclaredProcsTask
16-
import com.autonomousapps.tasks.FindNativeLibsTask
17-
import com.autonomousapps.tasks.GraphViewTask
18-
import com.autonomousapps.tasks.JvmCodeSourceExploderTask
11+
import com.autonomousapps.tasks.*
1912
import org.gradle.api.Project
2013
import org.gradle.api.file.FileTree
2114
import org.gradle.api.provider.Provider
@@ -40,18 +33,13 @@ internal class KmpProjectAnalyzer(
4033
override val kaptConfigurationName = "kapt"
4134
override val annotationProcessorConfigurationName = "annotationProcessor"
4235

43-
override val attributeValueJar = "jar"
36+
override val attributeValueJar = sourceSet.jarTaskName
4437

4538
override val isDataBindingEnabled: Provider<Boolean> = project.provider { false }
4639
override val isViewBindingEnabled: Provider<Boolean> = project.provider { false }
4740

4841
override val outputPaths = OutputPaths(project, variantName)
4942

50-
override fun registerGraphViewTask(findDeclarationsTask: TaskProvider<FindDeclarationsTask>): TaskProvider<GraphViewTask> {
51-
// TODO()
52-
return super.registerGraphViewTask(findDeclarationsTask)
53-
}
54-
5543
override fun registerByteCodeSourceExploderTask(): TaskProvider<ClassListExploderTask> {
5644
return project.tasks.register("explodeByteCodeSource$taskNameSuffix", ClassListExploderTask::class.java) {
5745
it.classes.setFrom(sourceSet.classesDirs)
@@ -96,7 +84,9 @@ internal class KmpProjectAnalyzer(
9684

9785
override fun registerFindNativeLibsTask(): TaskProvider<FindNativeLibsTask> {
9886
return project.tasks.register("findNativeLibs$taskNameSuffix", FindNativeLibsTask::class.java) {
99-
it.setMacNativeLibs(project.configurations.getByName(compileConfigurationName).artifactsFor(ArtifactAttributes.DYLIB))
87+
it.setMacNativeLibs(
88+
project.configurations.getByName(compileConfigurationName).artifactsFor(ArtifactAttributes.DYLIB)
89+
)
10090
it.output.set(outputPaths.nativeDependenciesPath)
10191
}
10292
}

src/main/kotlin/com/autonomousapps/model/source/SourceKind.kt

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.autonomousapps.internal.utils.capitalizeSafely
66
import com.squareup.moshi.JsonClass
77
import dev.zacsweers.moshix.sealed.annotations.TypeLabel
88
import org.gradle.api.tasks.SourceSet
9+
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
910
import java.io.Serializable
1011

1112
/**
@@ -360,6 +361,19 @@ public data class KmpSourceKind(
360361
val JVM_MAIN = of(JVM_MAIN_NAME)
361362
val JVM_TEST = of(JVM_TEST_NAME)
362363

364+
fun of(compilation: KotlinCompilation<*>): KmpSourceKind {
365+
val runtimeClasspathName = compilation.runtimeDependencyConfigurationName
366+
?: error("Kotlin compilation ${compilation.name} has null 'runtimeDependencyConfigurationName'")
367+
368+
return KmpSourceKind(
369+
name = compilation.defaultSourceSet.name,
370+
// Always custom
371+
kind = CUSTOM_JVM_KIND,
372+
compileClasspathName = compilation.compileDependencyConfigurationName,
373+
runtimeClasspathName = runtimeClasspathName,
374+
)
375+
}
376+
363377
fun of(sourceSetName: String): KmpSourceKind {
364378
return KmpSourceKind(
365379
name = sourceSetName,
@@ -370,8 +384,16 @@ public data class KmpSourceKind(
370384
// SourceSet.TEST_SOURCE_SET_NAME -> TEST_KIND
371385
// else -> CUSTOM_JVM_KIND
372386
// },
373-
compileClasspathName = "todo",
374-
runtimeClasspathName = "todo",
387+
compileClasspathName = if (sourceSetName == JVM_MAIN_NAME) {
388+
"jvmCompileClasspath"
389+
} else {
390+
"${sourceSetName}CompileClasspath"
391+
},
392+
runtimeClasspathName = if (sourceSetName == JVM_MAIN_NAME) {
393+
"jvmRuntimeClasspath"
394+
} else {
395+
"${sourceSetName}RuntimeClasspath"
396+
},
375397
)
376398
}
377399
}

src/main/kotlin/com/autonomousapps/subplugin/ProjectPlugin.kt

Lines changed: 33 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import com.autonomousapps.internal.utils.toJson
2929
import com.autonomousapps.model.DuplicateClass
3030
import com.autonomousapps.model.source.AndroidSourceKind
3131
import com.autonomousapps.model.source.JvmSourceKind
32-
import com.autonomousapps.model.source.KmpSourceKind
3332
import com.autonomousapps.model.source.SourceKind
3433
import com.autonomousapps.services.GlobalDslService
3534
import com.autonomousapps.services.InMemoryCache
@@ -43,7 +42,9 @@ import org.gradle.api.tasks.SourceSetContainer
4342
import org.gradle.api.tasks.TaskProvider
4443
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
4544
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
45+
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
4646
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
47+
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
4748
import java.util.concurrent.atomic.AtomicBoolean
4849

4950
private const val APPLICATION_PLUGIN = "application"
@@ -185,7 +186,7 @@ internal class ProjectPlugin(private val project: Project) {
185186
logger.log("Adding Kotlin Multiplatform tasks to ${project.path}")
186187
isKmpProject = true
187188
checkKgpOnClasspath()
188-
configureKotlinKmpProject()
189+
configureKotlinMultiplatformProject()
189190
}
190191
pluginManager.withPlugin(JAVA_PLUGIN) {
191192
configureJavaAppProject(maybeAppProject = true)
@@ -689,66 +690,31 @@ internal class ProjectPlugin(private val project: Project) {
689690
}
690691
}
691692

692-
/**
693-
* Has the `org.jetbrains.kotlin.multiplatform` plugin applied.
694-
*
695-
* TODO(tsr)!!: this is currently identical to `configureKotlinJvmProject()`!!
696-
*/
697-
private fun Project.configureKotlinKmpProject() {
698-
val k = KotlinSources(this, dagpExtension)
699-
700-
configureRedundantJvmPlugin {
701-
it.withKotlin(k.hasKotlin)
702-
}
703-
704-
if (configuredForKotlinJvmOrJavaLibrary.getAndSet(true)) {
705-
logger.info("(dependency analysis) $path was already configured for the java-library plugin")
706-
redundantJvmPlugin.configure()
707-
return
708-
}
709-
710-
val kotlin = extensions.getByType(KotlinMultiplatformExtension::class.java)
711-
val kotlinTargets = kotlin.targets
712-
kotlinTargets.configureEach { target ->
713-
println("CONFIGURING KOTLIN TARGET ${target.name}")
714-
// try {
715-
// val hasAbi = true
716-
//
717-
// val dependencyAnalyzer = KmpProjectAnalyzer(
718-
// project = this,
719-
// sourceSet = kmpSourceSet,
720-
// hasAbi = hasAbi,
721-
// )
722-
// } catch (_: UnknownTaskException) {
723-
// logger.warn("Skipping tasks creation for KMP target `${target.name}`")
724-
// }
725-
}
726-
727-
k.kotlinSourceSets.forEach { sourceSet ->
728-
try {
729-
val sourceKind = KmpSourceKind.of(sourceSet.name)
730-
val hasAbi = hasAbi(sourceSet)
731-
val kmpSourceSet = KmpSourceSet(sourceSet, sourceKind)
693+
/** Has the [KOTLIN_MULTIPLATFORM_PLUGIN] plugin applied. */
694+
private fun Project.configureKotlinMultiplatformProject() {
695+
extensions.getByType(KotlinMultiplatformExtension::class.java)
696+
.targets
697+
.withType(KotlinJvmTarget::class.java) // TODO(tsr) delete? or only analyze jvm targets? what about android targets?
698+
.configureEach { target ->
699+
println("CONFIGURING KOTLIN TARGET ${target.name}") // TODO delete
700+
target.compilations.configureEach { compilation ->
701+
println("CONFIGURING KOTLIN COMPILATION ${compilation.name}") // TODO delete
702+
try {
703+
val hasAbi = hasAbi(compilation)
704+
val kmpSourceSet = KmpSourceSet(compilation)
705+
706+
val dependencyAnalyzer = KmpProjectAnalyzer(
707+
project = this,
708+
sourceSet = kmpSourceSet,
709+
hasAbi = hasAbi,
710+
)
732711

733-
val dependencyAnalyzer = if (hasAbi) {
734-
KmpProjectAnalyzer(
735-
project = this,
736-
sourceSet = kmpSourceSet,
737-
hasAbi = true,
738-
)
739-
} else {
740-
KmpProjectAnalyzer(
741-
project = this,
742-
sourceSet = kmpSourceSet,
743-
hasAbi = false,
744-
)
712+
analyzeDependencies(dependencyAnalyzer)
713+
} catch (_: UnknownTaskException) {
714+
logger.warn("Skipping tasks creation for KMP target `${target.name}`")
715+
}
745716
}
746-
747-
analyzeDependencies(dependencyAnalyzer)
748-
} catch (_: UnknownTaskException) {
749-
logger.warn("Skipping tasks creation for sourceSet `${sourceSet.name}`")
750717
}
751-
}
752718
}
753719

754720
private fun Project.hasAbi(sourceSet: SourceSet): Boolean {
@@ -765,17 +731,20 @@ internal class ProjectPlugin(private val project: Project) {
765731
return hasApiConfiguration && isNotTest && isNotMainApp
766732
}
767733

768-
private fun Project.hasAbi(sourceSet: KotlinSourceSet): Boolean {
769-
if (sourceSet.name in dagpExtension.abiHandler.exclusionsHandler.excludedSourceSets.get()) {
734+
private fun Project.hasAbi(compilation: KotlinCompilation<*>): Boolean {
735+
val sourceSetName = compilation.defaultSourceSet.name
736+
if (sourceSetName in dagpExtension.abiHandler.exclusionsHandler.excludedSourceSets.get()) {
770737
// if this sourceSet is user-excluded, then it doesn't have an ABI
771738
return false
772739
}
773740

774-
val hasApiConfiguration = configurations.findByName(sourceSet.apiConfigurationName) != null
741+
// TODO(tsr): not sure about the equality checks against `KotlinSourceSet...`
742+
// what about this? `compilation.name == KotlinCompilation.MAIN_COMPILATION_NAME`
743+
val hasApiConfiguration = configurations.named(compilation.apiConfigurationName) != null
775744
// The 'test' sourceSet does not have an ABI
776-
val isNotTest = sourceSet.name != KotlinSourceSet.COMMON_TEST_SOURCE_SET_NAME
745+
val isNotTest = sourceSetName != KotlinSourceSet.COMMON_TEST_SOURCE_SET_NAME
777746
// The 'main' sourceSet for an app project does not have an ABI
778-
val isNotMainApp = !(isAppProject() && sourceSet.name == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME)
747+
val isNotMainApp = !(isAppProject() && sourceSetName == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME)
779748
return hasApiConfiguration && isNotTest && isNotMainApp
780749
}
781750

0 commit comments

Comments
 (0)