Skip to content

Commit d1118a8

Browse files
[clang][ExtractAPI] Distinguish between record kind for display and for RTTI
1 parent 01e91a2 commit d1118a8

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

clang/include/clang/ExtractAPI/API.h

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

267267
AccessControl Access;
268268

269+
RecordKind KindForDisplay;
269270
private:
270271
const RecordKind Kind;
271272
friend class RecordContext;
@@ -277,6 +278,7 @@ struct APIRecord {
277278
APIRecord *getNextInContext() const { return NextInContext; }
278279

279280
RecordKind getKind() const { return Kind; }
281+
RecordKind getKindForDisplay() const { return KindForDisplay; }
280282

281283
static APIRecord *castFromRecordContext(const RecordContext *Ctx);
282284
static RecordContext *castToRecordContext(const APIRecord *Record);
@@ -293,10 +295,10 @@ struct APIRecord {
293295
Availability(std::move(Availability)), Linkage(Linkage),
294296
Comment(Comment), Declaration(Declaration), SubHeading(SubHeading),
295297
IsFromSystemHeader(IsFromSystemHeader), Access(std::move(Access)),
296-
Kind(Kind) {}
298+
KindForDisplay(Kind), Kind(Kind) {}
297299

298300
APIRecord(RecordKind Kind, StringRef USR, StringRef Name)
299-
: USR(USR), Name(Name), Kind(Kind) {}
301+
: USR(USR), Name(Name), KindForDisplay(Kind), Kind(Kind) {}
300302

301303
// Pure virtual destructor to make APIRecord abstract
302304
virtual ~APIRecord() = 0;

clang/include/clang/ExtractAPI/ExtractAPIVisitor.h

+14-9
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),
628+
SubHeading, APIRecord::RecordKind::RK_CXXClass, Access, isInSystemHeader(Decl),
627629
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

+2-2
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
@@ -592,7 +592,7 @@ Array generateParentContexts(const SmallVectorImpl<SymbolReference> &Parents,
592592
Elem["name"] = Parent.Name;
593593
if (Parent.Record)
594594
Elem["kind"] =
595-
serializeSymbolKind(Parent.Record->getKind(), Lang)["identifier"];
595+
serializeSymbolKind(Parent.Record->KindForDisplay, Lang)["identifier"];
596596
else
597597
Elem["kind"] =
598598
serializeSymbolKind(APIRecord::RK_Unknown, Lang)["identifier"];

0 commit comments

Comments
 (0)