2121#include " TypeCheckType.h"
2222#include " TypeChecker.h"
2323#include " swift/AST/ASTWalker.h"
24+ #include " swift/AST/AvailabilityDomain.h"
2425#include " swift/AST/AvailabilityScope.h"
2526#include " swift/AST/ClangModuleLoader.h"
2627#include " swift/AST/DiagnosticsParse.h"
@@ -2961,32 +2962,37 @@ class UnavailabilityDiagnosticInfo {
29612962private:
29622963 Status DiagnosticStatus;
29632964 const AvailableAttr *Attr;
2964- StringRef Platform;
2965- StringRef VersionedPlatform;
2965+ AvailabilityDomain Domain;
29662966
29672967public:
29682968 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) {
29722971 assert (attr);
2973- assert (status == Status::AlwaysUnavailable || !VersionedPlatform.empty ());
29742972 };
29752973
29762974 Status getStatus () const { return DiagnosticStatus; }
29772975 const AvailableAttr *getAttr () const { return Attr; }
2976+ AvailabilityDomain getDomain () const { return Domain; }
2977+ StringRef getDomainName () const { return Domain.getNameForDiagnostics (); }
29782978
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 ;
29832985
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+ }
29902996 }
29912997};
29922998
@@ -2998,32 +3004,7 @@ getExplicitUnavailabilityDiagnosticInfo(const Decl *decl,
29983004 return std::nullopt ;
29993005
30003006 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);
30273008
30283009 switch (attr->getVersionAvailability (ctx)) {
30293010 case AvailableVersionComparison::Available:
@@ -3036,18 +3017,17 @@ getExplicitUnavailabilityDiagnosticInfo(const Decl *decl,
30363017 attr->Introduced .has_value ()) {
30373018 return UnavailabilityDiagnosticInfo (
30383019 UnavailabilityDiagnosticInfo::Status::IntroducedInVersion, attr,
3039- platform, versionedPlatform );
3020+ domain );
30403021 } else {
30413022 return UnavailabilityDiagnosticInfo (
30423023 UnavailabilityDiagnosticInfo::Status::AlwaysUnavailable, attr,
3043- platform, versionedPlatform );
3024+ domain );
30443025 }
30453026 break ;
30463027
30473028 case AvailableVersionComparison::Obsoleted:
30483029 return UnavailabilityDiagnosticInfo (
3049- UnavailabilityDiagnosticInfo::Status::Obsoleted, attr, platform,
3050- versionedPlatform);
3030+ UnavailabilityDiagnosticInfo::Status::Obsoleted, attr, domain);
30513031 }
30523032}
30533033
@@ -3069,7 +3049,11 @@ bool diagnoseExplicitUnavailability(
30693049
30703050 auto type = rootConf->getType ();
30713051 auto proto = rootConf->getProtocol ()->getDeclaredInterfaceType ();
3072- StringRef platform = diagnosticInfo->getPlatform ();
3052+ StringRef versionedPlatform = diagnosticInfo->getDomainName ();
3053+ StringRef platform =
3054+ diagnosticInfo->shouldHideDomainNameInUnversionedDiagnostics ()
3055+ ? " "
3056+ : versionedPlatform;
30733057 const AvailableAttr *attr = diagnosticInfo->getAttr ();
30743058
30753059 // Downgrade unavailable Sendable conformance diagnostics where
@@ -3093,13 +3077,12 @@ bool diagnoseExplicitUnavailability(
30933077 break ;
30943078 case UnavailabilityDiagnosticInfo::Status::IntroducedInVersion:
30953079 diags.diagnose (ext, diag::conformance_availability_introduced_in_version,
3096- type, proto, diagnosticInfo->getVersionedPlatform (),
3097- *attr->Introduced );
3080+ type, proto, versionedPlatform, *attr->Introduced );
30983081 break ;
30993082 case UnavailabilityDiagnosticInfo::Status::Obsoleted:
31003083 diags
31013084 .diagnose (ext, diag::conformance_availability_obsoleted, type, proto,
3102- diagnosticInfo-> getVersionedPlatform () , *attr->Obsoleted )
3085+ versionedPlatform , *attr->Obsoleted )
31033086 .highlight (attr->getRange ());
31043087 break ;
31053088 }
@@ -3496,7 +3479,11 @@ bool diagnoseExplicitUnavailability(
34963479 SourceLoc Loc = R.Start ;
34973480 ASTContext &ctx = D->getASTContext ();
34983481 auto &diags = ctx.Diags ;
3499- StringRef platform = diagnosticInfo->getPlatform ();
3482+ StringRef versionedPlatform = diagnosticInfo->getDomainName ();
3483+ StringRef platform =
3484+ diagnosticInfo->shouldHideDomainNameInUnversionedDiagnostics ()
3485+ ? " "
3486+ : versionedPlatform;
35003487
35013488 // TODO: Consider removing this.
35023489 // ObjC keypaths components weren't checked previously, so errors are demoted
@@ -3549,13 +3536,13 @@ bool diagnoseExplicitUnavailability(
35493536 case UnavailabilityDiagnosticInfo::Status::IntroducedInVersion:
35503537 diags
35513538 .diagnose (D, diag::availability_introduced_in_version, D,
3552- diagnosticInfo-> getVersionedPlatform () , *Attr->Introduced )
3539+ versionedPlatform , *Attr->Introduced )
35533540 .highlight (Attr->getRange ());
35543541 break ;
35553542 case UnavailabilityDiagnosticInfo::Status::Obsoleted:
35563543 diags
3557- .diagnose (D, diag::availability_obsoleted, D,
3558- diagnosticInfo-> getVersionedPlatform (), *Attr->Obsoleted )
3544+ .diagnose (D, diag::availability_obsoleted, D, versionedPlatform,
3545+ *Attr->Obsoleted )
35593546 .highlight (Attr->getRange ());
35603547 break ;
35613548 }
0 commit comments