@@ -2011,70 +2011,59 @@ static void fixAvailability(SourceRange ReferenceRange,
20112011 }
20122012}
20132013
2014- void TypeChecker::diagnosePotentialOpaqueTypeUnavailability (
2015- SourceRange ReferenceRange, const DeclContext *ReferenceDC,
2014+ void TypeChecker::diagnosePotentialUnavailability (
2015+ SourceRange ReferenceRange, Diag<StringRef, llvm::VersionTuple> Diag,
2016+ const DeclContext *ReferenceDC,
20162017 const UnavailabilityReason &Reason) {
20172018 ASTContext &Context = ReferenceDC->getASTContext ();
20182019
20192020 auto RequiredRange = Reason.getRequiredOSVersionRange ();
20202021 {
20212022 auto Err =
20222023 Context.Diags .diagnose (
2023- ReferenceRange.Start , diag::availability_opaque_types_only_version_newer ,
2024+ ReferenceRange.Start , Diag ,
20242025 prettyPlatformString (targetPlatform (Context.LangOpts )),
20252026 Reason.getRequiredOSVersionRange ().getLowerEndpoint ());
20262027
20272028 // Direct a fixit to the error if an existing guard is nearly-correct
2028- if (fixAvailabilityByNarrowingNearbyVersionCheck (ReferenceRange,
2029- ReferenceDC,
2030- RequiredRange, Context, Err))
2031- return ;
2032- }
2033- fixAvailability (ReferenceRange, ReferenceDC, RequiredRange, Context);
2034- }
2035-
2036- static void diagnosePotentialConcurrencyUnavailability (
2037- SourceRange ReferenceRange, const DeclContext *ReferenceDC,
2038- const UnavailabilityReason &Reason) {
2039- ASTContext &Context = ReferenceDC->getASTContext ();
2040-
2041- auto RequiredRange = Reason.getRequiredOSVersionRange ();
2042- {
2043- auto Err =
2044- Context.Diags .diagnose (
2045- ReferenceRange.Start ,
2046- diag::availability_concurrency_only_version_newer,
2047- prettyPlatformString (targetPlatform (Context.LangOpts )),
2048- Reason.getRequiredOSVersionRange ().getLowerEndpoint ());
2049-
2050- // Direct a fixit to the error if an existing guard is nearly-correct
2051- if (fixAvailabilityByNarrowingNearbyVersionCheck (ReferenceRange,
2052- ReferenceDC,
2053- RequiredRange, Context, Err))
2029+ if (fixAvailabilityByNarrowingNearbyVersionCheck (
2030+ ReferenceRange, ReferenceDC, RequiredRange, Context, Err))
20542031 return ;
20552032 }
20562033 fixAvailability (ReferenceRange, ReferenceDC, RequiredRange, Context);
20572034}
20582035
2059- void TypeChecker::checkConcurrencyAvailability (SourceRange ReferenceRange,
2060- const DeclContext *ReferenceDC) {
2061- // Check the availability of concurrency runtime support.
2036+ bool TypeChecker::checkAvailability (SourceRange ReferenceRange,
2037+ AvailabilityContext Availability,
2038+ Diag<StringRef, llvm::VersionTuple> Diag,
2039+ const DeclContext *ReferenceDC) {
20622040 ASTContext &ctx = ReferenceDC->getASTContext ();
20632041 if (ctx.LangOpts .DisableAvailabilityChecking )
2064- return ;
2042+ return false ;
20652043
20662044 if (!shouldCheckAvailability (ReferenceDC->getAsDecl ()))
2067- return ;
2045+ return false ;
20682046
20692047 auto runningOS =
20702048 TypeChecker::overApproximateAvailabilityAtLocation (
20712049 ReferenceRange.Start , ReferenceDC);
2072- auto availability = ctx. getBackDeployedConcurrencyAvailability ();
2073- if (!runningOS. isContainedIn (availability)) {
2074- diagnosePotentialConcurrencyUnavailability (
2075- ReferenceRange, ReferenceDC,
2076- UnavailabilityReason::requiresVersionRange (availability. getOSVersion ())) ;
2050+ if (!runningOS. isContainedIn (Availability)) {
2051+ diagnosePotentialUnavailability (
2052+ ReferenceRange, Diag, ReferenceDC,
2053+ UnavailabilityReason::requiresVersionRange (Availability. getOSVersion ()));
2054+ return true ;
20772055 }
2056+
2057+ return false ;
2058+ }
2059+
2060+ void TypeChecker::checkConcurrencyAvailability (SourceRange ReferenceRange,
2061+ const DeclContext *ReferenceDC) {
2062+ checkAvailability (
2063+ ReferenceRange,
2064+ ReferenceDC->getASTContext ().getBackDeployedConcurrencyAvailability (),
2065+ diag::availability_concurrency_only_version_newer,
2066+ ReferenceDC);
20782067}
20792068
20802069// / Returns the diagnostic to emit for the potentially unavailable decl and sets
@@ -3005,48 +2994,13 @@ bool isSubscriptReturningString(const ValueDecl *D, ASTContext &Context) {
30052994 return resultTy->isString ();
30062995}
30072996
3008- static bool diagnosePotentialParameterizedProtocolUnavailability (
3009- SourceRange ReferenceRange, const DeclContext *ReferenceDC,
3010- const UnavailabilityReason &Reason) {
3011- ASTContext &Context = ReferenceDC->getASTContext ();
3012-
3013- auto RequiredRange = Reason.getRequiredOSVersionRange ();
3014- {
3015- auto Err = Context.Diags .diagnose (
3016- ReferenceRange.Start ,
3017- diag::availability_parameterized_protocol_only_version_newer,
3018- prettyPlatformString (targetPlatform (Context.LangOpts )),
3019- Reason.getRequiredOSVersionRange ().getLowerEndpoint ());
3020-
3021- // Direct a fixit to the error if an existing guard is nearly-correct
3022- if (fixAvailabilityByNarrowingNearbyVersionCheck (
3023- ReferenceRange, ReferenceDC, RequiredRange, Context, Err))
3024- return true ;
3025- }
3026- fixAvailability (ReferenceRange, ReferenceDC, RequiredRange, Context);
3027- return true ;
3028- }
3029-
30302997bool swift::diagnoseParameterizedProtocolAvailability (
30312998 SourceRange ReferenceRange, const DeclContext *ReferenceDC) {
3032- // Check the availability of parameterized existential runtime support.
3033- ASTContext &ctx = ReferenceDC->getASTContext ();
3034- if (ctx.LangOpts .DisableAvailabilityChecking )
3035- return false ;
3036-
3037- if (!shouldCheckAvailability (ReferenceDC->getAsDecl ()))
3038- return false ;
3039-
3040- auto runningOS = TypeChecker::overApproximateAvailabilityAtLocation (
3041- ReferenceRange.Start , ReferenceDC);
3042- auto availability = ctx.getParameterizedExistentialRuntimeAvailability ();
3043- if (!runningOS.isContainedIn (availability)) {
3044- return diagnosePotentialParameterizedProtocolUnavailability (
3045- ReferenceRange, ReferenceDC,
3046- UnavailabilityReason::requiresVersionRange (
3047- availability.getOSVersion ()));
3048- }
3049- return false ;
2999+ return TypeChecker::checkAvailability (
3000+ ReferenceRange,
3001+ ReferenceDC->getASTContext ().getParameterizedExistentialRuntimeAvailability (),
3002+ diag::availability_parameterized_protocol_only_version_newer,
3003+ ReferenceDC);
30503004}
30513005
30523006static void
0 commit comments