in sources/amper-cli/src/org/jetbrains/amper/tasks/web/WebLinkTask.kt [83:154]
override suspend fun run(
dependenciesResult: List<TaskResult>,
executionContext: TaskGraphExecutionContext,
): Result {
val fragments = module.fragments.filter {
it.platforms.contains(platform) && it.isTest == isTest
}
if (fragments.isEmpty()) {
error("Zero fragments in module ${module.userReadableName} for platform $platform isTest=$isTest")
}
val externalKLibs = dependenciesResult
.filterIsInstance<ResolveExternalDependenciesTask.Result>()
.flatMap { it.runtimeClasspath } // runtime dependencies including transitive
.distinct()
.filterKLibs()
.toList()
val includeArtifact = dependenciesResult
.filterIsInstance<WebCompileKlibTask.Result>()
.firstOrNull { it.taskName == compileKLibTaskName }
?.compiledKlib
if (includeArtifact == null && isTest) {
// We may skip linking for test specifically if there's no compiled code in the fragments.
// Libraries are of no interest here because they can't contain any tests
logger.info("No test code was found compiled for ${fragments.identificationPhrase()}, skipping linking")
return Result(
linkedBinary = null,
)
}
val compileKLibDependencies = dependenciesResult
.filterIsInstance<WebCompileKlibTask.Result>()
.filter { it.taskName != compileKLibTaskName }
val compiledKLibs = compileKLibDependencies.mapNotNull { it.compiledKlib }
val kotlinUserSettings = fragments.singleLeafFragment().serializableKotlinSettings()
val jdk = jdkProvider.getJdkOrUserError(module.jdkSettings)
logger.debug("${expectedPlatform.name} link '${module.userReadableName}' -- ${fragments.joinToString(" ") { it.name }}")
val inputs = compiledKLibs + listOfNotNull(includeArtifact)
val artifact = incrementalCache.executeForFiles(
key = taskName.name,
inputValues = mapOf(
"kotlin.settings" to Json.encodeToString<KotlinUserSettings>(kotlinUserSettings),
"task.output.root" to taskOutputRoot.path.pathString,
),
inputFiles = inputs,
) {
cleanDirectory(taskOutputRoot.path)
val artifactPath = taskOutputRoot.path
compileSources(
jdk,
kotlinUserSettings = kotlinUserSettings,
librariesPaths = externalKLibs + inputs,
includeArtifact = includeArtifact,
)
listOf(artifactPath)
}.single()
return Result(
linkedBinary = artifact,
)
}