Add libclang support for namespace aliases (visitation + USRs) along
with a new cursor kind for a reference to a namespace. 

There's still some oddities in the source location information for
NamespaceAliasDecl that I'll address with a separate commit, so the
source locations displayed in the load-namespaces.cpp test will
change.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112676 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 2a7e6e9..230631b 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -316,6 +316,7 @@
   bool VisitObjCClassDecl(ObjCClassDecl *D);
   bool VisitLinkageSpecDecl(LinkageSpecDecl *D);
   bool VisitNamespaceDecl(NamespaceDecl *D);
+  bool VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
  
   // Name visitor
   bool VisitDeclarationNameInfo(DeclarationNameInfo Name);
@@ -863,6 +864,13 @@
   return VisitDeclContext(D);
 }
 
+bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
+  // FIXME: Visit nested-name-specifier
+  
+  return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(), 
+                                      D->getTargetNameLoc(), TU));
+}
+
 bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {
   switch (Name.getName().getNameKind()) {
   case clang::DeclarationName::Identifier:
@@ -2053,10 +2061,17 @@
     }
     case CXCursor_TemplateRef: {
       TemplateDecl *Template = getCursorTemplateRef(C).first;
-      assert(Template && "Missing type decl");
+      assert(Template && "Missing template decl");
       
       return createCXString(Template->getNameAsString());
     }
+        
+    case CXCursor_NamespaceRef: {
+      NamedDecl *NS = getCursorNamespaceRef(C).first;
+      assert(NS && "Missing namespace decl");
+      
+      return createCXString(NS->getNameAsString());
+    }
 
     default:
       return createCXString("<not implemented>");
@@ -2138,6 +2153,8 @@
       return createCXString("TypeRef");
   case CXCursor_TemplateRef:
       return createCXString("TemplateRef");
+  case CXCursor_NamespaceRef:
+    return createCXString("NamespaceRef");
   case CXCursor_UnexposedExpr:
       return createCXString("UnexposedExpr");
   case CXCursor_BlockExpr:
@@ -2200,6 +2217,8 @@
     return createCXString("ClassTemplate");
   case CXCursor_ClassTemplatePartialSpecialization:
     return createCXString("ClassTemplatePartialSpecialization");
+  case CXCursor_NamespaceAlias:
+    return createCXString("NamespaceAlias");
   }
 
   llvm_unreachable("Unhandled CXCursorKind");
@@ -2329,6 +2348,11 @@
       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
     }
 
+    case CXCursor_NamespaceRef: {
+      std::pair<NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
+      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
+    }
+
     case CXCursor_CXXBaseSpecifier: {
       // FIXME: Figure out what location to return for a CXXBaseSpecifier.
       return clang_getNullLocation();
@@ -2390,6 +2414,9 @@
     case CXCursor_TemplateRef:
       return getCursorTemplateRef(C).second;
 
+    case CXCursor_NamespaceRef:
+      return getCursorNamespaceRef(C).second;
+        
     case CXCursor_CXXBaseSpecifier:
       // FIXME: Figure out what source range to use for a CXBaseSpecifier.
       return SourceRange();
@@ -2470,6 +2497,9 @@
     case CXCursor_TemplateRef:
       return MakeCXCursor(getCursorTemplateRef(C).first, CXXUnit);
 
+    case CXCursor_NamespaceRef:
+      return MakeCXCursor(getCursorNamespaceRef(C).first, CXXUnit);
+
     case CXCursor_CXXBaseSpecifier: {
       CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
       return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),