[klib] Implement diagnostics for clashing KLIB signatures
Now, we detect clashing signatures during serialization to KLIB and
report a compiler error if two or more declarations have the same
`IdSignature`
For example, for the following code:
```kotlin
@Deprecated("", level = DeprecationLevel.HIDDEN)
fun foo(): String = ""
fun foo(): Int = 0
```
the compiler will produce this diagnostic:
```
e: main.kt:1:1 Platform declaration clash: The following declarations
have the same KLIB signature (/foo|foo(){}[0]):
fun foo(): String defined in root package
fun foo(): Int defined in root package
e: main.kt:4:1 Platform declaration clash: The following declarations
have the same KLIB signature (/foo|foo(){}[0]):
fun foo(): String defined in root package
fun foo(): Int defined in root package
```
Note that we report this diagnostic during serialization and not earlier
(e.g., in fir2ir) for more robustness, so ensure that we check
exactly the signatures that will be written to a KLIB.
If we later introduce some annotation for customizing a declaration's
signature (e.g., for preserving binary compatibility), this
diagnostic will continue to work as expected.
^KT-63670 Fixed
This commit is contained in:
committed by
Space Team
parent
e0cb145c6b
commit
eda30ff704
@@ -0,0 +1,14 @@
|
||||
/foo.kt:7:1: error: Platform declaration clash: The following declarations have the same KLIB 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:13:1: error: Platform declaration clash: The following declarations have the same KLIB 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:16:1: error: Platform declaration clash: The following declarations have the same KLIB 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
|
||||
@@ -0,0 +1,20 @@
|
||||
// FIR_IDENTICAL
|
||||
// RENDER_ALL_DIAGNOSTICS_FULL_TEXT
|
||||
|
||||
// FILE: foo.kt
|
||||
package com.example.klib.serialization.diagnostics
|
||||
|
||||
<!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Deprecated("", level = DeprecationLevel.HIDDEN)
|
||||
fun foo(): Long = 0L<!>
|
||||
|
||||
// FILE: main.kt
|
||||
package com.example.klib.serialization.diagnostics
|
||||
|
||||
<!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Deprecated("", level = DeprecationLevel.HIDDEN)
|
||||
fun foo(): String = ""<!>
|
||||
|
||||
<!CONFLICTING_KLIB_SIGNATURES_ERROR!>fun foo(): Int = 0<!>
|
||||
|
||||
fun main() {
|
||||
foo()
|
||||
}
|
||||
Reference in New Issue
Block a user