]> granicus.if.org Git - clang/commitdiff
Pretty printing and improved representation for namespace alias declarations
authorDouglas Gregor <dgregor@apple.com>
Sat, 30 May 2009 06:48:27 +0000 (06:48 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sat, 30 May 2009 06:48:27 +0000 (06:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72616 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclCXX.h
lib/AST/DeclCXX.cpp
lib/AST/DeclPrinter.cpp
lib/Sema/SemaDeclCXX.cpp
test/Coverage/cxx-language-features.inc

index 7a5233a6af95c3ed47c22d95f1af6088431b9f30..0971b6900e268c86951698e49e989df7693ad96a 100644 (file)
@@ -970,9 +970,16 @@ public:
 /// @endcode
 class NamespaceAliasDecl : public NamedDecl {
   SourceLocation AliasLoc;
+
+  /// \brief The source range that covers the nested-name-specifier
+  /// preceding the namespace name.
+  SourceRange QualifierRange;
+
+  /// \brief The nested-name-specifier that precedes the namespace
+  /// name, if any.
+  NestedNameSpecifier *Qualifier;
   
   /// IdentLoc - Location of namespace identifier.
-  /// FIXME: We don't store location of scope specifier.
   SourceLocation IdentLoc;
   
   /// Namespace - The Decl that this alias points to. Can either be a 
@@ -981,11 +988,21 @@ class NamespaceAliasDecl : public NamedDecl {
   
   NamespaceAliasDecl(DeclContext *DC, SourceLocation L, 
                      SourceLocation AliasLoc, IdentifierInfo *Alias, 
+                     SourceRange QualifierRange,
+                     NestedNameSpecifier *Qualifier,
                      SourceLocation IdentLoc, NamedDecl *Namespace)
     : NamedDecl(Decl::NamespaceAlias, DC, L, Alias), AliasLoc(AliasLoc), 
+      QualifierRange(QualifierRange), Qualifier(Qualifier),
       IdentLoc(IdentLoc), Namespace(Namespace) { }
 
 public:
+  /// \brief Retrieve the source range of the nested-name-specifier
+  /// that qualifiers the namespace name.
+  SourceRange getQualifierRange() const { return QualifierRange; }
+
+  /// \brief Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace.
+  NestedNameSpecifier *getQualifier() const { return Qualifier; }
 
   NamespaceDecl *getNamespace() {
     if (NamespaceAliasDecl *AD = dyn_cast<NamespaceAliasDecl>(Namespace))
@@ -997,10 +1014,16 @@ public:
   const NamespaceDecl *getNamespace() const {
     return const_cast<NamespaceAliasDecl*>(this)->getNamespace();
   }
-  
+
+  /// \brief Retrieve the namespace that this alias refers to, which
+  /// may either be a NamespaceDecl or a NamespaceAliasDecl.
+  NamedDecl *getAliasedNamespace() const { return Namespace; }
+
   static NamespaceAliasDecl *Create(ASTContext &C, DeclContext *DC, 
                                     SourceLocation L, SourceLocation AliasLoc, 
                                     IdentifierInfo *Alias, 
+                                    SourceRange QualifierRange,
+                                    NestedNameSpecifier *Qualifier,
                                     SourceLocation IdentLoc, 
                                     NamedDecl *Namespace);
   
index 5fb2a016b64cadc584fcd5302eaa0f85986364c4..6354d84784ec125bf465047b9e5a13f09d4136f1 100644 (file)
@@ -415,10 +415,12 @@ NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
                                                SourceLocation L, 
                                                SourceLocation AliasLoc, 
                                                IdentifierInfo *Alias, 
+                                               SourceRange QualifierRange,
+                                               NestedNameSpecifier *Qualifier,
                                                SourceLocation IdentLoc, 
                                                NamedDecl *Namespace) {
-  return new (C) NamespaceAliasDecl(DC, L, AliasLoc, Alias, IdentLoc
-                                    Namespace);
+  return new (C) NamespaceAliasDecl(DC, L, AliasLoc, Alias, QualifierRange
+                                    Qualifier, IdentLoc, Namespace);
 }
 
 StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
index 01cbee4d637059a967ae7ccf1113185032d23efe..2858c0a201e19ef4e2927f3ef444d4227ed09393 100644 (file)
@@ -55,6 +55,7 @@ namespace {
     void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
     void VisitOverloadedFunctionDecl(OverloadedFunctionDecl *D);
     void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
+    void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
     void VisitNamespaceDecl(NamespaceDecl *D);
     void VisitLinkageSpecDecl(LinkageSpecDecl *D);
     void VisitTemplateDecl(TemplateDecl *D);
@@ -435,6 +436,13 @@ void DeclPrinter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
   Out << D->getNominatedNamespace()->getNameAsString();
 }
 
+void DeclPrinter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
+  Out << "namespace " << D->getNameAsString() << " = ";
+  if (D->getQualifier())
+    D->getQualifier()->print(Out, Policy);
+  Out << D->getAliasedNamespace()->getNameAsString();
+}
+
 void DeclPrinter::VisitNamespaceDecl(NamespaceDecl *D) {
   Out << "namespace " << D->getNameAsString() << " {\n";
   VisitDeclContext(D);
index cd722fe1693167ba045cf8f27dec18e738fa535c..67c6dc3fae4996666e626c4272115fe701c14092 100644 (file)
@@ -1787,7 +1787,9 @@ Sema::DeclPtrTy Sema::ActOnNamespaceAliasDef(Scope *S,
   }
   
   NamespaceAliasDecl *AliasDecl = 
-    NamespaceAliasDecl::Create(Context, CurContext, NamespaceLoc, AliasLoc, Alias, 
+    NamespaceAliasDecl::Create(Context, CurContext, NamespaceLoc, AliasLoc, 
+                               Alias, SS.getRange(), 
+                               (NestedNameSpecifier *)SS.getScopeRep(),
                                IdentLoc, R);
   
   CurContext->addDecl(Context, AliasDecl);
index 92c9fd6f27ca7d981cbb86c237337afcfea19c63..bac6bc79102d071b91616d9eb204890b60817547 100644 (file)
@@ -10,3 +10,5 @@ namespace std {
 
 using namespace std::debug;
 using namespace std;
+
+namespace safestl = ::std::debug;