Skip to content

Commit c48be00

Browse files
committed
[NFC] Refactor diagnoseDeclAvailability() flags
The function took three random boolean parameters; there’s about to be a fourth. This wasn’t going to scale.
1 parent 6a604b6 commit c48be00

File tree

3 files changed

+34
-33
lines changed

3 files changed

+34
-33
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2368,9 +2368,7 @@ class AvailabilityWalker : public ASTWalker {
23682368

23692369
bool diagAvailability(const ValueDecl *D, SourceRange R,
23702370
const ApplyExpr *call = nullptr,
2371-
bool AllowPotentiallyUnavailableProtocol = false,
2372-
bool SignalOnPotentialUnavailability = true,
2373-
bool ForInout = false);
2371+
DeclAvailabilityFlags flags = None);
23742372

23752373
private:
23762374
bool diagnoseIncDecRemoval(const ValueDecl *D, SourceRange R,
@@ -2504,46 +2502,45 @@ class AvailabilityWalker : public ASTWalker {
25042502
switch (AccessContext) {
25052503
case MemberAccessContext::Getter:
25062504
diagAccessorAvailability(D->getGetter(), ReferenceRange, ReferenceDC,
2507-
/*ForInout=*/false);
2505+
None);
25082506
break;
25092507

25102508
case MemberAccessContext::Setter:
25112509
diagAccessorAvailability(D->getSetter(), ReferenceRange, ReferenceDC,
2512-
/*ForInout=*/false);
2510+
None);
25132511
break;
25142512

25152513
case MemberAccessContext::InOut:
25162514
diagAccessorAvailability(D->getGetter(), ReferenceRange, ReferenceDC,
2517-
/*ForInout=*/true);
2515+
DeclAvailabilityFlag::ForInout);
25182516

25192517
diagAccessorAvailability(D->getSetter(), ReferenceRange, ReferenceDC,
2520-
/*ForInout=*/true);
2518+
DeclAvailabilityFlag::ForInout);
25212519
break;
25222520
}
25232521
}
25242522

25252523
/// Emit a diagnostic, if necessary for a potentially unavailable accessor.
25262524
void diagAccessorAvailability(AccessorDecl *D, SourceRange ReferenceRange,
25272525
const DeclContext *ReferenceDC,
2528-
bool ForInout) const {
2526+
DeclAvailabilityFlags Flags) const {
2527+
Flags &= DeclAvailabilityFlag::ForInout;
2528+
Flags |= DeclAvailabilityFlag::ContinueOnPotentialUnavailability;
25292529
if (diagnoseDeclAvailability(D, TC,
25302530
const_cast<DeclContext*>(ReferenceDC),
25312531
ReferenceRange,
2532-
/*AllowPotentiallyUnavailableProtocol*/false,
2533-
/*SignalOnPotentialUnavailability*/false,
2534-
ForInout))
2532+
Flags))
25352533
return;
25362534
}
25372535
};
25382536
} // end anonymous namespace
25392537

25402538
/// Diagnose uses of unavailable declarations. Returns true if a diagnostic
25412539
/// was emitted.
2542-
bool AvailabilityWalker::diagAvailability(const ValueDecl *D, SourceRange R,
2543-
const ApplyExpr *call,
2544-
bool AllowPotentiallyUnavailableProtocol,
2545-
bool SignalOnPotentialUnavailability,
2546-
bool ForInout) {
2540+
bool
2541+
AvailabilityWalker::diagAvailability(const ValueDecl *D, SourceRange R,
2542+
const ApplyExpr *call,
2543+
DeclAvailabilityFlags Flags) {
25472544
if (!D)
25482545
return false;
25492546

@@ -2582,20 +2579,22 @@ bool AvailabilityWalker::diagAvailability(const ValueDecl *D, SourceRange R,
25822579
if (!isAccessorWithDeprecatedStorage)
25832580
TC.diagnoseIfDeprecated(R, DC, D, call);
25842581

2585-
if (AllowPotentiallyUnavailableProtocol && isa<ProtocolDecl>(D))
2582+
if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailableProtocol)
2583+
&& isa<ProtocolDecl>(D))
25862584
return false;
25872585

25882586
// Diagnose (and possibly signal) for potential unavailability
25892587
auto maybeUnavail = TC.checkDeclarationAvailability(D, R.Start, DC);
25902588
if (maybeUnavail.hasValue()) {
25912589
if (accessor) {
2590+
bool forInout = Flags.contains(DeclAvailabilityFlag::ForInout);
25922591
TC.diagnosePotentialAccessorUnavailability(accessor, R, DC,
25932592
maybeUnavail.getValue(),
2594-
ForInout);
2593+
forInout);
25952594
} else {
25962595
TC.diagnosePotentialUnavailability(D, R, DC, maybeUnavail.getValue());
25972596
}
2598-
if (SignalOnPotentialUnavailability)
2597+
if (!Flags.contains(DeclAvailabilityFlag::ContinueOnPotentialUnavailability))
25992598
return true;
26002599
}
26012600
return false;
@@ -2769,13 +2768,8 @@ bool swift::diagnoseDeclAvailability(const ValueDecl *Decl,
27692768
TypeChecker &TC,
27702769
DeclContext *DC,
27712770
SourceRange R,
2772-
bool AllowPotentiallyUnavailableProtocol,
2773-
bool SignalOnPotentialUnavailability,
2774-
bool ForInout)
2771+
DeclAvailabilityFlags Flags)
27752772
{
27762773
AvailabilityWalker AW(TC, DC);
2777-
return AW.diagAvailability(Decl, R, nullptr,
2778-
AllowPotentiallyUnavailableProtocol,
2779-
SignalOnPotentialUnavailability,
2780-
ForInout);
2774+
return AW.diagAvailability(Decl, R, nullptr, Flags);
27812775
}

lib/Sema/TypeCheckAvailability.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "swift/AST/Identifier.h"
1818
#include "swift/Basic/LLVM.h"
1919
#include "swift/Basic/SourceLoc.h"
20+
#include "swift/Basic/OptionSet.h"
2021
#include "llvm/ADT/ArrayRef.h"
2122
#include "llvm/ADT/Optional.h"
2223

@@ -33,16 +34,21 @@ namespace swift {
3334
void diagAvailability(TypeChecker &TC, const Expr *E,
3435
DeclContext *DC);
3536

37+
enum class DeclAvailabilityFlag : uint8_t {
38+
AllowPotentiallyUnavailableProtocol = 1 << 0,
39+
ContinueOnPotentialUnavailability = 1 << 1,
40+
ForInout = 1 << 2,
41+
};
42+
using DeclAvailabilityFlags = OptionSet<DeclAvailabilityFlag>;
43+
3644
/// Run the Availability-diagnostics algorithm otherwise used in an expr
3745
/// context, but for non-expr contexts such as TypeDecls referenced from
3846
/// TypeReprs.
3947
bool diagnoseDeclAvailability(const ValueDecl *Decl,
4048
TypeChecker &TC,
4149
DeclContext *DC,
4250
SourceRange R,
43-
bool AllowPotentiallyUnavailableProtocol,
44-
bool SignalOnPotentialUnavailability,
45-
bool ForInout);
51+
DeclAvailabilityFlags Options);
4652

4753
void diagnoseUnavailableOverride(ValueDecl *override,
4854
const ValueDecl *base,

lib/Sema/TypeCheckType.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,16 +1544,17 @@ static Type resolveIdentTypeComponent(
15441544
static bool diagnoseAvailability(IdentTypeRepr *IdType,
15451545
DeclContext *DC,
15461546
bool AllowPotentiallyUnavailableProtocol) {
1547+
DeclAvailabilityFlags flags =
1548+
DeclAvailabilityFlag::ContinueOnPotentialUnavailability;
1549+
if (AllowPotentiallyUnavailableProtocol)
1550+
flags |= DeclAvailabilityFlag::AllowPotentiallyUnavailableProtocol;
15471551
ASTContext &ctx = DC->getASTContext();
15481552
auto componentRange = IdType->getComponentRange();
15491553
for (auto comp : componentRange) {
15501554
if (auto *typeDecl = comp->getBoundDecl()) {
15511555
assert(ctx.getLazyResolver() && "Must have a type checker!");
15521556
TypeChecker &tc = static_cast<TypeChecker &>(*ctx.getLazyResolver());
1553-
if (diagnoseDeclAvailability(typeDecl, tc, DC, comp->getIdLoc(),
1554-
AllowPotentiallyUnavailableProtocol,
1555-
/*SignalOnPotentialUnavailability*/false,
1556-
/*ForInout*/false)) {
1557+
if (diagnoseDeclAvailability(typeDecl, tc, DC, comp->getIdLoc(), flags)) {
15571558
return true;
15581559
}
15591560
}

0 commit comments

Comments
 (0)