Improve support for Objective-C methods clashing with methods of Any (#2914)
This commit is contained in:
committed by
GitHub
parent
270a53ac8b
commit
cd4e0af034
+11
-1
@@ -325,7 +325,17 @@ private fun Type.hasUnalignedMembers(): Boolean = when (this) {
|
|||||||
// TODO: should the recursive checks be made in indexer when computing `hasUnalignedFields`?
|
// TODO: should the recursive checks be made in indexer when computing `hasUnalignedFields`?
|
||||||
}
|
}
|
||||||
|
|
||||||
private val ObjCMethod.kotlinName: String get() = selector.split(":").first()
|
private val ObjCMethod.kotlinName: String
|
||||||
|
get() {
|
||||||
|
val candidate = selector.split(":").first()
|
||||||
|
val trimmed = candidate.trimEnd('_')
|
||||||
|
return if (trimmed == "equals" && parameters.size == 1
|
||||||
|
|| (trimmed == "hashCode" || trimmed == "toString") && parameters.size == 0) {
|
||||||
|
candidate + "_"
|
||||||
|
} else {
|
||||||
|
candidate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private val ObjCClassOrProtocol.protocolsWithSupers: Sequence<ObjCProtocol>
|
private val ObjCClassOrProtocol.protocolsWithSupers: Sequence<ObjCProtocol>
|
||||||
get() = this.protocols.asSequence().flatMap { sequenceOf(it) + it.protocolsWithSupers }
|
get() = this.protocols.asSequence().flatMap { sequenceOf(it) + it.protocolsWithSupers }
|
||||||
|
|||||||
@@ -185,3 +185,23 @@ NSObject* createNSObject() {
|
|||||||
@interface MultipleInheritanceClash2 : MultipleInheritanceClashBase <MultipleInheritanceClash>
|
@interface MultipleInheritanceClash2 : MultipleInheritanceClashBase <MultipleInheritanceClash>
|
||||||
@property MultipleInheritanceClashBase* delegate;
|
@property MultipleInheritanceClashBase* delegate;
|
||||||
@end;
|
@end;
|
||||||
|
|
||||||
|
@interface TestClashingWithAny1 : NSObject
|
||||||
|
-(NSString*)toString;
|
||||||
|
-(NSString*)toString_;
|
||||||
|
-(int)hashCode;
|
||||||
|
-(BOOL)equals:(id _Nullable)other;
|
||||||
|
@end;
|
||||||
|
|
||||||
|
@interface TestClashingWithAny2 : NSObject
|
||||||
|
-(void)toString;
|
||||||
|
-(void)hashCode;
|
||||||
|
-(void)equals:(int)p; // May clash.
|
||||||
|
@end;
|
||||||
|
|
||||||
|
@interface TestClashingWithAny3 : NSObject
|
||||||
|
// Not clashing actually.
|
||||||
|
-(NSString*)toString:(int)p;
|
||||||
|
-(int)hashCode:(int)p;
|
||||||
|
-(BOOL)equals;
|
||||||
|
@end;
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ fun run() {
|
|||||||
testVarargs()
|
testVarargs()
|
||||||
testOverrideInit()
|
testOverrideInit()
|
||||||
testMultipleInheritanceClash()
|
testMultipleInheritanceClash()
|
||||||
|
testClashingWithAny()
|
||||||
|
|
||||||
assertEquals(2, ForwardDeclaredEnum.TWO.value)
|
assertEquals(2, ForwardDeclaredEnum.TWO.value)
|
||||||
|
|
||||||
@@ -334,6 +335,30 @@ fun testMultipleInheritanceClash() {
|
|||||||
assertEquals(clash2, clash2.delegate())
|
assertEquals(clash2, clash2.delegate())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testClashingWithAny() {
|
||||||
|
assertEquals("description", TestClashingWithAny1().toString())
|
||||||
|
assertEquals("toString", TestClashingWithAny1().toString_())
|
||||||
|
assertEquals("toString_", TestClashingWithAny1().toString__())
|
||||||
|
assertEquals(1, TestClashingWithAny1().hashCode())
|
||||||
|
assertEquals(31, TestClashingWithAny1().hashCode_())
|
||||||
|
assertFalse(TestClashingWithAny1().equals(TestClashingWithAny1()))
|
||||||
|
assertTrue(TestClashingWithAny1().equals_(TestClashingWithAny1()))
|
||||||
|
|
||||||
|
assertEquals("description", TestClashingWithAny2().toString())
|
||||||
|
assertEquals(Unit, TestClashingWithAny2().toString_())
|
||||||
|
assertEquals(2, TestClashingWithAny2().hashCode())
|
||||||
|
assertEquals(Unit, TestClashingWithAny2().hashCode_())
|
||||||
|
assertFalse(TestClashingWithAny2().equals(TestClashingWithAny2()))
|
||||||
|
assertEquals(Unit, TestClashingWithAny2().equals_(42))
|
||||||
|
|
||||||
|
assertEquals("description", TestClashingWithAny3().toString())
|
||||||
|
assertEquals("toString:11", TestClashingWithAny3().toString(11))
|
||||||
|
assertEquals(3, TestClashingWithAny3().hashCode())
|
||||||
|
assertEquals(4, TestClashingWithAny3().hashCode(3))
|
||||||
|
assertFalse(TestClashingWithAny3().equals(TestClashingWithAny3()))
|
||||||
|
assertTrue(TestClashingWithAny3().equals())
|
||||||
|
}
|
||||||
|
|
||||||
fun nsArrayOf(vararg elements: Any): NSArray = NSMutableArray().apply {
|
fun nsArrayOf(vararg elements: Any): NSArray = NSMutableArray().apply {
|
||||||
elements.forEach {
|
elements.forEach {
|
||||||
this.addObject(it as ObjCObject)
|
this.addObject(it as ObjCObject)
|
||||||
|
|||||||
@@ -187,3 +187,70 @@ static CustomRetainMethodsImpl* retainedCustomRetainMethodsImpl;
|
|||||||
|
|
||||||
@implementation MultipleInheritanceClash2
|
@implementation MultipleInheritanceClash2
|
||||||
@end;
|
@end;
|
||||||
|
|
||||||
|
@implementation TestClashingWithAny1
|
||||||
|
-(NSString*)description {
|
||||||
|
return @"description";
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSString*)toString {
|
||||||
|
return @"toString";
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSString*)toString_ {
|
||||||
|
return @"toString_";
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSUInteger)hash {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(int)hashCode {
|
||||||
|
return 31;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(BOOL)equals:(id _Nullable)other {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
@end;
|
||||||
|
|
||||||
|
@implementation TestClashingWithAny2
|
||||||
|
-(NSString*)description {
|
||||||
|
return @"description";
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)toString {
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSUInteger)hash {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)hashCode {
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)equals:(int)p {
|
||||||
|
}
|
||||||
|
@end;
|
||||||
|
|
||||||
|
@implementation TestClashingWithAny3
|
||||||
|
-(NSString*)description {
|
||||||
|
return @"description";
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSString*)toString:(int)p {
|
||||||
|
return [NSString stringWithFormat:@"%s:%d", "toString", p];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSUInteger)hash {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(int)hashCode:(int)p {
|
||||||
|
return p + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(BOOL)equals {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
@end;
|
||||||
|
|||||||
Reference in New Issue
Block a user