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.
|
||||
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.
|
||||
unsigned IsFilled : 1;
|
||||
|
||||
/// Is \c ThisDecl something that we consider a "function".
|
||||
unsigned IsFunctionDecl : 1;
|
||||
|
||||
/// Is \c ThisDecl something that we consider a "class".
|
||||
unsigned IsClassDecl : 1;
|
||||
/// Simplified kind of \c ThisDecl, see\c DeclKind enum.
|
||||
unsigned Kind : 3;
|
||||
|
||||
/// Is \c ThisDecl a template declaration.
|
||||
unsigned IsTemplateDecl : 1;
|
||||
|
@ -953,6 +982,10 @@ struct DeclInfo {
|
|||
unsigned IsClassMethod : 1;
|
||||
|
||||
void fill();
|
||||
|
||||
DeclKind getKind() const LLVM_READONLY {
|
||||
return static_cast<DeclKind>(Kind);
|
||||
}
|
||||
};
|
||||
|
||||
/// A full comment attached to a declaration, contains block content.
|
||||
|
|
|
@ -141,7 +141,7 @@ void DeclInfo::fill() {
|
|||
assert(!IsFilled);
|
||||
|
||||
// Set defaults.
|
||||
IsFunctionDecl = false;
|
||||
Kind = FunctionKind;
|
||||
IsTemplateDecl = false;
|
||||
IsTemplateSpecialization = false;
|
||||
IsTemplatePartialSpecialization = false;
|
||||
|
@ -153,7 +153,7 @@ void DeclInfo::fill() {
|
|||
if (!ThisDecl) {
|
||||
// Defaults are OK.
|
||||
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ThisDecl)) {
|
||||
IsFunctionDecl = true;
|
||||
Kind = FunctionKind;
|
||||
ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
|
||||
FD->getNumParams());
|
||||
unsigned NumLists = FD->getNumTemplateParameterLists();
|
||||
|
@ -169,14 +169,14 @@ void DeclInfo::fill() {
|
|||
IsClassMethod = !IsInstanceMethod;
|
||||
}
|
||||
} else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(ThisDecl)) {
|
||||
IsFunctionDecl = true;
|
||||
Kind = FunctionKind;
|
||||
ParamVars = ArrayRef<const ParmVarDecl *>(MD->param_begin(),
|
||||
MD->param_size());
|
||||
IsInstanceMethod = MD->isInstanceMethod();
|
||||
IsClassMethod = !IsInstanceMethod;
|
||||
} else if (const FunctionTemplateDecl *FTD =
|
||||
dyn_cast<FunctionTemplateDecl>(ThisDecl)) {
|
||||
IsFunctionDecl = true;
|
||||
Kind = FunctionKind;
|
||||
IsTemplateDecl = true;
|
||||
const FunctionDecl *FD = FTD->getTemplatedDecl();
|
||||
ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
|
||||
|
@ -184,18 +184,30 @@ void DeclInfo::fill() {
|
|||
TemplateParameters = FTD->getTemplateParameters();
|
||||
} else if (const ClassTemplateDecl *CTD =
|
||||
dyn_cast<ClassTemplateDecl>(ThisDecl)) {
|
||||
Kind = ClassKind;
|
||||
IsTemplateDecl = true;
|
||||
TemplateParameters = CTD->getTemplateParameters();
|
||||
} else if (const ClassTemplatePartialSpecializationDecl *CTPSD =
|
||||
dyn_cast<ClassTemplatePartialSpecializationDecl>(ThisDecl)) {
|
||||
Kind = ClassKind;
|
||||
IsTemplateDecl = true;
|
||||
IsTemplatePartialSpecialization = true;
|
||||
TemplateParameters = CTPSD->getTemplateParameters();
|
||||
} else if (isa<ClassTemplateSpecializationDecl>(ThisDecl)) {
|
||||
Kind = ClassKind;
|
||||
IsTemplateDecl = 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 =
|
||||
dyn_cast<TypeAliasTemplateDecl>(ThisDecl)) {
|
||||
Kind = TypedefKind;
|
||||
IsTemplateDecl = true;
|
||||
TemplateParameters = TAT->getTemplateParameters();
|
||||
}
|
||||
|
@ -204,3 +216,4 @@ void DeclInfo::fill() {
|
|||
|
||||
} // end namespace comments
|
||||
} // end namespace clang
|
||||
|
||||
|
|
|
@ -477,7 +477,7 @@ bool Sema::isFunctionDecl() {
|
|||
return false;
|
||||
if (!ThisDeclInfo->IsFilled)
|
||||
inspectThisDecl();
|
||||
return ThisDeclInfo->IsFunctionDecl;
|
||||
return ThisDeclInfo->getKind() == DeclInfo::FunctionKind;
|
||||
}
|
||||
|
||||
bool Sema::isTemplateDecl() {
|
||||
|
|
Loading…
Reference in New Issue