Skip to content

Commit 0a29ba8

Browse files
committed
[SymbolGraph] Add back isUnconditionallyUnavailable
It turns out this needed to prevent automatically inheriting a default introduced availability for a given module. rdar://64536460
1 parent cb0cdbc commit 0a29ba8

File tree

4 files changed

+50
-2
lines changed

4 files changed

+50
-2
lines changed

lib/SymbolGraphGen/AvailabilityMixin.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ Availability::Availability(const AvailableAttr &AvAttr)
7070
Obsoleted(AvAttr.Obsoleted),
7171
Message(AvAttr.Message),
7272
Renamed(AvAttr.Rename),
73-
IsUnconditionallyDeprecated(AvAttr.isUnconditionallyDeprecated()) {
73+
IsUnconditionallyDeprecated(AvAttr.isUnconditionallyDeprecated()),
74+
IsUnconditionallyUnavailable(AvAttr.isUnconditionallyUnavailable()) {
7475
assert(!Domain.empty());
7576
}
7677

@@ -93,6 +94,9 @@ Availability::updateFromDuplicate(const Availability &Other) {
9394
// Same for `deprecated` with no version.
9495
IsUnconditionallyDeprecated = Other.IsUnconditionallyDeprecated;
9596

97+
// Same for `unavailable` with no version.
98+
IsUnconditionallyUnavailable = Other.IsUnconditionallyUnavailable;
99+
96100
// Same for `obsoleted`.
97101
Obsoleted = Other.Obsoleted;
98102

@@ -150,6 +154,10 @@ Availability::updateFromParent(const Availability &Parent) {
150154
// If a parent is unconditionally deprecated, then so are all
151155
// of its children.
152156
IsUnconditionallyDeprecated |= Parent.IsUnconditionallyDeprecated;
157+
158+
// If a parent is unconditionally unavailable, then so are all
159+
// of its children.
160+
IsUnconditionallyUnavailable |= Parent.IsUnconditionallyUnavailable;
153161
}
154162

155163
void Availability::serialize(llvm::json::OStream &OS) const {
@@ -176,12 +184,16 @@ void Availability::serialize(llvm::json::OStream &OS) const {
176184
if (IsUnconditionallyDeprecated) {
177185
OS.attribute("isUnconditionallyDeprecated", true);
178186
}
187+
if (IsUnconditionallyUnavailable) {
188+
OS.attribute("isUnconditionallyUnavailable", true);
189+
}
179190
}); // end availability object
180191
}
181192

182193
bool Availability::empty() const {
183194
return !Introduced.hasValue() &&
184195
!Deprecated.hasValue() &&
185196
!Obsoleted.hasValue() &&
186-
!IsUnconditionallyDeprecated;
197+
!IsUnconditionallyDeprecated &&
198+
!IsUnconditionallyUnavailable;
187199
}

lib/SymbolGraphGen/AvailabilityMixin.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ struct Availability {
4646
/// If \c true, is unconditionally deprecated in this \c Domain.
4747
bool IsUnconditionallyDeprecated;
4848

49+
/// If \c true, is unconditionally unavailable in this \c Domain.
50+
bool IsUnconditionallyUnavailable;
51+
4952
Availability(const AvailableAttr &AvAttr);
5053

5154
/// Update this availability from a duplicate @available
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift %s -module-name UnavailableFilled -emit-module -emit-module-path %t/
3+
// RUN: %target-swift-symbolgraph-extract -module-name UnavailableFilled -I %t -pretty-print -output-dir %t
4+
// RUN: %FileCheck %s --input-file %t/UnavailableFilled.symbols.json
5+
6+
// REQUIRES: OS=macosx
7+
8+
@available(iOS, unavailable)
9+
public struct S {
10+
public func foo() {}
11+
}
12+
13+
// CHECK-LABEL: "precise": "s:17UnavailableFilled1SV3fooyyF",
14+
// CHECK: "availability": [
15+
// CHECK-NEXT: {
16+
// CHECK-NEXT: "domain": "iOS",
17+
// CHECK-NEXT: "isUnconditionallyUnavailable": true
18+
// CHECK-NEXT: }
19+
// CHECK-NEXT: ]
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift %s -module-name UnconditionallyUnavailable -emit-module -emit-module-path %t/
3+
// RUN: %target-swift-symbolgraph-extract -module-name UnconditionallyUnavailable -I %t -pretty-print -output-dir %t
4+
// RUN: %FileCheck %s --input-file %t/UnconditionallyUnavailable.symbols.json
5+
6+
@available(iOS, unavailable)
7+
public struct UnconditionallyUnavailable {}
8+
9+
// CHECK: "availability": [
10+
// CHECK-NEXT: {
11+
// CHECK-NEXT: "domain": "iOS",
12+
// CHECK-NEXT: "isUnconditionallyUnavailable": true
13+
// CHECK-NEXT: }
14+
// CHECK-NEXT: ]

0 commit comments

Comments
 (0)