File indexing completed on 2026-05-10 08:36:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef LLVM_CLANG_EXTRACTAPI_SERIALIZATION_SYMBOLGRAPHSERIALIZER_H
0018 #define LLVM_CLANG_EXTRACTAPI_SERIALIZATION_SYMBOLGRAPHSERIALIZER_H
0019
0020 #include "clang/ExtractAPI/API.h"
0021 #include "clang/ExtractAPI/APIIgnoresList.h"
0022 #include "clang/ExtractAPI/Serialization/APISetVisitor.h"
0023 #include "llvm/ADT/DenseMap.h"
0024 #include "llvm/ADT/SmallString.h"
0025 #include "llvm/ADT/SmallVector.h"
0026 #include "llvm/ADT/StringMap.h"
0027 #include "llvm/ADT/StringRef.h"
0028 #include "llvm/ADT/StringSet.h"
0029 #include "llvm/ADT/Twine.h"
0030 #include "llvm/Support/JSON.h"
0031 #include "llvm/Support/VersionTuple.h"
0032 #include "llvm/Support/raw_ostream.h"
0033 #include <optional>
0034
0035 namespace clang {
0036 namespace extractapi {
0037
0038 using namespace llvm::json;
0039
0040
0041 struct SymbolGraphSerializerOption {
0042
0043 bool Compact = true;
0044 bool EmitSymbolLabelsForTesting = false;
0045 };
0046
0047
0048 struct ExtendedModule {
0049 ExtendedModule() = default;
0050 ExtendedModule(ExtendedModule &&EM) = default;
0051 ExtendedModule &operator=(ExtendedModule &&EM) = default;
0052
0053 ExtendedModule(const ExtendedModule &EM) = delete;
0054 ExtendedModule &operator=(const ExtendedModule &EM) = delete;
0055
0056
0057
0058 Object *addSymbol(Object &&Symbol);
0059
0060 void addRelationship(Object &&Relationship);
0061
0062
0063 Array Symbols;
0064
0065
0066 Array Relationships;
0067 };
0068
0069
0070
0071
0072
0073
0074 class SymbolGraphSerializer : public APISetVisitor<SymbolGraphSerializer> {
0075 private:
0076 using Base = APISetVisitor<SymbolGraphSerializer>;
0077
0078
0079 ExtendedModule MainModule;
0080
0081
0082
0083
0084 llvm::StringMap<ExtendedModule> ExtendedModules;
0085
0086
0087 static const VersionTuple FormatVersion;
0088
0089
0090
0091 bool ForceEmitToMainModule;
0092
0093
0094
0095 llvm::SmallVector<SymbolReference, 8> Hierarchy;
0096
0097
0098
0099
0100 const APIIgnoresList &IgnoresList;
0101
0102 const bool EmitSymbolLabelsForTesting = false;
0103
0104 const bool SkipSymbolsInCategoriesToExternalTypes = false;
0105
0106
0107 Object *CurrentSymbol = nullptr;
0108
0109
0110 ExtendedModule *ModuleForCurrentSymbol = nullptr;
0111
0112 public:
0113 static void
0114 serializeMainSymbolGraph(raw_ostream &OS, const APISet &API,
0115 const APIIgnoresList &IgnoresList,
0116 SymbolGraphSerializerOption Options = {});
0117
0118 static void serializeWithExtensionGraphs(
0119 raw_ostream &MainOutput, const APISet &API,
0120 const APIIgnoresList &IgnoresList,
0121 llvm::function_ref<
0122 std::unique_ptr<llvm::raw_pwrite_stream>(llvm::Twine BaseFileName)>
0123 CreateOutputStream,
0124 SymbolGraphSerializerOption Options = {});
0125
0126
0127
0128
0129
0130
0131 static std::optional<Object> serializeSingleSymbolSGF(StringRef USR,
0132 const APISet &API);
0133
0134 private:
0135
0136 enum RelationshipKind {
0137
0138
0139
0140 MemberOf,
0141
0142
0143 InheritsFrom,
0144
0145
0146
0147 ConformsTo,
0148
0149
0150
0151 ExtensionTo,
0152 };
0153
0154
0155 void serializeSingleRecord(const APIRecord *Record);
0156
0157
0158 static StringRef getRelationshipString(RelationshipKind Kind);
0159
0160 void serializeRelationship(RelationshipKind Kind,
0161 const SymbolReference &Source,
0162 const SymbolReference &Target,
0163 ExtendedModule &Into);
0164
0165 enum ConstraintKind { Conformance, ConditionalConformance };
0166
0167 static StringRef getConstraintString(ConstraintKind Kind);
0168
0169
0170
0171
0172
0173 Object serializeGraph(StringRef ModuleName, ExtendedModule &&EM);
0174
0175
0176
0177 void serializeGraphToStream(raw_ostream &OS,
0178 SymbolGraphSerializerOption Options,
0179 StringRef ModuleName, ExtendedModule &&EM);
0180
0181
0182
0183
0184
0185 Object serializeMetadata() const;
0186
0187
0188
0189
0190
0191
0192
0193 Object serializeModuleObject(StringRef ModuleName) const;
0194
0195 Array serializePathComponents(const APIRecord *Record) const;
0196
0197
0198 bool shouldSkip(const APIRecord *Record) const;
0199
0200 ExtendedModule &getModuleForCurrentSymbol();
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221 void serializeAPIRecord(const APIRecord *Record);
0222
0223 public:
0224
0225
0226 bool traverseAPIRecord(const APIRecord *Record);
0227
0228 bool visitAPIRecord(const APIRecord *Record);
0229
0230
0231 bool visitGlobalFunctionRecord(const GlobalFunctionRecord *Record);
0232
0233 bool visitCXXClassRecord(const CXXClassRecord *Record);
0234
0235 bool visitClassTemplateRecord(const ClassTemplateRecord *Record);
0236
0237 bool visitClassTemplatePartialSpecializationRecord(
0238 const ClassTemplatePartialSpecializationRecord *Record);
0239
0240 bool visitCXXMethodRecord(const CXXMethodRecord *Record);
0241
0242 bool visitCXXMethodTemplateRecord(const CXXMethodTemplateRecord *Record);
0243
0244 bool visitCXXFieldTemplateRecord(const CXXFieldTemplateRecord *Record);
0245
0246 bool visitConceptRecord(const ConceptRecord *Record);
0247
0248 bool
0249 visitGlobalVariableTemplateRecord(const GlobalVariableTemplateRecord *Record);
0250
0251 bool visitGlobalVariableTemplatePartialSpecializationRecord(
0252 const GlobalVariableTemplatePartialSpecializationRecord *Record);
0253
0254 bool
0255 visitGlobalFunctionTemplateRecord(const GlobalFunctionTemplateRecord *Record);
0256
0257 bool visitObjCContainerRecord(const ObjCContainerRecord *Record);
0258
0259 bool visitObjCInterfaceRecord(const ObjCInterfaceRecord *Record);
0260
0261 bool traverseObjCCategoryRecord(const ObjCCategoryRecord *Record);
0262 bool walkUpFromObjCCategoryRecord(const ObjCCategoryRecord *Record);
0263 bool visitObjCCategoryRecord(const ObjCCategoryRecord *Record);
0264
0265 bool visitObjCMethodRecord(const ObjCMethodRecord *Record);
0266
0267 bool
0268 visitObjCInstanceVariableRecord(const ObjCInstanceVariableRecord *Record);
0269
0270 bool walkUpFromTypedefRecord(const TypedefRecord *Record);
0271 bool visitTypedefRecord(const TypedefRecord *Record);
0272
0273 SymbolGraphSerializer(const APISet &API, const APIIgnoresList &IgnoresList,
0274 bool EmitSymbolLabelsForTesting = false,
0275 bool ForceEmitToMainModule = false,
0276 bool SkipSymbolsInCategoriesToExternalTypes = false)
0277 : Base(API), ForceEmitToMainModule(ForceEmitToMainModule),
0278 IgnoresList(IgnoresList),
0279 EmitSymbolLabelsForTesting(EmitSymbolLabelsForTesting),
0280 SkipSymbolsInCategoriesToExternalTypes(
0281 SkipSymbolsInCategoriesToExternalTypes) {}
0282 };
0283
0284 }
0285 }
0286
0287 #endif