[clang][ExtractAPI] Add support C unions in non C++ parsing mode (#77451)

Ensure that we generate correct symbol kinds and declaration fragments
for unions in C and Objective-C parsing modes.

rdar://120544091
This commit is contained in:
Daniel Grumberg
2024-01-22 15:32:57 +00:00
committed by GitHub
parent 726d940586
commit 69fedaf830
9 changed files with 380 additions and 74 deletions

View File

@@ -400,7 +400,7 @@ Object serializeSymbolKind(APIRecord::RecordKind RK, Language Lang) {
Kind["identifier"] = AddLangPrefix("struct");
Kind["displayName"] = "Structure";
break;
case APIRecord::RK_CXXField:
case APIRecord::RK_UnionField:
Kind["identifier"] = AddLangPrefix("property");
Kind["displayName"] = "Instance Property";
break;
@@ -408,6 +408,10 @@ Object serializeSymbolKind(APIRecord::RecordKind RK, Language Lang) {
Kind["identifier"] = AddLangPrefix("union");
Kind["displayName"] = "Union";
break;
case APIRecord::RK_CXXField:
Kind["identifier"] = AddLangPrefix("property");
Kind["displayName"] = "Instance Property";
break;
case APIRecord::RK_StaticField:
Kind["identifier"] = AddLangPrefix("type.property");
Kind["displayName"] = "Type Property";
@@ -871,12 +875,12 @@ void SymbolGraphSerializer::visitEnumRecord(const EnumRecord &Record) {
serializeMembers(Record, Record.Constants);
}
void SymbolGraphSerializer::visitStructRecord(const StructRecord &Record) {
auto Struct = serializeAPIRecord(Record);
if (!Struct)
void SymbolGraphSerializer::visitRecordRecord(const RecordRecord &Record) {
auto SerializedRecord = serializeAPIRecord(Record);
if (!SerializedRecord)
return;
Symbols.emplace_back(std::move(*Struct));
Symbols.emplace_back(std::move(*SerializedRecord));
serializeMembers(Record, Record.Fields);
}
@@ -1167,7 +1171,9 @@ void SymbolGraphSerializer::serializeSingleRecord(const APIRecord *Record) {
visitEnumRecord(*cast<EnumRecord>(Record));
break;
case APIRecord::RK_Struct:
visitStructRecord(*cast<StructRecord>(Record));
LLVM_FALLTHROUGH;
case APIRecord::RK_Union:
visitRecordRecord(*cast<RecordRecord>(Record));
break;
case APIRecord::RK_StaticField:
visitStaticFieldRecord(*cast<StaticFieldRecord>(Record));