Skip to content

Commit 6f7d747

Browse files
committed
Sema: Clean up some duplicated code in availability checking
1 parent 4a631ee commit 6f7d747

File tree

3 files changed

+46
-94
lines changed

3 files changed

+46
-94
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 32 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,70 +2008,59 @@ static void fixAvailability(SourceRange ReferenceRange,
20082008
}
20092009
}
20102010

2011-
void TypeChecker::diagnosePotentialOpaqueTypeUnavailability(
2012-
SourceRange ReferenceRange, const DeclContext *ReferenceDC,
2011+
void TypeChecker::diagnosePotentialUnavailability(
2012+
SourceRange ReferenceRange, Diag<StringRef, llvm::VersionTuple> Diag,
2013+
const DeclContext *ReferenceDC,
20132014
const UnavailabilityReason &Reason) {
20142015
ASTContext &Context = ReferenceDC->getASTContext();
20152016

20162017
auto RequiredRange = Reason.getRequiredOSVersionRange();
20172018
{
20182019
auto Err =
20192020
Context.Diags.diagnose(
2020-
ReferenceRange.Start, diag::availability_opaque_types_only_version_newer,
2021+
ReferenceRange.Start, Diag,
20212022
prettyPlatformString(targetPlatform(Context.LangOpts)),
20222023
Reason.getRequiredOSVersionRange().getLowerEndpoint());
20232024

20242025
// Direct a fixit to the error if an existing guard is nearly-correct
2025-
if (fixAvailabilityByNarrowingNearbyVersionCheck(ReferenceRange,
2026-
ReferenceDC,
2027-
RequiredRange, Context, Err))
2028-
return;
2029-
}
2030-
fixAvailability(ReferenceRange, ReferenceDC, RequiredRange, Context);
2031-
}
2032-
2033-
static void diagnosePotentialConcurrencyUnavailability(
2034-
SourceRange ReferenceRange, const DeclContext *ReferenceDC,
2035-
const UnavailabilityReason &Reason) {
2036-
ASTContext &Context = ReferenceDC->getASTContext();
2037-
2038-
auto RequiredRange = Reason.getRequiredOSVersionRange();
2039-
{
2040-
auto Err =
2041-
Context.Diags.diagnose(
2042-
ReferenceRange.Start,
2043-
diag::availability_concurrency_only_version_newer,
2044-
prettyPlatformString(targetPlatform(Context.LangOpts)),
2045-
Reason.getRequiredOSVersionRange().getLowerEndpoint());
2046-
2047-
// Direct a fixit to the error if an existing guard is nearly-correct
2048-
if (fixAvailabilityByNarrowingNearbyVersionCheck(ReferenceRange,
2049-
ReferenceDC,
2050-
RequiredRange, Context, Err))
2026+
if (fixAvailabilityByNarrowingNearbyVersionCheck(
2027+
ReferenceRange, ReferenceDC, RequiredRange, Context, Err))
20512028
return;
20522029
}
20532030
fixAvailability(ReferenceRange, ReferenceDC, RequiredRange, Context);
20542031
}
20552032

2056-
void TypeChecker::checkConcurrencyAvailability(SourceRange ReferenceRange,
2057-
const DeclContext *ReferenceDC) {
2058-
// Check the availability of concurrency runtime support.
2033+
bool TypeChecker::checkAvailability(SourceRange ReferenceRange,
2034+
AvailabilityContext Availability,
2035+
Diag<StringRef, llvm::VersionTuple> Diag,
2036+
const DeclContext *ReferenceDC) {
20592037
ASTContext &ctx = ReferenceDC->getASTContext();
20602038
if (ctx.LangOpts.DisableAvailabilityChecking)
2061-
return;
2039+
return false;
20622040

20632041
if (!shouldCheckAvailability(ReferenceDC->getAsDecl()))
20642042
return;
20652043

20662044
auto runningOS =
20672045
TypeChecker::overApproximateAvailabilityAtLocation(
20682046
ReferenceRange.Start, ReferenceDC);
2069-
auto availability = ctx.getBackDeployedConcurrencyAvailability();
2070-
if (!runningOS.isContainedIn(availability)) {
2071-
diagnosePotentialConcurrencyUnavailability(
2072-
ReferenceRange, ReferenceDC,
2073-
UnavailabilityReason::requiresVersionRange(availability.getOSVersion()));
2047+
if (!runningOS.isContainedIn(Availability)) {
2048+
diagnosePotentialUnavailability(
2049+
ReferenceRange, Diag, ReferenceDC,
2050+
UnavailabilityReason::requiresVersionRange(Availability.getOSVersion()));
2051+
return true;
20742052
}
2053+
2054+
return false;
2055+
}
2056+
2057+
void TypeChecker::checkConcurrencyAvailability(SourceRange ReferenceRange,
2058+
const DeclContext *ReferenceDC) {
2059+
checkAvailability(
2060+
ReferenceRange,
2061+
ReferenceDC->getASTContext().getBackDeployedConcurrencyAvailability(),
2062+
diag::availability_concurrency_only_version_newer,
2063+
ReferenceDC);
20752064
}
20762065

20772066
/// Returns the diagnostic to emit for the potentially unavailable decl and sets
@@ -3002,48 +2991,13 @@ bool isSubscriptReturningString(const ValueDecl *D, ASTContext &Context) {
30022991
return resultTy->isString();
30032992
}
30042993

3005-
static bool diagnosePotentialParameterizedProtocolUnavailability(
3006-
SourceRange ReferenceRange, const DeclContext *ReferenceDC,
3007-
const UnavailabilityReason &Reason) {
3008-
ASTContext &Context = ReferenceDC->getASTContext();
3009-
3010-
auto RequiredRange = Reason.getRequiredOSVersionRange();
3011-
{
3012-
auto Err = Context.Diags.diagnose(
3013-
ReferenceRange.Start,
3014-
diag::availability_parameterized_protocol_only_version_newer,
3015-
prettyPlatformString(targetPlatform(Context.LangOpts)),
3016-
Reason.getRequiredOSVersionRange().getLowerEndpoint());
3017-
3018-
// Direct a fixit to the error if an existing guard is nearly-correct
3019-
if (fixAvailabilityByNarrowingNearbyVersionCheck(
3020-
ReferenceRange, ReferenceDC, RequiredRange, Context, Err))
3021-
return true;
3022-
}
3023-
fixAvailability(ReferenceRange, ReferenceDC, RequiredRange, Context);
3024-
return true;
3025-
}
3026-
30272994
bool swift::diagnoseParameterizedProtocolAvailability(
30282995
SourceRange ReferenceRange, const DeclContext *ReferenceDC) {
3029-
// Check the availability of parameterized existential runtime support.
3030-
ASTContext &ctx = ReferenceDC->getASTContext();
3031-
if (ctx.LangOpts.DisableAvailabilityChecking)
3032-
return false;
3033-
3034-
if (!shouldCheckAvailability(ReferenceDC->getAsDecl()))
3035-
return false;
3036-
3037-
auto runningOS = TypeChecker::overApproximateAvailabilityAtLocation(
3038-
ReferenceRange.Start, ReferenceDC);
3039-
auto availability = ctx.getParameterizedExistentialRuntimeAvailability();
3040-
if (!runningOS.isContainedIn(availability)) {
3041-
return diagnosePotentialParameterizedProtocolUnavailability(
3042-
ReferenceRange, ReferenceDC,
3043-
UnavailabilityReason::requiresVersionRange(
3044-
availability.getOSVersion()));
3045-
}
3046-
return false;
2996+
return TypeChecker::checkAvailability(
2997+
ReferenceRange,
2998+
ReferenceDC->getASTContext().getParameterizedExistentialRuntimeAvailability(),
2999+
diag::availability_parameterized_protocol_only_version_newer,
3000+
ReferenceDC);
30473001
}
30483002

30493003
static void

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,11 @@ OpaqueResultTypeRequest::evaluate(Evaluator &evaluator,
8585
}
8686

8787
// Check the availability of the opaque type runtime support.
88-
if (!ctx.LangOpts.DisableAvailabilityChecking) {
89-
auto runningOS =
90-
TypeChecker::overApproximateAvailabilityAtLocation(
91-
repr->getLoc(),
92-
originatingDecl->getInnermostDeclContext());
93-
auto availability = ctx.getOpaqueTypeAvailability();
94-
if (!runningOS.isContainedIn(availability)) {
95-
TypeChecker::diagnosePotentialOpaqueTypeUnavailability(
96-
repr->getSourceRange(),
97-
originatingDecl->getInnermostDeclContext(),
98-
UnavailabilityReason::requiresVersionRange(availability.getOSVersion()));
99-
}
100-
}
88+
TypeChecker::checkAvailability(
89+
repr->getSourceRange(),
90+
ctx.getOpaqueTypeAvailability(),
91+
diag::availability_opaque_types_only_version_newer,
92+
originatingDecl->getInnermostDeclContext());
10193

10294
// Create a generic signature for the opaque environment. This is the outer
10395
// generic signature with an added generic parameters representing the opaque

lib/Sema/TypeChecker.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,16 +1117,22 @@ void diagnosePotentialUnavailability(const RootProtocolConformance *rootConf,
11171117
const UnavailabilityReason &reason);
11181118

11191119
void
1120-
diagnosePotentialOpaqueTypeUnavailability(SourceRange ReferenceRange,
1121-
const DeclContext *ReferenceDC,
1122-
const UnavailabilityReason &Reason);
1120+
diagnosePotentialUnavailability(SourceRange ReferenceRange,
1121+
Diag<StringRef, llvm::VersionTuple> Diag,
1122+
const DeclContext *ReferenceDC,
1123+
const UnavailabilityReason &Reason);
11231124

11241125
/// Type check a 'distributed actor' declaration.
11251126
void checkDistributedActor(SourceFile *SF, NominalTypeDecl *decl);
11261127

11271128
/// Type check a single 'distributed func' declaration.
11281129
void checkDistributedFunc(FuncDecl *func);
11291130

1131+
bool checkAvailability(SourceRange ReferenceRange,
1132+
AvailabilityContext Availability,
1133+
Diag<StringRef, llvm::VersionTuple> Diag,
1134+
const DeclContext *ReferenceDC);
1135+
11301136
void checkConcurrencyAvailability(SourceRange ReferenceRange,
11311137
const DeclContext *ReferenceDC);
11321138

0 commit comments

Comments
 (0)