@@ -2008,70 +2008,59 @@ static void fixAvailability(SourceRange ReferenceRange,
2008
2008
}
2009
2009
}
2010
2010
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,
2013
2014
const UnavailabilityReason &Reason) {
2014
2015
ASTContext &Context = ReferenceDC->getASTContext ();
2015
2016
2016
2017
auto RequiredRange = Reason.getRequiredOSVersionRange ();
2017
2018
{
2018
2019
auto Err =
2019
2020
Context.Diags .diagnose (
2020
- ReferenceRange.Start , diag::availability_opaque_types_only_version_newer ,
2021
+ ReferenceRange.Start , Diag ,
2021
2022
prettyPlatformString (targetPlatform (Context.LangOpts )),
2022
2023
Reason.getRequiredOSVersionRange ().getLowerEndpoint ());
2023
2024
2024
2025
// 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))
2051
2028
return ;
2052
2029
}
2053
2030
fixAvailability (ReferenceRange, ReferenceDC, RequiredRange, Context);
2054
2031
}
2055
2032
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) {
2059
2037
ASTContext &ctx = ReferenceDC->getASTContext ();
2060
2038
if (ctx.LangOpts .DisableAvailabilityChecking )
2061
- return ;
2039
+ return false ;
2062
2040
2063
2041
if (!shouldCheckAvailability (ReferenceDC->getAsDecl ()))
2064
2042
return ;
2065
2043
2066
2044
auto runningOS =
2067
2045
TypeChecker::overApproximateAvailabilityAtLocation (
2068
2046
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 ;
2074
2052
}
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);
2075
2064
}
2076
2065
2077
2066
// / Returns the diagnostic to emit for the potentially unavailable decl and sets
@@ -3002,48 +2991,13 @@ bool isSubscriptReturningString(const ValueDecl *D, ASTContext &Context) {
3002
2991
return resultTy->isString ();
3003
2992
}
3004
2993
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
-
3027
2994
bool swift::diagnoseParameterizedProtocolAvailability (
3028
2995
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);
3047
3001
}
3048
3002
3049
3003
static void
0 commit comments