From 03ca64c9549d4eb97e9c1a7ede14dc9de316fdc4 Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Thu, 8 Feb 2024 19:05:44 +0100 Subject: [PATCH] [klib] Make `CONFLICTING_KLIB_SIGNATURES_DATA` diagnostic more precise Show what kind of declarations exactly are clashing: functions, properties, or fields. This is so that diagnostics about clashing properties and fields are distinguishable from one another, since properties and fields are rendered the same way in those diagnostics: --- .../diagnostics/rendering/CommonRenderers.kt | 5 +++- .../common/diagnostics/SerializationErrors.kt | 11 ++++++++ .../signatureClash.diag.txt | 26 +++++++++---------- .../signatureClash_MPP.diag.txt | 8 +++--- .../SignatureClashDiagnostics/output.txt | 20 +++++++------- 5 files changed, 42 insertions(+), 28 deletions(-) diff --git a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/rendering/CommonRenderers.kt b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/rendering/CommonRenderers.kt index e17ed080956..3bc382d7ef4 100644 --- a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/rendering/CommonRenderers.kt +++ b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/rendering/CommonRenderers.kt @@ -72,11 +72,14 @@ object CommonRenderers { declarationRenderer: DiagnosticParameterRenderer, renderSignature: StringBuilder.(Data) -> Unit, declarations: (Data) -> Collection, + declarationKind: (Data) -> String = { "declarations" }, ) = Renderer { data -> val sortedDeclarations = declarations(data).sortedWith(sortUsing) val renderingContext = RenderingContext.Impl(sortedDeclarations) buildString { - append("The following declarations have the same ") + append("The following ") + append(declarationKind(data)) + append(" have the same ") append(signatureKind) append(" signature (") renderSignature(data) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/diagnostics/SerializationErrors.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/diagnostics/SerializationErrors.kt index c6e9f3e43cc..3c86ffc7e94 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/diagnostics/SerializationErrors.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/diagnostics/SerializationErrors.kt @@ -15,6 +15,9 @@ import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers import org.jetbrains.kotlin.diagnostics.rendering.Renderer import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrField +import org.jetbrains.kotlin.ir.declarations.IrProperty +import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.renderer.DescriptorRenderer @@ -48,5 +51,13 @@ internal object SerializationDiagnosticRenderers { }, renderSignature = { append(it.signature.render()) }, declarations = { it.declarations.map(IrDeclaration::toIrBasedDescriptor) }, + declarationKind = { data -> + when { + data.declarations.all { it is IrSimpleFunction } -> "functions" + data.declarations.all { it is IrProperty } -> "properties" + data.declarations.all { it is IrField } -> "fields" + else -> "declarations" + } + }, ) } \ No newline at end of file diff --git a/compiler/testData/diagnostics/klibSerializationTests/signatureClash.diag.txt b/compiler/testData/diagnostics/klibSerializationTests/signatureClash.diag.txt index 5cc28ad37f4..1cc52bf9f5e 100644 --- a/compiler/testData/diagnostics/klibSerializationTests/signatureClash.diag.txt +++ b/compiler/testData/diagnostics/klibSerializationTests/signatureClash.diag.txt @@ -1,60 +1,60 @@ -/foo.kt:13:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/foo|foo(){}[0]): +/foo.kt:13:1: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/foo|foo(){}[0]): fun foo(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun foo(): kotlin.String defined in com.example.klib.serialization.diagnostics fun foo(): kotlin.Int defined in com.example.klib.serialization.diagnostics -/foo.kt:16:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): +/foo.kt:16:1: error: Platform declaration clash: The following properties have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): val myVal: kotlin.String defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics -/foo.kt:16:1: error: Platform declaration clash: The following declarations have the same IR signature ([ com.example.klib.serialization.diagnostics/myVal|{}myVal[0] <- Local[|FIELD PROPERTY_BACKING_FIELD name:myVal type:kotlin.Long visibility:private [static]] ]): +/foo.kt:16:1: error: Platform declaration clash: The following fields have the same IR signature ([ com.example.klib.serialization.diagnostics/myVal|{}myVal[0] <- Local[|FIELD PROPERTY_BACKING_FIELD name:myVal type:kotlin.Long visibility:private [static]] ]): var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics -/foo.kt:16:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): +/foo.kt:16:1: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): fun ``(): kotlin.Int defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.String defined in com.example.klib.serialization.diagnostics -/main.kt:21:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/foo|foo(){}[0]): +/main.kt:21:1: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/foo|foo(){}[0]): fun foo(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun foo(): kotlin.String defined in com.example.klib.serialization.diagnostics fun foo(): kotlin.Int defined in com.example.klib.serialization.diagnostics -/main.kt:24:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/foo|foo(){}[0]): +/main.kt:24:1: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/foo|foo(){}[0]): fun foo(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun foo(): kotlin.String defined in com.example.klib.serialization.diagnostics fun foo(): kotlin.Int defined in com.example.klib.serialization.diagnostics -/main.kt:26:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): +/main.kt:26:1: error: Platform declaration clash: The following properties have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): val myVal: kotlin.String defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics -/main.kt:26:1: error: Platform declaration clash: The following declarations have the same IR signature ([ com.example.klib.serialization.diagnostics/myVal|{}myVal[0] <- Local[|FIELD PROPERTY_BACKING_FIELD name:myVal type:kotlin.Long visibility:private [static]] ]): +/main.kt:26:1: error: Platform declaration clash: The following fields have the same IR signature ([ com.example.klib.serialization.diagnostics/myVal|{}myVal[0] <- Local[|FIELD PROPERTY_BACKING_FIELD name:myVal type:kotlin.Long visibility:private [static]] ]): var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics -/main.kt:26:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): +/main.kt:26:1: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): fun ``(): kotlin.Int defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.String defined in com.example.klib.serialization.diagnostics -/main.kt:29:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): +/main.kt:29:1: error: Platform declaration clash: The following properties have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): val myVal: kotlin.String defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics -/main.kt:31:5: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): +/main.kt:31:5: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): fun ``(): kotlin.Int defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.String defined in com.example.klib.serialization.diagnostics -/main.kt:44:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/bar|bar(){}[0]): +/main.kt:44:1: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/bar|bar(){}[0]): fun bar(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun bar(): kotlin.Long defined in com.example.klib.serialization.diagnostics -/main.kt:47:1: error: Platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/bar|bar(){}[0]): +/main.kt:47:1: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/bar|bar(){}[0]): fun bar(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun bar(): kotlin.Long defined in com.example.klib.serialization.diagnostics diff --git a/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.diag.txt b/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.diag.txt index 7965c8145ac..cf5a3d06afd 100644 --- a/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.diag.txt +++ b/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.diag.txt @@ -1,16 +1,16 @@ Module: common -/common.kt:7:1: error: Platform declaration clash: The following declarations have the same IR signature (/foo|foo(){}[0]): +/common.kt:7:1: error: Platform declaration clash: The following functions have the same IR signature (/foo|foo(){}[0]): fun foo(): kotlin.Int defined in root package fun foo(): kotlin.String defined in root package -/common.kt:10:1: error: Platform declaration clash: The following declarations have the same IR signature (/bar|bar(B){}[0]): +/common.kt:10:1: error: Platform declaration clash: The following functions have the same IR signature (/bar|bar(B){}[0]): fun bar(x: B): kotlin.Int defined in root package fun bar(x: B): kotlin.Int defined in root package Module: platform -/platform.kt:14:1: error: Platform declaration clash: The following declarations have the same IR signature (/foo|foo(){}[0]): +/platform.kt:14:1: error: Platform declaration clash: The following functions have the same IR signature (/foo|foo(){}[0]): fun foo(): kotlin.Int defined in root package fun foo(): kotlin.String defined in root package -/platform.kt:18:1: error: Platform declaration clash: The following declarations have the same IR signature (/bar|bar(B){}[0]): +/platform.kt:18:1: error: Platform declaration clash: The following functions have the same IR signature (/bar|bar(B){}[0]): fun bar(x: B): kotlin.Int defined in root package fun bar(x: B): kotlin.Int defined in root package diff --git a/native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/output.txt b/native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/output.txt index d62adbf2840..8f745865b0b 100644 --- a/native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/output.txt +++ b/native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/output.txt @@ -1,54 +1,54 @@ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:4:5: error: platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/A.foo|foo(){}[0]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:4:5: error: platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/A.foo|foo(){}[0]): fun foo(): kotlin.String defined in com.example.klib.serialization.diagnostics.A fun foo(): kotlin.Int defined in com.example.klib.serialization.diagnostics.A @Deprecated("", level = DeprecationLevel.HIDDEN) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:7:5: error: platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/A.foo|foo(){}[0]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:7:5: error: platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/A.foo|foo(){}[0]): fun foo(): kotlin.String defined in com.example.klib.serialization.diagnostics.A fun foo(): kotlin.Int defined in com.example.klib.serialization.diagnostics.A fun foo(): Int = 0 ^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:10:1: error: platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:10:1: error: platform declaration clash: The following properties have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): val myVal: kotlin.String defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics var myVal: Long = 0L ^^^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:10:1: error: platform declaration clash: The following declarations have the same IR signature ([ com.example.klib.serialization.diagnostics/myVal|{}myVal[0] <- Local[|FIELD PROPERTY_BACKING_FIELD name:myVal type:kotlin.Long visibility:private [static]] ]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:10:1: error: platform declaration clash: The following fields have the same IR signature ([ com.example.klib.serialization.diagnostics/myVal|{}myVal[0] <- Local[|FIELD PROPERTY_BACKING_FIELD name:myVal type:kotlin.Long visibility:private [static]] ]): var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics var myVal: Long = 0L ^^^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:10:1: error: platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:10:1: error: platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): fun ``(): kotlin.Int defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.String defined in com.example.klib.serialization.diagnostics var myVal: Long = 0L ^^^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:15:1: error: platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:15:1: error: platform declaration clash: The following properties have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): val myVal: kotlin.String defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics @Deprecated("", level = DeprecationLevel.HIDDEN) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:15:1: error: platform declaration clash: The following declarations have the same IR signature ([ com.example.klib.serialization.diagnostics/myVal|{}myVal[0] <- Local[|FIELD PROPERTY_BACKING_FIELD name:myVal type:kotlin.Long visibility:private [static]] ]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:15:1: error: platform declaration clash: The following fields have the same IR signature ([ com.example.klib.serialization.diagnostics/myVal|{}myVal[0] <- Local[|FIELD PROPERTY_BACKING_FIELD name:myVal type:kotlin.Long visibility:private [static]] ]): var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics @Deprecated("", level = DeprecationLevel.HIDDEN) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:15:1: error: platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:15:1: error: platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): fun ``(): kotlin.Int defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.String defined in com.example.klib.serialization.diagnostics @Deprecated("", level = DeprecationLevel.HIDDEN) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:18:1: error: platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:18:1: error: platform declaration clash: The following properties have the same IR signature (com.example.klib.serialization.diagnostics/myVal|{}myVal[0]): val myVal: kotlin.String defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Int defined in com.example.klib.serialization.diagnostics var myVal: kotlin.Long defined in com.example.klib.serialization.diagnostics @Deprecated("", level = DeprecationLevel.HIDDEN) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:20:5: error: platform declaration clash: The following declarations have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): +native/native.tests/testData/compilerOutput/SignatureClashDiagnostics/main.kt:20:5: error: platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/myVal.|(){}[0]): fun ``(): kotlin.Int defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.Long defined in com.example.klib.serialization.diagnostics fun ``(): kotlin.String defined in com.example.klib.serialization.diagnostics