Parcourir la source

Comments AST: refactor DeclInfo to use an enum for decl kind instead of
separate flags.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161217 91177308-0d34-0410-b5e6-96231b3b80d8

Dmitri Gribenko il y a 13 ans
Parent
commit
af19a6aaa2
3 fichiers modifiés avec 56 ajouts et 10 suppressions
  1. 38 5
      include/clang/AST/Comment.h
  2. 17 4
      lib/AST/Comment.cpp
  3. 1 1
      lib/AST/CommentSema.cpp

+ 38 - 5
include/clang/AST/Comment.h

@@ -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".
-  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.
   /// 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.

+ 17 - 4
lib/AST/Comment.cpp

@@ -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
+

+ 1 - 1
lib/AST/CommentSema.cpp

@@ -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() {