@@ -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-
30212988bool 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
30402997static void
0 commit comments