Skip to content

Commit 61d4ca8

Browse files
[clang][ExtractAPI] Distinguish between record kind for display and for RTTI (#91466)
rdar://127732562
1 parent c6c7afd commit 61d4ca8

File tree

3 files changed

+23
-15
lines changed

3 files changed

+23
-15
lines changed

clang/include/clang/ExtractAPI/API.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ struct APIRecord {
266266

267267
AccessControl Access;
268268

269+
RecordKind KindForDisplay;
270+
269271
private:
270272
const RecordKind Kind;
271273
friend class RecordContext;
@@ -277,6 +279,7 @@ struct APIRecord {
277279
APIRecord *getNextInContext() const { return NextInContext; }
278280

279281
RecordKind getKind() const { return Kind; }
282+
RecordKind getKindForDisplay() const { return KindForDisplay; }
280283

281284
static APIRecord *castFromRecordContext(const RecordContext *Ctx);
282285
static RecordContext *castToRecordContext(const APIRecord *Record);
@@ -293,10 +296,10 @@ struct APIRecord {
293296
Availability(std::move(Availability)), Linkage(Linkage),
294297
Comment(Comment), Declaration(Declaration), SubHeading(SubHeading),
295298
IsFromSystemHeader(IsFromSystemHeader), Access(std::move(Access)),
296-
Kind(Kind) {}
299+
KindForDisplay(Kind), Kind(Kind) {}
297300

298301
APIRecord(RecordKind Kind, StringRef USR, StringRef Name)
299-
: USR(USR), Name(Name), Kind(Kind) {}
302+
: USR(USR), Name(Name), KindForDisplay(Kind), Kind(Kind) {}
300303

301304
// Pure virtual destructor to make APIRecord abstract
302305
virtual ~APIRecord() = 0;

clang/include/clang/ExtractAPI/ExtractAPIVisitor.h

+15-10
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,15 @@ class ExtractAPIVisitorBase : public RecursiveASTVisitor<Derived> {
194194
return Bases;
195195
}
196196

197+
APIRecord::RecordKind getKindForDisplay(const CXXRecordDecl *Decl) {
198+
if (Decl->isUnion())
199+
return APIRecord::RK_Union;
200+
if (Decl->isStruct())
201+
return APIRecord::RK_Struct;
202+
203+
return APIRecord::RK_CXXClass;
204+
}
205+
197206
StringRef getOwningModuleName(const Decl &D) {
198207
if (auto *OwningModule = D.getImportedOwningModule())
199208
return OwningModule->Name;
@@ -599,13 +608,6 @@ bool ExtractAPIVisitorBase<Derived>::VisitCXXRecordDecl(
599608
DeclarationFragments SubHeading =
600609
DeclarationFragmentsBuilder::getSubHeading(Decl);
601610

602-
APIRecord::RecordKind Kind;
603-
if (Decl->isUnion())
604-
Kind = APIRecord::RecordKind::RK_Union;
605-
else if (Decl->isStruct())
606-
Kind = APIRecord::RecordKind::RK_Struct;
607-
else
608-
Kind = APIRecord::RecordKind::RK_CXXClass;
609611
auto Access = DeclarationFragmentsBuilder::getAccessControl(Decl);
610612

611613
CXXClassRecord *Record;
@@ -619,13 +621,15 @@ bool ExtractAPIVisitorBase<Derived>::VisitCXXRecordDecl(
619621
AvailabilityInfo::createFromDecl(Decl), Comment, Declaration,
620622
SubHeading, Template(Decl->getDescribedClassTemplate()), Access,
621623
isInSystemHeader(Decl));
622-
} else
624+
} else {
623625
Record = API.createRecord<CXXClassRecord>(
624626
USR, Name, createHierarchyInformationForDecl(*Decl), Loc,
625627
AvailabilityInfo::createFromDecl(Decl), Comment, Declaration,
626-
SubHeading, Kind, Access, isInSystemHeader(Decl),
627-
isEmbeddedInVarDeclarator(*Decl));
628+
SubHeading, APIRecord::RecordKind::RK_CXXClass, Access,
629+
isInSystemHeader(Decl), isEmbeddedInVarDeclarator(*Decl));
630+
}
628631

632+
Record->KindForDisplay = getKindForDisplay(Decl);
629633
Record->Bases = getBases(Decl);
630634

631635
return true;
@@ -849,6 +853,7 @@ bool ExtractAPIVisitorBase<Derived>::
849853
Template(Decl), DeclarationFragmentsBuilder::getAccessControl(Decl),
850854
isInSystemHeader(Decl));
851855

856+
CTPSR->KindForDisplay = getKindForDisplay(Decl);
852857
CTPSR->Bases = getBases(Decl);
853858

854859
return true;

clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ Object serializeSymbolKind(APIRecord::RecordKind RK, Language Lang) {
514514
/// which is prefixed by the source language name, useful for tooling to parse
515515
/// the kind, and a \c displayName for rendering human-readable names.
516516
Object serializeSymbolKind(const APIRecord &Record, Language Lang) {
517-
return serializeSymbolKind(Record.getKind(), Lang);
517+
return serializeSymbolKind(Record.KindForDisplay, Lang);
518518
}
519519

520520
/// Serialize the function signature field, as specified by the
@@ -591,8 +591,8 @@ Array generateParentContexts(const SmallVectorImpl<SymbolReference> &Parents,
591591
Elem["usr"] = Parent.USR;
592592
Elem["name"] = Parent.Name;
593593
if (Parent.Record)
594-
Elem["kind"] =
595-
serializeSymbolKind(Parent.Record->getKind(), Lang)["identifier"];
594+
Elem["kind"] = serializeSymbolKind(Parent.Record->KindForDisplay,
595+
Lang)["identifier"];
596596
else
597597
Elem["kind"] =
598598
serializeSymbolKind(APIRecord::RK_Unknown, Lang)["identifier"];

0 commit comments

Comments
 (0)