diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt index 2b8e2ae984a..998c0e15de6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt @@ -21,10 +21,15 @@ import org.jetbrains.kotlin.backend.konan.descriptors.KonanSharedVariablesManage import org.jetbrains.kotlin.backend.konan.descriptors.konanInternal import org.jetbrains.kotlin.backend.konan.ir.KonanIr import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.util.getCompilerMessageLocation import org.jetbrains.kotlin.name.Name abstract internal class KonanBackendContext(val config: KonanConfig) : CommonBackendContext { @@ -44,6 +49,25 @@ abstract internal class KonanBackendContext(val config: KonanConfig) : CommonBac override fun getInternalFunctions(name: String): List = builtIns.konanInternal.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).toList() - override val messageCollector: MessageCollector + val messageCollector: MessageCollector get() = config.configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + + override fun report(element: IrElement?, irFile: IrFile?, message: String, isError: Boolean) { + val location = element?.getCompilerMessageLocation(irFile ?: error("irFile should be not null for $element")) + this.messageCollector.report( + if (isError) CompilerMessageSeverity.ERROR else CompilerMessageSeverity.WARNING, + message, location + ) + } + + private fun IrElement.getCompilerMessageLocation(containingFile: IrFile): CompilerMessageLocation? { + val sourceRangeInfo = containingFile.fileEntry.getSourceRangeInfo(this.startOffset, this.endOffset) + return CompilerMessageLocation.create( + path = sourceRangeInfo.filePath, + line = sourceRangeInfo.startLineNumber, + column = sourceRangeInfo.startColumnNumber, + lineContent = null // TODO: retrieve the line content. + ) + } + } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Reporting.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Reporting.kt index fe93e80faae..5de2d1a3f47 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Reporting.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Reporting.kt @@ -17,22 +17,18 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.backend.common.CommonBackendContext -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.util.getCompilerMessageLocation internal fun CommonBackendContext.reportCompilationError(message: String, irFile: IrFile, irElement: IrElement): Nothing { - val location = irElement.getCompilerMessageLocation(irFile) - this.messageCollector.report(CompilerMessageSeverity.ERROR, message, location) + report(irElement, irFile, message, true) throw KonanCompilationException() } internal fun CommonBackendContext.reportCompilationError(message: String) { - this.messageCollector.report(CompilerMessageSeverity.ERROR, message, null) + report(null, null, message, true) } internal fun CommonBackendContext.reportCompilationWarning(message: String) { - this.messageCollector.report(CompilerMessageSeverity.WARNING, message, null) + report(null, null, message, false) }