Skip to content

Commit 4136f91

Browse files
authored
Merge pull request #4348 from rintaro/cc-override-access
[CodeCompletion] Never emit 'private' for conformance or override declarations
2 parents 3900166 + fac2b7a commit 4136f91

File tree

3 files changed

+242
-29
lines changed

3 files changed

+242
-29
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4142,9 +4142,12 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
41424142
bool missingOverride = Reason == DeclVisibilityKind::MemberOfSuper &&
41434143
!isKeywordSpecified("override");
41444144

4145-
if (missingDeclIntroducer && missingAccess)
4146-
Builder.addAccessControlKeyword(
4147-
std::min(VD->getFormalAccess(), AccessibilityOfContext));
4145+
if (missingDeclIntroducer && missingAccess) {
4146+
auto Access = std::min(VD->getFormalAccess(), AccessibilityOfContext);
4147+
// Only emit 'public', not needed otherwise.
4148+
if (Access >= Accessibility::Public)
4149+
Builder.addAccessControlKeyword(Access);
4150+
}
41484151

41494152
// FIXME: if we're missing 'override', but have the decl introducer we
41504153
// should delete it and re-add both in the correct order.
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
// RUN: sed -n -e '1,/NO_ERRORS_UP_TO_HERE$/ p' %s > %t_no_errors.swift
2+
// RUN: %target-swift-frontend -parse -verify -disable-objc-attr-requires-foundation-module %t_no_errors.swift
3+
//
4+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_PRIVATE_AD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PRIVATE_AD
5+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_FILEPRIVATE_AD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PRIVATE_AD
6+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_INTERNAL_AD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_INTERNAL_AD
7+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_PUBLIC_AD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PUBLIC_AD
8+
//
9+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_PRIVATE_BD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PRIVATE_BD
10+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_FILEPRIVATE_BD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PRIVATE_BD
11+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_INTERNAL_BD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_INTERNAL_BD
12+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_PUBLIC_BD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PUBLIC_BD
13+
//
14+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_PRIVATE_CD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PRIVATE_CD
15+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_FILEPRIVATE_CD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PRIVATE_CD
16+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_INTERNAL_CD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_INTERNAL_CD
17+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TEST_PUBLIC_CD -code-completion-keywords=false | %FileCheck %s -check-prefix=TEST_PUBLIC_CD
18+
19+
@objc
20+
private class TagPA {}
21+
22+
@objc
23+
class TagPB {}
24+
25+
@objc
26+
public class TagPC {}
27+
28+
@objc
29+
private class BaseAPrivate {
30+
fileprivate init(fromBase: TagPA) {}
31+
32+
fileprivate func baseAFunc(x: TagPA) {}
33+
34+
fileprivate subscript(a: TagPA) -> Int { return 1 }
35+
36+
fileprivate var baseAVarRW: TagPA
37+
fileprivate let baseAVarRO: TagPA
38+
39+
fileprivate func colliding() {}
40+
fileprivate func collidingGeneric<T>(x: T) {}
41+
}
42+
43+
@objc
44+
class BaseBInternal {
45+
init(fromBaseB: TagPB) {}
46+
47+
func baseBFunc(x: TagPB) {}
48+
49+
subscript(a: TagPB) -> Int { return 1 }
50+
51+
var baseBVarRW: TagPB
52+
let baseBVarRO: TagPB
53+
54+
func colliding() {}
55+
func collidingGeneric<T>(x: T) {}
56+
}
57+
58+
@objc
59+
public class BaseCPublic {
60+
public init(fromBaseC: TagPC) {}
61+
62+
public func baseCFunc(x: TagPC) {}
63+
64+
public subscript(a: TagPC) -> Int { return 1 }
65+
66+
public var baseCVarRW: TagPC
67+
public let baseCVarRO: TagPC
68+
69+
public func colliding() {}
70+
public func collidingGeneric<T>(x: T) {}
71+
}
72+
73+
public protocol ProtocolD {
74+
func colliding()
75+
func collidingGeneric<T>(x: T)
76+
}
77+
78+
// NO_ERRORS_UP_TO_HERE
79+
80+
private class TestPrivateAD : BaseAPrivate, ProtocolD {
81+
#^TEST_PRIVATE_AD^#
82+
}
83+
fileprivate class TestFilePrivateAD : BaseAPrivate, ProtocolD {
84+
#^TEST_FILEPRIVATE_AD^#
85+
// Same as TEST_PRIVATE_AD.
86+
}
87+
class TestInternalAD : BaseAPrivate, ProtocolD {
88+
#^TEST_INTERNAL_AD^#
89+
}
90+
public class TestPublicAD : ProtocolAPrivate, ProtocolD {
91+
#^TEST_PUBLIC_AD^#
92+
}
93+
94+
// TEST_PRIVATE_AD: Begin completions, 5 items
95+
// TEST_PRIVATE_AD-DAG: Decl[InstanceMethod]/Super: override func baseAFunc(x: TagPA) {|}; name=baseAFunc(x: TagPA)
96+
// TEST_PRIVATE_AD-DAG: Decl[InstanceVar]/Super: override var baseAVarRW: TagPA; name=baseAVarRW: TagPA
97+
// TEST_PRIVATE_AD-DAG: Decl[InstanceMethod]/Super: override func colliding() {|}; name=colliding()
98+
// TEST_PRIVATE_AD-DAG: Decl[InstanceMethod]/Super: override func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
99+
// TEST_PRIVATE_AD-DAG: Decl[Constructor]/Super: init(fromBase: TagPA) {|}; name=init(fromBase: TagPA)
100+
// TEST_PRIVATE_AD: End completions
101+
102+
// TEST_INTERNAL_AD: Begin completions, 5 items
103+
// TEST_INTERNAL_AD-DAG: Decl[InstanceMethod]/Super: override func baseAFunc(x: TagPA) {|}; name=baseAFunc(x: TagPA)
104+
// TEST_INTERNAL_AD-DAG: Decl[InstanceVar]/Super: override var baseAVarRW: TagPA; name=baseAVarRW: TagPA
105+
// TEST_INTERNAL_AD-DAG: Decl[InstanceMethod]/Super: override func colliding() {|}; name=colliding()
106+
// TEST_INTERNAL_AD-DAG: Decl[InstanceMethod]/Super: override func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
107+
// TEST_INTERNAL_AD-DAG: Decl[Constructor]/Super: init(fromBase: TagPA) {|}; name=init(fromBase: TagPA)
108+
// TEST_INTERNAL_AD: End completions
109+
110+
// TEST_PUBLIC_AD: Begin completions, 2 items
111+
// TEST_PUBLIC_AD-DAG: Decl[InstanceMethod]/Super: public func colliding() {|}; name=colliding()
112+
// TEST_PUBLIC_AD-DAG: Decl[InstanceMethod]/Super: public func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
113+
// TEST_PUBLIC_AD: End completions
114+
115+
private class TestPrivateBD : BaseBInternal, ProtocolD {
116+
#^TEST_PRIVATE_BD^#
117+
}
118+
fileprivate class TestFilePrivateBD : BaseBInternal, ProtocolD {
119+
#^TEST_FILEPRIVATE_BD^#
120+
// Same as TEST_PRIVATE_BD.
121+
}
122+
class TestInternalBD : BaseBInternal, ProtocolD {
123+
#^TEST_INTERNAL_BD^#
124+
}
125+
public class TestPublicBD : BaseBInternal, ProtocolD {
126+
#^TEST_PUBLIC_BD^#
127+
}
128+
129+
// TEST_PRIVATE_BD: Begin completions, 5 items
130+
// TEST_PRIVATE_BD-DAG: Decl[InstanceMethod]/Super: override func baseBFunc(x: TagPB) {|}; name=baseBFunc(x: TagPB)
131+
// TEST_PRIVATE_BD-DAG: Decl[InstanceVar]/Super: override var baseBVarRW: TagPB; name=baseBVarRW: TagPB
132+
// TEST_PRIVATE_BD-DAG: Decl[InstanceMethod]/Super: override func colliding() {|}; name=colliding()
133+
// TEST_PRIVATE_BD-DAG: Decl[InstanceMethod]/Super: override func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
134+
// TEST_PRIVATE_BD-DAG: Decl[Constructor]/Super: init(fromBaseB: TagPB) {|}; name=init(fromBaseB: TagPB)
135+
// TEST_PRIVATE_BD: End completions
136+
137+
// TEST_INTERNAL_BD: Begin completions, 5 items
138+
// TEST_INTERNAL_BD-DAG: Decl[InstanceMethod]/Super: override func baseBFunc(x: TagPB) {|}; name=baseBFunc(x: TagPB)
139+
// TEST_INTERNAL_BD-DAG: Decl[InstanceVar]/Super: override var baseBVarRW: TagPB; name=baseBVarRW: TagPB
140+
// TEST_INTERNAL_BD-DAG: Decl[InstanceMethod]/Super: override func colliding() {|}; name=colliding()
141+
// TEST_INTERNAL_BD-DAG: Decl[InstanceMethod]/Super: override func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
142+
// TEST_INTERNAL_BD-DAG: Decl[Constructor]/Super: init(fromBaseB: TagPB) {|}; name=init(fromBaseB: TagPB)
143+
// TEST_INTERNAL_BD: End completions
144+
145+
// TEST_PUBLIC_BD: Begin completions, 5 items
146+
// TEST_PUBLIC_BD-DAG: Decl[InstanceMethod]/Super: override func baseBFunc(x: TagPB) {|}; name=baseBFunc(x: TagPB)
147+
// TEST_PUBLIC_BD-DAG: Decl[InstanceVar]/Super: override var baseBVarRW: TagPB; name=baseBVarRW: TagPB
148+
// TEST_PUBLIC_BD-DAG: Decl[InstanceMethod]/Super: public override func colliding() {|}; name=colliding()
149+
// TEST_PUBLIC_BD-DAG: Decl[InstanceMethod]/Super: public override func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
150+
// TEST_PUBLIC_BD-DAG: Decl[Constructor]/Super: init(fromBaseB: TagPB) {|}; name=init(fromBaseB: TagPB)
151+
// TEST_PUBLIC_BD: End completions
152+
153+
private class TestPrivateCD : BaseCPublic, ProtocolD {
154+
#^TEST_PRIVATE_CD^#
155+
}
156+
fileprivate class TestFilePrivateCD : BaseCPublic, ProtocolD {
157+
#^TEST_FILEPRIVATE_CD^#
158+
// Same as TEST_PRIVATE_CD.
159+
}
160+
class TestInternalCD : BaseCPublic, ProtocolD {
161+
#^TEST_INTERNAL_CD^#
162+
}
163+
public class TestPublicCD : BaseCPublic, ProtocolD {
164+
#^TEST_PUBLIC_CD^#
165+
}
166+
167+
// TEST_PRIVATE_CD: Begin completions, 5 items
168+
// TEST_PRIVATE_CD-DAG: Decl[InstanceMethod]/Super: override func baseCFunc(x: TagPC) {|}; name=baseCFunc(x: TagPC)
169+
// TEST_PRIVATE_CD-DAG: Decl[InstanceVar]/Super: override var baseCVarRW: TagPC; name=baseCVarRW: TagPC
170+
// TEST_PRIVATE_CD-DAG: Decl[InstanceMethod]/Super: override func colliding() {|}; name=colliding()
171+
// TEST_PRIVATE_CD-DAG: Decl[InstanceMethod]/Super: override func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
172+
// TEST_PRIVATE_CD-DAG: Decl[Constructor]/Super: init(fromBaseC: TagPC) {|}; name=init(fromBaseC: TagPC)
173+
// TEST_PRIVATE_CD: End completions
174+
175+
// TEST_INTERNAL_CD: Begin completions, 5 items
176+
// TEST_INTERNAL_CD-DAG: Decl[InstanceMethod]/Super: override func baseCFunc(x: TagPC) {|}; name=baseCFunc(x: TagPC)
177+
// TEST_INTERNAL_CD-DAG: Decl[InstanceVar]/Super: override var baseCVarRW: TagPC; name=baseCVarRW: TagPC
178+
// TEST_INTERNAL_CD-DAG: Decl[InstanceMethod]/Super: override func colliding() {|}; name=colliding()
179+
// TEST_INTERNAL_CD-DAG: Decl[InstanceMethod]/Super: override func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
180+
// TEST_INTERNAL_CD-DAG: Decl[Constructor]/Super: init(fromBaseC: TagPC) {|}; name=init(fromBaseC: TagPC)
181+
// TEST_INTERNAL_CD: End completions
182+
183+
// TEST_PUBLIC_CD: Begin completions, 5 items
184+
// TEST_PUBLIC_CD-DAG: Decl[InstanceMethod]/Super: public override func baseCFunc(x: TagPC) {|}; name=baseCFunc(x: TagPC)
185+
// TEST_PUBLIC_CD-DAG: Decl[InstanceVar]/Super: public override var baseCVarRW: TagPC; name=baseCVarRW: TagPC
186+
// TEST_PUBLIC_CD-DAG: Decl[InstanceMethod]/Super: public override func colliding() {|}; name=colliding()
187+
// TEST_PUBLIC_CD-DAG: Decl[InstanceMethod]/Super: public override func collidingGeneric<T>(x: T) {|}; name=collidingGeneric<T>(x: T)
188+
// TEST_PUBLIC_CD-DAG: Decl[Constructor]/Super: init(fromBaseC: TagPC) {|}; name=init(fromBaseC: TagPC)
189+
// TEST_PUBLIC_CD: End completions
190+

0 commit comments

Comments
 (0)