21
21
#include " TypeCheckType.h"
22
22
#include " TypeChecker.h"
23
23
#include " swift/AST/ASTWalker.h"
24
+ #include " swift/AST/AvailabilityDomain.h"
24
25
#include " swift/AST/AvailabilityScope.h"
25
26
#include " swift/AST/ClangModuleLoader.h"
26
27
#include " swift/AST/DiagnosticsParse.h"
@@ -2961,32 +2962,37 @@ class UnavailabilityDiagnosticInfo {
2961
2962
private:
2962
2963
Status DiagnosticStatus;
2963
2964
const AvailableAttr *Attr;
2964
- StringRef Platform;
2965
- StringRef VersionedPlatform;
2965
+ AvailabilityDomain Domain;
2966
2966
2967
2967
public:
2968
2968
UnavailabilityDiagnosticInfo (Status status, const AvailableAttr *attr,
2969
- StringRef platform, StringRef versionedPlatform)
2970
- : DiagnosticStatus(status), Attr(attr), Platform(platform),
2971
- VersionedPlatform (versionedPlatform) {
2969
+ AvailabilityDomain domain)
2970
+ : DiagnosticStatus(status), Attr(attr), Domain(domain) {
2972
2971
assert (attr);
2973
- assert (status == Status::AlwaysUnavailable || !VersionedPlatform.empty ());
2974
2972
};
2975
2973
2976
2974
Status getStatus () const { return DiagnosticStatus; }
2977
2975
const AvailableAttr *getAttr () const { return Attr; }
2976
+ AvailabilityDomain getDomain () const { return Domain; }
2977
+ StringRef getDomainName () const { return Domain.getNameForDiagnostics (); }
2978
2978
2979
- // / Returns the platform name (or "Swift" for a declaration that is
2980
- // / unavailable in Swift) to print in the main unavailability diangostic. May
2981
- // / be empty.
2982
- StringRef getPlatform () const { return Platform; }
2979
+ bool shouldHideDomainNameInUnversionedDiagnostics () const {
2980
+ switch (getDomain ().getKind ()) {
2981
+ case AvailabilityDomain::Kind::Universal:
2982
+ return true ;
2983
+ case AvailabilityDomain::Kind::Platform:
2984
+ return false ;
2983
2985
2984
- // / Returns the platform name to print in diagnostic notes about the version
2985
- // / in which a declaration either will become available or previously became
2986
- // / obsoleted.
2987
- StringRef getVersionedPlatform () const {
2988
- assert (DiagnosticStatus != Status::AlwaysUnavailable);
2989
- return VersionedPlatform;
2986
+ case AvailabilityDomain::Kind::PackageDescription:
2987
+ case AvailabilityDomain::Kind::SwiftLanguage:
2988
+ switch (DiagnosticStatus) {
2989
+ case Status::AlwaysUnavailable:
2990
+ return false ;
2991
+ case Status::IntroducedInVersion:
2992
+ case Status::Obsoleted:
2993
+ return true ;
2994
+ }
2995
+ }
2990
2996
}
2991
2997
};
2992
2998
@@ -2998,32 +3004,7 @@ getExplicitUnavailabilityDiagnosticInfo(const Decl *decl,
2998
3004
return std::nullopt;
2999
3005
3000
3006
ASTContext &ctx = decl->getASTContext ();
3001
- StringRef platform = " " ;
3002
- StringRef versionedPlatform = " " ;
3003
- switch (attr->getPlatformAgnosticAvailability ()) {
3004
- case PlatformAgnosticAvailabilityKind::Deprecated:
3005
- llvm_unreachable (" shouldn't see deprecations in explicit unavailability" );
3006
-
3007
- case PlatformAgnosticAvailabilityKind::NoAsync:
3008
- llvm_unreachable (" shouldn't see noasync in explicit unavailability" );
3009
-
3010
- case PlatformAgnosticAvailabilityKind::None:
3011
- case PlatformAgnosticAvailabilityKind::Unavailable:
3012
- if (attr->getPlatform () != PlatformKind::none) {
3013
- platform = attr->prettyPlatformString ();
3014
- versionedPlatform = platform;
3015
- }
3016
- break ;
3017
- case PlatformAgnosticAvailabilityKind::SwiftVersionSpecific:
3018
- versionedPlatform = " Swift" ;
3019
- break ;
3020
- case PlatformAgnosticAvailabilityKind::PackageDescriptionVersionSpecific:
3021
- versionedPlatform = " PackageDescription" ;
3022
- break ;
3023
- case PlatformAgnosticAvailabilityKind::UnavailableInSwift:
3024
- platform = " Swift" ;
3025
- break ;
3026
- }
3007
+ auto domain = decl->getDomainForAvailableAttr (attr);
3027
3008
3028
3009
switch (attr->getVersionAvailability (ctx)) {
3029
3010
case AvailableVersionComparison::Available:
@@ -3036,18 +3017,17 @@ getExplicitUnavailabilityDiagnosticInfo(const Decl *decl,
3036
3017
attr->Introduced .has_value ()) {
3037
3018
return UnavailabilityDiagnosticInfo (
3038
3019
UnavailabilityDiagnosticInfo::Status::IntroducedInVersion, attr,
3039
- platform, versionedPlatform );
3020
+ domain );
3040
3021
} else {
3041
3022
return UnavailabilityDiagnosticInfo (
3042
3023
UnavailabilityDiagnosticInfo::Status::AlwaysUnavailable, attr,
3043
- platform, versionedPlatform );
3024
+ domain );
3044
3025
}
3045
3026
break ;
3046
3027
3047
3028
case AvailableVersionComparison::Obsoleted:
3048
3029
return UnavailabilityDiagnosticInfo (
3049
- UnavailabilityDiagnosticInfo::Status::Obsoleted, attr, platform,
3050
- versionedPlatform);
3030
+ UnavailabilityDiagnosticInfo::Status::Obsoleted, attr, domain);
3051
3031
}
3052
3032
}
3053
3033
@@ -3069,7 +3049,11 @@ bool diagnoseExplicitUnavailability(
3069
3049
3070
3050
auto type = rootConf->getType ();
3071
3051
auto proto = rootConf->getProtocol ()->getDeclaredInterfaceType ();
3072
- StringRef platform = diagnosticInfo->getPlatform ();
3052
+ StringRef versionedPlatform = diagnosticInfo->getDomainName ();
3053
+ StringRef platform =
3054
+ diagnosticInfo->shouldHideDomainNameInUnversionedDiagnostics ()
3055
+ ? " "
3056
+ : versionedPlatform;
3073
3057
const AvailableAttr *attr = diagnosticInfo->getAttr ();
3074
3058
3075
3059
// Downgrade unavailable Sendable conformance diagnostics where
@@ -3093,13 +3077,12 @@ bool diagnoseExplicitUnavailability(
3093
3077
break ;
3094
3078
case UnavailabilityDiagnosticInfo::Status::IntroducedInVersion:
3095
3079
diags.diagnose (ext, diag::conformance_availability_introduced_in_version,
3096
- type, proto, diagnosticInfo->getVersionedPlatform (),
3097
- *attr->Introduced );
3080
+ type, proto, versionedPlatform, *attr->Introduced );
3098
3081
break ;
3099
3082
case UnavailabilityDiagnosticInfo::Status::Obsoleted:
3100
3083
diags
3101
3084
.diagnose (ext, diag::conformance_availability_obsoleted, type, proto,
3102
- diagnosticInfo-> getVersionedPlatform () , *attr->Obsoleted )
3085
+ versionedPlatform , *attr->Obsoleted )
3103
3086
.highlight (attr->getRange ());
3104
3087
break ;
3105
3088
}
@@ -3496,7 +3479,11 @@ bool diagnoseExplicitUnavailability(
3496
3479
SourceLoc Loc = R.Start ;
3497
3480
ASTContext &ctx = D->getASTContext ();
3498
3481
auto &diags = ctx.Diags ;
3499
- StringRef platform = diagnosticInfo->getPlatform ();
3482
+ StringRef versionedPlatform = diagnosticInfo->getDomainName ();
3483
+ StringRef platform =
3484
+ diagnosticInfo->shouldHideDomainNameInUnversionedDiagnostics ()
3485
+ ? " "
3486
+ : versionedPlatform;
3500
3487
3501
3488
// TODO: Consider removing this.
3502
3489
// ObjC keypaths components weren't checked previously, so errors are demoted
@@ -3549,13 +3536,13 @@ bool diagnoseExplicitUnavailability(
3549
3536
case UnavailabilityDiagnosticInfo::Status::IntroducedInVersion:
3550
3537
diags
3551
3538
.diagnose (D, diag::availability_introduced_in_version, D,
3552
- diagnosticInfo-> getVersionedPlatform () , *Attr->Introduced )
3539
+ versionedPlatform , *Attr->Introduced )
3553
3540
.highlight (Attr->getRange ());
3554
3541
break ;
3555
3542
case UnavailabilityDiagnosticInfo::Status::Obsoleted:
3556
3543
diags
3557
- .diagnose (D, diag::availability_obsoleted, D,
3558
- diagnosticInfo-> getVersionedPlatform (), *Attr->Obsoleted )
3544
+ .diagnose (D, diag::availability_obsoleted, D, versionedPlatform,
3545
+ *Attr->Obsoleted )
3559
3546
.highlight (Attr->getRange ());
3560
3547
break ;
3561
3548
}
0 commit comments