Skip to content

Commit 2b4062f

Browse files
authored
Merge pull request #8634 from daniel-grumberg/cherry-picks/swift/6.0/05c1447
2 parents 8583cc1 + 0af98c9 commit 2b4062f

File tree

4 files changed

+123
-457
lines changed

4 files changed

+123
-457
lines changed

clang/include/clang/ExtractAPI/AvailabilityInfo.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,21 @@ struct AvailabilityInfo {
3030
VersionTuple Introduced;
3131
VersionTuple Deprecated;
3232
VersionTuple Obsoleted;
33+
bool Unavailable = false;
3334
bool UnconditionallyDeprecated = false;
3435
bool UnconditionallyUnavailable = false;
3536

3637
AvailabilityInfo() = default;
3738

3839
/// Determine if this AvailabilityInfo represents the default availability.
3940
bool isDefault() const { return *this == AvailabilityInfo(); }
41+
42+
/// Check if the symbol is unavailable unconditionally or
43+
/// on the active platform and os version.
44+
bool isUnavailable() const {
45+
return Unavailable || isUnconditionallyUnavailable();
46+
}
47+
4048
/// Check if the symbol is unconditionally deprecated.
4149
///
4250
/// i.e. \code __attribute__((deprecated)) \endcode
@@ -49,9 +57,10 @@ struct AvailabilityInfo {
4957
}
5058

5159
AvailabilityInfo(StringRef Domain, VersionTuple I, VersionTuple D,
52-
VersionTuple O, bool UD, bool UU)
60+
VersionTuple O, bool U, bool UD, bool UU)
5361
: Domain(Domain), Introduced(I), Deprecated(D), Obsoleted(O),
54-
UnconditionallyDeprecated(UD), UnconditionallyUnavailable(UU) {}
62+
Unavailable(U), UnconditionallyDeprecated(UD),
63+
UnconditionallyUnavailable(UU) {}
5564

5665
friend bool operator==(const AvailabilityInfo &Lhs,
5766
const AvailabilityInfo &Rhs);
@@ -63,10 +72,10 @@ struct AvailabilityInfo {
6372
inline bool operator==(const AvailabilityInfo &Lhs,
6473
const AvailabilityInfo &Rhs) {
6574
return std::tie(Lhs.Introduced, Lhs.Deprecated, Lhs.Obsoleted,
66-
Lhs.UnconditionallyDeprecated,
75+
Lhs.Unavailable, Lhs.UnconditionallyDeprecated,
6776
Lhs.UnconditionallyUnavailable) ==
6877
std::tie(Rhs.Introduced, Rhs.Deprecated, Rhs.Obsoleted,
69-
Rhs.UnconditionallyDeprecated,
78+
Rhs.Unavailable, Rhs.UnconditionallyDeprecated,
7079
Rhs.UnconditionallyUnavailable);
7180
}
7281

clang/lib/ExtractAPI/AvailabilityInfo.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ AvailabilityInfo AvailabilityInfo::createFromDecl(const Decl *Decl) {
1717
for (const auto *A : RD->specific_attrs<AvailabilityAttr>()) {
1818
if (A->getPlatform()->getName() != PlatformName)
1919
continue;
20-
Availability =
21-
AvailabilityInfo(A->getPlatform()->getName(), A->getIntroduced(),
22-
A->getDeprecated(), A->getObsoleted(), false, false);
20+
Availability = AvailabilityInfo(
21+
A->getPlatform()->getName(), A->getIntroduced(), A->getDeprecated(),
22+
A->getObsoleted(), A->getUnavailable(), false, false);
2323
break;
2424
}
2525

clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -164,27 +164,29 @@ std::optional<Array> serializeAvailability(const AvailabilityInfo &Avail) {
164164
if (Avail.isDefault())
165165
return std::nullopt;
166166

167-
Object Availability;
168167
Array AvailabilityArray;
169-
Availability["domain"] = Avail.Domain;
170-
serializeObject(Availability, "introduced",
171-
serializeSemanticVersion(Avail.Introduced));
172-
serializeObject(Availability, "deprecated",
173-
serializeSemanticVersion(Avail.Deprecated));
174-
serializeObject(Availability, "obsoleted",
175-
serializeSemanticVersion(Avail.Obsoleted));
168+
176169
if (Avail.isUnconditionallyDeprecated()) {
177170
Object UnconditionallyDeprecated;
178171
UnconditionallyDeprecated["domain"] = "*";
179172
UnconditionallyDeprecated["isUnconditionallyDeprecated"] = true;
180173
AvailabilityArray.emplace_back(std::move(UnconditionallyDeprecated));
181174
}
182-
if (Avail.isUnconditionallyUnavailable()) {
183-
Object UnconditionallyUnavailable;
184-
UnconditionallyUnavailable["domain"] = "*";
185-
UnconditionallyUnavailable["isUnconditionallyUnavailable"] = true;
186-
AvailabilityArray.emplace_back(std::move(UnconditionallyUnavailable));
175+
Object Availability;
176+
177+
Availability["domain"] = Avail.Domain;
178+
179+
if (Avail.isUnavailable()) {
180+
Availability["isUnconditionallyUnavailable"] = true;
181+
} else {
182+
serializeObject(Availability, "introduced",
183+
serializeSemanticVersion(Avail.Introduced));
184+
serializeObject(Availability, "deprecated",
185+
serializeSemanticVersion(Avail.Deprecated));
186+
serializeObject(Availability, "obsoleted",
187+
serializeSemanticVersion(Avail.Obsoleted));
187188
}
189+
188190
AvailabilityArray.emplace_back(std::move(Availability));
189191
return AvailabilityArray;
190192
}

0 commit comments

Comments
 (0)