Skip to content

Commit 65f7a84

Browse files
Arsenic-ATGdaniel-grumberg
authored andcommitted
[clang][ExtractAPI] Handle platform specific unavailability correctly
This Patch gives ExtractAPI the ability to emit correct availability information for symbols marked as unavailable on a specific platform ( PR#60954 ) Reviewed By: dang Differential Revision: https://reviews.llvm.org/D144940
1 parent 3230a64 commit 65f7a84

File tree

4 files changed

+23
-10
lines changed

4 files changed

+23
-10
lines changed

clang/include/clang/ExtractAPI/AvailabilityInfo.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@ struct AvailabilityInfo {
3333
VersionTuple Introduced;
3434
VersionTuple Deprecated;
3535
VersionTuple Obsoleted;
36+
bool Unavailable;
3637

3738
AvailabilityInfo() = default;
3839

3940
AvailabilityInfo(StringRef Domain, VersionTuple I, VersionTuple D,
40-
VersionTuple O)
41-
: Domain(Domain), Introduced(I), Deprecated(D), Obsoleted(O) {}
41+
VersionTuple O, bool U)
42+
: Domain(Domain), Introduced(I), Deprecated(D), Obsoleted(O),
43+
Unavailable(U) {}
4244
};
4345

4446
class AvailabilitySet {

clang/lib/ExtractAPI/AvailabilityInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ AvailabilitySet::AvailabilitySet(const Decl *Decl) {
4242
Availability->Obsoleted = Attr->getObsoleted();
4343
} else {
4444
Availabilities.emplace_back(Domain, Attr->getIntroduced(),
45-
Attr->getDeprecated(),
46-
Attr->getObsoleted());
45+
Attr->getDeprecated(), Attr->getObsoleted(),
46+
Attr->getUnavailable());
4747
}
4848
}
4949
}

clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,16 @@ serializeAvailability(const AvailabilitySet &Availabilities) {
171171
for (const auto &AvailInfo : Availabilities) {
172172
Object Availability;
173173
Availability["domain"] = AvailInfo.Domain;
174-
serializeObject(Availability, "introducedVersion",
175-
serializeSemanticVersion(AvailInfo.Introduced));
176-
serializeObject(Availability, "deprecatedVersion",
177-
serializeSemanticVersion(AvailInfo.Deprecated));
178-
serializeObject(Availability, "obsoletedVersion",
179-
serializeSemanticVersion(AvailInfo.Obsoleted));
174+
if (AvailInfo.Unavailable)
175+
Availability["isUnconditionallyUnavailable"] = true;
176+
else {
177+
serializeObject(Availability, "introducedVersion",
178+
serializeSemanticVersion(AvailInfo.Introduced));
179+
serializeObject(Availability, "deprecatedVersion",
180+
serializeSemanticVersion(AvailInfo.Deprecated));
181+
serializeObject(Availability, "obsoletedVersion",
182+
serializeSemanticVersion(AvailInfo.Obsoleted));
183+
}
180184
AvailabilityArray.emplace_back(std::move(Availability));
181185
}
182186

clang/test/ExtractAPI/availability.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ void e(void) __attribute__((deprecated)) __attribute__((availability(macos, intr
2626
void f(void) __attribute__((unavailable)) __attribute__((availability(macos, introduced=11.0)));
2727

2828
void d(void) __attribute__((availability(tvos, introduced=15.0)));
29+
30+
void e(void) __attribute__((availability(tvos, unavailable)));
31+
2932
///expected-no-diagnostics
3033

3134
//--- reference.output.json.in
@@ -391,6 +394,10 @@ void d(void) __attribute__((availability(tvos, introduced=15.0)));
391394
"minor": 0,
392395
"patch": 0
393396
}
397+
},
398+
{
399+
"domain": "tvos",
400+
"isUnconditionallyUnavailable": true
394401
}
395402
],
396403
"declarationFragments": [

0 commit comments

Comments
 (0)