@@ -208,20 +208,20 @@ struct APIRecord {
208
208
RK_ClassTemplate,
209
209
RK_ClassTemplateSpecialization,
210
210
RK_ClassTemplatePartialSpecialization,
211
- RK_LastRecordContext,
212
- RK_GlobalFunction,
213
- RK_GlobalFunctionTemplate,
214
- RK_GlobalFunctionTemplateSpecialization,
211
+ RK_StructField,
212
+ RK_UnionField,
213
+ RK_CXXField,
214
+ RK_StaticField,
215
+ RK_CXXFieldTemplate,
215
216
RK_GlobalVariable,
216
217
RK_GlobalVariableTemplate,
217
218
RK_GlobalVariableTemplateSpecialization,
218
219
RK_GlobalVariableTemplatePartialSpecialization,
220
+ RK_LastRecordContext,
221
+ RK_GlobalFunction,
222
+ RK_GlobalFunctionTemplate,
223
+ RK_GlobalFunctionTemplateSpecialization,
219
224
RK_EnumConstant,
220
- RK_StructField,
221
- RK_UnionField,
222
- RK_StaticField,
223
- RK_CXXField,
224
- RK_CXXFieldTemplate,
225
225
RK_Concept,
226
226
RK_CXXStaticMethod,
227
227
RK_CXXInstanceMethod,
@@ -321,6 +321,8 @@ class RecordContext {
321
321
322
322
RecordContext (APIRecord::RecordKind Kind) : Kind(Kind) {}
323
323
324
+ void stealRecordChain (RecordContext &Other);
325
+
324
326
APIRecord::RecordKind getKind () const { return Kind; }
325
327
326
328
struct record_iterator {
@@ -475,31 +477,36 @@ struct GlobalFunctionTemplateSpecializationRecord : GlobalFunctionRecord {
475
477
};
476
478
477
479
// / This holds information associated with global functions.
478
- struct GlobalVariableRecord : APIRecord {
480
+ struct GlobalVariableRecord : APIRecord, RecordContext {
479
481
GlobalVariableRecord (StringRef USR, StringRef Name, SymbolReference Parent,
480
482
PresumedLoc Loc, AvailabilityInfo Availability,
481
483
LinkageInfo Linkage, const DocComment &Comment,
482
484
DeclarationFragments Declaration,
483
485
DeclarationFragments SubHeading, bool IsFromSystemHeader)
484
486
: APIRecord(RK_GlobalVariable, USR, Name, Parent, Loc,
485
487
std::move (Availability), Linkage, Comment, Declaration,
486
- SubHeading, IsFromSystemHeader) {}
488
+ SubHeading, IsFromSystemHeader),
489
+ RecordContext(RK_GlobalVariable) {}
487
490
488
491
GlobalVariableRecord (RecordKind Kind, StringRef USR, StringRef Name,
489
- SymbolReference Parent,
490
-
491
- PresumedLoc Loc, AvailabilityInfo Availability,
492
- LinkageInfo Linkage, const DocComment &Comment,
492
+ SymbolReference Parent, PresumedLoc Loc,
493
+ AvailabilityInfo Availability, LinkageInfo Linkage,
494
+ const DocComment &Comment,
493
495
DeclarationFragments Declaration,
494
496
DeclarationFragments SubHeading, bool IsFromSystemHeader)
495
497
: APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
496
498
Linkage, Comment, Declaration, SubHeading,
497
- IsFromSystemHeader) {}
499
+ IsFromSystemHeader),
500
+ RecordContext(Kind) {}
498
501
499
502
static bool classof (const APIRecord *Record) {
500
503
return classofKind (Record->getKind ());
501
504
}
502
- static bool classofKind (RecordKind K) { return K == RK_GlobalVariable; }
505
+ static bool classofKind (RecordKind K) {
506
+ return K == RK_GlobalVariable || K == RK_GlobalVariableTemplate ||
507
+ K == RK_GlobalVariableTemplateSpecialization ||
508
+ K == RK_GlobalVariableTemplatePartialSpecialization;
509
+ }
503
510
504
511
private:
505
512
virtual void anchor ();
@@ -591,36 +598,64 @@ struct EnumConstantRecord : APIRecord {
591
598
virtual void anchor ();
592
599
};
593
600
601
+ struct TagRecord : APIRecord, RecordContext {
602
+ TagRecord (RecordKind Kind, StringRef USR, StringRef Name,
603
+ SymbolReference Parent, PresumedLoc Loc,
604
+ AvailabilityInfo Availability, const DocComment &Comment,
605
+ DeclarationFragments Declaration, DeclarationFragments SubHeading,
606
+ bool IsFromSystemHeader, bool IsEmbeddedInVarDeclarator,
607
+ AccessControl Access = AccessControl())
608
+ : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
609
+ LinkageInfo::none (), Comment, Declaration, SubHeading,
610
+ IsFromSystemHeader, std::move(Access)),
611
+ RecordContext(Kind),
612
+ IsEmbeddedInVarDeclarator(IsEmbeddedInVarDeclarator){};
613
+
614
+ static bool classof (const APIRecord *Record) {
615
+ return classofKind (Record->getKind ());
616
+ }
617
+ static bool classofKind (RecordKind K) {
618
+ return K == RK_Struct || K == RK_Union || K == RK_Enum;
619
+ }
620
+
621
+ bool IsEmbeddedInVarDeclarator;
622
+
623
+ virtual ~TagRecord () = 0 ;
624
+ };
625
+
594
626
// / This holds information associated with enums.
595
- struct EnumRecord : APIRecord, RecordContext {
627
+ struct EnumRecord : TagRecord {
596
628
EnumRecord (StringRef USR, StringRef Name, SymbolReference Parent,
597
629
PresumedLoc Loc, AvailabilityInfo Availability,
598
630
const DocComment &Comment, DeclarationFragments Declaration,
599
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
600
- : APIRecord(RK_Enum, USR, Name, Parent, Loc, std::move(Availability),
601
- LinkageInfo::none (), Comment, Declaration, SubHeading,
602
- IsFromSystemHeader),
603
- RecordContext(RK_Enum) {}
631
+ DeclarationFragments SubHeading, bool IsFromSystemHeader,
632
+ bool IsEmbeddedInVarDeclarator,
633
+ AccessControl Access = AccessControl())
634
+ : TagRecord(RK_Enum, USR, Name, Parent, Loc, std::move(Availability),
635
+ Comment, Declaration, SubHeading, IsFromSystemHeader,
636
+ IsEmbeddedInVarDeclarator, std::move(Access)) {}
604
637
605
638
static bool classof (const APIRecord *Record) {
606
639
return classofKind (Record->getKind ());
607
640
}
641
+
608
642
static bool classofKind (RecordKind K) { return K == RK_Enum; }
609
643
610
644
private:
611
645
virtual void anchor ();
612
646
};
613
647
614
648
// / This holds information associated with struct or union fields fields.
615
- struct RecordFieldRecord : APIRecord {
649
+ struct RecordFieldRecord : APIRecord, RecordContext {
616
650
RecordFieldRecord (RecordKind Kind, StringRef USR, StringRef Name,
617
651
SymbolReference Parent, PresumedLoc Loc,
618
652
AvailabilityInfo Availability, const DocComment &Comment,
619
653
DeclarationFragments Declaration,
620
654
DeclarationFragments SubHeading, bool IsFromSystemHeader)
621
655
: APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
622
656
LinkageInfo::none (), Comment, Declaration, SubHeading,
623
- IsFromSystemHeader) {}
657
+ IsFromSystemHeader),
658
+ RecordContext(Kind) {}
624
659
625
660
static bool classof (const APIRecord *Record) {
626
661
return classofKind (Record->getKind ());
@@ -633,16 +668,17 @@ struct RecordFieldRecord : APIRecord {
633
668
};
634
669
635
670
// / This holds information associated with structs and unions.
636
- struct RecordRecord : APIRecord, RecordContext {
671
+ struct RecordRecord : TagRecord {
637
672
RecordRecord (RecordKind Kind, StringRef USR, StringRef Name,
638
673
SymbolReference Parent, PresumedLoc Loc,
639
674
AvailabilityInfo Availability, const DocComment &Comment,
640
675
DeclarationFragments Declaration,
641
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
642
- : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
643
- LinkageInfo::none (), Comment, Declaration, SubHeading,
644
- IsFromSystemHeader),
645
- RecordContext(Kind) {}
676
+ DeclarationFragments SubHeading, bool IsFromSystemHeader,
677
+ bool IsEmbeddedInVarDeclarator,
678
+ AccessControl Access = AccessControl())
679
+ : TagRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
680
+ Comment, Declaration, SubHeading, IsFromSystemHeader,
681
+ IsEmbeddedInVarDeclarator, std::move(Access)) {}
646
682
647
683
static bool classof (const APIRecord *Record) {
648
684
return classofKind (Record->getKind ());
@@ -651,6 +687,8 @@ struct RecordRecord : APIRecord, RecordContext {
651
687
return K == RK_Struct || K == RK_Union;
652
688
}
653
689
690
+ bool isAnonymousWithNoTypedef () { return Name.empty (); }
691
+
654
692
virtual ~RecordRecord () = 0 ;
655
693
};
656
694
@@ -676,9 +714,11 @@ struct StructRecord : RecordRecord {
676
714
StructRecord (StringRef USR, StringRef Name, SymbolReference Parent,
677
715
PresumedLoc Loc, AvailabilityInfo Availability,
678
716
const DocComment &Comment, DeclarationFragments Declaration,
679
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
717
+ DeclarationFragments SubHeading, bool IsFromSystemHeader,
718
+ bool IsEmbeddedInVarDeclarator)
680
719
: RecordRecord(RK_Struct, USR, Name, Parent, Loc, std::move(Availability),
681
- Comment, Declaration, SubHeading, IsFromSystemHeader) {}
720
+ Comment, Declaration, SubHeading, IsFromSystemHeader,
721
+ IsEmbeddedInVarDeclarator) {}
682
722
683
723
static bool classof (const APIRecord *Record) {
684
724
return classofKind (Record->getKind ());
@@ -711,9 +751,11 @@ struct UnionRecord : RecordRecord {
711
751
UnionRecord (StringRef USR, StringRef Name, SymbolReference Parent,
712
752
PresumedLoc Loc, AvailabilityInfo Availability,
713
753
const DocComment &Comment, DeclarationFragments Declaration,
714
- DeclarationFragments SubHeading, bool IsFromSystemHeader)
754
+ DeclarationFragments SubHeading, bool IsFromSystemHeader,
755
+ bool IsEmbeddedInVarDeclarator)
715
756
: RecordRecord(RK_Union, USR, Name, Parent, Loc, std::move(Availability),
716
- Comment, Declaration, SubHeading, IsFromSystemHeader) {}
757
+ Comment, Declaration, SubHeading, IsFromSystemHeader,
758
+ IsEmbeddedInVarDeclarator) {}
717
759
718
760
static bool classof (const APIRecord *Record) {
719
761
return classofKind (Record->getKind ());
@@ -724,15 +766,16 @@ struct UnionRecord : RecordRecord {
724
766
virtual void anchor ();
725
767
};
726
768
727
- struct CXXFieldRecord : APIRecord {
769
+ struct CXXFieldRecord : APIRecord, RecordContext {
728
770
CXXFieldRecord (StringRef USR, StringRef Name, SymbolReference Parent,
729
771
PresumedLoc Loc, AvailabilityInfo Availability,
730
772
const DocComment &Comment, DeclarationFragments Declaration,
731
773
DeclarationFragments SubHeading, AccessControl Access,
732
774
bool IsFromSystemHeader)
733
775
: APIRecord(RK_CXXField, USR, Name, Parent, Loc, std::move(Availability),
734
776
LinkageInfo::none (), Comment, Declaration, SubHeading,
735
- IsFromSystemHeader, std::move(Access)) {}
777
+ IsFromSystemHeader, std::move(Access)),
778
+ RecordContext(RK_CXXField) {}
736
779
737
780
CXXFieldRecord (RecordKind Kind, StringRef USR, StringRef Name,
738
781
SymbolReference Parent, PresumedLoc Loc,
@@ -742,7 +785,8 @@ struct CXXFieldRecord : APIRecord {
742
785
bool IsFromSystemHeader)
743
786
: APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
744
787
LinkageInfo::none(), Comment, Declaration, SubHeading,
745
- IsFromSystemHeader, std::move(Access)) {}
788
+ IsFromSystemHeader, std::move(Access)),
789
+ RecordContext(Kind) {}
746
790
747
791
static bool classof (const APIRecord *Record) {
748
792
return classofKind (Record->getKind ());
@@ -1118,18 +1162,18 @@ struct ObjCContainerRecord : APIRecord, RecordContext {
1118
1162
virtual ~ObjCContainerRecord () = 0 ;
1119
1163
};
1120
1164
1121
- struct CXXClassRecord : APIRecord, RecordContext {
1165
+ struct CXXClassRecord : RecordRecord {
1122
1166
SmallVector<SymbolReference> Bases;
1123
1167
1124
1168
CXXClassRecord (StringRef USR, StringRef Name, SymbolReference Parent,
1125
1169
PresumedLoc Loc, AvailabilityInfo Availability,
1126
1170
const DocComment &Comment, DeclarationFragments Declaration,
1127
1171
DeclarationFragments SubHeading, RecordKind Kind,
1128
- AccessControl Access, bool IsFromSystemHeader)
1129
- : APIRecord(Kind, USR, Name, Parent, Loc, std::move(Availability),
1130
- LinkageInfo::none (), Comment, Declaration, SubHeading ,
1131
- IsFromSystemHeader, std::move(Access)) ,
1132
- RecordContext(Kind ) {}
1172
+ AccessControl Access, bool IsFromSystemHeader,
1173
+ bool IsEmbeddedInVarDeclarator = false )
1174
+ : RecordRecord(Kind, USR, Name, Parent, Loc, std::move(Availability) ,
1175
+ Comment, Declaration, SubHeading, IsFromSystemHeader ,
1176
+ IsEmbeddedInVarDeclarator, std::move(Access) ) {}
1133
1177
1134
1178
static bool classof (const APIRecord *Record) {
1135
1179
return classofKind (Record->getKind ());
0 commit comments