You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Provide fix-its when overriding a bridged type with the old type.
This is support for SE-0069: Mutability and Foundation Value Types.
In cases where someone has overridden a method that takes, e.g.
'NSURL', the override will no longer be valid, because the system
class will now use the value type 'URL' instead. If an override's
full name matches exactly, the compiler will offer fix-its for any
uses of reference types where value types are now preferred.
(This must be a direct match; subclasses, including the mutable
variants of many Foundation types, will need to be updated by hand.)
One wrinkle here is the use of generics. In Swift 2, Objective-C
generics weren't imported at all, so it's unlikely that the overriding
method will have the correct generic arguments. Simple migration
might insert the "bound" type, but it can't know what specific type
might be more appropriate. Therefore, the logic to add the fix-it
ignores generic arguments, assuming the parent's type is correct.
rdar://problem/26183575
// FIXME: expected-note@+1 {{getter for 'prop' declared here}}
39
+
varprop:Refrigerator // expected-note {{attempt to override property here}}
40
+
// FIXME: expected-note@+1 {{getter for 'propGeneric' declared here}}
41
+
varpropGeneric:ManufacturerInfo<NSString> // expected-note {{attempt to override property here}}
42
+
}
43
+
44
+
classSub:Base{
45
+
// expected-note@+1 {{type does not match superclass instance method with type '(a: Refrigerator, b: Refrigerator) -> Refrigerator?'}} {{25-40=Refrigerator}} {{45-61=Refrigerator?}} {{66-81=Refrigerator}}
46
+
overridefunc test(a:APPRefrigerator, b:APPRefrigerator?)->APPRefrigerator{ // expected-error {{method does not override any method from its superclass}} {{none}}
47
+
return a
48
+
}
49
+
// expected-note@+1 {{type does not match superclass instance method with type '(a: ManufacturerInfo<NSString>, b: ManufacturerInfo<NSString>) -> ManufacturerInfo<NSString>?'}} {{32-62=ManufacturerInfo<NSString>}} {{67-98=ManufacturerInfo<NSString>?}} {{103-133=ManufacturerInfo<NSString>}}
50
+
overridefunc testGeneric(a:APPManufacturerInfo<AnyObject>, b:APPManufacturerInfo<AnyObject>?)->APPManufacturerInfo<AnyObject>{ // expected-error {{method does not override any method from its superclass}} {{none}}
51
+
return a
52
+
}
53
+
// expected-note@+1 {{type does not match superclass class method with type '(inout Refrigerator) -> ()'}} {{36-57=inout Refrigerator}}
54
+
overrideclassfunc testInout(_:inoutAPPRefrigerator){} // expected-error {{method does not override any method from its superclass}} {{none}}
55
+
56
+
overridefunc testUnmigrated(a:NSObject, b:NSObject, c:NSObject){} // expected-error {{method does not override any method from its superclass}} {{none}}
57
+
58
+
// expected-note@+1 {{type does not match superclass instance method with type '(a: NSRuncingMode, b: Refrigerator) -> ()'}} {{53-68=Refrigerator}}
59
+
overridefunc testPartialMigrated(a:NSObject, b:APPRefrigerator){} // expected-error {{method does not override any method from its superclass}} {{none}}
60
+
61
+
// expected-note@+1 {{type does not match superclass subscript with type '(a: Refrigerator, b: Refrigerator) -> Refrigerator?'}} {{27-42=Refrigerator}} {{49-65=Refrigerator?}} {{70-85=Refrigerator}}
62
+
override subscript(a a:APPRefrigerator, b b:APPRefrigerator?)->APPRefrigerator{ // expected-error {{subscript does not override any subscript from its superclass}} {{none}}
63
+
return a
64
+
}
65
+
// expected-note@+1 {{type does not match superclass subscript with type '(generic: ManufacturerInfo<NSString>, b: ManufacturerInfo<NSString>) -> ManufacturerInfo<NSString>?'}} {{33-63=ManufacturerInfo<NSString>}} {{70-101=ManufacturerInfo<NSString>?}} {{106-136=ManufacturerInfo<NSString>}}
66
+
override subscript(generic a:APPManufacturerInfo<AnyObject>, b b:APPManufacturerInfo<AnyObject>?)->APPManufacturerInfo<AnyObject>{ // expected-error {{subscript does not override any subscript from its superclass}} {{none}}
67
+
return a
68
+
}
69
+
70
+
// expected-note@+1 {{type does not match superclass initializer with arguments '(a: Refrigerator, b: Refrigerator)'}} {{20-35=Refrigerator}} {{40-56=Refrigerator?}}
71
+
overrideinit(a:APPRefrigerator, b:APPRefrigerator?){} // expected-error {{initializer does not override a designated initializer from its superclass}}
72
+
// expected-note@+1 {{type does not match superclass initializer with arguments '(generic: ManufacturerInfo<NSString>, b: ManufacturerInfo<NSString>)'}} {{28-58=ManufacturerInfo<NSString>}} {{63-94=ManufacturerInfo<NSString>?}}
73
+
overrideinit(generic a:APPManufacturerInfo<AnyObject>, b:APPManufacturerInfo<AnyObject>?){} // expected-error {{initializer does not override a designated initializer from its superclass}}
74
+
// expected-note@+1 {{type does not match superclass initializer with argument '(singleArgument: Refrigerator)'}} {{33-48=Refrigerator}}
75
+
overrideinit(singleArgument:APPRefrigerator){} // expected-error {{initializer does not override a designated initializer from its superclass}}
76
+
77
+
// FIXME: expected-error@+2 {{getter for 'prop' with Objective-C selector 'prop' conflicts with getter for 'prop' from superclass 'Base' with the same Objective-C selector}}
78
+
// expected-note@+1 {{type does not match superclass var with type 'Refrigerator'}} {{22-37=Refrigerator}}
79
+
overridevarprop:APPRefrigerator{ // expected-error {{property 'prop' with type 'APPRefrigerator' cannot override a property with type 'Refrigerator'}}
80
+
return super.prop // implicitly bridged
81
+
}
82
+
// FIXME: expected-error@+2 {{getter for 'propGeneric' with Objective-C selector 'propGeneric' conflicts with getter for 'propGeneric' from superclass 'Base' with the same Objective-C selector}}
83
+
// expected-note@+1 {{type does not match superclass var with type 'ManufacturerInfo<NSString>'}} {{29-59=ManufacturerInfo<NSString>}}
84
+
overridevarpropGeneric:APPManufacturerInfo<AnyObject>{ // expected-error {{property 'propGeneric' with type 'APPManufacturerInfo<AnyObject>' cannot override a property with type 'ManufacturerInfo<NSString>'}}
0 commit comments