Skip to content

Commit 7cf5d4b

Browse files
committed
AST: Adopt AvailabilityDomain in unavailability diagnostics.
1 parent 9b7764a commit 7cf5d4b

File tree

3 files changed

+60
-54
lines changed

3 files changed

+60
-54
lines changed

include/swift/AST/AvailabilityDomain.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ class AvailabilityDomain final {
7272
return AvailabilityDomain(Kind::PackageDescription);
7373
}
7474

75+
Kind getKind() const { return kind; }
76+
7577
bool isUniversal() const { return kind == Kind::Universal; }
7678

7779
bool isPlatform() const { return kind == Kind::Platform; }
@@ -86,6 +88,10 @@ class AvailabilityDomain final {
8688
return platform;
8789
}
8890

91+
/// Returns the string to use in diagnostics to identify the domain. May
92+
/// return an empty string.
93+
llvm::StringRef getNameForDiagnostics() const;
94+
8995
/// Returns the string to use when printing an `@available` attribute.
9096
llvm::StringRef getNameForAttributePrinting() const;
9197
};

lib/AST/AvailabilityDomain.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ Decl::getDomainForAvailableAttr(const AvailableAttr *attr) const {
3636
}
3737
}
3838

39+
llvm::StringRef AvailabilityDomain::getNameForDiagnostics() const {
40+
switch (kind) {
41+
case Kind::Universal:
42+
return "";
43+
case Kind::Platform:
44+
return swift::prettyPlatformString(getPlatformKind());
45+
case Kind::SwiftLanguage:
46+
return "Swift";
47+
case Kind::PackageDescription:
48+
return "PackageDescription";
49+
}
50+
}
51+
3952
llvm::StringRef AvailabilityDomain::getNameForAttributePrinting() const {
4053
switch (kind) {
4154
case Kind::Universal:

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 41 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
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 {
29612962
private:
29622963
Status DiagnosticStatus;
29632964
const AvailableAttr *Attr;
2964-
StringRef Platform;
2965-
StringRef VersionedPlatform;
2965+
AvailabilityDomain Domain;
29662966

29672967
public:
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

Comments
 (0)