[ObjCInterop] Implement @ObjCSignatureOverride

This annotation leads to conflicting overloads error supression,
in case where several function with the same argument types,
but different argument names are inherited from ObjC class.

We need to implement it in both K1 and K2 to make the IDE experience
better.
But the annotation itself wouldn't be available in K1.

    ^KT-61323
This commit is contained in:
Pavel Kunyavskiy
2024-01-18 14:56:57 +01:00
committed by Space Team
parent 77eee0d3fc
commit 6e8a7d4662
30 changed files with 698 additions and 41 deletions
@@ -0,0 +1,131 @@
// !LANGUAGE: -ObjCSignatureOverrideAnnotation
// FIR_IDENTICAL
// WITH_PLATFORM_LIBS
import kotlinx.cinterop.*
import platform.darwin.*
import platform.Foundation.*
import platform.CoreFoundation.*
import platform.CoreBluetooth.*
class Delelegate1 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
}
class Delegate2 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
}
class Delegate3 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
}
class Delegate4 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
}
class Delegate5 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
<!CONFLICTING_OVERLOADS!>override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
}
@@ -0,0 +1,140 @@
// !LANGUAGE: +ObjCSignatureOverrideAnnotation
// !API_VERSION: 2.0
// FIR_IDENTICAL
// WITH_PLATFORM_LIBS
import kotlinx.cinterop.*
import platform.darwin.*
import platform.Foundation.*
import platform.CoreFoundation.*
import platform.CoreBluetooth.*
class Delelegate1 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
@ObjCSignatureOverride
override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()
@ObjCSignatureOverride
override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
}
class Delegate2 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
<!CONFLICTING_OBJC_OVERLOADS!>override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()<!>
<!CONFLICTING_OBJC_OVERLOADS!>override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()<!>
}
class Delegate3 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
@ObjCSignatureOverride
override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()
<!CONFLICTING_OBJC_OVERLOADS!>override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()<!>
}
class Delegate4 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
@ObjCSignatureOverride
override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()
@ObjCSignatureOverride
override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()
}
class Delegate5 : CBCentralManagerDelegateProtocol, NSObject() {
override fun centralManager(central: CBCentralManager, willRestoreState: Map<Any?, *>): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDiscoverPeripheral: CBPeripheral,
advertisementData: Map<Any?, *>,
RSSI: NSNumber
): Unit = TODO()
override fun centralManager(central: CBCentralManager, didConnectPeripheral: CBPeripheral): Unit = TODO()
override fun centralManager(
central: CBCentralManager,
didDisconnectPeripheral: CBPeripheral,
timestamp: Double,
isReconnecting: Boolean,
error: NSError?
): Unit = TODO()
override fun centralManagerDidUpdateState(central: CBCentralManager): Unit = TODO()
<!CONFLICTING_OVERLOADS!>@ObjCSignatureOverride
override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
<!CONFLICTING_OVERLOADS!>@ObjCSignatureOverride
override fun centralManager(central: CBCentralManager, didFailToConnectPeripheral: CBPeripheral, error: NSError?): Unit<!> = TODO()
@ObjCSignatureOverride
override fun centralManager(central: CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: NSError?): Unit = TODO()
}
@@ -0,0 +1,22 @@
// !API_VERSION: 2.0
// FIR_IDENTICAL
// WITH_PLATFORM_LIBS
import kotlinx.cinterop.*
import platform.darwin.*
<!INAPPLICABLE_OBJC_OVERRIDE!>@ObjCSignatureOverride<!>
fun foo() = 1
class A {
<!INAPPLICABLE_OBJC_OVERRIDE!>@ObjCSignatureOverride<!>
fun foo() = 1
}
<!WRONG_ANNOTATION_TARGET!>@ObjCSignatureOverride<!>
class B : NSObject() {
<!INAPPLICABLE_OBJC_OVERRIDE!>@ObjCSignatureOverride<!>
fun foo() = 1
<!WRONG_ANNOTATION_TARGET!>@ObjCSignatureOverride<!>
val v = 1
}