MaskRay created this revision.
MaskRay added reviewers: rsmith, arphaman.
Herald added subscribers: cfe-commits, jfb.

Currently the switch conditions display Decl nodes with space-separated 
lowercase words. Some conditions are missing and will cause llvm_unreachable() 
failure. It is simpler to just use DeclNodes.inc names uninterpretedly.


Repository:
  rC Clang

https://reviews.llvm.org/D52529

Files:
  lib/Frontend/ASTConsumers.cpp

Index: lib/Frontend/ASTConsumers.cpp
===================================================================
--- lib/Frontend/ASTConsumers.cpp
+++ lib/Frontend/ASTConsumers.cpp
@@ -418,117 +418,27 @@
       Out << "  ";
 
     Decl::Kind DK = I->getKind();
+
+    if (auto *DC = dyn_cast<DeclContext>(I)) {
+      PrintDeclContext(DC, Indentation + 1);
+      continue;
+    }
+
     switch (DK) {
-    case Decl::Namespace:
-    case Decl::Enum:
-    case Decl::Record:
-    case Decl::CXXRecord:
-    case Decl::ObjCMethod:
-    case Decl::ObjCInterface:
-    case Decl::ObjCCategory:
-    case Decl::ObjCProtocol:
-    case Decl::ObjCImplementation:
-    case Decl::ObjCCategoryImpl:
-    case Decl::LinkageSpec:
-    case Decl::Block:
-    case Decl::Function:
-    case Decl::CXXMethod:
-    case Decl::CXXConstructor:
-    case Decl::CXXDestructor:
-    case Decl::CXXConversion:
-    case Decl::ClassTemplateSpecialization:
-    case Decl::ClassTemplatePartialSpecialization: {
-      DeclContext* DC = cast<DeclContext>(I);
-      PrintDeclContext(DC, Indentation+2);
-      break;
-    }
-    case Decl::IndirectField:
-      Out << "<IndirectField> " << *cast<IndirectFieldDecl>(I) << '\n';
-      break;
-    case Decl::Label:
-      Out << "<Label> " << *cast<LabelDecl>(I) << '\n';
-      break;
-    case Decl::Field:
-      Out << "<field> " << *cast<FieldDecl>(I) << '\n';
-      break;
-    case Decl::Typedef:
-    case Decl::TypeAlias:
-      Out << "<typedef> " << *cast<TypedefNameDecl>(I) << '\n';
-      break;
-    case Decl::EnumConstant:
-      Out << "<enum constant> " << *cast<EnumConstantDecl>(I) << '\n';
-      break;
-    case Decl::Var:
-      Out << "<var> " << *cast<VarDecl>(I) << '\n';
-      break;
-    case Decl::ImplicitParam:
-      Out << "<implicit parameter> " << *cast<ImplicitParamDecl>(I) << '\n';
-      break;
-    case Decl::ParmVar:
-      Out << "<parameter> " << *cast<ParmVarDecl>(I) << '\n';
-      break;
-    case Decl::ObjCProperty:
-      Out << "<objc property> " << *cast<ObjCPropertyDecl>(I) << '\n';
-      break;
-    case Decl::FunctionTemplate:
-      Out << "<function template> " << *cast<FunctionTemplateDecl>(I) << '\n';
-      break;
-    case Decl::TypeAliasTemplate:
-      Out << "<type alias template> " << *cast<TypeAliasTemplateDecl>(I)
-          << '\n';
-      break;
-    case Decl::FileScopeAsm:
-      Out << "<file-scope asm>\n";
-      break;
-    case Decl::UsingDirective:
-      Out << "<using directive>\n";
-      break;
-    case Decl::NamespaceAlias:
-      Out << "<namespace alias> " << *cast<NamespaceAliasDecl>(I) << '\n';
-      break;
-    case Decl::ClassTemplate:
-      Out << "<class template> " << *cast<ClassTemplateDecl>(I) << '\n';
-      break;
-    case Decl::OMPThreadPrivate: {
-      Out << "<omp threadprivate> " << '"' << I << "\"\n";
-      break;
-    }
-    case Decl::Friend: {
-      Out << "<friend>";
-      if (const NamedDecl *ND = cast<FriendDecl>(I)->getFriendDecl())
-        Out << ' ' << *ND;
-      Out << "\n";
-      break;
-    }
-    case Decl::Using:
-      Out << "<using> " << *cast<UsingDecl>(I) << "\n";
-      break;
-    case Decl::UsingShadow:
-      Out << "<using shadow> " << *cast<UsingShadowDecl>(I) << "\n";
-      break;
-    case Decl::UnresolvedUsingValue:
-      Out << "<unresolved using value> " << *cast<UnresolvedUsingValueDecl>(I)
-          << "\n";
-      break;
-    case Decl::Empty:
-      Out << "<empty>\n";
-      break;
-    case Decl::AccessSpec:
-      Out << "<access specifier>\n";
-      break;
-    case Decl::VarTemplate:
-      Out << "<var template> " << *cast<VarTemplateDecl>(I) << "\n";
-      break;
-    case Decl::StaticAssert:
-      Out << "<static assert>\n";
-      break;
-
-    default:
-      Out << "DeclKind: " << DK << '"' << I << "\"\n";
-      llvm_unreachable("decl unhandled");
+#define NAMED(DERIVED, BASE)                                         \
+    case Decl::DERIVED:                                              \
+      Out << "<" << #DERIVED << "> " << *cast<NamedDecl>(I) << "\n"; \
+      continue;
+#define DECL(DERIVED, BASE)                                          \
+    case Decl::DERIVED:                                              \
+      Out << "<" << #DERIVED << ">\n";                               \
+      continue;
+#define ABSTRACT_DECL(DECL)
+#include "clang/AST/DeclNodes.inc"
     }
   }
 }
+
 std::unique_ptr<ASTConsumer> clang::CreateDeclContextPrinter() {
   return llvm::make_unique<DeclContextPrinter>();
 }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to