aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp
diff options
context:
space:
mode:
authorZixu Wang <zixu_wang@apple.com>2022-03-16 17:49:31 -0700
committerZixu Wang <zixu_wang@apple.com>2022-03-23 09:41:21 -0700
commit71b4c22612a06c950d31db83a45dee7412a64c64 (patch)
tree3f5c02729d313e9d0dd377e7001bcf019ba5489a /clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp
parent5a2e56b70e2fa7ad0d82e54bc4c741b16f05e475 (diff)
downloadllvm-71b4c22612a06c950d31db83a45dee7412a64c64.zip
llvm-71b4c22612a06c950d31db83a45dee7412a64c64.tar.gz
llvm-71b4c22612a06c950d31db83a45dee7412a64c64.tar.bz2
[clang][extract-api] Add enum support
Add support for enum records - Add `EnumConstantRecord` and `EnumRecord` to store API information for enums - Implement `VisitEnumDecl` in `ExtractAPIVisitor` - Implement serializatin for enum records and `MemberOf` relationship - Add test case for enum records - Few other improvements Depends on D122160 Differential Revision: https://reviews.llvm.org/D121873
Diffstat (limited to 'clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp')
-rw-r--r--clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp59
1 files changed, 56 insertions, 3 deletions
diff --git a/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp b/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp
index f262aab..574ea45 100644
--- a/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp
+++ b/clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp
@@ -336,17 +336,21 @@ Object serializeNames(const APIRecord &Record) {
/// the kind, and a \c displayName for rendering human-readable names.
Object serializeSymbolKind(const APIRecord &Record,
const LangOptions &LangOpts) {
+ auto AddLangPrefix = [&LangOpts](StringRef S) -> std::string {
+ return (getLanguageName(LangOpts) + "." + S).str();
+ };
+
Object Kind;
switch (Record.getKind()) {
- case APIRecord::RK_Global:
+ case APIRecord::RK_Global: {
auto *GR = dyn_cast<GlobalRecord>(&Record);
switch (GR->GlobalKind) {
case GVKind::Function:
- Kind["identifier"] = (getLanguageName(LangOpts) + ".func").str();
+ Kind["identifier"] = AddLangPrefix("func");
Kind["displayName"] = "Function";
break;
case GVKind::Variable:
- Kind["identifier"] = (getLanguageName(LangOpts) + ".var").str();
+ Kind["identifier"] = AddLangPrefix("var");
Kind["displayName"] = "Global Variable";
break;
case GVKind::Unknown:
@@ -355,6 +359,15 @@ Object serializeSymbolKind(const APIRecord &Record,
}
break;
}
+ case APIRecord::RK_EnumConstant:
+ Kind["identifier"] = AddLangPrefix("enum.case");
+ Kind["displayName"] = "Enumeration Case";
+ break;
+ case APIRecord::RK_Enum:
+ Kind["identifier"] = AddLangPrefix("enum");
+ Kind["displayName"] = "Enumeration";
+ break;
+ }
return Kind;
}
@@ -413,6 +426,25 @@ SymbolGraphSerializer::serializeAPIRecord(const APIRecord &Record) const {
return Obj;
}
+StringRef SymbolGraphSerializer::getRelationshipString(RelationshipKind Kind) {
+ switch (Kind) {
+ case RelationshipKind::MemberOf:
+ return "memberOf";
+ }
+ llvm_unreachable("Unhandled relationship kind");
+}
+
+void SymbolGraphSerializer::serializeRelationship(RelationshipKind Kind,
+ const APIRecord &Source,
+ const APIRecord &Target) {
+ Object Relationship;
+ Relationship["source"] = Source.USR;
+ Relationship["target"] = Target.USR;
+ Relationship["kind"] = getRelationshipString(Kind);
+
+ Relationships.emplace_back(std::move(Relationship));
+}
+
void SymbolGraphSerializer::serializeGlobalRecord(const GlobalRecord &Record) {
auto Obj = serializeAPIRecord(Record);
if (!Obj)
@@ -425,6 +457,23 @@ void SymbolGraphSerializer::serializeGlobalRecord(const GlobalRecord &Record) {
Symbols.emplace_back(std::move(*Obj));
}
+void SymbolGraphSerializer::serializeEnumRecord(const EnumRecord &Record) {
+ auto Enum = serializeAPIRecord(Record);
+ if (!Enum)
+ return;
+
+ Symbols.emplace_back(std::move(*Enum));
+
+ for (const auto &Constant : Record.Constants) {
+ auto EnumConstant = serializeAPIRecord(*Constant);
+ if (!EnumConstant)
+ continue;
+
+ Symbols.emplace_back(std::move(*EnumConstant));
+ serializeRelationship(RelationshipKind::MemberOf, *Constant, Record);
+ }
+}
+
Object SymbolGraphSerializer::serialize() {
Object Root;
serializeObject(Root, "metadata", serializeMetadata());
@@ -434,6 +483,10 @@ Object SymbolGraphSerializer::serialize() {
for (const auto &Global : API.getGlobals())
serializeGlobalRecord(*Global.second);
+ // Serialize enum records in the API set.
+ for (const auto &Enum : API.getEnums())
+ serializeEnumRecord(*Enum.second);
+
Root["symbols"] = std::move(Symbols);
Root["relationhips"] = std::move(Relationships);