diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-09-01 19:52:22 +0000 | 
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-09-01 19:52:22 +0000 | 
| commit | a9aa29cf0b171e0046111e99c555250e45b39a3b (patch) | |
| tree | 310c5d35d7163d0c545d037dbfecfb5034209a0f /clang/tools/libclang | |
| parent | 61a312413c82aa23ef63467cde87f6de1ce8724f (diff) | |
| download | bcm5719-llvm-a9aa29cf0b171e0046111e99c555250e45b39a3b.tar.gz bcm5719-llvm-a9aa29cf0b171e0046111e99c555250e45b39a3b.zip  | |
Implement libclang support for using declarations. Clang actually uses
three different kinds of AST nodes to represent using declarations:
UsingDecl, UnresolvedUsingValueDecl, and
UnresolvedUsingTypenameDecl. These three are collapsed into a single
cursor kind for using declarations, since libclang clients don't need
the distinction.
Several related changes here:
  - Cursor visitation of the three AST nodes for using declarations
  - Proper source-range computation for these AST nodes
  - Using declarations have no USRs, since they don't actually declare
    any entities.
llvm-svn: 112730
Diffstat (limited to 'clang/tools/libclang')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 31 | ||||
| -rw-r--r-- | clang/tools/libclang/CIndexUSRs.cpp | 9 | ||||
| -rw-r--r-- | clang/tools/libclang/CXCursor.cpp | 5 | 
3 files changed, 43 insertions, 2 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 3c4211efdc5..947b3b28262 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -319,6 +319,9 @@ public:    bool VisitNamespaceDecl(NamespaceDecl *D);    bool VisitNamespaceAliasDecl(NamespaceAliasDecl *D);    bool VisitUsingDirectiveDecl(UsingDirectiveDecl *D); +  bool VisitUsingDecl(UsingDecl *D); +  bool VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); +  bool VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);    // Name visitor    bool VisitDeclarationNameInfo(DeclarationNameInfo Name); @@ -902,19 +905,41 @@ bool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) {  }  bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { -  // FIXME: Visit nested-name-specifier +  // FIXME: Visit nested-name-specifier.    return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(),                                         D->getTargetNameLoc(), TU));  } +bool CursorVisitor::VisitUsingDecl(UsingDecl *D) { +  // FIXME: Visit nested-name-specifier. +   +  // FIXME: Provide a multi-reference of some kind for all of the declarations +  // that the using declaration refers to. We don't have this kind of cursor +  // yet. +   +  return VisitDeclarationNameInfo(D->getNameInfo()); +} +  bool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { -  // FIXME: Visit nested-name-specifier +  // FIXME: Visit nested-name-specifier.    return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(),                                        D->getIdentLocation(), TU));  } +bool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { +  // FIXME: Visit nested-name-specifier. +   +  return VisitDeclarationNameInfo(D->getNameInfo()); +} + +bool CursorVisitor::VisitUnresolvedUsingTypenameDecl( +                                               UnresolvedUsingTypenameDecl *D) { +  // FIXME: Visit nested-name-specifier. +  return false; +} +  bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {    switch (Name.getName().getNameKind()) {    case clang::DeclarationName::Identifier: @@ -2268,6 +2293,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {      return createCXString("NamespaceAlias");    case CXCursor_UsingDirective:      return createCXString("UsingDirective"); +  case CXCursor_UsingDeclaration: +    return createCXString("UsingDeclaration");    }    llvm_unreachable("Unhandled CXCursorKind"); diff --git a/clang/tools/libclang/CIndexUSRs.cpp b/clang/tools/libclang/CIndexUSRs.cpp index a60d1d3e189..8f3dacfad21 100644 --- a/clang/tools/libclang/CIndexUSRs.cpp +++ b/clang/tools/libclang/CIndexUSRs.cpp @@ -86,6 +86,15 @@ public:    void VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {      IgnoreResults = true;    } +  void VisitUsingDecl(UsingDecl *D) {  +    IgnoreResults = true; +  } +  void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {  +    IgnoreResults = true; +  } +  void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {  +    IgnoreResults = true; +  }    /// Generate the string component containing the location of the    ///  declaration. diff --git a/clang/tools/libclang/CXCursor.cpp b/clang/tools/libclang/CXCursor.cpp index 75806ffa8d7..506033e7663 100644 --- a/clang/tools/libclang/CXCursor.cpp +++ b/clang/tools/libclang/CXCursor.cpp @@ -71,6 +71,11 @@ static CXCursorKind GetCursorKind(Decl *D) {        return CXCursor_ClassTemplatePartialSpecialization;      case Decl::UsingDirective:     return CXCursor_UsingDirective; +    case Decl::Using: +    case Decl::UnresolvedUsingValue: +    case Decl::UnresolvedUsingTypename:  +      return CXCursor_UsingDeclaration; +            default:        if (TagDecl *TD = dyn_cast<TagDecl>(D)) {          switch (TD->getTagKind()) {  | 

