Skip to content

Commit 6b3872d

Browse files
committed
Spruce Up Static/Class Diagnostics
Mention the let/var character of the property in addition to its static spelling kind. Then drop the reference to "specifier". As icing on top, offer to insert an initializer after any binding patterns. rdar://19827674
1 parent c2b13cd commit 6b3872d

File tree

3 files changed

+48
-13
lines changed

3 files changed

+48
-13
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,10 +1553,13 @@ ERROR(observingprop_requires_initializer,none,
15531553
"non-member observing properties require an initializer", ())
15541554
ERROR(global_requires_initializer,none,
15551555
"global '%select{var|let}0' declaration requires an initializer expression"
1556-
"%select{ or getter/setter specifier|}0", (bool))
1556+
"%select{ or an explicitly stated getter|}0", (bool))
15571557
ERROR(static_requires_initializer,none,
1558-
"%select{ERROR|'static var'|'class var'|}0 declaration requires an initializer "
1559-
"expression or getter/setter specifier", (StaticSpellingKind))
1558+
"'%select{ERROR|static|class|}0 %select{var|let}1' declaration requires "
1559+
"an initializer expression or an explicitly stated getter",
1560+
(StaticSpellingKind, bool))
1561+
NOTE(static_requires_initializer_add_init,none,
1562+
"add an initializer to silence this error", ())
15601563
ERROR(pattern_type_access,none,
15611564
"%select{%select{variable|constant}0|property}1 "
15621565
"%select{must be declared %select{"

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1622,7 +1622,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
16221622
Ctx.evaluator, PatternBindingEntryRequest{PBD, i}, nullptr);
16231623
assert(entry && "No pattern binding entry?");
16241624

1625-
PBD->getPattern(i)->forEachVariable([&](VarDecl *var) {
1625+
const auto *Pat = PBD->getPattern(i);
1626+
Pat->forEachVariable([&](VarDecl *var) {
16261627
this->visitBoundVariable(var);
16271628

16281629
if (PBD->isInitialized(i)) {
@@ -1680,7 +1681,10 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
16801681
}
16811682

16821683
var->diagnose(diag::static_requires_initializer,
1683-
var->getCorrectStaticSpelling());
1684+
var->getCorrectStaticSpelling(),
1685+
var->isLet());
1686+
var->diagnose(diag::static_requires_initializer_add_init)
1687+
.fixItInsert(Pat->getEndLoc(), " = <#initializer#>");
16841688
markVarAndPBDInvalid();
16851689
return;
16861690
}
@@ -1697,6 +1701,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
16971701
}
16981702

16991703
var->diagnose(diag::global_requires_initializer, var->isLet());
1704+
var->diagnose(diag::static_requires_initializer_add_init)
1705+
.fixItInsert(Pat->getEndLoc(), " = <#initializer#>");
17001706
markVarAndPBDInvalid();
17011707
return;
17021708
}

test/decl/var/static_var.swift

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,27 @@
22

33
// See also rdar://15626843.
44
static var gvu1: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
5-
// expected-error@-1 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
5+
// expected-error@-1 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
6+
// expected-note@-2 {{add an initializer to silence this error}} {{18-18= = <#initializer#>}}
67
class var gvu2: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
7-
// expected-error@-1 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
8+
// expected-error@-1 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
9+
// expected-note@-2 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
810
override static var gvu3: Int // expected-error {{static properties may only be declared on a type}}{{10-17=}}
911
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
10-
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
12+
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
13+
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
1114
override class var gvu4: Int // expected-error {{class properties may only be declared on a type}}{{10-16=}}
1215
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
13-
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
16+
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
17+
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
1418
static override var gvu5: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
1519
// expected-error@-1 {{'override' can only be specified on class members}}{{8-17=}}
16-
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
20+
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
21+
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
1722
class override var gvu6: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
1823
// expected-error@-1 {{'override' can only be specified on class members}}{{7-16=}}
19-
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
24+
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
25+
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
2026

2127
static var gvu7: Int { // expected-error {{static properties may only be declared on a type}}{{1-8=}}
2228
return 42
@@ -28,20 +34,26 @@ class var gvu8: Int { // expected-error {{class properties may only be declared
2834

2935
static let glu1: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
3036
// expected-error@-1 {{global 'let' declaration requires an initializer expression}}
37+
// expected-note@-2 {{add an initializer to silence this error}} {{18-18= = <#initializer#>}}
3138
class let glu2: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
3239
// expected-error@-1 {{global 'let' declaration requires an initializer expression}}
40+
// expected-note@-2 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
3341
override static let glu3: Int // expected-error {{static properties may only be declared on a type}}{{10-17=}}
3442
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
3543
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
44+
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
3645
override class let glu4: Int // expected-error {{class properties may only be declared on a type}}{{10-16=}}
3746
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
3847
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
48+
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
3949
static override let glu5: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
4050
// expected-error@-1 {{'override' can only be specified on class members}}{{8-17=}}
4151
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
52+
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
4253
class override let glu6: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
4354
// expected-error@-1 {{'override' can only be specified on class members}}{{7-16=}}
4455
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
56+
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
4557

4658

4759
static var gvi1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-8=}}
@@ -187,7 +199,8 @@ extension P {
187199

188200
struct S1 {
189201
// rdar://15626843
190-
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or getter/setter specifier}}
202+
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
203+
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
191204
var y = 1
192205

193206
static var z = 5
@@ -205,7 +218,20 @@ enum E1 {
205218
}
206219

207220
class C1 {
208-
class var x: Int // expected-error {{class stored properties not supported}} expected-error {{'class var' declaration requires an initializer expression or getter/setter specifier}}
221+
class var x: Int // expected-error {{class stored properties not supported}} expected-error {{'class var' declaration requires an initializer expression or an explicitly stated getter}}
222+
// expected-note@-1 {{add an initializer to silence this error}} {{16-16= = <#initializer#>}}
223+
class let x: Int // expected-error {{class stored properties not supported}} expected-error {{'class let' declaration requires an initializer expression or an explicitly stated getter}}
224+
// expected-note@-1 {{add an initializer to silence this error}} {{16-16= = <#initializer#>}}
225+
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
226+
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
227+
static let x: Int // expected-error {{'static let' declaration requires an initializer expression or an explicitly stated getter}}
228+
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
229+
230+
// FIXME: We immediately invalidate the pattern binding after the first error
231+
// is emitted, but we could definitely emit a second round of fixits for the
232+
// other pattern here.
233+
static var (x, y): (Int, Int), (z, w): (Int, Int) // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
234+
// expected-note@-1 {{add an initializer to silence this error}} {{31-31= = <#initializer#>}}
209235
}
210236

211237
class C2 {

0 commit comments

Comments
 (0)