@@ -2008,67 +2008,56 @@ 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
auto runningOS =
2064
2042
TypeChecker::overApproximateAvailabilityAtLocation (
2065
2043
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 ;
2071
2049
}
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);
2072
2061
}
2073
2062
2074
2063
// / Returns the diagnostic to emit for the potentially unavailable decl and sets
@@ -2996,45 +2985,13 @@ bool isSubscriptReturningString(const ValueDecl *D, ASTContext &Context) {
2996
2985
return resultTy->isString ();
2997
2986
}
2998
2987
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
-
3021
2988
bool swift::diagnoseParameterizedProtocolAvailability (
3022
2989
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);
3038
2995
}
3039
2996
3040
2997
static void
0 commit comments