]> granicus.if.org Git - clang/commitdiff
DeclContext had its "casting machinery" inside the class definition so that if a...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Mon, 16 Feb 2009 14:29:28 +0000 (14:29 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Mon, 16 Feb 2009 14:29:28 +0000 (14:29 +0000)
would be in one place. Since, now, only DeclNodes.def needs to be modified, move things out-of-line and simplify the DeclContext class.

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

include/clang/AST/DeclBase.h
lib/AST/DeclBase.cpp

index 8172ab22c734c87c106d0a473a1b396b9d99a0a9..064fa310d36a52963018be99405a9e1be0f630c7 100644 (file)
@@ -371,33 +371,6 @@ class DeclContext {
   /// another pointer.
   Decl *LastDecl;
 
-  // Used in the CastTo template to get the DeclKind
-  // from a Decl or a DeclContext. DeclContext doesn't have a getKind() method
-  // to avoid 'ambiguous access' compiler errors.
-  template<typename T> struct KindTrait {
-    static Decl::Kind getKind(const T *D) { return D->getKind(); }
-  };
-
-  // Used only by the ToDecl and FromDecl methods
-  template<typename To, typename From>
-  static To *CastTo(const From *D) {
-    Decl::Kind DK = KindTrait<From>::getKind(D);
-    switch(DK) {
-#define DECL_CONTEXT(Name) \
-      case Decl::Name:     \
-        return static_cast<Name##Decl*>(const_cast<From*>(D));
-#define DECL_CONTEXT_BASE(Name)
-#include "clang/AST/DeclNodes.def"
-      default:
-#define DECL_CONTEXT_BASE(Name)                                   \
-        if (DK >= Decl::Name##First && DK <= Decl::Name##Last)    \
-          return static_cast<Name##Decl*>(const_cast<From*>(D));
-#include "clang/AST/DeclNodes.def"
-        assert(false && "a decl that inherits DeclContext isn't handled");
-        return 0;
-    }
-  }
-
   /// isLookupMap - Determine if the lookup structure is a
   /// DenseMap. Othewise, it is an array.
   bool isLookupMap() const { return LookupPtr.getInt() == LookupIsMap; }
@@ -780,21 +753,7 @@ public:
     return getUsingDirectives().second;
   }
 
-  static bool classof(const Decl *D) {
-    switch (D->getKind()) {
-#define DECL_CONTEXT(Name) case Decl::Name:
-#define DECL_CONTEXT_BASE(Name)
-#include "clang/AST/DeclNodes.def"
-        return true;
-      default:
-#define DECL_CONTEXT_BASE(Name)                   \
-        if (D->getKind() >= Decl::Name##First &&  \
-            D->getKind() <= Decl::Name##Last)     \
-          return true;
-#include "clang/AST/DeclNodes.def"
-        return false;
-    }
-  }
+  static bool classof(const Decl *D);
   static bool classof(const DeclContext *D) { return true; }
 #define DECL_CONTEXT(Name) \
   static bool classof(const Name##Decl *D) { return true; }
@@ -810,10 +769,6 @@ private:
   friend class Decl;
 };
 
-template<> struct DeclContext::KindTrait<DeclContext> {
-  static Decl::Kind getKind(const DeclContext *D) { return D->DeclKind; }
-};
-
 inline bool Decl::isTemplateParameter() const {
   return getKind() == TemplateTypeParm || getKind() == NonTypeTemplateParm;
 }
index 91f2bf2765e305c1d56bcbdfb69fd2dfc382b967..a8ca34dca54ebc9cc6c5eda76e1c8683262875ee 100644 (file)
@@ -213,17 +213,61 @@ void Decl::Destroy(ASTContext& C) {
 }
 
 Decl *Decl::castFromDeclContext (const DeclContext *D) {
-  return DeclContext::CastTo<Decl>(D);
+  Decl::Kind DK = D->getDeclKind();
+  switch(DK) {
+#define DECL_CONTEXT(Name) \
+    case Decl::Name:     \
+      return static_cast<Name##Decl*>(const_cast<DeclContext*>(D));
+#define DECL_CONTEXT_BASE(Name)
+#include "clang/AST/DeclNodes.def"
+    default:
+#define DECL_CONTEXT_BASE(Name)                                   \
+      if (DK >= Decl::Name##First && DK <= Decl::Name##Last)    \
+        return static_cast<Name##Decl*>(const_cast<DeclContext*>(D));
+#include "clang/AST/DeclNodes.def"
+      assert(false && "a decl that inherits DeclContext isn't handled");
+      return 0;
+  }
 }
 
 DeclContext *Decl::castToDeclContext(const Decl *D) {
-  return DeclContext::CastTo<DeclContext>(D);
+  Decl::Kind DK = D->getKind();
+  switch(DK) {
+#define DECL_CONTEXT(Name) \
+    case Decl::Name:     \
+      return static_cast<Name##Decl*>(const_cast<Decl*>(D));
+#define DECL_CONTEXT_BASE(Name)
+#include "clang/AST/DeclNodes.def"
+    default:
+#define DECL_CONTEXT_BASE(Name)                                   \
+      if (DK >= Decl::Name##First && DK <= Decl::Name##Last)    \
+        return static_cast<Name##Decl*>(const_cast<Decl*>(D));
+#include "clang/AST/DeclNodes.def"
+      assert(false && "a decl that inherits DeclContext isn't handled");
+      return 0;
+  }
 }
 
 //===----------------------------------------------------------------------===//
 // DeclContext Implementation
 //===----------------------------------------------------------------------===//
 
+bool DeclContext::classof(const Decl *D) {
+  switch (D->getKind()) {
+#define DECL_CONTEXT(Name) case Decl::Name:
+#define DECL_CONTEXT_BASE(Name)
+#include "clang/AST/DeclNodes.def"
+      return true;
+    default:
+#define DECL_CONTEXT_BASE(Name)                   \
+      if (D->getKind() >= Decl::Name##First &&  \
+          D->getKind() <= Decl::Name##Last)     \
+        return true;
+#include "clang/AST/DeclNodes.def"
+      return false;
+  }
+}
+
 const DeclContext *DeclContext::getParent() const {
   if (const Decl *D = dyn_cast<Decl>(this))
     return D->getDeclContext();