Skip to content

Commit 05439d3

Browse files
[clang][ExtractAPI] Distinguish between record kind for display and for RTTI (llvm#91466)
rdar://127732562
1 parent 04fb099 commit 05439d3

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

clang/include/clang/ExtractAPI/API.h

Lines changed: 7 additions & 1 deletion
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,7 +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) {}
300+
301+
APIRecord(RecordKind Kind, StringRef USR, StringRef Name)
302+
: USR(USR), Name(Name), KindForDisplay(Kind), Kind(Kind) {}
297303

298304
// Pure virtual destructor to make APIRecord abstract
299305
virtual ~APIRecord() = 0;

clang/include/clang/ExtractAPI/ExtractAPIVisitor.h

Lines changed: 15 additions & 9 deletions
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;
@@ -573,13 +582,6 @@ bool ExtractAPIVisitorBase<Derived>::VisitCXXRecordDecl(
573582
DeclarationFragments SubHeading =
574583
DeclarationFragmentsBuilder::getSubHeading(Decl);
575584

576-
APIRecord::RecordKind Kind;
577-
if (Decl->isUnion())
578-
Kind = APIRecord::RecordKind::RK_Union;
579-
else if (Decl->isStruct())
580-
Kind = APIRecord::RecordKind::RK_Struct;
581-
else
582-
Kind = APIRecord::RecordKind::RK_CXXClass;
583585
auto Access = DeclarationFragmentsBuilder::getAccessControl(Decl);
584586

585587
CXXClassRecord *Record;
@@ -594,12 +596,15 @@ bool ExtractAPIVisitorBase<Derived>::VisitCXXRecordDecl(
594596
AvailabilityInfo::createFromDecl(Decl), Comment, Declaration,
595597
SubHeading, Template(Decl->getDescribedClassTemplate()), Access,
596598
isInSystemHeader(Decl));
597-
} else
599+
} else {
598600
Record = API.createRecord<CXXClassRecord>(
599601
USR, Name, createHierarchyInformationForDecl(*Decl), Loc,
600602
AvailabilityInfo::createFromDecl(Decl), Comment, Declaration,
601-
SubHeading, Kind, Access, isInSystemHeader(Decl));
603+
SubHeading, APIRecord::RecordKind::RK_CXXClass, Access,
604+
isInSystemHeader(Decl));
605+
}
602606

607+
Record->KindForDisplay = getKindForDisplay(Decl);
603608
Record->Bases = getBases(Decl);
604609

605610
return true;
@@ -823,6 +828,7 @@ bool ExtractAPIVisitorBase<Derived>::
823828
Template(Decl), DeclarationFragmentsBuilder::getAccessControl(Decl),
824829
isInSystemHeader(Decl));
825830

831+
CTPSR->KindForDisplay = getKindForDisplay(Decl);
826832
CTPSR->Bases = getBases(Decl);
827833

828834
return true;

clang/lib/ExtractAPI/Serialization/SymbolGraphSerializer.cpp

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

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

0 commit comments

Comments
 (0)