Don't generate ObjCExport bridges for private setters of public properties

#KT-43599 Fixed
This commit is contained in:
SvyatoslavScherbina
2020-12-10 11:56:04 +03:00
committed by Stanislav Erokhin
parent c582612bd7
commit c7bc8f0691
5 changed files with 77 additions and 1 deletions
@@ -22,7 +22,10 @@ internal fun ObjCExportedInterface.createCodeSpec(symbolTable: SymbolTable): Obj
fun List<CallableMemberDescriptor>.toObjCMethods() = createObjCMethods(this.flatMap {
when (it) {
is PropertyDescriptor -> listOfNotNull(it.getter, it.setter)
is PropertyDescriptor -> listOfNotNull(
it.getter,
it.setter?.takeIf(mapper::shouldBeExposed) // Similar to [ObjCExportTranslatorImpl.buildProperty].
)
is FunctionDescriptor -> listOf(it)
else -> error(it)
}
@@ -552,6 +552,7 @@ internal class ObjCExportTranslatorImpl(
val setterName: String?
val propertySetter = property.setter
// Note: the condition below is similar to "toObjCMethods" logic in [ObjCExportedInterface.createCodeSpec].
if (propertySetter != null && mapper.shouldBeExposed(propertySetter)) {
val setterSelector = mapper.getBaseMethods(propertySetter).map { namer.getSelector(it) }.distinct().single()
setterName = if (setterSelector != "set" + name.capitalize() + ":") setterSelector else null
@@ -611,6 +611,26 @@ __attribute__((swift_name("Kt41907Kt")))
+ (void)testKt41907O:(id<KtIkt41907>)o __attribute__((swift_name("testKt41907(o:)")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("KT43599")))
@interface KtKT43599 : KtBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@property (readonly) NSString *memberProperty __attribute__((swift_name("memberProperty")));
@end;
@interface KtKT43599 (Kt43599Kt)
@property (readonly) NSString *extensionProperty __attribute__((swift_name("extensionProperty")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("Kt43599Kt")))
@interface KtKt43599Kt : KtBase
+ (void)setTopLevelLateinitPropertyValue:(NSString *)value __attribute__((swift_name("setTopLevelLateinitProperty(value:)")));
@property (class, readonly) NSString *topLevelProperty __attribute__((swift_name("topLevelProperty")));
@property (class, readonly) NSString *topLevelLateinitProperty __attribute__((swift_name("topLevelLateinitProperty")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("LibraryKt")))
@interface KtLibraryKt : KtBase
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
package kt43599
// Note: this test relies on two-stage compilation.
class KT43599 {
var memberProperty = "memberProperty"
private set
}
var KT43599.extensionProperty
get() = "extensionProperty"
private set(value) { TODO() }
var topLevelProperty
get() = "topLevelProperty"
private set(value) { TODO() }
lateinit var topLevelLateinitProperty: String
private set
fun setTopLevelLateinitProperty(value: String) {
topLevelLateinitProperty = value
}
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
import Kt
private func testPropertyWithPrivateSetter() throws {
try assertEquals(actual: KT43599().memberProperty, expected: "memberProperty")
try assertEquals(actual: KT43599().extensionProperty, expected: "extensionProperty")
try assertEquals(actual: Kt43599Kt.topLevelProperty, expected: "topLevelProperty")
// Checking the reported case too:
Kt43599Kt.setTopLevelLateinitProperty(value: "topLevelLateinitProperty")
try assertEquals(actual: Kt43599Kt.topLevelLateinitProperty, expected: "topLevelLateinitProperty")
}
class Kt43599Tests : SimpleTestProvider {
override init() {
super.init()
test("TestPropertyWithPrivateSetter", testPropertyWithPrivateSetter)
}
}