Skip to content

Commit e719d71

Browse files
committed
Sema: Adopt SemanticAvailableAttr more thoroughly in unavailability diagnostics.
1 parent d0b418b commit e719d71

File tree

1 file changed

+29
-27
lines changed

1 file changed

+29
-27
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3035,7 +3035,7 @@ class UnavailabilityDiagnosticInfo {
30353035
: DiagnosticStatus(status), Attr(attr) {};
30363036

30373037
Status getStatus() const { return DiagnosticStatus; }
3038-
const AvailableAttr *getAttr() const { return Attr.getParsedAttr(); }
3038+
SemanticAvailableAttr getAttr() const { return Attr; }
30393039
AvailabilityDomain getDomain() const { return Attr.getDomain(); }
30403040
StringRef getDomainName() const {
30413041
return getDomain().getNameForDiagnostics();
@@ -3116,14 +3116,14 @@ bool diagnoseExplicitUnavailability(
31163116
diagnosticInfo->shouldHideDomainNameInUnversionedDiagnostics()
31173117
? ""
31183118
: versionedPlatform;
3119-
const AvailableAttr *attr = diagnosticInfo->getAttr();
3119+
auto attr = diagnosticInfo->getAttr();
31203120

31213121
// Downgrade unavailable Sendable conformance diagnostics where
31223122
// appropriate.
31233123
auto behavior =
31243124
behaviorLimitForExplicitUnavailability(rootConf, where.getDeclContext());
31253125

3126-
EncodedDiagnosticMessage EncodedMessage(attr->Message);
3126+
EncodedDiagnosticMessage EncodedMessage(attr.getMessage());
31273127
diags
31283128
.diagnose(loc, diag::conformance_availability_unavailable, type, proto,
31293129
platform.empty(), platform, EncodedMessage.Message)
@@ -3135,17 +3135,17 @@ bool diagnoseExplicitUnavailability(
31353135
diags
31363136
.diagnose(ext, diag::conformance_availability_marked_unavailable, type,
31373137
proto)
3138-
.highlight(attr->getRange());
3138+
.highlight(attr.getParsedAttr()->getRange());
31393139
break;
31403140
case UnavailabilityDiagnosticInfo::Status::IntroducedInVersion:
31413141
diags.diagnose(ext, diag::conformance_availability_introduced_in_version,
3142-
type, proto, versionedPlatform, *attr->Introduced);
3142+
type, proto, versionedPlatform, *attr.getIntroduced());
31433143
break;
31443144
case UnavailabilityDiagnosticInfo::Status::Obsoleted:
31453145
diags
31463146
.diagnose(ext, diag::conformance_availability_obsoleted, type, proto,
3147-
versionedPlatform, *attr->Obsoleted)
3148-
.highlight(attr->getRange());
3147+
versionedPlatform, *attr.getObsoleted())
3148+
.highlight(attr.getParsedAttr()->getRange());
31493149
break;
31503150
}
31513151
return true;
@@ -3532,9 +3532,8 @@ bool diagnoseExplicitUnavailability(
35323532
if (!diagnosticInfo)
35333533
return false;
35343534

3535-
auto *Attr = diagnosticInfo->getAttr();
3536-
if (Attr->getPlatformAgnosticAvailability() ==
3537-
PlatformAgnosticAvailabilityKind::UnavailableInSwift) {
3535+
auto Attr = diagnosticInfo->getAttr();
3536+
if (Attr.getDomain().isSwiftLanguage() && !Attr.isVersionSpecific()) {
35383537
if (shouldAllowReferenceToUnavailableInSwiftDeclaration(D, Where))
35393538
return false;
35403539
}
@@ -3558,20 +3557,21 @@ bool diagnoseExplicitUnavailability(
35583557
? DiagnosticBehavior::Warning
35593558
: DiagnosticBehavior::Unspecified;
35603559

3561-
if (!Attr->Rename.empty()) {
3560+
auto message = Attr.getMessage();
3561+
auto rename = Attr.getRename();
3562+
if (!rename.empty()) {
35623563
SmallString<32> newNameBuf;
35633564
std::optional<ReplacementDeclKind> replaceKind =
3564-
describeRename(ctx, Attr->Rename, D, newNameBuf);
3565+
describeRename(ctx, Attr.getRename(), D, newNameBuf);
35653566
unsigned rawReplaceKind = static_cast<unsigned>(
35663567
replaceKind.value_or(ReplacementDeclKind::None));
3567-
StringRef newName = replaceKind ? newNameBuf.str() : Attr->Rename;
3568-
EncodedDiagnosticMessage EncodedMessage(Attr->Message);
3569-
auto diag =
3570-
diags.diagnose(Loc, diag::availability_decl_unavailable_rename,
3571-
D, replaceKind.has_value(),
3572-
rawReplaceKind, newName, EncodedMessage.Message);
3573-
diag.limitBehavior(limit);
3574-
attachRenameFixIts(diag);
3568+
StringRef newName = replaceKind ? newNameBuf.str() : rename;
3569+
EncodedDiagnosticMessage EncodedMessage(message);
3570+
auto diag = diags.diagnose(Loc, diag::availability_decl_unavailable_rename,
3571+
D, replaceKind.has_value(), rawReplaceKind,
3572+
newName, EncodedMessage.Message);
3573+
diag.limitBehavior(limit);
3574+
attachRenameFixIts(diag);
35753575
} else if (isSubscriptReturningString(D, ctx)) {
35763576
diags.diagnose(Loc, diag::availability_string_subscript_migration)
35773577
.highlight(R)
@@ -3582,31 +3582,33 @@ bool diagnoseExplicitUnavailability(
35823582
return true;
35833583
} else {
35843584
auto unavailableDiagnosticPlatform = platform;
3585-
AvailabilityInference::updatePlatformStringForFallback(Attr, ctx, unavailableDiagnosticPlatform);
3586-
EncodedDiagnosticMessage EncodedMessage(Attr->Message);
3585+
AvailabilityInference::updatePlatformStringForFallback(
3586+
Attr.getParsedAttr(), ctx, unavailableDiagnosticPlatform);
3587+
EncodedDiagnosticMessage EncodedMessage(message);
35873588
diags
35883589
.diagnose(Loc, diag::availability_decl_unavailable, D, platform.empty(),
35893590
unavailableDiagnosticPlatform, EncodedMessage.Message)
35903591
.highlight(R)
35913592
.limitBehavior(limit);
35923593
}
35933594

3595+
auto sourceRange = Attr.getParsedAttr()->getRange();
35943596
switch (diagnosticInfo->getStatus()) {
35953597
case UnavailabilityDiagnosticInfo::Status::AlwaysUnavailable:
35963598
diags.diagnose(D, diag::availability_marked_unavailable, D)
3597-
.highlight(Attr->getRange());
3599+
.highlight(sourceRange);
35983600
break;
35993601
case UnavailabilityDiagnosticInfo::Status::IntroducedInVersion:
36003602
diags
36013603
.diagnose(D, diag::availability_introduced_in_version, D,
3602-
versionedPlatform, *Attr->Introduced)
3603-
.highlight(Attr->getRange());
3604+
versionedPlatform, *Attr.getIntroduced())
3605+
.highlight(sourceRange);
36043606
break;
36053607
case UnavailabilityDiagnosticInfo::Status::Obsoleted:
36063608
diags
36073609
.diagnose(D, diag::availability_obsoleted, D, versionedPlatform,
3608-
*Attr->Obsoleted)
3609-
.highlight(Attr->getRange());
3610+
*Attr.getObsoleted())
3611+
.highlight(sourceRange);
36103612
break;
36113613
}
36123614
return true;

0 commit comments

Comments
 (0)