[clang][extract-api] Add struct support

- Add `StructFieldRecord` and `StructRecord` to store API information
  for structs
- Implement `VisitRecordDecl` in `ExtractAPIVisitor`
- Implement Symbol Graph serialization for struct records.
- Add test case for struct records.

Depends on D121873

Differential Revision: https://reviews.llvm.org/D122202
This commit is contained in:
Zixu Wang
2022-03-21 19:11:29 -07:00
parent 311bdbc9b7
commit 5bb5704c1b
8 changed files with 518 additions and 0 deletions

View File

@@ -367,6 +367,14 @@ Object serializeSymbolKind(const APIRecord &Record,
Kind["identifier"] = AddLangPrefix("enum");
Kind["displayName"] = "Enumeration";
break;
case APIRecord::RK_StructField:
Kind["identifier"] = AddLangPrefix("property");
Kind["displayName"] = "Instance Property";
break;
case APIRecord::RK_Struct:
Kind["identifier"] = AddLangPrefix("struct");
Kind["displayName"] = "Structure";
break;
}
return Kind;
@@ -474,6 +482,23 @@ void SymbolGraphSerializer::serializeEnumRecord(const EnumRecord &Record) {
}
}
void SymbolGraphSerializer::serializeStructRecord(const StructRecord &Record) {
auto Struct = serializeAPIRecord(Record);
if (!Struct)
return;
Symbols.emplace_back(std::move(*Struct));
for (const auto &Field : Record.Fields) {
auto StructField = serializeAPIRecord(*Field);
if (!StructField)
continue;
Symbols.emplace_back(std::move(*StructField));
serializeRelationship(RelationshipKind::MemberOf, *Field, Record);
}
}
Object SymbolGraphSerializer::serialize() {
Object Root;
serializeObject(Root, "metadata", serializeMetadata());
@@ -487,6 +512,10 @@ Object SymbolGraphSerializer::serialize() {
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);
Root["symbols"] = std::move(Symbols);
Root["relationhips"] = std::move(Relationships);