forked from OSchip/llvm-project
Comments AST: refactor DeclInfo to use an enum for decl kind instead of
separate flags. llvm-svn: 161217
This commit is contained in:
parent
637ecd2098
commit
37a7fafd44
|
@ -923,14 +923,43 @@ struct DeclInfo {
|
||||||
/// a template.
|
/// a template.
|
||||||
const TemplateParameterList *TemplateParameters;
|
const TemplateParameterList *TemplateParameters;
|
||||||
|
|
||||||
|
/// A simplified description of \c ThisDecl kind that should be good enough
|
||||||
|
/// for documentation rendering purposes.
|
||||||
|
enum DeclKind {
|
||||||
|
/// Something that we consider a "function":
|
||||||
|
/// \li function,
|
||||||
|
/// \li function template,
|
||||||
|
/// \li function template specialization,
|
||||||
|
/// \li member function,
|
||||||
|
/// \li member function template,
|
||||||
|
/// \li member function template specialization,
|
||||||
|
/// \li ObjC method.
|
||||||
|
FunctionKind,
|
||||||
|
|
||||||
|
/// Something that we consider a "class":
|
||||||
|
/// \li class/struct,
|
||||||
|
/// \li class template,
|
||||||
|
/// \li class template (partial) specialization.
|
||||||
|
ClassKind,
|
||||||
|
|
||||||
|
/// Something that we consider a "variable":
|
||||||
|
/// \li namespace scope variables;
|
||||||
|
/// \li static and non-static class data members.
|
||||||
|
VariableKind,
|
||||||
|
|
||||||
|
/// A C++ namespace.
|
||||||
|
NamespaceKind,
|
||||||
|
|
||||||
|
/// A C++ typedef-name (a 'typedef' decl specifier or alias-declaration),
|
||||||
|
/// see \c TypedefNameDecl.
|
||||||
|
TypedefKind
|
||||||
|
};
|
||||||
|
|
||||||
/// If false, only \c ThisDecl is valid.
|
/// If false, only \c ThisDecl is valid.
|
||||||
unsigned IsFilled : 1;
|
unsigned IsFilled : 1;
|
||||||
|
|
||||||
/// Is \c ThisDecl something that we consider a "function".
|
/// Simplified kind of \c ThisDecl, see\c DeclKind enum.
|
||||||
unsigned IsFunctionDecl : 1;
|
unsigned Kind : 3;
|
||||||
|
|
||||||
/// Is \c ThisDecl something that we consider a "class".
|
|
||||||
unsigned IsClassDecl : 1;
|
|
||||||
|
|
||||||
/// Is \c ThisDecl a template declaration.
|
/// Is \c ThisDecl a template declaration.
|
||||||
unsigned IsTemplateDecl : 1;
|
unsigned IsTemplateDecl : 1;
|
||||||
|
@ -953,6 +982,10 @@ struct DeclInfo {
|
||||||
unsigned IsClassMethod : 1;
|
unsigned IsClassMethod : 1;
|
||||||
|
|
||||||
void fill();
|
void fill();
|
||||||
|
|
||||||
|
DeclKind getKind() const LLVM_READONLY {
|
||||||
|
return static_cast<DeclKind>(Kind);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A full comment attached to a declaration, contains block content.
|
/// A full comment attached to a declaration, contains block content.
|
||||||
|
|
|
@ -141,7 +141,7 @@ void DeclInfo::fill() {
|
||||||
assert(!IsFilled);
|
assert(!IsFilled);
|
||||||
|
|
||||||
// Set defaults.
|
// Set defaults.
|
||||||
IsFunctionDecl = false;
|
Kind = FunctionKind;
|
||||||
IsTemplateDecl = false;
|
IsTemplateDecl = false;
|
||||||
IsTemplateSpecialization = false;
|
IsTemplateSpecialization = false;
|
||||||
IsTemplatePartialSpecialization = false;
|
IsTemplatePartialSpecialization = false;
|
||||||
|
@ -153,7 +153,7 @@ void DeclInfo::fill() {
|
||||||
if (!ThisDecl) {
|
if (!ThisDecl) {
|
||||||
// Defaults are OK.
|
// Defaults are OK.
|
||||||
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ThisDecl)) {
|
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ThisDecl)) {
|
||||||
IsFunctionDecl = true;
|
Kind = FunctionKind;
|
||||||
ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
|
ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
|
||||||
FD->getNumParams());
|
FD->getNumParams());
|
||||||
unsigned NumLists = FD->getNumTemplateParameterLists();
|
unsigned NumLists = FD->getNumTemplateParameterLists();
|
||||||
|
@ -169,14 +169,14 @@ void DeclInfo::fill() {
|
||||||
IsClassMethod = !IsInstanceMethod;
|
IsClassMethod = !IsInstanceMethod;
|
||||||
}
|
}
|
||||||
} else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(ThisDecl)) {
|
} else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(ThisDecl)) {
|
||||||
IsFunctionDecl = true;
|
Kind = FunctionKind;
|
||||||
ParamVars = ArrayRef<const ParmVarDecl *>(MD->param_begin(),
|
ParamVars = ArrayRef<const ParmVarDecl *>(MD->param_begin(),
|
||||||
MD->param_size());
|
MD->param_size());
|
||||||
IsInstanceMethod = MD->isInstanceMethod();
|
IsInstanceMethod = MD->isInstanceMethod();
|
||||||
IsClassMethod = !IsInstanceMethod;
|
IsClassMethod = !IsInstanceMethod;
|
||||||
} else if (const FunctionTemplateDecl *FTD =
|
} else if (const FunctionTemplateDecl *FTD =
|
||||||
dyn_cast<FunctionTemplateDecl>(ThisDecl)) {
|
dyn_cast<FunctionTemplateDecl>(ThisDecl)) {
|
||||||
IsFunctionDecl = true;
|
Kind = FunctionKind;
|
||||||
IsTemplateDecl = true;
|
IsTemplateDecl = true;
|
||||||
const FunctionDecl *FD = FTD->getTemplatedDecl();
|
const FunctionDecl *FD = FTD->getTemplatedDecl();
|
||||||
ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
|
ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
|
||||||
|
@ -184,18 +184,30 @@ void DeclInfo::fill() {
|
||||||
TemplateParameters = FTD->getTemplateParameters();
|
TemplateParameters = FTD->getTemplateParameters();
|
||||||
} else if (const ClassTemplateDecl *CTD =
|
} else if (const ClassTemplateDecl *CTD =
|
||||||
dyn_cast<ClassTemplateDecl>(ThisDecl)) {
|
dyn_cast<ClassTemplateDecl>(ThisDecl)) {
|
||||||
|
Kind = ClassKind;
|
||||||
IsTemplateDecl = true;
|
IsTemplateDecl = true;
|
||||||
TemplateParameters = CTD->getTemplateParameters();
|
TemplateParameters = CTD->getTemplateParameters();
|
||||||
} else if (const ClassTemplatePartialSpecializationDecl *CTPSD =
|
} else if (const ClassTemplatePartialSpecializationDecl *CTPSD =
|
||||||
dyn_cast<ClassTemplatePartialSpecializationDecl>(ThisDecl)) {
|
dyn_cast<ClassTemplatePartialSpecializationDecl>(ThisDecl)) {
|
||||||
|
Kind = ClassKind;
|
||||||
IsTemplateDecl = true;
|
IsTemplateDecl = true;
|
||||||
IsTemplatePartialSpecialization = true;
|
IsTemplatePartialSpecialization = true;
|
||||||
TemplateParameters = CTPSD->getTemplateParameters();
|
TemplateParameters = CTPSD->getTemplateParameters();
|
||||||
} else if (isa<ClassTemplateSpecializationDecl>(ThisDecl)) {
|
} else if (isa<ClassTemplateSpecializationDecl>(ThisDecl)) {
|
||||||
|
Kind = ClassKind;
|
||||||
IsTemplateDecl = true;
|
IsTemplateDecl = true;
|
||||||
IsTemplateSpecialization = true;
|
IsTemplateSpecialization = true;
|
||||||
|
} else if (isa<RecordDecl>(ThisDecl)) {
|
||||||
|
Kind = ClassKind;
|
||||||
|
} else if (isa<VarDecl>(ThisDecl) || isa<FieldDecl>(ThisDecl)) {
|
||||||
|
Kind = VariableKind;
|
||||||
|
} else if (isa<NamespaceDecl>(ThisDecl)) {
|
||||||
|
Kind = NamespaceKind;
|
||||||
|
} else if (isa<TypedefNameDecl>(ThisDecl)) {
|
||||||
|
Kind = TypedefKind;
|
||||||
} else if (const TypeAliasTemplateDecl *TAT =
|
} else if (const TypeAliasTemplateDecl *TAT =
|
||||||
dyn_cast<TypeAliasTemplateDecl>(ThisDecl)) {
|
dyn_cast<TypeAliasTemplateDecl>(ThisDecl)) {
|
||||||
|
Kind = TypedefKind;
|
||||||
IsTemplateDecl = true;
|
IsTemplateDecl = true;
|
||||||
TemplateParameters = TAT->getTemplateParameters();
|
TemplateParameters = TAT->getTemplateParameters();
|
||||||
}
|
}
|
||||||
|
@ -204,3 +216,4 @@ void DeclInfo::fill() {
|
||||||
|
|
||||||
} // end namespace comments
|
} // end namespace comments
|
||||||
} // end namespace clang
|
} // end namespace clang
|
||||||
|
|
||||||
|
|
|
@ -477,7 +477,7 @@ bool Sema::isFunctionDecl() {
|
||||||
return false;
|
return false;
|
||||||
if (!ThisDeclInfo->IsFilled)
|
if (!ThisDeclInfo->IsFilled)
|
||||||
inspectThisDecl();
|
inspectThisDecl();
|
||||||
return ThisDeclInfo->IsFunctionDecl;
|
return ThisDeclInfo->getKind() == DeclInfo::FunctionKind;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sema::isTemplateDecl() {
|
bool Sema::isTemplateDecl() {
|
||||||
|
|
Loading…
Reference in New Issue