Skip to content

Commit 0901790

Browse files
committed
Sema: Clean up some duplicated code in availability checking
1 parent 02258c1 commit 0901790

File tree

3 files changed

+46
-91
lines changed

3 files changed

+46
-91
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 32 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,67 +2008,56 @@ 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
auto runningOS =
20642042
TypeChecker::overApproximateAvailabilityAtLocation(
20652043
ReferenceRange.Start, ReferenceDC);
2066-
auto availability = ctx.getBackDeployedConcurrencyAvailability();
2067-
if (!runningOS.isContainedIn(availability)) {
2068-
diagnosePotentialConcurrencyUnavailability(
2069-
ReferenceRange, ReferenceDC,
2070-
UnavailabilityReason::requiresVersionRange(availability.getOSVersion()));
2044+
if (!runningOS.isContainedIn(Availability)) {
2045+
diagnosePotentialUnavailability(
2046+
ReferenceRange, Diag, ReferenceDC,
2047+
UnavailabilityReason::requiresVersionRange(Availability.getOSVersion()));
2048+
return true;
20712049
}
2050+
2051+
return false;
2052+
}
2053+
2054+
void TypeChecker::checkConcurrencyAvailability(SourceRange ReferenceRange,
2055+
const DeclContext *ReferenceDC) {
2056+
checkAvailability(
2057+
ReferenceRange,
2058+
ReferenceDC->getASTContext().getBackDeployedConcurrencyAvailability(),
2059+
diag::availability_concurrency_only_version_newer,
2060+
ReferenceDC);
20722061
}
20732062

20742063
/// Returns the diagnostic to emit for the potentially unavailable decl and sets
@@ -2996,45 +2985,13 @@ bool isSubscriptReturningString(const ValueDecl *D, ASTContext &Context) {
29962985
return resultTy->isString();
29972986
}
29982987

2999-
static bool diagnosePotentialParameterizedProtocolUnavailability(
3000-
SourceRange ReferenceRange, const DeclContext *ReferenceDC,
3001-
const UnavailabilityReason &Reason) {
3002-
ASTContext &Context = ReferenceDC->getASTContext();
3003-
3004-
auto RequiredRange = Reason.getRequiredOSVersionRange();
3005-
{
3006-
auto Err = Context.Diags.diagnose(
3007-
ReferenceRange.Start,
3008-
diag::availability_parameterized_protocol_only_version_newer,
3009-
prettyPlatformString(targetPlatform(Context.LangOpts)),
3010-
Reason.getRequiredOSVersionRange().getLowerEndpoint());
3011-
3012-
// Direct a fixit to the error if an existing guard is nearly-correct
3013-
if (fixAvailabilityByNarrowingNearbyVersionCheck(
3014-
ReferenceRange, ReferenceDC, RequiredRange, Context, Err))
3015-
return true;
3016-
}
3017-
fixAvailability(ReferenceRange, ReferenceDC, RequiredRange, Context);
3018-
return true;
3019-
}
3020-
30212988
bool swift::diagnoseParameterizedProtocolAvailability(
30222989
SourceRange ReferenceRange, const DeclContext *ReferenceDC) {
3023-
// Check the availability of parameterized existential runtime support.
3024-
ASTContext &ctx = ReferenceDC->getASTContext();
3025-
if (ctx.LangOpts.DisableAvailabilityChecking)
3026-
return false;
3027-
3028-
auto runningOS = TypeChecker::overApproximateAvailabilityAtLocation(
3029-
ReferenceRange.Start, ReferenceDC);
3030-
auto availability = ctx.getParameterizedExistentialRuntimeAvailability();
3031-
if (!runningOS.isContainedIn(availability)) {
3032-
return diagnosePotentialParameterizedProtocolUnavailability(
3033-
ReferenceRange, ReferenceDC,
3034-
UnavailabilityReason::requiresVersionRange(
3035-
availability.getOSVersion()));
3036-
}
3037-
return false;
2990+
return TypeChecker::checkAvailability(
2991+
ReferenceRange,
2992+
ReferenceDC->getASTContext().getParameterizedExistentialRuntimeAvailability(),
2993+
diag::availability_parameterized_protocol_only_version_newer,
2994+
ReferenceDC);
30382995
}
30392996

30402997
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)