36
36
namespace clang {
37
37
namespace extractapi {
38
38
39
+ class Template {
40
+ struct TemplateParameter {
41
+ // "class", "typename", or concept name
42
+ std::string Type;
43
+ std::string Name;
44
+ unsigned int Index;
45
+ unsigned int Depth;
46
+ bool IsParameterPack;
47
+
48
+ TemplateParameter (std::string Type, std::string Name, unsigned int Index,
49
+ unsigned int Depth, bool IsParameterPack)
50
+ : Type(Type), Name(Name), Index(Index), Depth(Depth),
51
+ IsParameterPack (IsParameterPack) {}
52
+ };
53
+
54
+ struct TemplateConstraint {
55
+ // type name of the constraint, if it has one
56
+ std::string Type;
57
+ std::string Kind;
58
+ std::string LHS, RHS;
59
+ };
60
+ llvm::SmallVector<TemplateParameter> Parameters;
61
+ llvm::SmallVector<TemplateConstraint> Constraints;
62
+
63
+ public:
64
+ Template () = default;
65
+
66
+ Template (const TemplateDecl *Decl) {
67
+ for (auto *const Parameter : *Decl->getTemplateParameters ()) {
68
+ const auto *Param = dyn_cast<TemplateTypeParmDecl>(Parameter);
69
+ if (!Param) // some params are null
70
+ continue ;
71
+ std::string Type;
72
+ if (Param->hasTypeConstraint ())
73
+ Type = Param->getTypeConstraint ()->getNamedConcept ()->getName ().str ();
74
+ else if (Param->wasDeclaredWithTypename ())
75
+ Type = " typename" ;
76
+ else
77
+ Type = " class" ;
78
+
79
+ addTemplateParameter (Type, Param->getName ().str (), Param->getIndex (),
80
+ Param->getDepth (), Param->isParameterPack ());
81
+ }
82
+ }
83
+
84
+ Template (const ClassTemplatePartialSpecializationDecl *Decl) {
85
+ for (auto *const Parameter : *Decl->getTemplateParameters ()) {
86
+ const auto *Param = dyn_cast<TemplateTypeParmDecl>(Parameter);
87
+ if (!Param) // some params are null
88
+ continue ;
89
+ std::string Type;
90
+ if (Param->hasTypeConstraint ())
91
+ Type = Param->getTypeConstraint ()->getNamedConcept ()->getName ().str ();
92
+ else if (Param->wasDeclaredWithTypename ())
93
+ Type = " typename" ;
94
+ else
95
+ Type = " class" ;
96
+
97
+ addTemplateParameter (Type, Param->getName ().str (), Param->getIndex (),
98
+ Param->getDepth (), Param->isParameterPack ());
99
+ }
100
+ }
101
+
102
+ const llvm::SmallVector<TemplateParameter> &getParameters () const {
103
+ return Parameters;
104
+ }
105
+
106
+ const llvm::SmallVector<TemplateConstraint> &getConstraints () const {
107
+ return Constraints;
108
+ }
109
+
110
+ void addTemplateParameter (std::string Type, std::string Name,
111
+ unsigned int Index, unsigned int Depth,
112
+ bool IsParameterPack) {
113
+ Parameters.emplace_back (Type, Name, Index, Depth, IsParameterPack);
114
+ }
115
+
116
+ bool empty () const { return Parameters.empty () && Constraints.empty (); }
117
+ };
118
+
39
119
// / DocComment is a vector of RawComment::CommentLine.
40
120
// /
41
121
// / Each line represents one line of striped documentation comment,
@@ -69,6 +149,10 @@ struct APIRecord {
69
149
RK_StaticField,
70
150
RK_CXXField,
71
151
RK_CXXClass,
152
+ RK_ClassTemplate,
153
+ RK_ClassTemplateSpecialization,
154
+ RK_ClassTemplatePartialSpecialization,
155
+ RK_Concept,
72
156
RK_CXXStaticMethod,
73
157
RK_CXXInstanceMethod,
74
158
RK_CXXConstructorMethod,
@@ -640,6 +724,75 @@ struct CXXClassRecord : APIRecord {
640
724
virtual void anchor ();
641
725
};
642
726
727
+ struct ClassTemplateRecord : CXXClassRecord {
728
+ Template Templ;
729
+
730
+ ClassTemplateRecord (StringRef USR, StringRef Name, PresumedLoc Loc,
731
+ AvailabilitySet Availabilities, const DocComment &Comment,
732
+ DeclarationFragments Declaration,
733
+ DeclarationFragments SubHeading, Template Template,
734
+ bool IsFromSystemHeader)
735
+ : CXXClassRecord(USR, Name, Loc, std::move(Availabilities), Comment,
736
+ Declaration, SubHeading, RK_ClassTemplate,
737
+ IsFromSystemHeader),
738
+ Templ (Template) {}
739
+
740
+ static bool classof (const APIRecord *Record) {
741
+ return Record->getKind () == RK_ClassTemplate;
742
+ }
743
+ };
744
+
745
+ struct ClassTemplateSpecializationRecord : CXXClassRecord {
746
+ ClassTemplateSpecializationRecord (StringRef USR, StringRef Name,
747
+ PresumedLoc Loc,
748
+ AvailabilitySet Availabilities,
749
+ const DocComment &Comment,
750
+ DeclarationFragments Declaration,
751
+ DeclarationFragments SubHeading,
752
+ bool IsFromSystemHeader)
753
+ : CXXClassRecord(USR, Name, Loc, std::move(Availabilities), Comment,
754
+ Declaration, SubHeading, RK_ClassTemplateSpecialization,
755
+ IsFromSystemHeader) {}
756
+
757
+ static bool classof (const APIRecord *Record) {
758
+ return Record->getKind () == RK_ClassTemplateSpecialization;
759
+ }
760
+ };
761
+
762
+ struct ClassTemplatePartialSpecializationRecord : CXXClassRecord {
763
+ Template Templ;
764
+ ClassTemplatePartialSpecializationRecord (
765
+ StringRef USR, StringRef Name, PresumedLoc Loc,
766
+ AvailabilitySet Availabilities, const DocComment &Comment,
767
+ DeclarationFragments Declaration, DeclarationFragments SubHeading,
768
+ Template Template, bool IsFromSystemHeader)
769
+ : CXXClassRecord(USR, Name, Loc, std::move(Availabilities), Comment,
770
+ Declaration, SubHeading, RK_ClassTemplateSpecialization,
771
+ IsFromSystemHeader),
772
+ Templ (Template) {}
773
+
774
+ static bool classof (const APIRecord *Record) {
775
+ return Record->getKind () == RK_ClassTemplatePartialSpecialization;
776
+ }
777
+ };
778
+
779
+ struct ConceptRecord : APIRecord {
780
+ Template Templ;
781
+ ConceptRecord (StringRef USR, StringRef Name, PresumedLoc Loc,
782
+ AvailabilitySet Availabilities, const DocComment &Comment,
783
+ DeclarationFragments Declaration,
784
+ DeclarationFragments SubHeading, Template Template,
785
+ bool IsFromSystemHeader)
786
+ : APIRecord(RK_Concept, USR, Name, Loc, std::move(Availabilities),
787
+ LinkageInfo::none (), Comment, Declaration, SubHeading,
788
+ IsFromSystemHeader),
789
+ Templ(Template) {}
790
+
791
+ static bool classof (const APIRecord *Record) {
792
+ return Record->getKind () == RK_Concept;
793
+ }
794
+ };
795
+
643
796
// / This holds information associated with Objective-C categories.
644
797
struct ObjCCategoryRecord : ObjCContainerRecord {
645
798
SymbolReference Interface;
@@ -773,6 +926,13 @@ template <typename RecordTy> struct has_access : public std::false_type {};
773
926
template <> struct has_access <CXXMethodRecord> : public std::true_type {};
774
927
template <> struct has_access <CXXFieldRecord> : public std::true_type {};
775
928
929
+ template <typename RecordTy> struct has_template : public std ::false_type {};
930
+ template <> struct has_template <ClassTemplateRecord> : public std::true_type {};
931
+ template <>
932
+ struct has_template <ClassTemplatePartialSpecializationRecord>
933
+ : public std::true_type {};
934
+ template <> struct has_template <ConceptRecord> : public std::true_type {};
935
+
776
936
// / APISet holds the set of API records collected from given inputs.
777
937
class APISet {
778
938
public:
@@ -870,6 +1030,26 @@ class APISet {
870
1030
DeclarationFragments Declaration, DeclarationFragments SubHeading,
871
1031
APIRecord::RecordKind Kind, bool IsFromSystemHeader);
872
1032
1033
+ ClassTemplateRecord *
1034
+ addClassTemplate (StringRef Name, StringRef USR, PresumedLoc Loc,
1035
+ AvailabilitySet Availability, const DocComment &Comment,
1036
+ DeclarationFragments Declaration,
1037
+ DeclarationFragments SubHeading, Template Template,
1038
+ bool IsFromSystemHeader);
1039
+
1040
+ ClassTemplateSpecializationRecord *addClassTemplateSpecialization (
1041
+ StringRef Name, StringRef USR, PresumedLoc Loc,
1042
+ AvailabilitySet Availability, const DocComment &Comment,
1043
+ DeclarationFragments Declaration, DeclarationFragments SubHeading,
1044
+ bool IsFromSystemHeader);
1045
+
1046
+ ClassTemplatePartialSpecializationRecord *
1047
+ addClassTemplatePartialSpecialization (
1048
+ StringRef Name, StringRef USR, PresumedLoc Loc,
1049
+ AvailabilitySet Availability, const DocComment &Comment,
1050
+ DeclarationFragments Declaration, DeclarationFragments SubHeading,
1051
+ Template Template, bool IsFromSystemHeader);
1052
+
873
1053
CXXMethodRecord *
874
1054
addCXXMethod (CXXClassRecord *CXXClassRecord, StringRef Name, StringRef USR,
875
1055
PresumedLoc Loc, AvailabilitySet Availability,
@@ -884,6 +1064,13 @@ class APISet {
884
1064
FunctionSignature Signature, bool IsConstructor, AccessControl Access,
885
1065
bool IsFromSystemHeader);
886
1066
1067
+ ConceptRecord *addConcept (StringRef Name, StringRef USR, PresumedLoc Loc,
1068
+ AvailabilitySet Availability,
1069
+ const DocComment &Comment,
1070
+ DeclarationFragments Declaration,
1071
+ DeclarationFragments SubHeading, Template Template,
1072
+ bool IsFromSystemHeader);
1073
+
887
1074
// / Create and add an Objective-C category record into the API set.
888
1075
// /
889
1076
// / Note: the caller is responsible for keeping the StringRef \p Name and
@@ -1012,6 +1199,19 @@ class APISet {
1012
1199
const RecordMap<EnumRecord> &getEnums () const { return Enums; }
1013
1200
const RecordMap<StructRecord> &getStructs () const { return Structs; }
1014
1201
const RecordMap<CXXClassRecord> &getCXXClasses () const { return CXXClasses; }
1202
+ const RecordMap<ConceptRecord> &getConcepts () const { return Concepts; }
1203
+ const RecordMap<ClassTemplateRecord> &getClassTemplates () const {
1204
+ return ClassTemplates;
1205
+ }
1206
+ const RecordMap<ClassTemplateSpecializationRecord> &
1207
+ getClassTemplateSpecializations () const {
1208
+ return ClassTemplateSpecializations;
1209
+ }
1210
+ const RecordMap<ClassTemplatePartialSpecializationRecord> &
1211
+ getClassTemplatePartialSpecializations () const {
1212
+ return ClassTemplatePartialSpecializations;
1213
+ }
1214
+ const RecordMap<ConceptRecord> &getRecords () const { return Concepts; }
1015
1215
const RecordMap<ObjCCategoryRecord> &getObjCCategories () const {
1016
1216
return ObjCCategories;
1017
1217
}
@@ -1065,10 +1265,15 @@ class APISet {
1065
1265
llvm::DenseMap<StringRef, APIRecord *> USRBasedLookupTable;
1066
1266
RecordMap<GlobalFunctionRecord> GlobalFunctions;
1067
1267
RecordMap<GlobalVariableRecord> GlobalVariables;
1268
+ RecordMap<ConceptRecord> Concepts;
1068
1269
RecordMap<StaticFieldRecord> StaticFields;
1069
1270
RecordMap<EnumRecord> Enums;
1070
1271
RecordMap<StructRecord> Structs;
1071
1272
RecordMap<CXXClassRecord> CXXClasses;
1273
+ RecordMap<ClassTemplateRecord> ClassTemplates;
1274
+ RecordMap<ClassTemplateSpecializationRecord> ClassTemplateSpecializations;
1275
+ RecordMap<ClassTemplatePartialSpecializationRecord>
1276
+ ClassTemplatePartialSpecializations;
1072
1277
RecordMap<ObjCCategoryRecord> ObjCCategories;
1073
1278
RecordMap<ObjCInterfaceRecord> ObjCInterfaces;
1074
1279
RecordMap<ObjCProtocolRecord> ObjCProtocols;
0 commit comments