Handle any persistent Decl in the Clang expression parser, not just types.

Persistent decls have traditionally only been types.  However, we want to
be able to persist more things, like functions and global variables.  This
changes some of the nomenclature and the lookup rules to make this possible.

<rdar://problem/22864976>

llvm-svn: 263864
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp
index 9bf9d43..d1478e4 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp
@@ -14,6 +14,8 @@
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/Value.h"
 
+#include "clang/AST/Decl.h"
+
 #include "llvm/ADT/StringMap.h"
 
 using namespace lldb;
@@ -66,18 +68,26 @@
 }
 
 void
-ClangPersistentVariables::RegisterPersistentType (const ConstString &name,
-                                                  clang::TypeDecl *type_decl)
+ClangPersistentVariables::RegisterPersistentDecl (const ConstString &name,
+                                                  clang::NamedDecl *decl)
 {
-    m_persistent_types.insert(std::pair<const char*, clang::TypeDecl*>(name.GetCString(), type_decl));
+    m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(name.GetCString(), decl));
+    
+    if (clang::EnumDecl *enum_decl = llvm::dyn_cast<clang::EnumDecl>(decl))
+    {
+        for (clang::EnumConstantDecl *enumerator_decl : enum_decl->enumerators())
+        {
+            m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(ConstString(enumerator_decl->getNameAsString()).GetCString(), enumerator_decl));
+        }
+    }
 }
 
-clang::TypeDecl *
-ClangPersistentVariables::GetPersistentType (const ConstString &name)
+clang::NamedDecl *
+ClangPersistentVariables::GetPersistentDecl (const ConstString &name)
 {
-    PersistentTypeMap::const_iterator i = m_persistent_types.find(name.GetCString());
+    PersistentDeclMap::const_iterator i = m_persistent_decls.find(name.GetCString());
     
-    if (i == m_persistent_types.end())
+    if (i == m_persistent_decls.end())
         return NULL;
     else
         return i->second;