diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-09-02 21:17:18 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-12-08 17:34:50 +0000 |
commit | 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e (patch) | |
tree | 62f873df87c7c675557a179e0c4c83fe9f3087bc /contrib/llvm-project/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp | |
parent | cf037972ea8863e2bab7461d77345367d2c1e054 (diff) | |
parent | 7fa27ce4a07f19b07799a767fc29416f3b625afb (diff) |
Diffstat (limited to 'contrib/llvm-project/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp | 107 |
1 files changed, 40 insertions, 67 deletions
diff --git a/contrib/llvm-project/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp b/contrib/llvm-project/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp index 01e9b37d2680..534e9288cc71 100644 --- a/contrib/llvm-project/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp +++ b/contrib/llvm-project/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp @@ -14,16 +14,11 @@ #include "clang/ExtractAPI/Serialization/SymbolGraphSerializer.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Version.h" -#include "clang/ExtractAPI/API.h" -#include "clang/ExtractAPI/APIIgnoresList.h" #include "clang/ExtractAPI/DeclarationFragments.h" -#include "clang/ExtractAPI/Serialization/SerializerBase.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/STLFunctionalExtras.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" -#include "llvm/Support/JSON.h" #include "llvm/Support/Path.h" #include "llvm/Support/VersionTuple.h" #include <optional> @@ -171,12 +166,16 @@ serializeAvailability(const AvailabilitySet &Availabilities) { 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)); + if (AvailInfo.Unavailable) + Availability["isUnconditionallyUnavailable"] = true; + else { + serializeObject(Availability, "introducedVersion", + serializeSemanticVersion(AvailInfo.Introduced)); + serializeObject(Availability, "deprecatedVersion", + serializeSemanticVersion(AvailInfo.Deprecated)); + serializeObject(Availability, "obsoletedVersion", + serializeSemanticVersion(AvailInfo.Obsoleted)); + } AvailabilityArray.emplace_back(std::move(Availability)); } @@ -487,6 +486,7 @@ bool generatePathComponents( SmallVector<PathComponent, 4> ReverseComponenents; ReverseComponenents.emplace_back(Record.USR, Record.Name, Record.getKind()); const auto *CurrentParent = &Record.ParentInformation; + bool FailedToFindParent = false; while (CurrentParent && !CurrentParent->empty()) { PathComponent CurrentParentComponent(CurrentParent->ParentUSR, CurrentParent->ParentName, @@ -509,8 +509,10 @@ bool generatePathComponents( // The parent record doesn't exist which means the symbol shouldn't be // treated as part of the current product. - if (!ParentRecord) - return true; + if (!ParentRecord) { + FailedToFindParent = true; + break; + } ReverseComponenents.push_back(std::move(CurrentParentComponent)); CurrentParent = &ParentRecord->ParentInformation; @@ -519,8 +521,9 @@ bool generatePathComponents( for (const auto &PC : reverse(ReverseComponenents)) ComponentTransformer(PC); - return false; + return FailedToFindParent; } + Object serializeParentContext(const PathComponent &PC, Language Lang) { Object ParentContextElem; ParentContextElem["usr"] = PC.USR; @@ -533,20 +536,16 @@ template <typename RecordTy> Array generateParentContexts(const RecordTy &Record, const APISet &API, Language Lang) { Array ParentContexts; - if (generatePathComponents( - Record, API, [Lang, &ParentContexts](const PathComponent &PC) { - ParentContexts.push_back(serializeParentContext(PC, Lang)); - })) - ParentContexts.clear(); - ParentContexts.pop_back(); + generatePathComponents( + Record, API, [Lang, &ParentContexts](const PathComponent &PC) { + ParentContexts.push_back(serializeParentContext(PC, Lang)); + }); return ParentContexts; } } // namespace -void SymbolGraphSerializer::anchor() {} - /// Defines the format version emitted by SymbolGraphSerializer. const VersionTuple SymbolGraphSerializer::FormatVersion{0, 5, 3}; @@ -663,7 +662,7 @@ void SymbolGraphSerializer::serializeRelationship(RelationshipKind Kind, Relationships.emplace_back(std::move(Relationship)); } -void SymbolGraphSerializer::serializeGlobalFunctionRecord( +void SymbolGraphSerializer::visitGlobalFunctionRecord( const GlobalFunctionRecord &Record) { auto Obj = serializeAPIRecord(Record); if (!Obj) @@ -672,7 +671,7 @@ void SymbolGraphSerializer::serializeGlobalFunctionRecord( Symbols.emplace_back(std::move(*Obj)); } -void SymbolGraphSerializer::serializeGlobalVariableRecord( +void SymbolGraphSerializer::visitGlobalVariableRecord( const GlobalVariableRecord &Record) { auto Obj = serializeAPIRecord(Record); if (!Obj) @@ -681,7 +680,7 @@ void SymbolGraphSerializer::serializeGlobalVariableRecord( Symbols.emplace_back(std::move(*Obj)); } -void SymbolGraphSerializer::serializeEnumRecord(const EnumRecord &Record) { +void SymbolGraphSerializer::visitEnumRecord(const EnumRecord &Record) { auto Enum = serializeAPIRecord(Record); if (!Enum) return; @@ -690,7 +689,7 @@ void SymbolGraphSerializer::serializeEnumRecord(const EnumRecord &Record) { serializeMembers(Record, Record.Constants); } -void SymbolGraphSerializer::serializeStructRecord(const StructRecord &Record) { +void SymbolGraphSerializer::visitStructRecord(const StructRecord &Record) { auto Struct = serializeAPIRecord(Record); if (!Struct) return; @@ -699,7 +698,7 @@ void SymbolGraphSerializer::serializeStructRecord(const StructRecord &Record) { serializeMembers(Record, Record.Fields); } -void SymbolGraphSerializer::serializeObjCContainerRecord( +void SymbolGraphSerializer::visitObjCContainerRecord( const ObjCContainerRecord &Record) { auto ObjCContainer = serializeAPIRecord(Record); if (!ObjCContainer) @@ -736,7 +735,7 @@ void SymbolGraphSerializer::serializeObjCContainerRecord( } } -void SymbolGraphSerializer::serializeMacroDefinitionRecord( +void SymbolGraphSerializer::visitMacroDefinitionRecord( const MacroDefinitionRecord &Record) { auto Macro = serializeAPIRecord(Record); @@ -751,28 +750,28 @@ void SymbolGraphSerializer::serializeSingleRecord(const APIRecord *Record) { case APIRecord::RK_Unknown: llvm_unreachable("Records should have a known kind!"); case APIRecord::RK_GlobalFunction: - serializeGlobalFunctionRecord(*cast<GlobalFunctionRecord>(Record)); + visitGlobalFunctionRecord(*cast<GlobalFunctionRecord>(Record)); break; case APIRecord::RK_GlobalVariable: - serializeGlobalVariableRecord(*cast<GlobalVariableRecord>(Record)); + visitGlobalVariableRecord(*cast<GlobalVariableRecord>(Record)); break; case APIRecord::RK_Enum: - serializeEnumRecord(*cast<EnumRecord>(Record)); + visitEnumRecord(*cast<EnumRecord>(Record)); break; case APIRecord::RK_Struct: - serializeStructRecord(*cast<StructRecord>(Record)); + visitStructRecord(*cast<StructRecord>(Record)); break; case APIRecord::RK_ObjCInterface: - serializeObjCContainerRecord(*cast<ObjCInterfaceRecord>(Record)); + visitObjCContainerRecord(*cast<ObjCInterfaceRecord>(Record)); break; case APIRecord::RK_ObjCProtocol: - serializeObjCContainerRecord(*cast<ObjCProtocolRecord>(Record)); + visitObjCContainerRecord(*cast<ObjCProtocolRecord>(Record)); break; case APIRecord::RK_MacroDefinition: - serializeMacroDefinitionRecord(*cast<MacroDefinitionRecord>(Record)); + visitMacroDefinitionRecord(*cast<MacroDefinitionRecord>(Record)); break; case APIRecord::RK_Typedef: - serializeTypedefRecord(*cast<TypedefRecord>(Record)); + visitTypedefRecord(*cast<TypedefRecord>(Record)); break; default: if (auto Obj = serializeAPIRecord(*Record)) { @@ -786,8 +785,7 @@ void SymbolGraphSerializer::serializeSingleRecord(const APIRecord *Record) { } } -void SymbolGraphSerializer::serializeTypedefRecord( - const TypedefRecord &Record) { +void SymbolGraphSerializer::visitTypedefRecord(const TypedefRecord &Record) { // Typedefs of anonymous types have their entries unified with the underlying // type. bool ShouldDrop = Record.UnderlyingType.Name.empty(); @@ -807,35 +805,7 @@ void SymbolGraphSerializer::serializeTypedefRecord( } Object SymbolGraphSerializer::serialize() { - // Serialize global variables in the API set. - for (const auto &GlobalVar : API.getGlobalVariables()) - serializeGlobalVariableRecord(*GlobalVar.second); - - for (const auto &GlobalFunction : API.getGlobalFunctions()) - serializeGlobalFunctionRecord(*GlobalFunction.second); - - // Serialize enum records in the API set. - for (const auto &Enum : API.getEnums()) - serializeEnumRecord(*Enum.second); - - // Serialize struct records in the API set. - for (const auto &Struct : API.getStructs()) - serializeStructRecord(*Struct.second); - - // Serialize Objective-C interface records in the API set. - for (const auto &ObjCInterface : API.getObjCInterfaces()) - serializeObjCContainerRecord(*ObjCInterface.second); - - // Serialize Objective-C protocol records in the API set. - for (const auto &ObjCProtocol : API.getObjCProtocols()) - serializeObjCContainerRecord(*ObjCProtocol.second); - - for (const auto &Macro : API.getMacros()) - serializeMacroDefinitionRecord(*Macro.second); - - for (const auto &Typedef : API.getTypedefs()) - serializeTypedefRecord(*Typedef.second); - + traverseAPISet(); return serializeCurrentGraph(); } @@ -865,6 +835,9 @@ SymbolGraphSerializer::serializeSingleSymbolSGF(StringRef USR, if (!Record) return {}; + if (isa<ObjCCategoryRecord>(Record)) + return {}; + Object Root; APIIgnoresList EmptyIgnores; SymbolGraphSerializer Serializer(API, EmptyIgnores, |