[KLIB Resolver] Report KLIB resolver issues as compiler messages

The reason of this change is to make messages (especially warnings)
that are reported by the KLIB resolver become visible to the end user.
This can be achieved to forwarding such messages to the appropriate
compiler's components such as
`org.jetbrains.kotlin.cli.common.messages.MessageCollector` and
`org.jetbrains.kotlin.ir.util.IrMessageLogger`.

Also: The default `DummyLogger` should be used as minimal as possible.
Because it just forwards messages to the standard output (console)
where they can remain unattended. When the compiler is executed
from the Gradle plugin such messages appear only in DEBUG Gradle's log.

^KT-63573
This commit is contained in:
Dmitriy Dolovov
2023-11-28 18:52:19 +01:00
committed by Space Team
parent 8430be39c9
commit 46081f968d
21 changed files with 136 additions and 108 deletions
@@ -5,8 +5,7 @@
package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.getLogger
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.konan.library.defaultResolver
@@ -15,7 +14,6 @@ import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.library.UnresolvedLibrary
import org.jetbrains.kotlin.library.metadata.resolver.impl.libraryResolver
import org.jetbrains.kotlin.library.toUnresolvedLibraries
import org.jetbrains.kotlin.util.Logger
class KonanLibrariesResolveSupport(
configuration: CompilerConfiguration,
@@ -34,24 +32,13 @@ class KonanLibrariesResolveSupport(
private val unresolvedLibraries = libraryNames.toUnresolvedLibraries
private val repositories = configuration.getList(KonanConfigKeys.REPOSITORIES)
private val resolverLogger =
object : Logger {
private val collector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
override fun warning(message: String)= collector.report(CompilerMessageSeverity.STRONG_WARNING, message)
override fun error(message: String) = collector.report(CompilerMessageSeverity.ERROR, message)
override fun log(message: String) = collector.report(CompilerMessageSeverity.LOGGING, message)
override fun fatal(message: String): Nothing {
collector.report(CompilerMessageSeverity.ERROR, message)
throw KonanCompilationException()
}
}
private val resolver = defaultResolver(
repositories,
libraryNames.filter { it.contains(File.separator) } + includedLibraryFiles.map { it.absolutePath },
target,
distribution,
resolverLogger
configuration.getLogger()
).libraryResolver(resolveManifestDependenciesLenient)
// We pass included libraries by absolute paths to avoid repository-based resolution for them.
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.plugin.konan.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.jetbrains.kotlin.gradle.plugin.konan.KonanCliCompilerRunner
import org.jetbrains.kotlin.konan.library.defaultResolver
@@ -17,6 +16,7 @@ import org.jetbrains.kotlin.konan.target.Distribution
import org.jetbrains.kotlin.konan.target.PlatformManager
import org.jetbrains.kotlin.library.uniqueName
import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.util.Logger
import java.io.File
enum class KonanCacheKind(val outputKind: CompilerOutputKind) {
@@ -54,9 +54,16 @@ abstract class KonanCacheTask : DefaultTask() {
private fun readKlibUniqNameFromManifest(): String {
val konanHome = compilerDistributionPath.get().absolutePath
val resolver = defaultResolver(
emptyList(),
PlatformManager(konanHome).targetByName(target),
Distribution(konanHome)
repositories = emptyList(),
directLibs = emptyList(),
target = PlatformManager(konanHome).targetByName(target),
distribution = Distribution(konanHome),
logger = object : Logger {
override fun log(message: String) = logger.info(message)
override fun warning(message: String) = logger.warn(message)
override fun error(message: String): Unit = logger.error(message)
override fun fatal(message: String): Nothing = kotlin.error(message)
}
)
return resolver.resolve(originalKlib.asFile.get().absolutePath).uniqueName
}