From 57c9780d60b15baf0eba4393857affce47f60aa7 Mon Sep 17 00:00:00 2001 From: Daniel Grumberg Date: Mon, 1 Aug 2022 14:55:08 +0100 Subject: [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 --- .../Serialization/SymbolGraphSerializer.cpp | 56 +++++++++++++--------- 1 file changed, 34 insertions(+), 22 deletions(-) (limited to 'clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp') 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 serializeAvailability(const AvailabilityInfo &Avail) { - if (Avail.isDefault()) +/// an \c Array containing the formatted availability information. +Optional 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)); -- cgit v1.1