Skip to content

Commit 6290d9b

Browse files
authored
Introduce DescriptiveDeclKind::Property (#18183)
...and collapse StaticVar/ClassVar and StaticLet/ClassLet into StaticProperty/ClassProperty. "var" and "let" aren't great nouns to use in diagnostics to begin with, especially alongside semantic terms like "instance method". Focus on the type vs. non-type aspect instead with "property", which better matches how people talk about member vars (and lets) anyway.
1 parent 88937f9 commit 6290d9b

20 files changed

+84
-87
lines changed

include/swift/AST/Decl.h

+3-4
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,9 @@ enum class DescriptiveDeclKind : uint8_t {
117117
Var,
118118
Param,
119119
Let,
120-
StaticVar,
121-
StaticLet,
122-
ClassVar,
123-
ClassLet,
120+
Property,
121+
StaticProperty,
122+
ClassProperty,
124123
InfixOperator,
125124
PrefixOperator,
126125
PostfixOperator,

lib/AST/Decl.cpp

+9-10
Original file line numberDiff line numberDiff line change
@@ -164,14 +164,14 @@ DescriptiveDeclKind Decl::getDescriptiveKind() const {
164164
auto var = cast<VarDecl>(this);
165165
switch (var->getCorrectStaticSpelling()) {
166166
case StaticSpellingKind::None:
167-
return var->isLet()? DescriptiveDeclKind::Let
168-
: DescriptiveDeclKind::Var;
167+
if (var->getDeclContext()->isTypeContext())
168+
return DescriptiveDeclKind::Property;
169+
return var->isLet() ? DescriptiveDeclKind::Let
170+
: DescriptiveDeclKind::Var;
169171
case StaticSpellingKind::KeywordStatic:
170-
return var->isLet()? DescriptiveDeclKind::StaticLet
171-
: DescriptiveDeclKind::StaticVar;
172+
return DescriptiveDeclKind::StaticProperty;
172173
case StaticSpellingKind::KeywordClass:
173-
return var->isLet()? DescriptiveDeclKind::ClassLet
174-
: DescriptiveDeclKind::ClassVar;
174+
return DescriptiveDeclKind::ClassProperty;
175175
}
176176
}
177177

@@ -249,10 +249,9 @@ StringRef Decl::getDescriptiveKindName(DescriptiveDeclKind K) {
249249
ENTRY(Var, "var");
250250
ENTRY(Param, "parameter");
251251
ENTRY(Let, "let");
252-
ENTRY(StaticVar, "static var");
253-
ENTRY(StaticLet, "static let");
254-
ENTRY(ClassVar, "class var");
255-
ENTRY(ClassLet, "class let");
252+
ENTRY(Property, "property");
253+
ENTRY(StaticProperty, "static property");
254+
ENTRY(ClassProperty, "class property");
256255
ENTRY(PrecedenceGroup, "precedence group");
257256
ENTRY(InfixOperator, "infix operator");
258257
ENTRY(PrefixOperator, "prefix operator");

lib/Sema/TypeCheckDeclOverride.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -1495,8 +1495,7 @@ static bool checkSingleOverride(ValueDecl *override, ValueDecl *base) {
14951495
// FIXME: Customize message to the kind of thing.
14961496
auto baseKind = base->getDescriptiveKind();
14971497
switch (baseKind) {
1498-
case DescriptiveDeclKind::StaticLet:
1499-
case DescriptiveDeclKind::StaticVar:
1498+
case DescriptiveDeclKind::StaticProperty:
15001499
case DescriptiveDeclKind::StaticMethod:
15011500
override->diagnose(diag::override_static, baseKind);
15021501
break;

test/ClangImporter/objc_bridging_custom.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ func checkThatBridgingIsWorking(fridge: Refrigerator) {
7979
override init(singleArgument: APPRefrigerator) {} // expected-error {{initializer does not override a designated initializer from its superclass}}
8080

8181
// 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}}
82-
// expected-note@+1 {{type does not match superclass var with type 'Refrigerator'}} {{22-37=Refrigerator}}
82+
// expected-note@+1 {{type does not match superclass property with type 'Refrigerator'}} {{22-37=Refrigerator}}
8383
override var prop: APPRefrigerator { // expected-error {{property 'prop' with type 'APPRefrigerator' cannot override a property with type 'Refrigerator'}}
8484
return super.prop as APPRefrigerator
8585
}
8686
// 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}}
87-
// expected-note@+1 {{type does not match superclass var with type 'ManufacturerInfo<NSString>'}} {{29-59=ManufacturerInfo<NSString>}}
87+
// expected-note@+1 {{type does not match superclass property with type 'ManufacturerInfo<NSString>'}} {{29-59=ManufacturerInfo<NSString>}}
8888
override var propGeneric: APPManufacturerInfo<AnyObject> { // expected-error {{property 'propGeneric' with type 'APPManufacturerInfo<AnyObject>' cannot override a property with type 'ManufacturerInfo<NSString>'}}
8989
return super.prop // expected-error {{return type}}
9090
}
@@ -201,13 +201,13 @@ protocol TestProto {
201201

202202
// expected-note@+2 {{private}} expected-note@+2 {{@nonobjc}} expected-note@+2 {{extension}}
203203
// expected-note@+1 {{candidate has non-matching type 'APPRefrigerator?'}} {{13-29=Refrigerator?}}
204-
var prop: APPRefrigerator? { // expected-warning {{var 'prop' nearly matches optional requirement 'prop' of protocol 'TestObjCProto'}} {{none}}
204+
var prop: APPRefrigerator? { // expected-warning {{property 'prop' nearly matches optional requirement 'prop' of protocol 'TestObjCProto'}} {{none}}
205205
return nil
206206
}
207207

208208
// expected-note@+2 {{private}} expected-note@+2 {{@nonobjc}} expected-note@+2 {{extension}}
209209
// expected-note@+1 {{candidate has non-matching type 'APPManufacturerInfo<AnyObject>?'}} {{20-51=ManufacturerInfo<NSString>?}}
210-
var propGeneric: APPManufacturerInfo<AnyObject>? { // expected-warning {{var 'propGeneric' nearly matches optional requirement 'propGeneric' of protocol 'TestObjCProto'}} {{none}}
210+
var propGeneric: APPManufacturerInfo<AnyObject>? { // expected-warning {{property 'propGeneric' nearly matches optional requirement 'propGeneric' of protocol 'TestObjCProto'}} {{none}}
211211
return nil
212212
}
213213
}

test/Compatibility/accessibility.swift

+10-10
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ internal extension Base {
183183
public class PublicSub: Base {
184184
private required init() {} // expected-error {{'required' initializer must be accessible wherever class 'PublicSub' can be subclassed}} {{3-10=internal}}
185185
override func foo() {} // expected-error {{overriding instance method must be as accessible as the declaration it overrides}} {{12-12=public }}
186-
override var bar: Int { // expected-error {{overriding var must be as accessible as the declaration it overrides}} {{12-12=public }}
186+
override var bar: Int { // expected-error {{overriding property must be as accessible as the declaration it overrides}} {{12-12=public }}
187187
get { return 0 }
188188
set {}
189189
}
@@ -197,7 +197,7 @@ public class PublicSubGood: Base {
197197
internal class InternalSub: Base {
198198
required private init() {} // expected-error {{'required' initializer must be accessible wherever class 'InternalSub' can be subclassed}} {{12-19=internal}}
199199
private override func foo() {} // expected-error {{overriding instance method must be as accessible as its enclosing type}} {{3-10=internal}}
200-
private override var bar: Int { // expected-error {{overriding var must be as accessible as its enclosing type}} {{3-10=internal}}
200+
private override var bar: Int { // expected-error {{overriding property must be as accessible as its enclosing type}} {{3-10=internal}}
201201
get { return 0 }
202202
set {}
203203
}
@@ -216,7 +216,7 @@ internal class InternalSubGood: Base {
216216

217217
internal class InternalSubPrivateSet: Base {
218218
required init() {}
219-
private(set) override var bar: Int { // expected-error {{overriding var must be as accessible as its enclosing type}} {{3-16=}}
219+
private(set) override var bar: Int { // expected-error {{overriding property must be as accessible as its enclosing type}} {{3-16=}}
220220
get { return 0 }
221221
set {}
222222
}
@@ -229,7 +229,7 @@ internal class InternalSubPrivateSet: Base {
229229
fileprivate class FilePrivateSub: Base {
230230
required private init() {} // expected-error {{'required' initializer must be accessible wherever class 'FilePrivateSub' can be subclassed}} {{12-19=fileprivate}}
231231
private override func foo() {} // expected-error {{overriding instance method must be as accessible as its enclosing type}} {{3-10=fileprivate}}
232-
private override var bar: Int { // expected-error {{overriding var must be as accessible as its enclosing type}} {{3-10=fileprivate}}
232+
private override var bar: Int { // expected-error {{overriding property must be as accessible as its enclosing type}} {{3-10=fileprivate}}
233233
get { return 0 }
234234
set {}
235235
}
@@ -258,7 +258,7 @@ fileprivate class FilePrivateSubGood2: Base {
258258

259259
fileprivate class FilePrivateSubPrivateSet: Base {
260260
required init() {}
261-
private(set) override var bar: Int { // expected-error {{overriding var must be as accessible as its enclosing type}} {{3-10=fileprivate}}
261+
private(set) override var bar: Int { // expected-error {{overriding property must be as accessible as its enclosing type}} {{3-10=fileprivate}}
262262
get { return 0 }
263263
set {}
264264
}
@@ -271,7 +271,7 @@ fileprivate class FilePrivateSubPrivateSet: Base {
271271
private class PrivateSub: Base {
272272
required private init() {} // expected-error {{'required' initializer must be accessible wherever class 'PrivateSub' can be subclassed}} {{12-19=fileprivate}}
273273
private override func foo() {} // expected-error {{overriding instance method must be as accessible as its enclosing type}} {{3-10=fileprivate}}
274-
private override var bar: Int { // expected-error {{overriding var must be as accessible as its enclosing type}} {{3-10=fileprivate}}
274+
private override var bar: Int { // expected-error {{overriding property must be as accessible as its enclosing type}} {{3-10=fileprivate}}
275275
get { return 0 }
276276
set {}
277277
}
@@ -291,7 +291,7 @@ private class PrivateSubGood: Base {
291291
private class PrivateSubPrivateSet: Base {
292292
required fileprivate init() {}
293293
fileprivate override func foo() {}
294-
private(set) override var bar: Int { // expected-error {{setter of overriding var must be as accessible as its enclosing type}}
294+
private(set) override var bar: Int { // expected-error {{setter of overriding property must be as accessible as its enclosing type}}
295295
get { return 0 }
296296
set {}
297297
}
@@ -522,7 +522,7 @@ internal protocol InternalMutationOperations {
522522
}
523523

524524
public struct AccessorsControl : InternalMutationOperations {
525-
private var size = 0 // expected-error {{property 'size' must be declared internal because it matches a requirement in internal protocol 'InternalMutationOperations'}} {{none}} expected-note {{mark the var as 'internal' to satisfy the requirement}} {{3-10=internal}}
525+
private var size = 0 // expected-error {{property 'size' must be declared internal because it matches a requirement in internal protocol 'InternalMutationOperations'}} {{none}} expected-note {{mark the property as 'internal' to satisfy the requirement}} {{3-10=internal}}
526526
private subscript (_: Int) -> Int { // expected-error {{subscript must be declared internal because it matches a requirement in internal protocol 'InternalMutationOperations'}} {{none}} expected-note {{mark the subscript as 'internal' to satisfy the requirement}} {{3-10=internal}}
527527
get { return 42 }
528528
set {}
@@ -531,7 +531,7 @@ public struct AccessorsControl : InternalMutationOperations {
531531

532532
public struct PrivateSettersPublic : InternalMutationOperations {
533533
// Please don't change the formatting here; it's a precise fix-it test.
534-
public private(set) var size = 0 // expected-error {{setter for property 'size' must be declared internal because it matches a requirement in internal protocol 'InternalMutationOperations'}} {{none}} expected-note {{mark the var as 'internal' to satisfy the requirement}} {{10-17=internal}}
534+
public private(set) var size = 0 // expected-error {{setter for property 'size' must be declared internal because it matches a requirement in internal protocol 'InternalMutationOperations'}} {{none}} expected-note {{mark the property as 'internal' to satisfy the requirement}} {{10-17=internal}}
535535
public private(set) subscript (_: Int) -> Int { // expected-error {{subscript setter must be declared internal because it matches a requirement in internal protocol 'InternalMutationOperations'}} {{none}} expected-note {{mark the subscript as 'internal' to satisfy the requirement}} {{10-17=internal}}
536536
get { return 42 }
537537
set {}
@@ -540,7 +540,7 @@ public struct PrivateSettersPublic : InternalMutationOperations {
540540

541541
internal struct PrivateSettersInternal : PublicMutationOperations {
542542
// Please don't change the formatting here; it's a precise fix-it test.
543-
private(set)var size = 0 // expected-error {{setter for property 'size' must be as accessible as its enclosing type because it matches a requirement in protocol 'PublicMutationOperations'}} {{none}} expected-note {{mark the var as 'internal' to satisfy the requirement}} {{3-15=}}
543+
private(set)var size = 0 // expected-error {{setter for property 'size' must be as accessible as its enclosing type because it matches a requirement in protocol 'PublicMutationOperations'}} {{none}} expected-note {{mark the property as 'internal' to satisfy the requirement}} {{3-15=}}
544544

545545
internal private(set)subscript (_: Int) -> Int { // expected-error {{subscript setter must be as accessible as its enclosing type because it matches a requirement in protocol 'PublicMutationOperations'}} {{none}} expected-note {{mark the subscript as 'internal' to satisfy the requirement}} {{12-24=}}
546546
get { return 42 }

test/Constraints/diagnostics.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -452,8 +452,8 @@ let _: Color = .frob(1, &d) // expected-error {{missing argument label 'b:' in c
452452
let _: Color = .frob(1, b: &d) // expected-error {{cannot convert value of type 'Double' to expected argument type 'Int'}}
453453
var someColor : Color = .red // expected-error {{enum type 'Color' has no case 'red'; did you mean 'Red'}}
454454
someColor = .red // expected-error {{enum type 'Color' has no case 'red'; did you mean 'Red'}}
455-
someColor = .svar() // expected-error {{static var 'svar' is not a function}}
456-
someColor = .svar(1) // expected-error {{static var 'svar' is not a function}}
455+
someColor = .svar() // expected-error {{static property 'svar' is not a function}}
456+
someColor = .svar(1) // expected-error {{static property 'svar' is not a function}}
457457

458458
func testTypeSugar(_ a : Int) {
459459
typealias Stride = Int

0 commit comments

Comments
 (0)