Skip to content

Commit 7e377d9

Browse files
authored
Merge pull request swiftlang#28194 from CodaFi/dux-sel
2 parents 5accda2 + 911e749 commit 7e377d9

File tree

3 files changed

+192
-1
lines changed

3 files changed

+192
-1
lines changed

lib/Sema/MiscDiagnostics.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3417,7 +3417,20 @@ class ObjCSelectorWalker : public ASTWalker {
34173417
name = bestMethod->getFullName();
34183418
}
34193419

3420-
out << nominal->getName().str() << "." << name.getBaseName();
3420+
auto typeName = nominal->getName().str();
3421+
// If we're inside a type Foo (or an extension of it) and the suggestion
3422+
// is going to be #selector(Foo.bar) (or #selector(SuperclassOfFoo.bar),
3423+
// then suggest the more natural #selector(self.bar) instead.
3424+
if (auto containingTypeContext = DC->getInnermostTypeContext()) {
3425+
auto methodNominalType = nominal->getDeclaredType();
3426+
auto outerNomType = containingTypeContext->getSelfNominalTypeDecl()
3427+
->getDeclaredType();
3428+
if (methodNominalType->isEqual(outerNomType) ||
3429+
methodNominalType->isExactSuperclassOf(outerNomType))
3430+
typeName = "self";
3431+
}
3432+
3433+
out << typeName << "." << name.getBaseName();
34213434
auto argNames = name.getArgumentNames();
34223435

34233436
// Only print the parentheses if there are some argument

test/FixCode/fixits-apply-objc.swift

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,95 @@ import ObjectiveC
44

55
// REQUIRES: objc_interop
66

7+
@objc class Selectors {
8+
func takeSel(_: Selector) {}
9+
@objc func mySel() {}
10+
func test() {
11+
takeSel("mySel")
12+
takeSel(Selector("mySel"))
13+
}
14+
}
15+
16+
@objc class OtherClass {
17+
func test(s: Selectors) {
18+
s.takeSel("mySel")
19+
s.takeSel(Selector("mySel"))
20+
}
21+
}
22+
23+
@objc class Base {
24+
@objc func baseSel() {}
25+
}
26+
27+
@objc class Outer {
28+
func takeSel(_: Selector) {}
29+
@objc func outerSel() {}
30+
31+
@objc class Inner: Base {
32+
func takeSel(_: Selector) {}
33+
34+
@objc func innerSel() {}
35+
36+
func test(s: Selectors, o: Outer) {
37+
s.takeSel("mySel")
38+
s.takeSel(Selector("mySel"))
39+
40+
takeSel("innerSel")
41+
takeSel(Selector("innerSel"))
42+
43+
takeSel("baseSel")
44+
takeSel(Selector("baseSel"))
45+
46+
o.takeSel("outerSel")
47+
o.takeSel(Selector("outerSel"))
48+
}
49+
}
50+
51+
func test(s: Selectors, i: Inner) {
52+
s.takeSel("mySel")
53+
s.takeSel(Selector("mySel"))
54+
55+
i.takeSel("innerSel")
56+
i.takeSel(Selector("innerSel"))
57+
58+
i.takeSel("baseSel")
59+
i.takeSel(Selector("baseSel"))
60+
61+
takeSel("outerSel")
62+
takeSel(Selector("outerSel"))
63+
}
64+
}
65+
66+
extension Outer {
67+
func test2(s: Selectors, i: Inner) {
68+
s.takeSel("mySel")
69+
s.takeSel(Selector("mySel"))
70+
71+
i.takeSel("innerSel")
72+
i.takeSel(Selector("innerSel"))
73+
74+
i.takeSel("baseSel")
75+
i.takeSel(Selector("baseSel"))
76+
77+
takeSel("outerSel")
78+
takeSel(Selector("outerSel"))
79+
}
80+
}
81+
82+
func freeTest(s: Selectors, o: Outer, i: Outer.Inner) {
83+
s.takeSel("mySel")
84+
s.takeSel(Selector("mySel"))
85+
86+
i.takeSel("innerSel")
87+
i.takeSel(Selector("innerSel"))
88+
89+
i.takeSel("baseSel")
90+
i.takeSel(Selector("baseSel"))
91+
92+
o.takeSel("outerSel")
93+
o.takeSel(Selector("outerSel"))
94+
}
95+
796
func foo(an : Any) {
897
let a1 : AnyObject
998
a1 = an

test/FixCode/fixits-apply-objc.swift.result

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,95 @@ import ObjectiveC
44

55
// REQUIRES: objc_interop
66

7+
@objc class Selectors {
8+
func takeSel(_: Selector) {}
9+
@objc func mySel() {}
10+
func test() {
11+
takeSel(#selector(self.mySel))
12+
takeSel(#selector(self.mySel))
13+
}
14+
}
15+
16+
@objc class OtherClass {
17+
func test(s: Selectors) {
18+
s.takeSel(#selector(Selectors.mySel))
19+
s.takeSel(#selector(Selectors.mySel))
20+
}
21+
}
22+
23+
@objc class Base {
24+
@objc func baseSel() {}
25+
}
26+
27+
@objc class Outer {
28+
func takeSel(_: Selector) {}
29+
@objc func outerSel() {}
30+
31+
@objc class Inner: Base {
32+
func takeSel(_: Selector) {}
33+
34+
@objc func innerSel() {}
35+
36+
func test(s: Selectors, o: Outer) {
37+
s.takeSel(#selector(Selectors.mySel))
38+
s.takeSel(#selector(Selectors.mySel))
39+
40+
takeSel(#selector(self.innerSel))
41+
takeSel(#selector(self.innerSel))
42+
43+
takeSel(#selector(self.baseSel))
44+
takeSel(#selector(self.baseSel))
45+
46+
o.takeSel(#selector(Outer.outerSel))
47+
o.takeSel(#selector(Outer.outerSel))
48+
}
49+
}
50+
51+
func test(s: Selectors, i: Inner) {
52+
s.takeSel(#selector(Selectors.mySel))
53+
s.takeSel(#selector(Selectors.mySel))
54+
55+
i.takeSel(#selector(Inner.innerSel))
56+
i.takeSel(#selector(Inner.innerSel))
57+
58+
i.takeSel(#selector(Base.baseSel))
59+
i.takeSel(#selector(Base.baseSel))
60+
61+
takeSel(#selector(self.outerSel))
62+
takeSel(#selector(self.outerSel))
63+
}
64+
}
65+
66+
extension Outer {
67+
func test2(s: Selectors, i: Inner) {
68+
s.takeSel(#selector(Selectors.mySel))
69+
s.takeSel(#selector(Selectors.mySel))
70+
71+
i.takeSel(#selector(Inner.innerSel))
72+
i.takeSel(#selector(Inner.innerSel))
73+
74+
i.takeSel(#selector(Base.baseSel))
75+
i.takeSel(#selector(Base.baseSel))
76+
77+
takeSel(#selector(self.outerSel))
78+
takeSel(#selector(self.outerSel))
79+
}
80+
}
81+
82+
func freeTest(s: Selectors, o: Outer, i: Outer.Inner) {
83+
s.takeSel(#selector(Selectors.mySel))
84+
s.takeSel(#selector(Selectors.mySel))
85+
86+
i.takeSel(#selector(Inner.innerSel))
87+
i.takeSel(#selector(Inner.innerSel))
88+
89+
i.takeSel(#selector(Base.baseSel))
90+
i.takeSel(#selector(Base.baseSel))
91+
92+
o.takeSel(#selector(Outer.outerSel))
93+
o.takeSel(#selector(Outer.outerSel))
94+
}
95+
796
func foo(an : Any) {
897
let a1 : AnyObject
998
a1 = an as AnyObject

0 commit comments

Comments
 (0)