[cfe-commits] r161217 - in /cfe/trunk: include/clang/AST/Comment.h lib/AST/Comment.cpp lib/AST/CommentSema.cpp

Sean Silva silvas at purdue.edu
Thu Aug 2 14:52:42 PDT 2012


Could that giant if ... else if .... else if block profitably be
turned into a switch on Decl::getKind()?

--Sean Silva

On Thu, Aug 2, 2012 at 2:45 PM, Dmitri Gribenko <gribozavr at gmail.com> wrote:
> Author: gribozavr
> Date: Thu Aug  2 16:45:39 2012
> New Revision: 161217
>
> URL: http://llvm.org/viewvc/llvm-project?rev=161217&view=rev
> Log:
> Comments AST: refactor DeclInfo to use an enum for decl kind instead of
> separate flags.
>
> Modified:
>     cfe/trunk/include/clang/AST/Comment.h
>     cfe/trunk/lib/AST/Comment.cpp
>     cfe/trunk/lib/AST/CommentSema.cpp
>
> Modified: cfe/trunk/include/clang/AST/Comment.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Comment.h?rev=161217&r1=161216&r2=161217&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Comment.h (original)
> +++ cfe/trunk/include/clang/AST/Comment.h Thu Aug  2 16:45:39 2012
> @@ -923,14 +923,43 @@
>    /// 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 @@
>    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.
>
> Modified: cfe/trunk/lib/AST/Comment.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Comment.cpp?rev=161217&r1=161216&r2=161217&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Comment.cpp (original)
> +++ cfe/trunk/lib/AST/Comment.cpp Thu Aug  2 16:45:39 2012
> @@ -141,7 +141,7 @@
>    assert(!IsFilled);
>
>    // Set defaults.
> -  IsFunctionDecl = false;
> +  Kind = FunctionKind;
>    IsTemplateDecl = false;
>    IsTemplateSpecialization = false;
>    IsTemplatePartialSpecialization = false;
> @@ -153,7 +153,7 @@
>    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 @@
>        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 @@
>      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 @@
>
>  } // end namespace comments
>  } // end namespace clang
> +
>
> Modified: cfe/trunk/lib/AST/CommentSema.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentSema.cpp?rev=161217&r1=161216&r2=161217&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/CommentSema.cpp (original)
> +++ cfe/trunk/lib/AST/CommentSema.cpp Thu Aug  2 16:45:39 2012
> @@ -477,7 +477,7 @@
>      return false;
>    if (!ThisDeclInfo->IsFilled)
>      inspectThisDecl();
> -  return ThisDeclInfo->IsFunctionDecl;
> +  return ThisDeclInfo->getKind() == DeclInfo::FunctionKind;
>  }
>
>  bool Sema::isTemplateDecl() {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list