diff options
author | Daniel Grumberg <dgrumberg@apple.com> | 2022-08-01 14:55:08 +0100 |
---|---|---|
committer | Daniel Grumberg <dgrumberg@apple.com> | 2022-08-19 14:54:52 -0700 |
commit | 57c9780d60b15baf0eba4393857affce47f60aa7 (patch) | |
tree | 4c09c5a234530d67fc61dc11e8e5fe8cc62d046c /clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp | |
parent | 89aaae57eacf77a6902ef8d4af5c92a3d6c642c2 (diff) | |
download | llvm-57c9780d60b15baf0eba4393857affce47f60aa7.zip llvm-57c9780d60b15baf0eba4393857affce47f60aa7.tar.gz llvm-57c9780d60b15baf0eba4393857affce47f60aa7.tar.bz2 |
[clang][ExtractAPI] Record availability information on all platforms
Currently ExtractAPI only emits availability information for the
current platform. This makes it easy for clients to get all availability
information for a given symbol in one invocation as opposed to having to invoke
clang once per-platform and then merge the symbol-graphs.
Differential Revision: https://reviews.llvm.org/D130918
Diffstat (limited to 'clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp')
-rw-r--r-- | clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp b/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp index d1bf83c8..0810dec 100644 --- a/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp +++ b/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp @@ -135,30 +135,42 @@ Object serializeSourceRange(const PresumedLoc &BeginLoc, /// Serialize the availability attributes of a symbol. /// /// Availability information contains the introduced, deprecated, and obsoleted -/// versions of the symbol as semantic versions, if not default. -/// Availability information also contains flags to indicate if the symbol is -/// unconditionally unavailable or deprecated, -/// i.e. \c __attribute__((unavailable)) and \c __attribute__((deprecated)). +/// versions of the symbol for a given domain (roughly corresponds to a +/// platform) as semantic versions, if not default. Availability information +/// also contains flags to indicate if the symbol is unconditionally unavailable +/// or deprecated, i.e. \c __attribute__((unavailable)) and \c +/// __attribute__((deprecated)). /// /// \returns \c None if the symbol has default availability attributes, or -/// an \c Object containing the formatted availability information. -Optional<Object> serializeAvailability(const AvailabilityInfo &Avail) { - if (Avail.isDefault()) +/// an \c Array containing the formatted availability information. +Optional<Array> serializeAvailability(const AvailabilitySet &Availabilities) { + if (Availabilities.isDefault()) return None; - Object Availability; - serializeObject(Availability, "introducedVersion", - serializeSemanticVersion(Avail.Introduced)); - serializeObject(Availability, "deprecatedVersion", - serializeSemanticVersion(Avail.Deprecated)); - serializeObject(Availability, "obsoletedVersion", - serializeSemanticVersion(Avail.Obsoleted)); - if (Avail.isUnavailable()) - Availability["isUnconditionallyUnavailable"] = true; - if (Avail.isUnconditionallyDeprecated()) - Availability["isUnconditionallyDeprecated"] = true; + Array AvailabilityArray; - return Availability; + if (Availabilities.isUnconditionallyDeprecated()) { + Object UnconditionallyDeprecated; + UnconditionallyDeprecated["domain"] = "*"; + UnconditionallyDeprecated["isUnconditionallyDeprecated"] = true; + AvailabilityArray.emplace_back(std::move(UnconditionallyDeprecated)); + } + + // Note unconditionally unavailable records are skipped. + + for (const auto &AvailInfo : Availabilities) { + Object Availability; + Availability["domain"] = AvailInfo.Domain; + serializeObject(Availability, "introducedVersion", + serializeSemanticVersion(AvailInfo.Introduced)); + serializeObject(Availability, "deprecatedVersion", + serializeSemanticVersion(AvailInfo.Deprecated)); + serializeObject(Availability, "obsoletedVersion", + serializeSemanticVersion(AvailInfo.Obsoleted)); + AvailabilityArray.emplace_back(std::move(Availability)); + } + + return AvailabilityArray; } /// Get the language name string for interface language references. @@ -469,7 +481,7 @@ Object SymbolGraphSerializer::serializeModule() const { bool SymbolGraphSerializer::shouldSkip(const APIRecord &Record) const { // Skip unconditionally unavailable symbols - if (Record.Availability.isUnconditionallyUnavailable()) + if (Record.Availabilities.isUnconditionallyUnavailable()) return true; // Filter out symbols prefixed with an underscored as they are understood to @@ -494,8 +506,8 @@ SymbolGraphSerializer::serializeAPIRecord(const RecordTy &Record) const { serializeObject( Obj, "location", serializeSourceLocation(Record.Location, /*IncludeFileURI=*/true)); - serializeObject(Obj, "availability", - serializeAvailability(Record.Availability)); + serializeArray(Obj, "availability", + serializeAvailability(Record.Availabilities)); serializeObject(Obj, "docComment", serializeDocComment(Record.Comment)); serializeArray(Obj, "declarationFragments", serializeDeclarationFragments(Record.Declaration)); |