Skip to content

Commit d2e206d

Browse files
evelez7daniel-grumberg
authored andcommitted
[clang][ExtractAPI] Add support for C++ variable templates
Serialize global C++ variable templates and specializations. Depends on D157076 Reviewed By: dang Differential Revision: https://reviews.llvm.org/D157350
1 parent f46b01a commit d2e206d

File tree

11 files changed

+1066
-4
lines changed

11 files changed

+1066
-4
lines changed

clang/include/clang/ExtractAPI/API.h

Lines changed: 130 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,24 @@ class Template {
9999
}
100100
}
101101

102+
Template(const VarTemplatePartialSpecializationDecl *Decl) {
103+
for (auto *const Parameter : *Decl->getTemplateParameters()) {
104+
const auto *Param = dyn_cast<TemplateTypeParmDecl>(Parameter);
105+
if (!Param) // some params are null
106+
continue;
107+
std::string Type;
108+
if (Param->hasTypeConstraint())
109+
Type = Param->getTypeConstraint()->getNamedConcept()->getName().str();
110+
else if (Param->wasDeclaredWithTypename())
111+
Type = "typename";
112+
else
113+
Type = "class";
114+
115+
addTemplateParameter(Type, Param->getName().str(), Param->getIndex(),
116+
Param->getDepth(), Param->isParameterPack());
117+
}
118+
}
119+
102120
const llvm::SmallVector<TemplateParameter> &getParameters() const {
103121
return Parameters;
104122
}
@@ -141,6 +159,9 @@ struct APIRecord {
141159
RK_Unknown,
142160
RK_GlobalFunction,
143161
RK_GlobalVariable,
162+
RK_GlobalVariableTemplate,
163+
RK_GlobalVariableTemplateSpecialization,
164+
RK_GlobalVariableTemplatePartialSpecialization,
144165
RK_EnumConstant,
145166
RK_Enum,
146167
RK_StructField,
@@ -275,6 +296,14 @@ struct GlobalVariableRecord : APIRecord {
275296
Linkage, Comment, Declaration, SubHeading,
276297
IsFromSystemHeader) {}
277298

299+
GlobalVariableRecord(RecordKind Kind, StringRef USR, StringRef Name,
300+
PresumedLoc Loc, AvailabilitySet Availabilities,
301+
LinkageInfo Linkage, const DocComment &Comment,
302+
DeclarationFragments Declaration,
303+
DeclarationFragments SubHeading, bool IsFromSystemHeader)
304+
: APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), Linkage,
305+
Comment, Declaration, SubHeading, IsFromSystemHeader) {}
306+
278307
static bool classof(const APIRecord *Record) {
279308
return Record->getKind() == RK_GlobalVariable;
280309
}
@@ -283,6 +312,61 @@ struct GlobalVariableRecord : APIRecord {
283312
virtual void anchor();
284313
};
285314

315+
struct GlobalVariableTemplateRecord : GlobalVariableRecord {
316+
Template Templ;
317+
318+
GlobalVariableTemplateRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
319+
AvailabilitySet Availabilities,
320+
LinkageInfo Linkage, const DocComment &Comment,
321+
DeclarationFragments Declaration,
322+
DeclarationFragments SubHeading,
323+
class Template Template, bool IsFromSystemHeader)
324+
: GlobalVariableRecord(RK_GlobalVariableTemplate, USR, Name, Loc,
325+
std::move(Availabilities), Linkage, Comment,
326+
Declaration, SubHeading, IsFromSystemHeader),
327+
Templ(Template) {}
328+
329+
static bool classof(const APIRecord *Record) {
330+
return Record->getKind() == RK_GlobalVariableTemplate;
331+
}
332+
};
333+
334+
struct GlobalVariableTemplateSpecializationRecord : GlobalVariableRecord {
335+
GlobalVariableTemplateSpecializationRecord(
336+
StringRef USR, StringRef Name, PresumedLoc Loc,
337+
AvailabilitySet Availabilities, LinkageInfo Linkage,
338+
const DocComment &Comment, DeclarationFragments Declaration,
339+
DeclarationFragments SubHeading, bool IsFromSystemHeader)
340+
: GlobalVariableRecord(RK_GlobalVariableTemplateSpecialization, USR, Name,
341+
Loc, std::move(Availabilities), Linkage, Comment,
342+
Declaration, SubHeading, IsFromSystemHeader) {}
343+
344+
static bool classof(const APIRecord *Record) {
345+
return Record->getKind() == RK_GlobalVariableTemplateSpecialization;
346+
}
347+
};
348+
349+
struct GlobalVariableTemplatePartialSpecializationRecord
350+
: GlobalVariableRecord {
351+
Template Templ;
352+
353+
GlobalVariableTemplatePartialSpecializationRecord(
354+
StringRef USR, StringRef Name, PresumedLoc Loc,
355+
AvailabilitySet Availabilities, LinkageInfo Linkage,
356+
const DocComment &Comment, DeclarationFragments Declaration,
357+
DeclarationFragments SubHeading, class Template Template,
358+
bool IsFromSystemHeader)
359+
: GlobalVariableRecord(RK_GlobalVariableTemplatePartialSpecialization,
360+
USR, Name, Loc, std::move(Availabilities), Linkage,
361+
Comment, Declaration, SubHeading,
362+
IsFromSystemHeader),
363+
Templ(Template) {}
364+
365+
static bool classof(const APIRecord *Record) {
366+
return Record->getKind() == RK_GlobalVariableTemplatePartialSpecialization;
367+
}
368+
};
369+
286370
/// This holds information associated with enum constants.
287371
struct EnumConstantRecord : APIRecord {
288372
EnumConstantRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
@@ -778,6 +862,7 @@ struct ClassTemplatePartialSpecializationRecord : CXXClassRecord {
778862

779863
struct ConceptRecord : APIRecord {
780864
Template Templ;
865+
781866
ConceptRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
782867
AvailabilitySet Availabilities, const DocComment &Comment,
783868
DeclarationFragments Declaration,
@@ -787,10 +872,6 @@ struct ConceptRecord : APIRecord {
787872
LinkageInfo::none(), Comment, Declaration, SubHeading,
788873
IsFromSystemHeader),
789874
Templ(Template) {}
790-
791-
static bool classof(const APIRecord *Record) {
792-
return Record->getKind() == RK_Concept;
793-
}
794875
};
795876

796877
/// This holds information associated with Objective-C categories.
@@ -932,6 +1013,11 @@ template <>
9321013
struct has_template<ClassTemplatePartialSpecializationRecord>
9331014
: public std::true_type {};
9341015
template <> struct has_template<ConceptRecord> : public std::true_type {};
1016+
template <>
1017+
struct has_template<GlobalVariableTemplateRecord> : public std::true_type {};
1018+
template <>
1019+
struct has_template<GlobalVariableTemplatePartialSpecializationRecord>
1020+
: public std::true_type {};
9351021

9361022
/// APISet holds the set of API records collected from given inputs.
9371023
class APISet {
@@ -948,6 +1034,14 @@ class APISet {
9481034
const DocComment &Comment, DeclarationFragments Declaration,
9491035
DeclarationFragments SubHeadin, bool IsFromSystemHeaderg);
9501036

1037+
GlobalVariableTemplateRecord *
1038+
addGlobalVariableTemplate(StringRef Name, StringRef USR, PresumedLoc Loc,
1039+
AvailabilitySet Availability, LinkageInfo Linkage,
1040+
const DocComment &Comment,
1041+
DeclarationFragments Declaration,
1042+
DeclarationFragments SubHeading, Template Template,
1043+
bool IsFromSystemHeader);
1044+
9511045
/// Create and add a function record into the API set.
9521046
///
9531047
/// Note: the caller is responsible for keeping the StringRef \p Name and
@@ -1050,6 +1144,21 @@ class APISet {
10501144
DeclarationFragments Declaration, DeclarationFragments SubHeading,
10511145
Template Template, bool IsFromSystemHeader);
10521146

1147+
GlobalVariableTemplateSpecializationRecord *
1148+
addGlobalVariableTemplateSpecialization(
1149+
StringRef Name, StringRef USR, PresumedLoc Loc,
1150+
AvailabilitySet Availability, LinkageInfo Linkage,
1151+
const DocComment &Comment, DeclarationFragments Declaration,
1152+
DeclarationFragments SubHeading, bool IsFromSystemHeader);
1153+
1154+
GlobalVariableTemplatePartialSpecializationRecord *
1155+
addGlobalVariableTemplatePartialSpecialization(
1156+
StringRef Name, StringRef USR, PresumedLoc Loc,
1157+
AvailabilitySet Availability, LinkageInfo Linkage,
1158+
const DocComment &Comment, DeclarationFragments Declaration,
1159+
DeclarationFragments SubHeading, Template Template,
1160+
bool IsFromSystemHeader);
1161+
10531162
CXXMethodRecord *
10541163
addCXXMethod(CXXClassRecord *CXXClassRecord, StringRef Name, StringRef USR,
10551164
PresumedLoc Loc, AvailabilitySet Availability,
@@ -1193,9 +1302,21 @@ class APISet {
11931302
const RecordMap<GlobalVariableRecord> &getGlobalVariables() const {
11941303
return GlobalVariables;
11951304
}
1305+
const RecordMap<GlobalVariableTemplateRecord> &
1306+
getGlobalVariableTemplates() const {
1307+
return GlobalVariableTemplates;
1308+
}
11961309
const RecordMap<StaticFieldRecord> &getStaticFields() const {
11971310
return StaticFields;
11981311
}
1312+
const RecordMap<GlobalVariableTemplateSpecializationRecord> &
1313+
getGlobalVariableTemplateSpecializations() const {
1314+
return GlobalVariableTemplateSpecializations;
1315+
}
1316+
const RecordMap<GlobalVariableTemplatePartialSpecializationRecord> &
1317+
getGlobalVariableTemplatePartialSpecializations() const {
1318+
return GlobalVariableTemplatePartialSpecializations;
1319+
}
11991320
const RecordMap<EnumRecord> &getEnums() const { return Enums; }
12001321
const RecordMap<StructRecord> &getStructs() const { return Structs; }
12011322
const RecordMap<CXXClassRecord> &getCXXClasses() const { return CXXClasses; }
@@ -1265,6 +1386,11 @@ class APISet {
12651386
llvm::DenseMap<StringRef, APIRecord *> USRBasedLookupTable;
12661387
RecordMap<GlobalFunctionRecord> GlobalFunctions;
12671388
RecordMap<GlobalVariableRecord> GlobalVariables;
1389+
RecordMap<GlobalVariableTemplateRecord> GlobalVariableTemplates;
1390+
RecordMap<GlobalVariableTemplateSpecializationRecord>
1391+
GlobalVariableTemplateSpecializations;
1392+
RecordMap<GlobalVariableTemplatePartialSpecializationRecord>
1393+
GlobalVariableTemplatePartialSpecializations;
12681394
RecordMap<ConceptRecord> Concepts;
12691395
RecordMap<StaticFieldRecord> StaticFields;
12701396
RecordMap<EnumRecord> Enums;

clang/include/clang/ExtractAPI/DeclarationFragments.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@
2323
#include "clang/AST/DeclCXX.h"
2424
#include "clang/AST/DeclObjC.h"
2525
#include "clang/AST/DeclTemplate.h"
26+
#include "clang/AST/ExprCXX.h"
2627
#include "clang/AST/TypeLoc.h"
28+
#include "clang/Basic/Specifiers.h"
2729
#include "clang/Lex/MacroInfo.h"
30+
#include "llvm/ADT/SmallVector.h"
2831
#include "llvm/ADT/StringRef.h"
2932
#include <vector>
3033

@@ -269,6 +272,8 @@ class DeclarationFragmentsBuilder {
269272
/// Build DeclarationFragments for a variable declaration VarDecl.
270273
static DeclarationFragments getFragmentsForVar(const VarDecl *);
271274

275+
static DeclarationFragments getFragmentsForVarTemplate(const VarDecl *);
276+
272277
/// Build DeclarationFragments for a function declaration FunctionDecl.
273278
static DeclarationFragments getFragmentsForFunction(const FunctionDecl *);
274279

@@ -321,6 +326,12 @@ class DeclarationFragmentsBuilder {
321326
static DeclarationFragments getFragmentsForClassTemplatePartialSpecialization(
322327
const ClassTemplatePartialSpecializationDecl *);
323328

329+
static DeclarationFragments getFragmentsForVarTemplateSpecialization(
330+
const VarTemplateSpecializationDecl *);
331+
332+
static DeclarationFragments getFragmentsForVarTemplatePartialSpecialization(
333+
const VarTemplatePartialSpecializationDecl *);
334+
324335
/// Build DeclarationFragments for an Objective-C category declaration
325336
/// ObjCCategoryDecl.
326337
static DeclarationFragments

0 commit comments

Comments
 (0)