forked from OSchip/llvm-project
Comment AST: DeclInfo: collapse a bunch of boolean flags into an enum.
llvm-svn: 161352
This commit is contained in:
parent
a3e3343e51
commit
8e5d5f1feb
|
@ -925,7 +925,8 @@ struct DeclInfo {
|
|||
QualType ResultType;
|
||||
|
||||
/// Template parameters that can be referenced by \\tparam if \c ThisDecl is
|
||||
/// a template.
|
||||
/// a template (\c IsTemplateDecl or \c IsTemplatePartialSpecialization is
|
||||
/// true).
|
||||
const TemplateParameterList *TemplateParameters;
|
||||
|
||||
/// A simplified description of \c ThisDecl kind that should be good enough
|
||||
|
@ -963,6 +964,14 @@ struct DeclInfo {
|
|||
TypedefKind
|
||||
};
|
||||
|
||||
/// What kind of template specialization \c ThisDecl is.
|
||||
enum TemplateDeclKind {
|
||||
NotTemplate,
|
||||
Template,
|
||||
TemplateSpecialization,
|
||||
TemplatePartialSpecialization
|
||||
};
|
||||
|
||||
/// If false, only \c ThisDecl is valid.
|
||||
unsigned IsFilled : 1;
|
||||
|
||||
|
@ -970,14 +979,7 @@ struct DeclInfo {
|
|||
unsigned Kind : 3;
|
||||
|
||||
/// Is \c ThisDecl a template declaration.
|
||||
unsigned IsTemplateDecl : 1;
|
||||
|
||||
/// Is \c ThisDecl a template specialization.
|
||||
unsigned IsTemplateSpecialization : 1;
|
||||
|
||||
/// Is \c ThisDecl a template partial specialization.
|
||||
/// Never true if \c IsFunctionDecl is true.
|
||||
unsigned IsTemplatePartialSpecialization : 1;
|
||||
unsigned TemplateKind : 2;
|
||||
|
||||
/// Is \c ThisDecl an ObjCMethodDecl.
|
||||
unsigned IsObjCMethod : 1;
|
||||
|
@ -997,6 +999,10 @@ struct DeclInfo {
|
|||
DeclKind getKind() const LLVM_READONLY {
|
||||
return static_cast<DeclKind>(Kind);
|
||||
}
|
||||
|
||||
TemplateDeclKind getTemplateKind() const LLVM_READONLY {
|
||||
return static_cast<TemplateDeclKind>(TemplateKind);
|
||||
}
|
||||
};
|
||||
|
||||
/// A full comment attached to a declaration, contains block content.
|
||||
|
|
|
@ -188,7 +188,7 @@ public:
|
|||
void checkBlockCommandDuplicate(const BlockCommandComment *Command);
|
||||
|
||||
bool isFunctionDecl();
|
||||
bool isTemplateDecl();
|
||||
bool isTemplateOrSpecialization();
|
||||
|
||||
ArrayRef<const ParmVarDecl *> getParamVars();
|
||||
|
||||
|
|
|
@ -142,9 +142,7 @@ void DeclInfo::fill() {
|
|||
|
||||
// Set defaults.
|
||||
Kind = OtherKind;
|
||||
IsTemplateDecl = false;
|
||||
IsTemplateSpecialization = false;
|
||||
IsTemplatePartialSpecialization = false;
|
||||
TemplateKind = NotTemplate;
|
||||
IsObjCMethod = false;
|
||||
IsInstanceMethod = false;
|
||||
IsClassMethod = false;
|
||||
|
@ -174,8 +172,7 @@ void DeclInfo::fill() {
|
|||
ResultType = FD->getResultType();
|
||||
unsigned NumLists = FD->getNumTemplateParameterLists();
|
||||
if (NumLists != 0) {
|
||||
IsTemplateDecl = true;
|
||||
IsTemplateSpecialization = true;
|
||||
TemplateKind = TemplateSpecialization;
|
||||
TemplateParameters =
|
||||
FD->getTemplateParameterList(NumLists - 1);
|
||||
}
|
||||
|
@ -202,7 +199,7 @@ void DeclInfo::fill() {
|
|||
case Decl::FunctionTemplate: {
|
||||
const FunctionTemplateDecl *FTD = cast<FunctionTemplateDecl>(ThisDecl);
|
||||
Kind = FunctionKind;
|
||||
IsTemplateDecl = true;
|
||||
TemplateKind = Template;
|
||||
const FunctionDecl *FD = FTD->getTemplatedDecl();
|
||||
ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
|
||||
FD->getNumParams());
|
||||
|
@ -213,7 +210,7 @@ void DeclInfo::fill() {
|
|||
case Decl::ClassTemplate: {
|
||||
const ClassTemplateDecl *CTD = cast<ClassTemplateDecl>(ThisDecl);
|
||||
Kind = ClassKind;
|
||||
IsTemplateDecl = true;
|
||||
TemplateKind = Template;
|
||||
TemplateParameters = CTD->getTemplateParameters();
|
||||
break;
|
||||
}
|
||||
|
@ -221,15 +218,13 @@ void DeclInfo::fill() {
|
|||
const ClassTemplatePartialSpecializationDecl *CTPSD =
|
||||
cast<ClassTemplatePartialSpecializationDecl>(ThisDecl);
|
||||
Kind = ClassKind;
|
||||
IsTemplateDecl = true;
|
||||
IsTemplatePartialSpecialization = true;
|
||||
TemplateKind = TemplatePartialSpecialization;
|
||||
TemplateParameters = CTPSD->getTemplateParameters();
|
||||
break;
|
||||
}
|
||||
case Decl::ClassTemplateSpecialization:
|
||||
Kind = ClassKind;
|
||||
IsTemplateDecl = true;
|
||||
IsTemplateSpecialization = true;
|
||||
TemplateKind = TemplateSpecialization;
|
||||
break;
|
||||
case Decl::Record:
|
||||
case Decl::CXXRecord:
|
||||
|
@ -251,7 +246,7 @@ void DeclInfo::fill() {
|
|||
case Decl::TypeAliasTemplate: {
|
||||
const TypeAliasTemplateDecl *TAT = cast<TypeAliasTemplateDecl>(ThisDecl);
|
||||
Kind = TypedefKind;
|
||||
IsTemplateDecl = true;
|
||||
TemplateKind = Template;
|
||||
TemplateParameters = TAT->getTemplateParameters();
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -205,7 +205,7 @@ TParamCommandComment *Sema::actOnTParamCommandStart(SourceLocation LocBegin,
|
|||
TParamCommandComment *Command =
|
||||
new (Allocator) TParamCommandComment(LocBegin, LocEnd, Name);
|
||||
|
||||
if (!isTemplateDecl())
|
||||
if (!isTemplateOrSpecialization())
|
||||
Diag(Command->getLocation(),
|
||||
diag::warn_doc_tparam_not_attached_to_a_template_decl)
|
||||
<< Command->getCommandNameRange();
|
||||
|
@ -226,7 +226,7 @@ void Sema::actOnTParamCommandParamNameArg(TParamCommandComment *Command,
|
|||
Arg);
|
||||
Command->setArgs(llvm::makeArrayRef(A, 1));
|
||||
|
||||
if (!isTemplateDecl()) {
|
||||
if (!isTemplateOrSpecialization()) {
|
||||
// We already warned that this \\tparam is not attached to a template decl.
|
||||
return;
|
||||
}
|
||||
|
@ -536,12 +536,12 @@ bool Sema::isFunctionDecl() {
|
|||
return ThisDeclInfo->getKind() == DeclInfo::FunctionKind;
|
||||
}
|
||||
|
||||
bool Sema::isTemplateDecl() {
|
||||
bool Sema::isTemplateOrSpecialization() {
|
||||
if (!ThisDeclInfo)
|
||||
return false;
|
||||
if (!ThisDeclInfo->IsFilled)
|
||||
inspectThisDecl();
|
||||
return ThisDeclInfo->IsTemplateDecl;
|
||||
return ThisDeclInfo->getTemplateKind() != DeclInfo::NotTemplate;
|
||||
}
|
||||
|
||||
ArrayRef<const ParmVarDecl *> Sema::getParamVars() {
|
||||
|
|
Loading…
Reference in New Issue