Skip to content

Commit f991245

Browse files
committed
[Diag] Formalize SelfAccessKind printing
1 parent 5f74067 commit f991245

File tree

10 files changed

+69
-37
lines changed

10 files changed

+69
-37
lines changed

include/swift/AST/Decl.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5561,12 +5561,14 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
55615561

55625562
class OperatorDecl;
55635563

5564-
/// Note: These align with '%select's in diagnostics.
55655564
enum class SelfAccessKind : uint8_t {
5566-
NonMutating = 0,
5567-
Mutating = 1,
5568-
__Consuming = 2,
5565+
NonMutating,
5566+
Mutating,
5567+
__Consuming,
55695568
};
5569+
5570+
/// Diagnostic printing of \c SelfAccessKind.
5571+
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, SelfAccessKind SAK);
55705572

55715573
/// FuncDecl - 'func' declaration.
55725574
class FuncDecl : public AbstractFunctionDecl {

include/swift/AST/DiagnosticEngine.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace swift {
3030
class ValueDecl;
3131

3232
enum class PatternKind : uint8_t;
33+
enum class SelfAccessKind : uint8_t;
3334
enum class ReferenceOwnership : uint8_t;
3435
enum class StaticSpellingKind : uint8_t;
3536
enum class DescriptiveDeclKind : uint8_t;
@@ -77,6 +78,7 @@ namespace swift {
7778
Type,
7879
TypeRepr,
7980
PatternKind,
81+
SelfAccessKind,
8082
ReferenceOwnership,
8183
StaticSpellingKind,
8284
DescriptiveDeclKind,
@@ -105,6 +107,7 @@ namespace swift {
105107
Type TypeVal;
106108
TypeRepr *TyR;
107109
PatternKind PatternKindVal;
110+
SelfAccessKind SelfAccessKindVal;
108111
ReferenceOwnership ReferenceOwnershipVal;
109112
StaticSpellingKind StaticSpellingKindVal;
110113
DescriptiveDeclKind DescriptiveDeclKindVal;
@@ -169,6 +172,10 @@ namespace swift {
169172
: Kind(DiagnosticArgumentKind::ReferenceOwnership),
170173
ReferenceOwnershipVal(RO) {}
171174

175+
DiagnosticArgument(SelfAccessKind SAK)
176+
: Kind(DiagnosticArgumentKind::SelfAccessKind),
177+
SelfAccessKindVal(SAK) {}
178+
172179
DiagnosticArgument(StaticSpellingKind SSK)
173180
: Kind(DiagnosticArgumentKind::StaticSpellingKind),
174181
StaticSpellingKindVal(SSK) {}
@@ -249,6 +256,11 @@ namespace swift {
249256
return ReferenceOwnershipVal;
250257
}
251258

259+
SelfAccessKind getAsSelfAccessKind() const {
260+
assert(Kind == DiagnosticArgumentKind::SelfAccessKind);
261+
return SelfAccessKindVal;
262+
}
263+
252264
StaticSpellingKind getAsStaticSpellingKind() const {
253265
assert(Kind == DiagnosticArgumentKind::StaticSpellingKind);
254266
return StaticSpellingKindVal;

include/swift/AST/DiagnosticsSema.def

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,24 +1108,20 @@ ERROR(attribute_requires_operator_identifier,none,
11081108
ERROR(attribute_requires_single_argument,none,
11091109
"'%0' requires a function with one argument", (StringRef))
11101110

1111-
ERROR(mutating_invalid_global_scope,none,
1112-
"'%select{nonmutating|mutating|__consuming}0' is only valid on methods",
1113-
(unsigned))
1114-
ERROR(mutating_invalid_classes,none,
1115-
"'%select{nonmutating|mutating|__consuming}0' isn't valid on methods in "
1116-
"classes or class-bound protocols", (bool))
1111+
ERROR(mutating_invalid_global_scope,none, "%0 is only valid on methods",
1112+
(SelfAccessKind))
1113+
ERROR(mutating_invalid_classes,none, "%0 isn't valid on methods in "
1114+
"classes or class-bound protocols", (SelfAccessKind))
11171115

11181116
ERROR(functions_mutating_and_not,none,
1119-
"method must not be declared both "
1120-
"%select{nonmutating|mutating|__consuming}0 and "
1121-
"%select{nonmutating|mutating|__consuming}1",
1122-
(unsigned, unsigned))
1117+
"method must not be declared both %0 and %1",
1118+
(SelfAccessKind, SelfAccessKind))
11231119
ERROR(static_functions_not_mutating,none,
11241120
"static functions must not be declared mutating", ())
11251121

11261122
ERROR(modify_mutatingness_differs_from_setter,none,
1127-
"'modify' accessor cannot be %select{nonmutating|mutating}0 "
1128-
"when the setter is %select{mutating|nonmutating}0", (bool))
1123+
"'modify' accessor cannot be %0 when the setter is %1",
1124+
(SelfAccessKind, SelfAccessKind))
11291125

11301126
ERROR(transparent_in_protocols_not_supported,none,
11311127
"'@_transparent' attribute is not supported on declarations within protocols", ())
@@ -1871,8 +1867,8 @@ NOTE(protocol_witness_prefix_postfix_conflict,none,
18711867
"candidate is %select{|prefix, |postfix, }1not "
18721868
"%select{prefix|postfix}0 as required", (bool, unsigned))
18731869
NOTE(protocol_witness_mutation_modifier_conflict,none,
1874-
"candidate is marked '%select{nonmutating|mutating|__consuming}0' but "
1875-
"protocol does not allow it", (unsigned))
1870+
"candidate is marked %0 but protocol does not allow it",
1871+
(SelfAccessKind))
18761872
NOTE(protocol_witness_settable_conflict,none,
18771873
"candidate is not settable, but protocol requires it", ())
18781874
NOTE(protocol_witness_rethrows_conflict,none,

lib/AST/Decl.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,16 @@ llvm::raw_ostream &swift::operator<<(llvm::raw_ostream &OS,
324324
return OS << "'" << keywordOf(RO) << "'";
325325
}
326326

327+
llvm::raw_ostream &swift::operator<<(llvm::raw_ostream &OS,
328+
SelfAccessKind SAK) {
329+
switch (SAK) {
330+
case SelfAccessKind::NonMutating: return OS << "'nonmutating'";
331+
case SelfAccessKind::Mutating: return OS << "'mutating'";
332+
case SelfAccessKind::__Consuming: return OS << "'__consuming'";
333+
}
334+
llvm_unreachable("Unknown SelfAccessKind");
335+
}
336+
327337
DeclContext *Decl::getInnermostDeclContext() const {
328338
if (auto func = dyn_cast<AbstractFunctionDecl>(this))
329339
return const_cast<AbstractFunctionDecl*>(func);

lib/AST/DiagnosticEngine.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,18 @@ static void formatDiagnosticArgument(StringRef Modifier,
475475
Out << Arg.getAsPatternKind();
476476
break;
477477

478+
case DiagnosticArgumentKind::SelfAccessKind:
479+
if (Modifier == "select") {
480+
formatSelectionArgument(ModifierArguments, Args,
481+
unsigned(Arg.getAsSelfAccessKind()),
482+
FormatOpts, Out);
483+
} else {
484+
assert(Modifier.empty() &&
485+
"Improper modifier for SelfAccessKind argument");
486+
Out << Arg.getAsSelfAccessKind();
487+
}
488+
break;
489+
478490
case DiagnosticArgumentKind::ReferenceOwnership:
479491
if (Modifier == "select") {
480492
formatSelectionArgument(ModifierArguments, Args,

lib/Sema/TypeCheckAttr.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,11 @@ void AttributeEarlyChecker::visitMutationAttr(DeclAttribute *attr) {
279279
if (contextTy->hasReferenceSemantics()) {
280280
if (attrModifier != SelfAccessKind::__Consuming)
281281
diagnoseAndRemoveAttr(attr, diag::mutating_invalid_classes,
282-
unsigned(attrModifier));
282+
attrModifier);
283283
}
284284
} else {
285285
diagnoseAndRemoveAttr(attr, diag::mutating_invalid_global_scope,
286-
unsigned(attrModifier));
286+
attrModifier);
287287
}
288288

289289
// Verify we don't have more than one of mutating, nonmutating,
@@ -294,24 +294,21 @@ void AttributeEarlyChecker::visitMutationAttr(DeclAttribute *attr) {
294294
if (auto *NMA = FD->getAttrs().getAttribute<NonMutatingAttr>()) {
295295
if (attrModifier != SelfAccessKind::NonMutating) {
296296
diagnoseAndRemoveAttr(NMA, diag::functions_mutating_and_not,
297-
unsigned(SelfAccessKind::NonMutating),
298-
unsigned(attrModifier));
297+
SelfAccessKind::NonMutating, attrModifier);
299298
}
300299
}
301300

302301
if (auto *MUA = FD->getAttrs().getAttribute<MutatingAttr>()) {
303302
if (attrModifier != SelfAccessKind::Mutating) {
304303
diagnoseAndRemoveAttr(MUA, diag::functions_mutating_and_not,
305-
unsigned(SelfAccessKind::Mutating),
306-
unsigned(attrModifier));
304+
SelfAccessKind::Mutating, attrModifier);
307305
}
308306
}
309307

310308
if (auto *CSA = FD->getAttrs().getAttribute<ConsumingAttr>()) {
311309
if (attrModifier != SelfAccessKind::__Consuming) {
312310
diagnoseAndRemoveAttr(CSA, diag::functions_mutating_and_not,
313-
unsigned(SelfAccessKind::__Consuming),
314-
unsigned(attrModifier));
311+
SelfAccessKind::__Consuming, attrModifier);
315312
}
316313
}
317314
}

lib/Sema/TypeCheckDecl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1975,7 +1975,10 @@ static bool computeIsSetterMutating(TypeChecker &TC,
19751975
if ((result || storage->isGetterMutating()) != modifyResult) {
19761976
TC.diagnose(modifyAccessor,
19771977
diag::modify_mutatingness_differs_from_setter,
1978-
modifyResult);
1978+
modifyResult ? SelfAccessKind::Mutating
1979+
: SelfAccessKind::NonMutating,
1980+
modifyResult ? SelfAccessKind::NonMutating
1981+
: SelfAccessKind::Mutating);
19791982
TC.diagnose(storage->getSetter(), diag::previous_accessor, "setter", 0);
19801983
modifyAccessor->setInvalid();
19811984
}

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2193,19 +2193,19 @@ diagnoseMatch(ModuleDecl *module, NormalProtocolConformance *conformance,
21932193
// FIXME: Could emit a Fix-It here.
21942194
diags.diagnose(match.Witness,
21952195
diag::protocol_witness_mutation_modifier_conflict,
2196-
unsigned(SelfAccessKind::Mutating));
2196+
SelfAccessKind::Mutating);
21972197
break;
21982198
case MatchKind::NonMutatingConflict:
21992199
// FIXME: Could emit a Fix-It here.
22002200
diags.diagnose(match.Witness,
22012201
diag::protocol_witness_mutation_modifier_conflict,
2202-
unsigned(SelfAccessKind::NonMutating));
2202+
SelfAccessKind::NonMutating);
22032203
break;
22042204
case MatchKind::ConsumingConflict:
22052205
// FIXME: Could emit a Fix-It here.
22062206
diags.diagnose(match.Witness,
22072207
diag::protocol_witness_mutation_modifier_conflict,
2208-
unsigned(SelfAccessKind::__Consuming));
2208+
SelfAccessKind::__Consuming);
22092209
break;
22102210
case MatchKind::RethrowsConflict:
22112211
// FIXME: Could emit a Fix-It here.

test/Sema/generalized_accessors.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,13 @@ struct Modify {
9494

9595
var getAndNonMutatingModifyAndSet: Int {
9696
get {}
97-
nonmutating _modify {} // expected-error {{'modify' accessor cannot be nonmutating when the setter is mutating}}
97+
nonmutating _modify {} // expected-error {{'modify' accessor cannot be 'nonmutating' when the setter is 'mutating'}}
9898
set {} // expected-note {{setter defined here}}
9999
}
100100

101101
var getAndModifyAndNonMutatingSet: Int {
102102
get {}
103-
_modify {}// expected-error {{'modify' accessor cannot be mutating when the setter is nonmutating}}
103+
_modify {}// expected-error {{'modify' accessor cannot be 'mutating' when the setter is 'nonmutating'}}
104104
nonmutating set {} // expected-note {{setter defined here}}
105105
}
106106
}

test/Sema/immutability.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -509,11 +509,11 @@ struct F { // expected-note 1 {{in declaration of 'F'}}
509509
mutating mutating mutating f() { // expected-error 2 {{duplicate modifier}} expected-note 2 {{modifier already specified here}} expected-error {{expected declaration}}
510510
}
511511

512-
mutating nonmutating func g() {} // expected-error {{method must not be declared both mutating and nonmutating}}
513-
__consuming nonmutating func h() {} // expected-error {{method must not be declared both __consuming and nonmutating}}
514-
__consuming mutating func i() {} // expected-error {{method must not be declared both __consuming and mutating}}
515-
nonmutating mutating func j() {} // expected-error {{method must not be declared both nonmutating and mutating}}
516-
__consuming nonmutating mutating func k() {} // expected-error {{method must not be declared both __consuming and mutating}} expected-error {{method must not be declared both nonmutating and mutating}}
512+
mutating nonmutating func g() {} // expected-error {{method must not be declared both 'mutating' and 'nonmutating'}}
513+
__consuming nonmutating func h() {} // expected-error {{method must not be declared both '__consuming' and 'nonmutating'}}
514+
__consuming mutating func i() {} // expected-error {{method must not be declared both '__consuming' and 'mutating'}}
515+
nonmutating mutating func j() {} // expected-error {{method must not be declared both 'nonmutating' and 'mutating'}}
516+
__consuming nonmutating mutating func k() {} // expected-error {{method must not be declared both '__consuming' and 'mutating'}} expected-error {{method must not be declared both 'nonmutating' and 'mutating'}}
517517
}
518518

519519
protocol SingleIntProperty {

0 commit comments

Comments
 (0)