Skip to content

Commit 8d8c898

Browse files
committed
[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 8842d7e commit 8d8c898

File tree

11 files changed

+1067
-4
lines changed

11 files changed

+1067
-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,
@@ -279,6 +300,14 @@ struct GlobalVariableRecord : APIRecord {
279300
Linkage, Comment, Declaration, SubHeading,
280301
IsFromSystemHeader) {}
281302

303+
GlobalVariableRecord(RecordKind Kind, StringRef USR, StringRef Name,
304+
PresumedLoc Loc, AvailabilitySet Availabilities,
305+
LinkageInfo Linkage, const DocComment &Comment,
306+
DeclarationFragments Declaration,
307+
DeclarationFragments SubHeading, bool IsFromSystemHeader)
308+
: APIRecord(Kind, USR, Name, Loc, std::move(Availabilities), Linkage,
309+
Comment, Declaration, SubHeading, IsFromSystemHeader) {}
310+
282311
static bool classof(const APIRecord *Record) {
283312
return Record->getKind() == RK_GlobalVariable;
284313
}
@@ -287,6 +316,61 @@ struct GlobalVariableRecord : APIRecord {
287316
virtual void anchor();
288317
};
289318

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

783867
struct ConceptRecord : APIRecord {
784868
Template Templ;
869+
785870
ConceptRecord(StringRef USR, StringRef Name, PresumedLoc Loc,
786871
AvailabilitySet Availabilities, const DocComment &Comment,
787872
DeclarationFragments Declaration,
@@ -791,10 +876,6 @@ struct ConceptRecord : APIRecord {
791876
LinkageInfo::none(), Comment, Declaration, SubHeading,
792877
IsFromSystemHeader),
793878
Templ(Template) {}
794-
795-
static bool classof(const APIRecord *Record) {
796-
return Record->getKind() == RK_Concept;
797-
}
798879
};
799880

800881
/// This holds information associated with Objective-C categories.
@@ -938,6 +1019,11 @@ template <>
9381019
struct has_template<ClassTemplatePartialSpecializationRecord>
9391020
: public std::true_type {};
9401021
template <> struct has_template<ConceptRecord> : public std::true_type {};
1022+
template <>
1023+
struct has_template<GlobalVariableTemplateRecord> : public std::true_type {};
1024+
template <>
1025+
struct has_template<GlobalVariableTemplatePartialSpecializationRecord>
1026+
: public std::true_type {};
9411027

9421028
/// APISet holds the set of API records collected from given inputs.
9431029
class APISet {
@@ -954,6 +1040,14 @@ class APISet {
9541040
const DocComment &Comment, DeclarationFragments Declaration,
9551041
DeclarationFragments SubHeadin, bool IsFromSystemHeaderg);
9561042

1043+
GlobalVariableTemplateRecord *
1044+
addGlobalVariableTemplate(StringRef Name, StringRef USR, PresumedLoc Loc,
1045+
AvailabilitySet Availability, LinkageInfo Linkage,
1046+
const DocComment &Comment,
1047+
DeclarationFragments Declaration,
1048+
DeclarationFragments SubHeading, Template Template,
1049+
bool IsFromSystemHeader);
1050+
9571051
/// Create and add a function record into the API set.
9581052
///
9591053
/// Note: the caller is responsible for keeping the StringRef \p Name and
@@ -1056,6 +1150,21 @@ class APISet {
10561150
DeclarationFragments Declaration, DeclarationFragments SubHeading,
10571151
Template Template, bool IsFromSystemHeader);
10581152

1153+
GlobalVariableTemplateSpecializationRecord *
1154+
addGlobalVariableTemplateSpecialization(
1155+
StringRef Name, StringRef USR, PresumedLoc Loc,
1156+
AvailabilitySet Availability, LinkageInfo Linkage,
1157+
const DocComment &Comment, DeclarationFragments Declaration,
1158+
DeclarationFragments SubHeading, bool IsFromSystemHeader);
1159+
1160+
GlobalVariableTemplatePartialSpecializationRecord *
1161+
addGlobalVariableTemplatePartialSpecialization(
1162+
StringRef Name, StringRef USR, PresumedLoc Loc,
1163+
AvailabilitySet Availability, LinkageInfo Linkage,
1164+
const DocComment &Comment, DeclarationFragments Declaration,
1165+
DeclarationFragments SubHeading, Template Template,
1166+
bool IsFromSystemHeader);
1167+
10591168
CXXMethodRecord *
10601169
addCXXMethod(CXXClassRecord *CXXClassRecord, StringRef Name, StringRef USR,
10611170
PresumedLoc Loc, AvailabilitySet Availability,
@@ -1199,9 +1308,21 @@ class APISet {
11991308
const RecordMap<GlobalVariableRecord> &getGlobalVariables() const {
12001309
return GlobalVariables;
12011310
}
1311+
const RecordMap<GlobalVariableTemplateRecord> &
1312+
getGlobalVariableTemplates() const {
1313+
return GlobalVariableTemplates;
1314+
}
12021315
const RecordMap<StaticFieldRecord> &getStaticFields() const {
12031316
return StaticFields;
12041317
}
1318+
const RecordMap<GlobalVariableTemplateSpecializationRecord> &
1319+
getGlobalVariableTemplateSpecializations() const {
1320+
return GlobalVariableTemplateSpecializations;
1321+
}
1322+
const RecordMap<GlobalVariableTemplatePartialSpecializationRecord> &
1323+
getGlobalVariableTemplatePartialSpecializations() const {
1324+
return GlobalVariableTemplatePartialSpecializations;
1325+
}
12051326
const RecordMap<EnumRecord> &getEnums() const { return Enums; }
12061327
const RecordMap<StructRecord> &getStructs() const { return Structs; }
12071328
const RecordMap<CXXClassRecord> &getCXXClasses() const { return CXXClasses; }
@@ -1271,6 +1392,11 @@ class APISet {
12711392
llvm::DenseMap<StringRef, APIRecord *> USRBasedLookupTable;
12721393
RecordMap<GlobalFunctionRecord> GlobalFunctions;
12731394
RecordMap<GlobalVariableRecord> GlobalVariables;
1395+
RecordMap<GlobalVariableTemplateRecord> GlobalVariableTemplates;
1396+
RecordMap<GlobalVariableTemplateSpecializationRecord>
1397+
GlobalVariableTemplateSpecializations;
1398+
RecordMap<GlobalVariableTemplatePartialSpecializationRecord>
1399+
GlobalVariableTemplatePartialSpecializations;
12741400
RecordMap<ConceptRecord> Concepts;
12751401
RecordMap<StaticFieldRecord> StaticFields;
12761402
RecordMap<EnumRecord> Enums;

clang/include/clang/ExtractAPI/DeclarationFragments.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
#include "clang/AST/DeclCXX.h"
2424
#include "clang/AST/DeclObjC.h"
2525
#include "clang/AST/DeclTemplate.h"
26+
#include "clang/AST/ExprCXX.h"
27+
#include "clang/Basic/Specifiers.h"
2628
#include "clang/Lex/MacroInfo.h"
29+
#include "llvm/ADT/SmallVector.h"
2730
#include "llvm/ADT/StringRef.h"
2831
#include <vector>
2932

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

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

@@ -320,6 +325,12 @@ class DeclarationFragmentsBuilder {
320325
static DeclarationFragments getFragmentsForClassTemplatePartialSpecialization(
321326
const ClassTemplatePartialSpecializationDecl *);
322327

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

0 commit comments

Comments
 (0)